J’ai eu à réfléchir à un problème d’affichage déporté dans mon lycée. Voici la solution que j’ai trouvé. Je la note ici, aussi bien pour moi, que je puisse m’en rappeler que pour ceux qui souhaiteraient faire la même chose.
Le problème : faire un affichage déporté sur plusieurs écrans : faire afficher des informations sur plusieurs écrans, pilotés par un seul ordinateur. Il faut que la solution soit économique au niveau matériel et au niveau énergétique. Qu’elle soit facile à utiliser pour l’usager et qu’on puisse ajouter autant d’affichage que l’on veut. Il était hors de question de récupérer de vieux postes qui tourneraient en permanence (energivore et nécessité de trouver un local à portée d’écran… pas facile dans un établissement scolaire), ni de tirer des cables VGA à travers l’établissement (perte de qualité, coût prohibitif des cables VGA).
La solution : un serveur partageant une présentation LibreOffice en ubuntu et des clients sur Raspberry Pi qui gère l’affichage sur les écrans. Le tout communiquant par réseau éthernet.
Le matériel nécessaire :
- côté serveur : un vieil ordinateur tournant sous ubuntu. Cet ordinateur n’est allumé que lors des mises à jour du fichier, il ne tourne pas en permanence. Je l’appellerai serveur par la suite, par commodité.
- côté affichage : un écran avec une entrée HDMI, un raspberry pi avec son cable d’alimentation, son cable hdmi, son RJ45. Le tout dupliqué en autant d’écran que l’on veut. Le Raspi est configuré selon les préconisations de la fondation Raspberry Pi. Yaka suivre les instructions – en anglais.
1ère étape : paramétrage du serveur
J’ai paramétré le serveur en suivant la procédure ubuntu pour partager un disque . Lors de l’installation de ubuntu, j’ai créé une petite partition qui se monte en /media/diff-ecran. C’est elle qui sera partagée avec les Raspis.
1) installation des paquets nécessaire pour transformer la machine en serveur
sudo apt-get install nfs-kernel-server nfs-common ssh openssh-server openssh-client
2) modification du fichier /etc/hosts.allow
sudo nano /etc/hosts.allow
ajout de :
portmap: num.ip.ras.pi1, num.ip.ras.pi2, num.ip.ras.pi3, num.ip.ras.pi4, num.ip.ras.pi5
lockd: num.ip.ras.pi1, num.ip.ras.pi2, num.ip.ras.pi3, num.ip.ras.pi4, num.ip.ras.pi5
mountd: num.ip.ras.pi1, num.ip.ras.pi2, num.ip.ras.pi3, num.ip.ras.pi4, num.ip.ras.pi5
rquotad: num.ip.ras.pi1, num.ip.ras.pi2, num.ip.ras.pi3, num.ip.ras.pi4, num.ip.ras.pi5
statd: num.ip.ras.pi1, num.ip.ras.pi2, num.ip.ras.pi3, num.ip.ras.pi4, num.ip.ras.pi5
où, vous l’aurez compris num.ip.ras.pi1 est l’adresse IP du Raspi N°1, etc.
3) modification de /etc/exports
sudo nano /etc/exports
/media/diff-ecran num.ip.ras.pi1(rw,sync) num.ip.ras.pi1(rw,sync) num.ip.ras.pi1(rw,sync) num.ip.ras.pi1(rw,sync) num.ip.ras.pi1(rw,sync)
sudo invoke-rc.d nfs-kernel-server restart
Cette partie est plus délicate, j’ai du pioché différentes solutions pour arriver à mes fins. Prêt ? C’est parti
1) Faire démarrer le raspi en mode Xwindows par défaut
sudo raspi-config
choisir la bonne option pour faire un démarrage de session automatique sans demander le mot de passe
sudo reboot
tester pour voir si tout fonctionne comme attendu.
2) mettre à jour le raspi et installer libreoffice
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
Installer libreOffice pour RasPi en utilisant la boutique de la fondation.
3) mettre le Raspi en IP fixe
Cette étape n’est pas nécessaire, selon le réseau. On peut demander au serveur DHCP d’affecter l’adresse IP voulue au Raspi.
modification du fichier /etc/network/interfaces
sudo nano /etc/network/interfaces
qui doit ressembler à ça au final :
auto lo
iface lo inet loopback
iface eth0 inet static
address num.ip.ras.pi1 #Mettre ici l’adresse
netmask 255.255.xxx.xx #la suite est à renseigner selon le réseau
gateway xxx.xxx.xxx.xxx
broadcast xxx.xxx.xxx.255allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
On reboot
sudo reboot
et on vérifie que l’IP est la bonne :
ifconfig
4) Paramétrer le raspi pour qu’il puisse accéder au serveur
On suit la procédure ubuntu pour partager un disque du côté client ce coup-ci :
création du répertoire d’échange
sudo mkdir /media/partage
puis installation des outils nécessaire à la communication avec le serveur :
sudo apt-get install ssh openssh-server openssh-client nfs-common
On essaie pour voir si ça marche :
sudo mount -t nfs num.ip.du.serveur:/media/diff-ecran /media/partage/
Normalement dans /media/partage, on devrait trouver ce qu’on a déposé sur le serveur dans /media/diff-ecran.
Si c’est le cas, on peut modifier le fichier fstab pour que soit monté automatiquement la partition du serveur au démarrage :
sudo nano /etc/fstab
On ajoute à fstab :
# Montage disque reseau
num.ip.du.serveur:/media/diff-ecran /media/partage/ nfs rw 0 0
Après quoi, on peut rebooter le Raspi pour voir si tout se passe comme prévu au démarrage, c’est à dire que /media/diff-ecran soi du serveur soit vu dans /media/partage du Raspi.
5) Préparer les répertoires du home
Dans le /home/pi on crée un répertoire Presentations et un répertoire Scripts
6) Création des scripts à mettre dans le dossier Scripts
6.a) Script lancement de la présentation StartPrez.sh :
Ce script lance la présentation adiffuser.odp qui sera dans /home/pi/Presentations
#/!/bin/bash
soffice –norestore -show /home/pi/Presentations/adiffuser.odp –display :0.0 &
Ne pas oublier de rendre ce script éxecutable
sudo chmod +x /home/pi/Scripts/StartPrez.sh
6.b) Script lancé au démarrage du RasPi StartUpPrez.sh :
Ce script vérifie que le disque partagé est monté puis compare les 2 fichiers, local et distant. Si le distant est plus récent, il est copié en local
Puis le script lance le show
#/!/bin/bash
if [ -d /media/partage/ -a /media/partage/adiffuser.odp -nt /home/pi/Presentations/adiffuser.odp ];
then
cp /media/partage/adiffuser.odp /home/pi/Presentations/.
fi
/home/pi/Scripts/StartPrez.sh
sudo chmod +x /home/pi/Scripts/StartUpPrez.sh
6.c) Script de mise à jour de la présentation MAJPrez.sh
Ce script vérifie l’existence du disque partagé. S’il n’y est pas, il tente de le monter (au cas où le serveur ait été lancé après que le Pi ait été allumé) puis vérifie s’il y a une mise à jour sur le serveur.
S’il y en a, la mise à jour est copiée, la présentation en cours est arrêtée puis la nouvelle présentation est relancée
#/!/bin/bash
if [ ! -f /media/partage/adiffuser.odp ];
then
sudo mount -a
fi
if [ -f /media/partage/adiffuser.odp -a /media/partage/adiffuser.odp -nt /home/pi/Presentations/adiffuser.odp ];
then
cp /media/partage/adiffuser.odp /home/pi/Presentations/.
pkill -f « oosplash »
pkill -f « soffice.bin »
/home/pi/Scripts/StartPrez.sh
fi
sudo chmod +x /home/pi/Scripts/MAJPrez.sh
7) Paramétrage de lancement des scripts
7.a) lancement au démarrage
On met en place un script qui est lancé au démarrage :
sudo nano /etc/profile.d/StartUpPrez.sh
Dans lequel on met :
#/!/bin/bash
xset s off #ces commandes empêchent le Raspberry Pi de se mettre en veille
xset -dpms
xset s noblank
/home/pi/Scripts/StartUpPrez.sh #lance la présentation
Ne pas oublier
sudo chmod +x /etc/profile.d/StartUpPrez.sh
7.b) lancement automatique du script de mise à jour de la présentation
Il faut éditer la table crontab :
crontab -e
et on ajoute
*/5 * * * * /home/pi/Scripts/MAJPrez.sh
qui permet le lancement du script MAJPrez.sh toutes les 5 minutes – peut être modifié pour que la programmation soit toutes les heures, quotidienne, etc.
Ainsi, au démarrage, le Raspi lance StartUpPrez.sh qui vérifie s’il y a quelque chose de neuf sur le serveur et lance la présentation. Puis toutes les 5 minutes, le Raspi lance MAJPrez.sh qui monte le serveur s’il le faut (cas où le serveur a été allumé après le Raspi), vérifie s’il y a une mise à jour plus récente sur le serveur et la lance le cas échéant.
Normalement à ce niveau tout est fonctionnel et une mise à jour sur le serveur de la présentation implique une mise à jour de la présentation en cours dans les 5 minutes.
3) Dernière étape : on duplique la configuration du Raspi
Sur un ubuntu qui lit les cartes SD, on suit la procédure dd de ubuntu pour copier la carte sd. On fait d’abord une copie de la carte SD bien configurée :
sudo dd if=/dev/mmcblk0 of=path/where/to/save/SaveSDFinal.img bs=1M
où /dec/mmcblk0 est la carte SD, déterminée avec un
sudo fdisk -l
Puis on copie cette image sur une carte SD neuve :
sudo dd if=path/where/to/save/SaveSDFinal.img of=/dev/mmcblk0 bs=1M
Ouf ! Ilne reste plus qu’à faire quelques branchements et vous avez votre solution d’affichage déportée pour le prix d’un écran avec entrée hdmi + une quarantaine d’euros pour les Raspberry Pi.
Il est possible de faire en sorte que chaque Raspi éteigne son écran. Affaire à suivre…