Raspberry radio+nas
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.