Créer un cadre photo numérique connecté avec un Raspberry Pi

On se souvient tous de l’engouement pour les cadres photo numériques, dont le principe est de faire défiler sur un écran les photos stockées sur une carte mémoire. La principale limitation de ceux-ci est (était ?) qu’ils sont finalement assez « statiques » si on ne prend pas le soin de changer régulièrement le contenu de la carte, d’où le désaveux qu’ils ont fini par subir. C’est pourquoi m’est venu l’idée d’essayer de relancer cette mode tout en m’affranchissant de ce caractère statique.

Principe

L’objectif est d’utiliser un Raspberry et un écran pour lire et afficher de façon aléatoire les photos stockées sur un disque réseau (NAS). Grâce à ce dernier, on peut considérer qu’il n’y a plus de limitation sur le nombre de photos stockées. De plus, si vous avez l’habitude de stocker toutes vos photos sur le NAS, alors vous êtes sûr que les photos affichées seront toujours à jour.

Diaporama des photos du NAS sur le Raspberry
Diaporama des photos du NAS sur le Raspberry

Matériel

  • Un Rapsberry Pi connecté au réseau local
  • Un NAS sur lequel sont stockées les photos
  • Un écran pour le Raspberry

Pour afficher des photos dans un salon, inutile d’avoir un écran 30″ ni du 4K. De nos jours, on trouve facilement des trucs suffisants d’occasion pour moins de 50€. Si vous trouvez ça encore trop cher ou trop gros, vous pouvez toujours utiliser un écran 4,3″ à 22€.

Accéder aux photos depuis le Raspberry

Les photos étant stockées sur le NAS, l’objectif est que le Raspberry y ait accès de façon transparente. Le plus simple est donc de monter le dossier de stockage du NAS en NFS sur le Raspberry. Je vous invite à (re)lire cet article pour mettre en place le montage NFS.

NFS sous Raspbian 8

Pour le montage NFS sur Raspbian 8, je vous invite à consulter mon précédent billet.

Dans la suite, on supposera que les photos sont accessibles depuis le Raspberry dans le dossier /home/pi/Pictures/

Empêcher l’extinction automatique de l’écran

Par défaut, le Raspberry éteint l’écran si aucune activité n’est enregistrée pendant 10 minutes. Il faut donc désactiver cette fonction en modifiant le fichier lightdm.conf :

sudo nano /etc/lightdm/lightdm.conf

Dans celui-ci, il faut alors rechercher la ligne où se trouve [SeatDefaults]. Juste en dessous de ce tag, ajoutez :

xserver-command=X -s 0 -dpms

Installation et paramétrage du diaporama

Pour afficher le diaporama, on va utiliser le programme feh qui peut servir d’afficheur d’images ou de diaporama.

sudo apt-get install feh

feh fonctionne intégralement en ligne de commande. Commencez par créer dans le dossier Pictures/ un fichier Slideshow.sh :

nano Slideshow.sh

et ajoutez-y les lignes suivantes :

#!/bin/bash
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority /usr/bin/feh -q -z -Y -d -Z -r -F -D 7.0 &

Les premières commandes (« DISPLAY=etc » et « XAUTHORITY=etc ») servent à préciser que feh doit être lancé sur l’écran du Raspberry, et non sur le terminal depuis lequel vous êtes connecté au Raspberry.
Les options de feh utilisées ici sont les suivantes :

  • -q : « quiet mode », ne rapporte que les erreurs fatales
  • -z : affiche les photos dans l’ordre aléatoire
  • -Y : cache le pointeur de la souris
  • -d : affiche l’adresse de la photo affichée
  • -Z : zoom automatique sur les photos
  • -r : mode récursif, feh va parcourir tous les sous-dossiers
  • -F : plein écran
  • -D 7.0 : délai de 7s entre les photos

La liste complète (et très longue !) des options disponibles est accessible ici.

La ligne finit par une esperluette (&) pour que la commande soit lancée en tâche de fond (retour du prompt après le lancement).
Comme on a précisé qu’il fallait lancer feh sur l’écran du Raspberry, vous pouvez tester le script en lançant simplement :

bash Slideshow.sh

Pour arrêter le diaporama, il suffit de tuer feh :

killall feh

Génération d’une liste des fichiers JPEG

feh va commencer par chercher toutes photos auxquelles il a accès avant de les afficher. Si ce nombre est trop grand (plus de 20 000 chez moi), alors vous risquez de devoir attendre un moment avant qu’il ne se passe quoi que ce soit. L’idée est donc de commencer par créer un fichier listant l’ensemble des photos, puis de demander à feh de lire ce fichier.

Méthode 1 : génération du listing côté Rpi

On va chercher tous les fichiers contenus dans Pictures/ dont le nom finit par jpg ou jpeg (indépendamment de la casse). Pour ce faire, on peut exécuter la ligne suivante :

find ./ -type f -iname "*.jp*g" > JPEGlist.txt

On va ainsi générer un fichier JPEGlist.txt contenant une liste de chemins absolus vers chaque fichier JPEG contenus dans Pictures/ et ses sous-dossiers.

Ensuite, vous n’avez qu’à rajouter les options suivantes à l’exécution de feh (en plus des précédentes) :

-f JPEGlist.txt

Au début de ce tuto, je vous avais promis que tout était automatique et que les fichiers à afficher devaient être à jour. Pour automatiser la génération du listing, il suffit de créer un petit script avec la commande précédente et de programmer un (ana)cron pour automatiser tout ça.

Méthode 2 : génération du listing côté NAS

Dans la pratique, il est préférable de générer le listing depuis le NAS plutôt que depuis le Raspberry (la tâche sera plus rapide puisqu’elle n’utilisera pas le réseau). On va donc demander au NAS de générer ce listing ; le Raspberry n’aura plus qu’à le lire.

La difficulté réside dans le fait que les chemins vers le fichier ne seront plus les bons : sur mon NAS (Synology Diskstation), les photos sont stockées dans /volume1/photo/, alors que le Raspberry y accède à /home/pi/Pictures/ (adresse du point de montage). Il faut donc supprimer dans le listing tous les « /volume1/photo/ ».

Sur le NAS, on commence donc par créer un nouveau script :

nano listingGen.sh

avec pour contenu :

#!/bin/bash
picFold="/volume1/photo/" # Adresse absolue à supprimer
fileName="JPEGlist.txt"   # Nom du fichier listing
 
filePath="$picFold$fileName"
find $picFold -type f -iname "*.jp*g" | sed 's|'$picFold'||' > $filePath

Ensuite il suffit de programmer son exécution automatique (sur DSM, il y un paquet qui permet de planifier des tâches totalement en graphique).

Note : il est préférable que feh ait le droit d’écriture sur le fichier listing car si une photo est inaccessible, il la supprime de la liste. Depuis le Raspberry, vous pouvez vérifier de quels droits vous disposez sur JPEGlist.txt. Si vous n’avez pas le droit d’écriture, il suffit de rajouter la ligne suivante au script de génération :

chmod 666 $filePath

Filtrer les fichiers image

Pour gérer ma bibliothèque de photos sur le NAS, j’utilise DSM Photo Station. Inconvénient : il génère dans chaque dossier un sous-dossier nommé « @eaDir » contenant les miniatures des photos. Or, je ne veux pas que feh affiche ces miniatures parce qu’en plein écran, c’est carrément moche. Dans mon script précédent, on va donc demander à exclure de la liste les fichiers dont le chemin comporte « @eadir » et on va en profiter pour ignorer les fichiers et dossier cachés. De plus, on va aussi prendre en compte les fichiers PNG. J’obtiens ainsi le script suivant :

#!/bin/bash
picFold="/volume1/photo/"
fileName="JPEGlist.txt"
 
# Filtres inclusifs et exclusifs
inclu="-iname '*.jp*g'  -o -iname '*.png'"
exclu="-path '*@eaDir*' -o -iname '\.*' -o -path '*/\.*'"
 
# Recherche des fichiers avec 'find'
filePath="$picFold$fileName" # Adresse d'enregistrement
filtre="\( $inclu \) ! \( $exclu \)"
cmdFind="find $picFold -type f \( $filtre \)"
 
# Suppression du chemin absolu et enregistrement de la sortie
eval $cmdFind  | sed 's|'$picFold'||' > $filePath
chmod 666 $filePath

Lancement automatique du diaporama au boot du Raspberry

Si tout fonctionne correctement (listing généré et feh qui retrouve bien ses petits), il ne reste plus qu’à demander à ce que Slideshow.sh soit lancé automatiquement au boot de la framboise (un fois l’utilisateur pi loggé en graphique pour être exact).

Pour ce faire, il faut modifier le fichier autostart. Sur Raspbian 8 (Jessie), il se trouve dans .config/lxsession/LXDE-pi/autostart :

nano .config/lxsession/LXDE-pi/autostart

Ajoutez-y avant la ligne @xscreensaver :

@/bin/bash /home/pi/Pictures/Slideshow.sh

Sur les versions plus anciennes de Raspbian, le fichier autostart se trouve dans .config/lxsession/LXDE/

Conclusion

Maintenant, il suffit d’allumer le Raspberry pour voir un diaporama de toutes les photos stockées sur le NAS. Comme celle-ci sont affichées dans l’ordre aléatoire, l’ordre dans lequel elles s’afficheront changera à chaque redémarrage de la framboise. Le fait d’utiliser différents scripts rend votre installation configurable à l’infini : options de feh et filtres sur les fichiers à afficher.