Ajout de la prise en charge du mode headless pour le système timelapse, y compris la configuration des variables d'environnement, l'amélioration de la connexion WiFi et la vérification de l'accessibilité de la caméra. Création d'un script d'installation pour les dépendances nécessaires en mode headless.

This commit is contained in:
2025-04-27 19:12:35 +02:00
parent 2013c2cf41
commit a756856e5c
4 changed files with 147 additions and 10 deletions

View File

@@ -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)"
# 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"

80
setup_headless.sh Normal file
View File

@@ -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"

View File

@@ -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
WantedBy=multi-user.target

View File

@@ -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()