Ou Création d’un lecteur et exécuteur de QR Codes pour se faire un assistant personnel
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
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
pour éditer le fichiersudo nano /home/pi/.config/lxsession/LXDE-pi/autostart
Edit : Suite modification de Stretch, il faut maintenant faire : sudo nano /etc/xdg/lxsession/LXDE-pi/autostart
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
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 …
Rétroliens : Ajout d’un module RTC au Raspberry Pi – TREVILLY.COM
Rétroliens : Lancement automatique d’un script au démarrage – TREVILLY.COM