Raspberry radio+nas
| Ce wiki a été archivé en 2018.
Le nouveau wiki se trouve à: ressources.labomedia.org Les fonctionnalités sont désactivées: vous pouvez faire une recherche sur Google site:https://wiki.labomedia.org et découvrir La Labomedia. |
Sommaire
Exploitation pédagogique d'un Rapsberry.
- Transférer les photographies automatiquement depuis une carte SD sur un disque dur en exploitant les données EXIF. Ceci fait elles seront disponible dans le cadre d'une réseau local.
- Écouter la radio sur une chaîne Hi-fi avec une possibilité de contrôle via une télécommande infra-rouge.
Le matériel.
- Une carte raspberry-pi
- un disque dur externe avec alimentation.
- une Led IR.
- un écran tactile 2,8 pouces de chez Adafruit.
Configuration du Raspberry pi avec un disque dur externe.
Objectif : pouvoir libérer le lecteur SD du raspberry, une fois la séquence de boot terminée, afin de lire les cartes SD contenant mes photographies.
Dans un premier temps une installation de Raspbian sur une carte SD de manière traditionnelle doit être faite.
Puis effectuer les opérations suivantes :
- Raccorder le disque dur à votre PI, vérifier son point de montage avec df
- Démonter le disque.
- Copier le contenu de la carte avec : sudo dd if=/dev/mmcblk0p2 of=/dev/sda2 bs=512
- Modifier /boot/cmdline.txt en remplaçant root=/dev/mmcblk0p2 par root=/dev/sda2
- Modifier le /etc/fstab en remplaçant /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 par /dev/sda2 / ext4 defaults,noatime 0 1
- Étendre le ROOT FILE SYSTEM avec sudo resize2fs /dev/sda2
A l'aide de cet article booter-le-raspberry-pi-sur-un-disque-dur-usb, effectuer le transfert du système.
A ce stade vous pouvez transférer le contenu de votre carte SD sur une carte ayant une capacité plus réduite.
Gestion de la récupération automatique des photographies depuis la carte SD.
Ceci est basé sur les règles udev, qui vont déclencher un script assurant le traitement des fichiers. Grand texte=== Configuration de la règle udev. ===
Dans le répertoire /etc/udev/rules.d/ créer un fichier nommé : 100-SD-card.rules. Ce fichier contient les informations de réaction à l'introduction de la carte SD dans le lecteur de la PI.
Attention de manière générale le script lancé par la règle UDEV doit être relativement cours en terme de temps d’exécution sous peine de ne pas fonctionner. En effet, sous réserve d'une confirmation, la gestion par le noyau via udev se fait cycliquement et peut interrompre un script dont la durée serait longue
ATTRS{type}=="*SD", ATTR{partition}=="?", ACTION=="add", RUN+="/opt/bin/sd_photo.sh"
Qui va lancer le script /opt/bin/sd_photo.sh décrit ci dessous.
Le script de transfert des photographies (sd_photo.sh).
Le script va transférer les photographies en utilisant les données exifs de date. Les photographies seront stockées dans un répertoire avec l'arborescence suivante : année/mois/jour. Dans le répertoire jour un répertoire carte_NUM est créer pour chaque nouvelle carte traitée.
Attention il vous faut installer l'outil exiv2 avec un sudo apt-get install exiv2.
#!/bin/bash
#Ensemble de transfert des photos depuis la carte SD vers les repertoire partagé par samba .
# Cet ensemble est fonctionnel mais a revoir.
function transfert() {
echo "debut de la fonction de transfert " >> /home/pi/Images/mon_log
repertoireCarte="/media/card/"
repertoireSamba="/media/share/photographies/"
CARTE=0
NumPhoto=0
ANNEE_1=0
MOIS_1=0
JOUR_1=0
#entrer dans le repertoire de base
cd $repertoireCarte
echo "Liste les images " >> /home/pi/Images/mon_log
find ./* | grep JPG > liste_images.txt
#passer dans le répertoire de stockage
#cd $repertoireSamba
echo "Debut des operations de transfert " >> /home/pi/Images/mon_log
while read ligne
do
#cd $repertoireCarte
echo $ligne >> /home/pi/Images/mon_log
ligne=${ligne:2}
ligne=$repertoireCarte$ligne
echo "Traitement du fichier : "$ligne >>/home/pi/Images/mon_log
exiv2 $ligne | grep timestamp > ./date.txt
cat ./date.txt
ANNEE=$(cut -d':' -f2,1 ./date.txt)
ANNEE=${ANNEE:18:4}
echo "Annee: "$ANNEE >> /home/pi/Images/mon_log
MOIS=$(cut -d':' -f3,1 ./date.txt)
MOIS=${MOIS:17:2}
echo "mois: "$MOIS >> /home/pi/Images/mon_log
JOUR=$(cut -d':' -f4,1 ./date.txt)
JOUR=${JOUR:17:2}
echo "jour: "$JOUR >> /home/pi/Images/mon_log
# rm /home/pi/Images/date.txt
cd $repertoireSamba
if test -d $ANNEE
then
echo "repertoire présent " >> /home/pi/Images/mon_log
else
echo "repertoire absent" >> /home/pi/Images/mon_log
mkdir $ANNEE
chown guest $ANNEE
chgrp guest $ANNEE
fi
cd $ANNEE
if test -d $MOIS
then
echo "repertoire présent">> /home/pi/Images/mon_log
else
echo "repertoire absent" >> /home/pi/Images/mon_log
mkdir $MOIS
chown guest $MOIS
chgrp guest $MOIS
fi
cd $MOIS
if test -d $JOUR
then
echo "repertoire présent">> /home/pi/Images/mon_log
else
echo "repertoire absent" >> /home/pi/Images/mon_log
mkdir $JOUR
chown guest $JOUR
chgrp guest $JOUR
fi
cd $JOUR
echo $ANNEE_1"---"$MOIS_1"---"$JOUR_1
echo $ANNEE"---"$MOIS"---"$JOUR >> /home/pi/Images/mon_log
if [ "$ANNEE" != "$ANNEE_1" ] || [ "$MOIS" != "$MOIS_1" ] || [ "$JOUR" != "$JOUR_1" ];
then
echo "changement de carte" >> /home/pi/Images/mon_log
CARTE=0
ANNEE_1=$ANNEE
MOIS_1=$MOIS
JOUR_1=$JOUR
fi
#A ce stade il faut creer la copie de la photographie
#attention ceci ne doit être fait qu'une seule fois.
if [ "$CARTE" = "0" ];
then
numeroCarte=$(ls -d */ | wc -l)
#echo $numeroCarte >> /home/pi/Images/mon_log
(( numeroCarte = numeroCarte + 1 ))
echo $numeroCarte >> /home/pi/Images/mon_log
mkdir "Carte_"$numeroCarte
chown guest "Carte_"$numeroCarte
chgrp guest "Carte_"$numeroCarte
CARTE=1
fi
#copie du fichier dans le répertoire
(( NumPhoto = NumPhoto +1 ))
cd "Carte_"$numeroCarte
#touch test.txt
echo "transfert des fichiers depuis la carte" >> /home/pi/Images/mon_log
#ligne=${ligne:1}
echo $ligne >> /home/pi/Images/mon_log
mv $ligne ./$JOUR'_'$MOIS'_'$ANNEE'_'$NumPhoto'.jpg'
chown guest ./$JOUR'_'$MOIS'_'$ANNEE'_'$NumPhoto'.jpg'
chgrp guest ./$JOUR'_'$MOIS'_'$ANNEE'_'$NumPhoto'.jpg'
done < /media/card/liste_images.txt
}
echo "ok insere" > /home/pi/Images/mon_log
sudo chown pi /home/pi/Images/mon_log
sudo chgrp pi /home/pi/Images/mon_log
sudo mount /dev/mmcblk0p1 /media/card
echo "MONTE LA CARTE" >> /home/pi/Images/mon_log
#ceci fonctionne
T1=$(mount | grep card)
echo $T1 >> /home/pi/Images/mon_log
if [ "$T1" = "" ]; then
echo "Pas de carte montee" >>/home/pi/Images/mon_log
else
#ici ajouter tout le traitement des images
echo "Copie des données" >> /home/pi/Images/mon_log
transfert
fi
sudo chown pi /home/pi/Images/*
sudo chgrp pi /home/pi/Images/*
sudo umount /dev/mmcblk0p1
echo "DEMONTE LA CARTE" >> /home/pi/Images/mon_log
Remarques : Il faudrait ajouter une LED sur le GPIO pour signaler la fin du traitement de la carte SD.
Mise à disposition des fichiers dans le réseau local.
Utilisation de samba. La configuration de samba est dès plus classique un répertoire partagé nommé /media/share/photographies/ qui sera indiqué dans le script précédent comme variable repertoireSamba
http://www.pihomeserver.fr/2012/12/09/raspberry-pi-home-server-etape-10-installer-samba/
Écouter la radio en ligne.
Mise en place du lecteur Vlc.
Dans le /etc/rc.local il faut ajouter ceci : en attente de modification Dans ce cas j'ai utilisé vlc en serveur sans interface graphique : cvlc -I http. Ceci permet de piloter Vlc depuis un navigateur.
Mise en œuvre de la télécommande IR.
Procédure à suivre :
- installer lirc.
- construire le fichier liant les codes de la télécommande avec les noms des touches.
- affecter les actions, aux différentes touches
Avant toute chose :
sudo apt-get upgrade
sudo apt-get update
Installer lirc
puis installation de lirc pour gérer l'infrarouge :
sudo apt-get install lirc
Configurer quelle est l'entrée du GPIO qui sert à la diode infrarouge, dans le fichier /etc/modules en ajoutant ces deux lignes :
lirc_dev
lirc_rpi gpio_in_pin=23
si la broche Out de votre diode est sur la pin 23 du GPIO.
Puis dans /etc/lirc/hardware.conf il faut effectuer les modification comme ceci (voir fichier).
Puis un reboot de votre raspberry.
Premiers essais
Arrêter le module lirc :
sudo /etc/init.d/lirc stop
Lancer cette commande, qui va vous permettre de voir si votre carte réagit à informations envoyées par la télécommande.
mode2 -d /dev/lirc0
En appuyant sur les touches de votre télécommande, vous verrez les codes s'afficher. Ceci indique que votre ensemble est fonctionnel.
Création du fichier de configuration de votre télécommande
Cette opération va permettre de créer un fichier qui va affecter pour chaque touche le code correspondant.
La liste des touches supportées est obtenue par la commande suivante :
irrecord --list-namespace
La commande suivante va démarrer la procédure. Une fois effectuée vous devez appuyer sur une touche jusqu'à l'apparition de deux lignes d'étoiles. Puis il vous faudra saisir le nom de la touche à configurer, et appuyer dessus.
irrecord -d /dev/lirc0 ~/out.conf
ceci permet de créer le fichier /etc/lirc/lircd.conf avec les options de votre télécommande.
Ensuite il faut créer un fichier /etc/lirc/lircrc qui contient pour chaque touche les commandes à exécuter.
Exemple pour avancer dans la playlist
begin
remote = DENON
prog = irexec
button = KEY_NEXT
config = curl "http://nas:8080/requests/status.xml?command=pl_next"
repeat = 0
end
Note : Penser à installer CURL dans le cas présent pour piloter VLC via le réseau. D'autres solutions plus élégantes sont sans doute possible, n'hésitez pas à m'en faire part.
Mise en œuvre de l'écran tactile.
La mise en œuvre s'est faite an suivant le tutoriel à cette adresse : https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/overview.
Attention : La mise à jour de Raspbian via sudo apt-get update et sudo apt-get upgrade semble mettre à plat l'installation des fichiers nécessaires à l'écran tactile ! D'ou un réinstallation uniquement des paquets suivants :
- libraspberrypi-bin-adafruit.deb
- libraspberrypi-dev-adafruit.deb
- libraspberrypi-doc-adafruit.deb
- libraspberrypi0-adafruit.deb
- raspberrypi-bootloader-adafruit-20140917-1.deb
Si vous n'avez pas supprimé les fichiers la première fois un sudo dpkg -i -B *.deb suffira.
La configuration finale se fera de la sorte :
- affichage de l'écran en position horizontale.
Dans le fichier /etc/modprobe.d/adafruit.conf il faudra préciser la valeur de rotate=0 ou 180 et penser à refaire une calibration avec sudo ./pitft_touch_cal.py
- lancement en automatique de l'interface web de vlc en mode plein écran.
Il s'agit de se passer de toute l'interface de LXDE pour cette application, seul le navigateur midori sera lancé avec comme page html de contrôle a l'adresse monnas:8080/mobile.html . Notons que j'ai du modifier cette page pour supprimer les ascenseurs sur l'écran. En réduisant les marges entre les boutons et au dessus des boutons de contrôle (fichier /usr/share/vlc/lua/http/css/mobile.css). De plus j'ai supprimé l'icône de VLC dans la page mobile.html (fichier /usr/share/vlc/lua/http/mobile.html). Pour le lancement en automatique de midori en plein écran voir cette documentation http://www.framboise314.fr/raspbian-tout-un-tas-de-trucs/#Dmarrer_le_Raspberry_Pi_sur_une_page_web_en_plein_cran et remplacer la dernière ligne par @midori -e Fullscreen -a monnas:8080/mobile.html
- Économiseur d'écran et gestion des Leds de l'écran tactile.
Afin de ne pas devoir supporter un écran allumé en permanence, j'ai opté pour la suppression de l'économiseur d'écran dans mon cas Xscreensaver. Je l'ai remplacé par un script assurant le contrôle des leds de l'écran. Le principe est d'éteindre les leds au démarrage, ce qui entraîne un écran noir, dès que l'on touche la dalle tactile les leds sont rallumées puis éteintes après un bref délai.
Il faut pour ceci effectuer les modifications suivantes : Ajouter les lignes suivantes dans /etc/rc.local, pour gérer la sortie du GPIO dédiée aux leds de l'écran.
#active la sortie pour les leds sudo sh -c "echo 252 > /sys/class/gpio/export" sudo sh -c "echo 'out' > /sys/class/gpio/gpio252/direction" #extinction de l'écran au démarrage. sudo sh -c "echo '0' > /sys/class/gpio/gpio252/value" #script de gestion de l'allumage/extinction de l'écran sudo /home/pi/allumage_ecran.py &
le script "allumage_ecran.py" est indiqué ci-dessous, il nécessite l'installation de python evedev.
#!/usr/bin/python
# -*- coding:utf-8 -*-
from evdev import InputDevice
from select import select
import time
dev = InputDevice('/dev/input/event0')
for event in dev.read_loop():
# Ouverture d'un fichier en *lecture*:
fichier = open("/sys/class/gpio/gpio252/value", "w")
fichier.write("1")
# Fermeture du fichier
fichier.close()
#delai avant extinction
time.sleep(1)
fichier = open("/sys/class/gpio/gpio252/value", "w")
fichier.write("0")
# Fermeture du fichier
fichier.close()
Reste à faire exploiter les quatre boutons en bas de l'écran pour la mise en veille de l'appareil, la réactivation.