From a756856e5cec43c73094fd95f02ad106f8e07d88 Mon Sep 17 00:00:00 2001 From: Kerboul Date: Sun, 27 Apr 2025 19:12:35 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20la=20prise=20en=20charge=20du=20mo?= =?UTF-8?q?de=20headless=20pour=20le=20syst=C3=A8me=20timelapse,=20y=20com?= =?UTF-8?q?pris=20la=20configuration=20des=20variables=20d'environnement,?= =?UTF-8?q?=20l'am=C3=A9lioration=20de=20la=20connexion=20WiFi=20et=20la?= =?UTF-8?q?=20v=C3=A9rification=20de=20l'accessibilit=C3=A9=20de=20la=20ca?= =?UTF-8?q?m=C3=A9ra.=20Cr=C3=A9ation=20d'un=20script=20d'installation=20p?= =?UTF-8?q?our=20les=20d=C3=A9pendances=20n=C3=A9cessaires=20en=20mode=20h?= =?UTF-8?q?eadless.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script.sh | 51 ++++++++++++++++++++++++++-- setup_headless.sh | 80 ++++++++++++++++++++++++++++++++++++++++++++ timelapse.service | 16 ++++++--- timelapse/sensors.py | 10 +++--- 4 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 setup_headless.sh diff --git a/script.sh b/script.sh index a367b4f..782f910 100755 --- a/script.sh +++ b/script.sh @@ -39,7 +39,11 @@ cleanup() { trap 'cleanup 1' INT TERM log "===============================================================" -log "Démarrage du système timelapse" +log "Démarrage du système timelapse (mode headless)" + +# Configuration des variables d'environnement pour mode headless +export LIBCAMERA_LOG_LEVELS=3 +export DISPLAY=:0 # Fonction pour se connecter au WiFi avec plusieurs tentatives connect_wifi() { @@ -47,9 +51,38 @@ connect_wifi() { local password="kingcard" local retries=0 + log "Vérification de l'interface WiFi..." + if ! ip link show | grep -q wlan0; then + log "Interface WiFi non trouvée ou désactivée" + # Essayer d'activer l'interface si elle existe + if ip link show wlan0 &>/dev/null; then + log "Tentative d'activation de wlan0" + ip link set wlan0 up + sleep 2 + fi + fi + while [ $retries -lt $MAX_RETRIES ]; do log "Tentative de connexion WiFi ($((retries+1))/$MAX_RETRIES)" - nmcli dev wifi connect "$ssid" password "$password" + + # Essayer d'abord avec nmcli si disponible + if command -v nmcli >/dev/null 2>&1; then + nmcli dev wifi connect "$ssid" password "$password" + # Sinon essayer avec wpa_supplicant + elif command -v wpa_cli >/dev/null 2>&1; then + # Créer un fichier de configuration wpa_supplicant + wpa_conf="/tmp/wpa_supplicant.conf" + echo "network={" > $wpa_conf + echo " ssid=\"$ssid\"" >> $wpa_conf + echo " psk=\"$password\"" >> $wpa_conf + echo "}" >> $wpa_conf + + # Utiliser wpa_supplicant pour se connecter + wpa_supplicant -i wlan0 -c $wpa_conf -B + sleep 2 + dhclient wlan0 + rm -f $wpa_conf + fi if check_internet; then log "Connexion WiFi établie" @@ -70,6 +103,17 @@ check_internet() { return $? } +# Vérifier si la caméra est accessible +check_camera() { + if libcamera-still --list-cameras &>/dev/null; then + log "Caméra détectée et accessible" + return 0 + else + log "ERREUR: Caméra non détectée ou non accessible" + return 1 + fi +} + # S'assurer que le répertoire de configuration existe mkdir -p "$CONFIG_DIR" @@ -79,6 +123,9 @@ connect_wifi # Vérifier si les chemins Python sont corrects export PYTHONPATH="$BASE_DIR:$PYTHONPATH" +# Vérifier que la caméra est accessible +check_camera + if check_internet; then log "Connecté à internet" diff --git a/setup_headless.sh b/setup_headless.sh new file mode 100644 index 0000000..a3fccd2 --- /dev/null +++ b/setup_headless.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# Script d'installation et de vérification pour le système timelapse en mode headless +# Ce script vérifie et installe toutes les dépendances nécessaires + +echo "======== Configuration du système timelapse en mode headless ========" +echo "Vérification et installation des dépendances..." + +# Fonction pour installer une dépendance si elle n'est pas déjà présente +install_if_missing() { + if ! dpkg -l | grep -q $1; then + echo "Installation de $1..." + sudo apt install -y $1 + else + echo "$1 est déjà installé." + fi +} + +# Mise à jour des dépôts +sudo apt update + +# Installation des dépendances système +install_if_missing python3-pip +install_if_missing python3-dev +install_if_missing i2c-tools +install_if_missing libcamera-dev +install_if_missing python3-picamera2 +install_if_missing python3-libcamera +install_if_missing libopenjp2-7 +install_if_missing libtiff5 + +# Installation des dépendances Python +echo "Installation des dépendances Python..." +pip3 install --upgrade pip +pip3 install smbus2 +pip3 install requests +pip3 install picamera2 +pip3 install pathlib + +# Activation des interfaces requises +echo "Activation de l'interface I2C..." +if ! grep -q "dtparam=i2c_arm=on" /boot/config.txt; then + echo "dtparam=i2c_arm=on" | sudo tee -a /boot/config.txt + echo "I2C activé dans /boot/config.txt" +else + echo "I2C déjà activé." +fi + +echo "Activation de la caméra..." +if ! grep -q "start_x=1" /boot/config.txt; then + echo "start_x=1" | sudo tee -a /boot/config.txt + echo "gpu_mem=128" | sudo tee -a /boot/config.txt + echo "Caméra activée dans /boot/config.txt" +else + echo "Caméra déjà activée." +fi + +# Ajout de l'utilisateur aux groupes nécessaires +echo "Ajout de l'utilisateur aux groupes requis..." +sudo usermod -a -G i2c,video,gpio $USER + +# Installation du service systemd +echo "Installation du service timelapse..." +sudo cp timelapse.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable timelapse.service + +# Création des répertoires nécessaires +echo "Création des répertoires de travail..." +mkdir -p CONFIG +mkdir -p PROJECT + +# Test des périphériques I2C +echo "Test des périphériques I2C (si vous voyez des erreurs, vérifiez les connexions)..." +sudo i2cdetect -y 1 + +echo "======== Configuration terminée ========" +echo "Le système timelapse est prêt à fonctionner en mode headless." +echo "Un redémarrage est recommandé pour appliquer tous les changements:" +echo "sudo reboot" \ No newline at end of file diff --git a/timelapse.service b/timelapse.service index f1448c8..84c99f7 100644 --- a/timelapse.service +++ b/timelapse.service @@ -1,8 +1,11 @@ [Unit] -Description=Service Timelapse Raspberry Pi +Description=Service Timelapse Raspberry Pi (Headless Mode) DefaultDependencies=no -Before=basic.target -After=local-fs.target +After=local-fs.target network-online.target +Wants=network-online.target +Requires=network.target +# S'assurer que le service démarre après l'initialisation complète du réseau +# y compris après que NetworkManager ou systemd-networkd aient essayé d'établir une connexion [Service] Type=simple @@ -13,6 +16,11 @@ Restart=on-failure RestartSec=30 StandardOutput=append:/home/timelapse/Documents/Time_Lapse/timelapse-service.log StandardError=append:/home/timelapse/Documents/Time_Lapse/timelapse-service.log +Environment="DISPLAY=:0" +Environment="XAUTHORITY=/home/timelapse/.Xauthority" +Environment="XDG_RUNTIME_DIR=/run/user/1000" +# Ajouter un petit délai pour s'assurer que les interfaces réseau sont vraiment prêtes +ExecStartPre=/bin/sleep 5 [Install] -WantedBy=sysinit.target \ No newline at end of file +WantedBy=multi-user.target \ No newline at end of file diff --git a/timelapse/sensors.py b/timelapse/sensors.py index a1665c8..e4d0ecd 100644 --- a/timelapse/sensors.py +++ b/timelapse/sensors.py @@ -92,12 +92,14 @@ class Camera: image_path = os.path.join(folder_path, f"{timestamp}.jpg") try: + # Configuration pour mode headless (sans écran) cam = pc.Picamera2() - conf = cam.create_preview_configuration(main={"size": (800, 600)}) - cam.configure(conf) - cam.start_preview(pc.Preview.QTGL) + config = cam.create_still_configuration(main={"size": (800, 600)}) + cam.configure(config) cam.start() - time.sleep(0.1) + # Attente pour stabilisation de l'exposition + time.sleep(2) + # Capture de l'image cam.capture_file(image_path) cam.close()