Projet

[Étape 3] Création d’un Photobooth – Finalisation

Nous avons vu dans les précédents articles de quel matériel nous avions besoin pour créer un photobooth avec un Raspberry, puis nous avons développé le programme pour afficher le retour vidéo, capturer les images et intégrer un flash et un bouton. Dans cet article, nous allons voir comment créer le service qui permettra de démarrer notre programme automatiquement à l’allumage du Raspberry et comment créer un script pour installer automatiquement notre programme.

Création de photobooth.service

Pour que le photobooth démarre automatiquement avec le Raspberry Pi, nous allons créer une unité systemd. Ce fichier décrit le programme à lancer, l’utilisateur qui l’exécutera et le comportement à adopter en cas d’erreur.

[Unit]
Description=PhotoBooth
After=graphical.target
Wants=graphical.target

La section Unit permet de décrire le service, de vérifier des prérequis. nous donnons le nom du service avec Description. After indique que le photobooth doit être lancé après le démarrage de l’environnement graphique. Wants=graphical.target demande à systemd de démarrer également l’environnement graphique qui est nécessaire à notre programme.

[Service]
Type=simple
User=YOUR_USER
Group=YOUR_USER

WorkingDirectory=/home/YOUR_USER/PhotoBooth

Environment=WAYLAND_DISPLAY=wayland-0
Environment=XDG_RUNTIME_DIR=/run/user/YOUR_UID
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /home/YOUR_USER/PhotoBooth/main.py

La section [Service] décrit l’exécution du programme. Avec Type=simple, systemd considère le service comme démarré dès que la commande est lancée. User et Group indiquent le compte système à utiliser. WorkingDirectory définit le dossier depuis lequel le programme s’exécute.

Les lignes Environment ajoutent des variables nécessaires à l’environnement graphique Wayland. PYTHONUNBUFFERED=1 permet notamment d’envoyer les sorties de Python sans attendre qu’elles soient mises en mémoire tampon. Enfin, ExecStart contient la commande qui lance le programme.

Restart=on-failure
RestartSec=5

StandardOutput=journal
StandardError=journal

Avec Restart=on-failure, systemd relance le programme s’il se termine avec une erreur. RestartSec=5 impose une pause de cinq secondes avant cette relance.

Les sorties standard et les erreurs sont envoyées dans le journal système ; on peut les consulter en tapant dans le terminal: journalctl -u photobooth -f.

[Install]
WantedBy=graphical.target

La section [Install] indique que le service doit être associé à graphical.target lorsqu’on l’active.

Maintenant que notre fichier service est prêt, passons à l’installation de notre programme !

Script d’installation du programme

Le script install.sh automatise l’installation du photobooth sur le Raspberry Pi. Il installe les dépendances, copie les fichiers du programme, configure les permissions puis active le service systemd.

#!/bin/bash
set -e

La première ligne indique que le script doit être exécuté avec Bash. set -e lui demande de s’arrêter si une commande échoue, afin de ne pas poursuivre une installation incomplète.

CURRENT_USER=$(logname 2>/dev/null || whoami)
CURRENT_UID=$(id -u "$CURRENT_USER")
INSTALL_DIR="/home/$CURRENT_USER/PhotoBooth"
SERVICE_NAME="photobooth"

Nous définissons ensuite plusieurs variables : le nom de l’utilisateur courant (l. 4), son identifiant numérique (l. 5), le chemin du dossier d’installation (l. 6) et le nom du service (l. 7). Le script utilise ces valeurs pour adapter les chemins et la configuration au Raspberry Pi utilisé.

sudo apt update

sudo apt install -y \
    python3-opencv \
    python3-pygame \
    python3-pil \
    python3-numpy

sudo apt install -y \
    python3-gpiozero \
    python3-lgpio \
    python3-picamera2

La première étape de notre script est d’installer toutes les dépendances pour notre programme. Nous commençons par mettre à jour la liste des paquets disponibles (l. 13), puis nous installons les bibliothèques nécessaires. OpenCV, Pygame, Pillow et NumPy servent au traitement et à l’affichage des images. Les paquets gpiozero, lgpio et picamera2 permettent de gérer les entrées GPIO et la caméra.

sudo mkdir -p "$INSTALL_DIR"
if [ "$(realpath .)" != "$(realpath "$INSTALL_DIR")" ]; then
    sudo cp -r ./* "$INSTALL_DIR/"
else
    echo "    Déjà dans $INSTALL_DIR, copie ignorée."
fi
sudo chown -R "$CURRENT_USER:$CURRENT_USER" "$INSTALL_DIR"

La deuxième étape crée le dossier /home/pi/PhotoBooth (l. 28), puis y copie les fichiers du programme (l. 30). Si le script est déjà exécuté depuis ce dossier, la copie est ignorée. Enfin, les fichiers sont attribués à l’utilisateur courant (l. 34).

sudo usermod -aG video,render,gpio "$CURRENT_USER"
mkdir -p "/home/$CURRENT_USER/photos"

La troisième étape ajoute l’utilisateur aux groupes video, render et gpio, nécessaires à l’accès à la caméra, au rendu graphique et aux broches GPIO (l. 38). Elle crée également le dossier photos, où le programme pourra enregistrer les images (l. 39).

sed \
    -e "s/YOUR_USER/$CURRENT_USER/g" \
    -e "s/YOUR_UID/$CURRENT_UID/g" \
    photobooth.service | sudo tee "/etc/systemd/system/${SERVICE_NAME}.service" > /dev/null
sudo systemctl daemon-reload
sudo systemctl enable "$SERVICE_NAME"
sudo systemctl start  "$SERVICE_NAME"

La dernière étape de notre script configure le service systemd. La commande sed remplace les valeurs YOUR_USER et YOUR_UID du fichier photobooth.service, puis installe le fichier généré dans le dossier des services système (l. 46). daemon-reload demande à systemd de relire sa configuration (l. 47). Enfin, enable active le lancement automatique au démarrage (l. 48) et start lance le service immédiatement (l.49).

Installation du photobooth

Vous pouvez retrouver l’ensemble du programme sur le github de Pymotion.

A partir d’une image de Raspberry PI OS avec le module arducam préalablement installé, exécutez ces commandes

git clone https://github.com/pymotion/Pi-photobooth.git
cd Pi-photobooth
chmod +x install.sh
./install.sh

Une fois l’installation finie, le Photobooth devrait démarrer automatiquement et vous voilà prêt pour prendre de superbes photos.

Florent

Recent Posts

[Étape 2] Création d’un photobooth – Logiciel

Nous avons préparé la semaine dernière toute la partie matérielle du photobooth. Maintenant nous allons…

1 semaine ago

[Étape 1] Création d’un photobooth – Hardware

J'avais il y a quelques années réalisé un photobooth, afin de permettre aux convives de…

2 semaines ago

Conduite autonome : comment détecter les lignes d’une route

Détecter les voies de circulation est une étape incontournable pour la réalisation d’un système de…

4 semaines ago

Installez OpenCV 4 sur macOs

Vous avez commencé un projet de vision par ordinateur ou de traitement d'images ? Alors,…

3 mois ago

Détecter et Lire une plaque d’immatriculation

Dans l’article d’aujourd’hui, nous allons nous intéresser à la lecture des plaques d’immatriculation des voitures.…

3 mois ago

Reconnaissance de caractères: utiliser Tesseract avec OpenCV

Nous avons vu la semaine dernière comment utiliser tesseract dans un invité de commande. Nous…

3 mois ago