Utiliser un Raspberry Pi pour exécuter des taches de manière semi-automatique par QR Codes

Ou Création d’un lecteur et exécuteur de QR Codes pour se faire un assistant personnel

Photo du Rpi3 avec alimentation et module caméra
Un Raspberry Pi 3 + son alimentation 3A + le module Caméra 5Mpx

Le principe est de réaliser une sorte d’assistant personnel mais sans le recours à un assistant personnel vocal afin de ne pas être écouté en permanence par un système (surtout si c’est un système tiers ; quid des données ?)
Le but final est de pouvoir exécuter des actions sans avoir à utiliser de souris et/ou clavier ; juste en présentant un QR Code au Raspberry Pi.

L’idée m’est venu en lisant un article parlant de Qrocodile

Système :
Raspbian “with desktop” ; version de Debian (Linux) adapté aux Raspberry Pi (architecture ARM)

Matériel :
1 Raspberry Pi3 et 1 Module caméra 5Mpx (système sur Clef USB à la place d’une carte µSD)

Installation du système de base (Raspbian) :
Écriture de l’image de raspbian avec etcher

Capture d'écran de l'application Etcher en train d'écrire l'image de Raspbian sur Clef USB
Écriture de l’image de raspbian avec etcher

Premier démarrage et configuration habituelle avec menu « Framboise » puis « Préférences » puis « Configuration … »
(activer SSH et caméra, passer toutes les localisations en Fr, modifier le mot de passe, …)

Mise à jour totale et complète :

sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo reboot

Notes :
sudo = passer en super-utilisateur (administrateur) pour avoir les droits de réaliser les actions
apt-get update = met à jour la liste des paquets disponibles et leurs versions, mais n’installe aucun paquet/logiciel et n’en met aucun à jour. Après avoir mis à jour les listes, le gestionnaire de paquets est informé des mises à jour disponibles pour les logiciels déjà installés et des versions des logiciels installables.
On doit toujours commencer par mettre à jour les listes après l’installation initiale et avant l’installation d’un paquet.
apt-get upgrade installe les nouvelles versions des paquets/logiciels déjà installés ; c’est une mise à jour de tous les paquets installés ; par comparaison avec les listes mises à jour précédemment.
apt-get dist-upgrade met à jour tous les paquets installés vers les dernières versions et installera de nouveaux paquets si nécessaire (un simple « upgrade » n’ajoute pas de nouveaux paquets/logiciels).
L’usage de -y permet de forcer l’action sans avoir à répondre à la question (y pour YES).
Reboot permet de lancer le redémarrage
L’usage de && entre les commandes signifie « une fois que cette action est faite, alors passer à la suivante »

Installation du module caméra :

sudo modprobe bcm2835-v4l2
echo "bcm2835-v4l2" | sudo tee -a /etc/modules

Et vérification du bon fonctionnement :

ls -l /dev/video0

qui donne

crw-rw----+ 1 root video 81, (...) /dev/video0

Note :
Si modprobe n’est pas exécuté, la caméra fonctionne (un essai avec raspistill a été concluant).
Cependant, la commande ls -l /dev/video0 renvoie
ls: impossible d'accéder à '/dev/video0': Aucun fichier ou dossier de ce type
De ce fait, zbarcam ne peut fonctionner, disant
ERROR: zbar processor in _zbar_video_open():
system error: opening video device '/dev/video0': No such file or directory (2)

En effet, comme le dit la documentation (https://linux.die.net/man/1/zbarcam) : « zbarcam scanne une source vidéo video4linux. (…) La valeur par défaut est /dev/video0. »

Installation du programme de lecture des QR code et codes-barres :

sudo apt-get install zbar-tools -y

Vérification de son fonctionnement :

zbarcam --prescale=400x300

Note :
On utilise --prescale=400x300 pour avoir une fenêtre réduite.
Cela améliore le temps de réponse de la caméra et la facilité de lecture.

Le problème réside dans la lecture et l’interprétation des QR Codes.
En effet, le résultat est inactif.

Par exemple, le QR Code créé pour chromium-browser startpage.com/fra
Renvoie cette ligne : QR-Code:chromium-browser startpage.com/fra
Cette ligne apparait dans le terminal qui a lancé la commande zbarcam --prescale=400x300
Conclusion : Le QR Code est donc lu mais ininterprétable … Pfff … Pas Cool …

On va donc forcer zbarcam à :
1 – Écrire dans un fichier temporaire (dans /tmp ; le fichier sera /tmp/zbar.txt)
2 – Le forcer à faire un échappement de ce qui se trouve avant “:”
3 – Toujours interpréter la dernière ligne/commande

Pour se faire, on utilise soit un script python soit un script bash/shell.

–> Afin de rendre ses lauriers à César, je précise que ce script n’est en rien de ma création, mais m’a été offert par Jelopo

Le script est donc très naturellement nommé  … “jelopo.sh” 🙂

On va créer le fichier en faisant
sudo nano jelopo.sh (création en mode console)
ou sudo leafpad jelopo.sh (création en mode graphique)

Et on tape ce code :

#!/bin/bash 
touch /tmp/zbar.txt
while true
do CMD=`tail -1 /tmp/zbar.txt | cut -f 2 -d ":"`
     if [[ $CMD != $LAST_CMD ]]
     then $CMD
     fi 
     LAST_CMD="$CMD"
   sleep 1
done

Note :
Le but de touch /tmp/zbar.txt est de mettre à jour le “timestamp” du fichier, c’est-à-dire la date de dernière modification, mais cela permet également de créer un fichier vide s’il n’existe pas encore.
La commande “tail -1” permet de se limiter la dernière ligne du fichier texte /tmp/zbar.txt
La commande Cut est utilisée pour afficher seulement ce que est écrit après les « : »
La partie $CMD != $LAST_CMD vérifie si les deux informations sont différentes ; c’est un opérateur de comparaison

On vérifie le fonctionnement en lançant le script manuellement dans un terminal

bash jelopo.sh

puis, zbarcam dans un autre terminal

zbarcam --prescale=400x300 | cat > /tmp/zbar.txt

Note :
On a ajouté la redirection vers le fichier temporaire avec la fonction Cat (concaténer en Français)
L’usage de > /tmp/zbar.txt permet de créer le fichier s’il n’existe pas et de remplacer son contenu s’il existe déjà.

On approche un QR-Code …
Zbarcam le détecte en l’encadrant en rouge puis en vert …
Et … cette fois … la commande est exécutée dans le terminal. Yes !

A noter :
Le défaut étant qu’une même commande n’est pas exécutable 2 fois de suite.
Je n’ai pas réussi à contourner ce problème.

Améliorations :
Plutôt que de devoir lancer les 2 scripts, on simplifie la chose avec la création d’un code permettant de lancer les 2 actions.
Hein ? Qui a dit “Fainéant” ?!
Moi, je dis “Rationnalisation” et pas Fainéantise ; na !
En plus, c’est mon avis et je le partage avec mes autres moi.
En plus, je m’en félicite 🙂
Bon, bref …
On crée un fichier que l’on appelle « script-total.sh » pour plus de logique en faisant sudo nano script-total.sh
Puis inscription du code

#!/bin/bash 
zbarcam --prescale=300x300|cat>/tmp/zbar.txt|bash jelopo.sh
done

Il suffit alors de lancer le script dans un terminal avec bash script-total.sh afin de lancer zbarcam mais aussi son script d’interprétation

Ensuite, on améliore encore en lançant de manière automatique le navigateur chromium au démarrage du Raspberry Pi en modifiant la séquence dite « autostart ».
Il suffit de faire sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart pour éditer le fichier
Et d’ajouter la ligne @chromium-browser https://qwant.com

Même si cela n’est pas vraiment utile sur la machine de lecture, j’ai installé « qrencode » (un générateur du QR Codes en ligne de commande). Il suffit de taper

sudo apt-get install qrencode -y
image d'un QR Code demandant d'ouvrir youtube avec Chromium
QR Code demandant d’ouvrir youtube avec Chromium

L’usage de la console est simple.
Par exemple, il suffit de taper qrencode -o youtube.png "chromium-browser youtube.fr" pour créer une image nommée youtube.png qui est un QRcode demandant au navigateur d’aller sur youtube.fr (illustration ci-contre)
On peut spécifier un chemin précis pour le stockage de l’image si besoin en faisant qrencode -o /home/pi/QRcodes/youtube.png "chromium-browser youtube.fr".
(évidemment, j’avais créer le dossier “QRcodes” au sein de l’utilisateur “pi” auparavant)

Autre amélioration :
Tests de démarrage automatique du script « script-total.sh » pour rendre le système totalement indépendant d’un clavier et d’une action humaine réelle.
Dans un but d’apprentissage, je laisse tous mes tests ; ça pourra peut-être aider autrui.

1 – Première solution testée
Mise en action automatique du script au démarrage avec la modification de .bashrc avec sudo nano .bashrc pour y ajouter la ligne /home/pi/script-total.sh

Problème = ne se lance que si on ouvre un terminal en manuel … Donc non utilisable en mode production …

1 bis – Première solution avec modification
Mise en action automatique du script au démarrage avec la modification de .bashrc avec sudo nano .bashrc pour y ajouter la ligne /home/pi/script-total.sh

Et lancement automatique de LXterm en faisant sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart pour éditer le fichier avec ajout de la ligne @lxterminal

Problème = oui, ça fonctionne, mais toute nouvelle fenêtre du terminal ouverte lance zbarcam et est non utilisable sauf à faire « ctrl » et « c » pour reprendre la main.

2 – Seconde solution essayée
Création d’un fichier script-auto.desktop avec sudo nano /usr/share/applications/script-auto.desktop
puis

[Desktop Entry]
Name=script-auto
Exec=/home/pi/script-total.sh
Type=Application
Terminal=false

puis sudo cp /usr/share/applications/script-auto.desktop /etc/xdg/autostart/ afin de créer le même fichier dans le dossier autostart.

Problème = on ne visualise pas ce qui se passe dans le terminal (QR code exécuté ? Erreur ? …)

3 – Troisième solution après des recherches complémentaires
Reprise de l’idée de la solution 1 bis
Puisque la modification du fichier /home/pi/.config/lxsession/LXDE-pi/autostart permet de lancer LXterminal, alors, il suffit de trouver le bon codage pour lui faire executer le script.

En fait, le terminal nous met lui-même sur la piste en nous indiquant l’usage et quelques options.
(Ne pas oublier d’utiliser man lxterminal qui affiche le manuel d’utilisation)
Cette ligne a retenu toute mon attention : --command=STRING Execute the argument to this option inside the terminal

On édite alors le fichier avec sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart puis on ajoute bêtement la ligne @lxterminal –command=’bash /home/pi/script-total.sh’

Problème, la ligne @lxterminal –command=’bash /home/pi/script-total.sh’ fonctionne si elle est tapée dans un terminal … mais … n’est pas executée au démarrage.
Peut-être un problème de droit d’exécution ?!? 😮
Allez ; on teste !

Tentative de solution en faisant sudo chmod +x script-total.sh et en croisant les doigts pendant le redémarrage (je sais, ça ne sert à rien, mais bon ; ça occupe)
Pfff … cela ne fonctionne pas … Snif !
Bon, on casse tout à coups de hache ?
Non !!! Éclair de génie !
On essaye ensuite en modifiant le autostart avec @lxterminal --command="./script-total.sh"

Problème ? Aucun ; cette solution lance bien le script « script-total.sh » exécutant la commande « zbarcam » + le script « jelopo.sh ».
Et l’action est belle et bien visible dans la fenêtre du terminal + nous laisse loisir d’en ouvrir d’autres pour lancer les commandes voulues en manuel.
Bref, je valide et conserve cette méthode qui permet de s’affranchir d’un clavier.

Une autre amélioration a ensuite été de faire un retour sonore pour le cas où le Raspberrt Pi serait utilisé sans écran.
J’ai donc installé un programme connu dans le monde Linux et que j’utilise déjà pour mon système d’alarme : SVOX Pico TTS (TTS signifie Text To Speach).
Installation simple avec :

sudo apt-get install libttspico-utils

Puis création d’une phrase avec pico2wave -l fr-FR -w zbar-actif.wav "... OK ! ZèdBar activé !"
(Pour la bonne prononciation, j’ai utilisé « ZèdBar » et non « Zbar ». J’ai aussi forcé un attente avec « … » pour laisser au Raspberry Pi le temps nécessaire à la mise en lecture)

Le script-total.sh est alors modifié :

#!/bin/bash
omxplayer /home/pi/zbar-actif.wav|zbarcam --prescale=300x300|cat>/tmp/zbar.txt|bash jelopo.sh
done

Pour finir (comment ça, je suis “perfectionniste” ?!?), la dernière partie de ma prise de tête a porté sur la disposition des fenêtres au démarrage.
En effet, il y a une fenêtre de Terminal + la fenêtre de Zbar + le navigateur en ouverture automatique.
L’idée était de pouvoir visualiser les 3 fenêtres sans avoir à y toucher à la main (pas de souris).
Évidemment, cela n’est utile que parce que je bosse avec un écran actuellement 🙂
Après quelques recherches, j’ai trouvé qu’il fallait jouer sur les paramètres de openbox (en modifiant le fichier lxde-pi-rc.xml de openbox qui se trouve dans le dossier caché .config).
Il suffit de faire sudo nano $HOME/.config/openbox/lxde-pi-rc.xml

Dans la partie « applications », vous trouverez cette partie :
(attention, image car le code est en partie interprété par WordPress et donc non visible ici)

Perso, j’y ai ajouté :

(les chiffres en abscisse et ordonnée ont été trouvés à taton sur la petite TV qui me sert d’écran quand je bosse en direct sur le Rpi)

Idées de QR-Code :
– Envoyer un SMS directement sur le portable de sa maman par un enfant qui rentre à la maison
– Lancer un système de vidéosurveillance basé sur Motion en quittant la maison
– Couper le système de vidéosurveillance en rentrant à la maison
– …

A suivre …

A propos de Alban

Papa de 4 enfants étant lui même resté un enfant. Tombé par obligation dans l'informatique à 22 ans pour le boulot et s'étant "un peu" pris au jeu ... Pas un génie de l'informatique (loin de là), mais intéressé et carrément orienté Linux et entraide.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*