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:
51
script.sh
51
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"
|
||||
|
||||
|
||||
80
setup_headless.sh
Normal file
80
setup_headless.sh
Normal 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"
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user