Raspberry radio+nas

De Centre de Ressources Numériques - Labomedia
Révision de 3 novembre 2016 à 21:20 par Billard fm (discussion | contributions) (Configuration du Raspberry pi avec un disque dur externe.)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
RaspberryPI avec ecran tactile

Exploitation pédagogique d'un Rapsberry.

  1. 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.
  1. É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 :

  1. Raccorder le disque dur à votre PI, vérifier son point de montage avec df
  2. Démonter le disque.
  3. Copier le contenu de la carte avec : sudo dd if=/dev/mmcblk0p2 of=/dev/sda2 bs=512
  4. Modifier /boot/cmdline.txt en remplaçant root=/dev/mmcblk0p2 par root=/dev/sda2
  5. Modifier le /etc/fstab en remplaçant /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 par /dev/sda2 / ext4 defaults,noatime 0 1
  6. É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 :

  1. installer lirc.
  2. construire le fichier liant les codes de la télécommande avec les noms des touches.
  3. 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.