Une webcam à base de Raspberry Pi

Après maintenant plus d’un an en télétravail, et pouvant compter mes jours de présences en agence sur les doigts de mes deux mains (sans avoir à recourir à un changement de base de numération), et à l’heure de l’explosion des communications en visioconférence, ou au minimum en audioconférence, se pose la question de la webcam. Si mon ordinateur professionnel en possède une intégrée, ce n’est en revanche pas le cas de mon ordinateur fixe. Au détour dans mon agrégateur de flux RSS, j’ai vu passer un article évoquant Raspberry Pi et webcam. Trouvant l’idée intrigante: contourner l’utilisation première d’un Pi pour en faire une webcam, je me suis donc lancé dans la réalisation de ce petit projet.

Composants

Côté composants, rien de bien compliqué:

  • Un Raspberry Pi zéro W.
  • Un module image HQ.
  • Un objectif.
  • Une carte microSD.
  • Un câble USB.

Installation

Pour l’installation, que du classique dans le monde du Raspberry Pi. Il suffit de récupérer l’image système dans la partie release du projet showmewebcam sur GitHub, puis de l’écrire sur une carte micro SD avec son logiciel habituel, pour ma part, dd. Il ne reste plus qu’à connecter le module au Pi, insérer la carte et connecter le câble USB en utilisant le port USB de données du Pi (et pas celui d’alimentation, celui situé au milieu du Pi donc), puis à connecter le tout à un ordinateur.

Boîtier

Du côté du boîtier, j’ai trouvé ce modèle 3D plutôt esthétique, que j’ai imprimé en PETG noir. Après impression, petite déception, car l’assemblage nécessite des vis format M2 et/ou M2.5. Mon stock de M3 n’étant d’aucune utilité, j’étais bon pour quelques semaines supplémentaires d’attente pour recevoir quelques modèles de vis compatibles de longueurs variées. Ce qui nous donne au final le panachage suivant :

  • Pi: 3x M2x5.
  • Camera/Pi: 2x M2x8 and 1x M2x6.
  • Case: 4x M2.5×14.

Mise en place

Pour installer la caméra, j’ai modélisé un modèle 3D relativement simple permettant de connecter d’autres pièces provenant d’un modèle de bras articulé. Cela fait l’affaire, même si à l’usage, j’aurais dû mettre plus d’espace au niveau du connecteur. Ce sera pour la version 2.

Les modèles qui composent mon ensemble sont donc les suivants :

Autre mésaventure, après avoir assemblé le boîtier et visser la camera sur le support, j’ai constaté qu’à quelques millimètres près, je ne pouvais plus connecter la caméra, même en utilisant un câble coudé. J’ai donc fait l’acquisition d’un adaptateur 1/4 femelle vers 1/4 mâle pour rehausser la caméra de quelques centimètres.

Résultat

Le résultat est plutôt satisfaisant. La qualité d’image plutôt bonne, même si celle-ci est limitée à du 720p, la limite se situant à priori du côté du traitement des codecs sur le Pi pour espérer voir arriver du 1080p. Évoquons maintenant le sujet qui fâche (un peu) : la latence. La caméra est réactive, mais je crois détecter un léger décalage entre l’image et le son. Il faudrait effectuer le même test avec un Pi 4 à la place du Pi zéro, pour vérifier si la limite provient de la puissance de la plateforme, ou est propre au code utilisé. Raison pour laquelle il ne serait pas inutile de toujours avoir un Pi inutilisé en plus en réserve.

Bref, un projet intéressant à base de Raspberry Pi et qui permet de se familiariser avec les modules caméra du Raspberry Pi.

Sources

RackPi : Mise en place

Ayant fait l’acquisition d’un rack de taille moyenne l’an dernier, dans le but d’organiser et de ranger correctement tous mes appareils informatiques: switch, NAS, routeur, Raspberry Pi, onduleur, je cherchais une bonne manière d’organiser les Raspberry Pi. Après quelques recherches parmi les modèles 3D existants sur Thingiverse et Prusa Printers, j’ai trouvé le projet RackPi: nombreuses photos, documentation plutôt complètes, étapes d’assemblage claires. Il ne restait plus qu’à me lancer dans la construction de mon exemplaire.

Assemblage

Quelques notes concernant l’assemblage. Premièrement, les résistances, celle de 1k ohm est à utiliser avec la led et celle de 10k ohm sert pour le bouton poussoir. Pour les vis, j’utilise du côté des headers, une M2.5 de 14mm de longueur, afin de pouvoir sécuriser par la suite un PoE hat. De l’autre côté, j’ai fait le choix d’une M2.5 de longueur 10mm. Les différents composants sont maintenus en place à coup de pistolet à colle. Étape incontournable avant l’encollage: tester, tester et tester ! C’est du bon sens, mais cela évite de devoir tout démonter après coup. Illustration: dans le deuxième exemplaire que j’ai assemblé, ma partie bouton ne fonctionnait pas et j’ai donc pu en refaire une nouvelle avant de procéder à l’assemblage.

Gros plan sur le circuit du bouton poussoir.

Câblage

En suivant le câblage et en m’aidant du document de référence concernant les GPIO du Raspberry Pi, j’obtiens la configuration suivante.

LED

(+) -> Fil jaune -> Pin 16 -> GPIO 23
(-) -> Fil orange -> Pin 14 -> GROUND

Bouton marche/arrêt

Fil violet -> Pin 39 -> GROUND
Fil bleu -> GLOBAL_EN

Bouton poussoir

Fil violet -> Pin 17 -> POWER 3V3
Fil gris -> Pin 38 -> GPIO 20
Fil blanc -> Pin 25 -> GROUND

Écran

SDA -> Fil vert -> Pin 3 -> GPIO 2
SCL -> Fil jaune -> Pin 5 -> GPIO 3
VCC -> Fil rouge -> Pin 1 -> POWER 3V3
GND -> Fil noir -> Pin 6 -> GROUND

Câblé et prêt à coller.

Configuration du pi

Activation de I2C et SPI via raspi-config:

$ sudo raspi-config
-> Interfacing Options
-> SPI
-> I2C

Installation des dépendances nécessaires:

$ sudo apt-get install python3-pip
$ sudo pip3 install adafruit-circuitpython-ssd1306
$ sudo apt-get install python3-pil
$ sudo apt-get install -y python-smbus
$ sudo apt-get install -y i2c-tools
$ sudo pip3 install psutil

Vérification du câblage de l’écran. Celui-ci doit apparaître à l’adresse 3c.

sudo i2cdetect -y 1

Ensuite, récupération du script d’affichage des informations sur l’écran. Deux URL possibles, celle du fichier sur Thingiverse, ou celle pointant vers le même script dans un dépôt sur Github que je contrôle. De cette manière, je peux m’assurer que le code exécuté et bien celui que j’ai relu et qu’il n’a pas été modifié ultérieurement sur Thingiverse, dans le cas d’une installation ou d’une réinstallation future.

# Utilisation du fichier "officiel".
$ wget https://www.thingiverse.com/download:8343823 -O infoscreen.py
# Utilisation d'une copie du fichier dans un dépôt que je contrôle.
$ wget https://raw.githubusercontent.com/vvision/rack-pi/main/infoscreen.py
$ sudo chmod 755 infoscreen.py

Exécution du script pour vérifier son fonctionnement.

$ sudo python3 infoscreen.py

Afin de s’assurer que le script est lancé automatiquement au démarrage, on modifie rc.local en ajoutant la ligne suivante, juste avant la ligne exit 0, via sudo nano /etc/rc.local et en modifiant le chemin vers l’emplacement du script sur le disque si besoin.

sudo python3 /home/pi/infoscreen.py &

Côté contrôle, un appui simple sur le bouton permet d’allumer l’écran. Un appui d’environ 8s déclenche un redémarrage et au-dessus de 12s, le pi déclenchera un shutdown. En cas d’arrêt, si vous avez câblez le bouton slider sur le pin central EN/GLOBAL_EN de votre pi 3+ ou de votre pi 4, il est possible de couper l’alimentation du pi grâce à ce bouton une fois le pi éteint.

Conclusion

Quelques mots pour terminer. Le résultat est extrêmement satisfaisant, mon Raspberry Pi est maintenant correctement installé dans le rack (ce sera encore mieux dès que j’aurais trouvé des vis auto-taraudantes correctes). L’écran est utile pour avoir l’adresse IP du Pi, surtout dans les premiers moments de mise en place, le temps de configurer une IP statique au niveau du DNS local. Sinon, les informations d’utilisation du CPU et de la RAM sont toujours bonne à prendre lorsqu’on s’interroge sur la charge du Pi, et deviennent donc facilement accessible. Les deux boutons permettant de contrôler extinction, redémarrage et de maintenir éteint le Pi sont également utiles puisque je peux désormais effectuer ces opérations sans avoir à ouvrir une connexion SSH.

En bref, un projet intéressant, qui ne se limite pas à installer quelques lignes de codes, mais permet de pratiquer mes compétences en soudure, de découvrir la partie GPIO des Raspberry PI et au final d’améliorer l’organisation du rack.

Supprimer le dépôt vscode de Microsoft du Raspberry Pi

Début février, un nouveau dépôt est arrivé automatiquement dans l’OS du Raspberry Pi. A chaque déclenchement d’une vérification des mises à jour, une requête part donc vers les serveurs de Microsoft. Tout cela, pour être en mesure d’installer vscode sur votre Pi. Je ne m’étendrai pas sur le sujet du binaire non libre distribué pour un vscode dit « open source », ou encore de la télémétrie activée par défaut.

Allons à l’essentiel, si comme moi, vos Raspberry Pi fonctionnent en mode serveur et que vous souhaitez vous débarrasser de cet ajout inopportun, voici les commandes à exécuter:

sudo rm /etc/apt/sources.list.d/vscode.list
sudo rm /etc/apt/trusted.gpg.d/microsoft.gpg
sudo apt update

Source: Is Microsoft Spying on your Raspberry Pi?

[Pi] Boot depuis un SSD

Ayant fait l’acquisition d’un Pi 4 durant l’été, en vue de migrer mon cloud privé vers la dernière génération de Pi et de disposer d’un peu plus de RAM, je me suis donc intéressé à la manière de faire démarrer le Pi depuis un système stocké sur un disque SSD et non plus simplement sur une carte microSD. Disponible d’abord en version bêta, cette fonctionnalité est désormais accessible par défaut, au prix toutefois de quelques opérations de configuration, en fonction du moment où vous aurez fait l’acquisition du Pi.

De mon côté, la première étape a été la vérification de la version du contenu de la mémoire EEPROM du Pi et sa mise à jour. Pour cela préparation d’une carte microSD avec activation de ssh et configuration du Wifi automatiquement au démarrage. Après que le Pi soit apparu dans la liste des clients connectés à mon LAN, et ayant obtenu ainsi son IP, je m’y connecte donc en ssh. Une fois connecté, je lance une mise à jour du système, puis vérifie le contenu de la mémoire EEPROM, et déclenche sa mise à jour, celle-ci étant trop ancienne pour permettre le mécanisme de boot depuis un disque externe.

sudo apt-get install aptitude
sudo aptitude update
sudo aptitude upgrade
sudo rpi-eeprom-update
sudo rpi-eeprom-update -a
sudo reboot

Voici ci-dessous, ce que j’obtiens après mise à jour. De mémoire, pour bénéficier du boot externe, la valeur de CURRENT, doit à la date où j’écris, valoir 000138a1. En supposant que ceci correspond bien à un numéro de version, une version supérieure devrait faire l’affaire. Nous pouvons également considérer, qu’une date antérieure à celle de la version du 3 septembre 2020, ou plus généralement, une différence entre CURRENT et LATEST, sont des indications suffisantes de procéder à la mise à jour.

BCM2711 detected
VL805 firmware in bootloader EEPROM
BOOTLOADER: up-to-date
CURRENT: Thu 3 Sep 12:11:43 UTC 2020 (1599135103)
LATEST: Thu 3 Sep 12:11:43 UTC 2020 (1599135103)
FW DIR: /lib/firmware/raspberrypi/bootloader/critical
VL805: up-to-date
CURRENT: 000138a1
LATEST: 000138a1

Une fois cela fait, j’ai donc installé la version lite du Raspberry Pi OS (nouveau nom de raspbian si j’ai bien suivi). À noter que n’ayant pas réussi à réaliser l’installation avec l’installeur officiel, ni avec Etcher, je suis revenu à la bonne vieille méthode manuelle en utilisant dd. Une fois mon disque prêt, je le connecte au Pi, branche le Pi et attends de le voir se connecter au Wifi. Ce qu’il ne fera jamais. Après quelques recherches, je découvre qu’il est également nécessaire d’effectuer une modification de configuration pour changer l’ordre de boot. Retour donc de la carte microSD pour effectuer cette opération avec la commande suivante :

sudo -E rpi-eeprom-config --edit

Il faudra alors remplacer la ligne :

BOOT_ORDER=0x1

Par la valeur suivante pour la variable BOOT_ORDER.

BOOT_ORDER=0xf41

Il ne reste plus qu’à redémarrer, retirer la carte microSD, connecter le disque au Pi et le rebrancher. Après quelques minutes d’attente, le Pi apparaît sur mon LAN et quelques instants plus tard, je parviens à m’y connecter en ssh.

Tout est prêt pour la migration !

[Pi] Configuration SSH avant premier démarrage

On prend la même structure que pour la note sur la configuration du Wifi, et on recommence.

Une nouvelle fois, rien de nouveau pour la plupart d’entre nous, mais un moyen pour moi de retrouver facilement la syntaxe de la configuration à utiliser et le lien vers la documentation sur le site officiel.

Pour que le Pi au moment du premier démarrage, active automatiquement un accès SSH, et ne pas avoir à connecter clavier et écran, il suffit donc de créer dans le dossier boot de la carte SD, le fichier ssh. Le contenu du fichier n’a pas d’importance.

Profitons-en pour noter que l’utilisateur par défaut est l’utilisateur pi avec le mot de passe par défaut raspberry. Bien évident, à changer immédiatement lorsque l’on commence à faire autre chose que des tests et du prototypage ou encore que l’on expose le Pi en dehors du LAN.