8x32 PI
This commit is contained in:
Executable
+100
@@ -0,0 +1,100 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# INSTALLATION AUTOMATIQUE sur le Raspberry Pi
|
||||
# Workshop « Vitrine pixels »
|
||||
# =============================================================================
|
||||
#
|
||||
# À lancer SUR LE RASPBERRY PI, depuis le dossier du projet :
|
||||
# bash installation/installer.sh
|
||||
#
|
||||
# Ce script fait, dans l'ordre, tout ce qui est décrit à la main dans
|
||||
# INSTALLATION_PI.md (parties 5 à 8). Chaque étape affiche ce qu'elle fait.
|
||||
# On peut le relancer sans danger : ce qui est déjà fait est ignoré.
|
||||
|
||||
set -e # s'arrêter à la première erreur, au lieu de continuer à l'aveugle
|
||||
|
||||
# Le dossier du projet = le dossier parent de celui qui contient ce script.
|
||||
PROJET="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
ENV="$HOME/vitrine-env" # l'« environnement Python » du projet
|
||||
# La partie « boot » de la carte SD (lisible depuis tout ordinateur) est
|
||||
# montée dans /boot/firmware depuis Raspberry Pi OS 12 « Bookworm »,
|
||||
# et dans /boot sur les systèmes plus anciens (Raspbian 11 « Bullseye »).
|
||||
if [ -f /boot/firmware/config.txt ]; then
|
||||
BOOT=/boot/firmware
|
||||
elif [ -f /boot/config.txt ]; then
|
||||
BOOT=/boot
|
||||
else
|
||||
echo "!!! config.txt introuvable : ce script est prévu pour Raspberry Pi OS."
|
||||
exit 1
|
||||
fi
|
||||
CONFIG=$BOOT/config.txt # le fichier de réglages du Pi
|
||||
ANIMATIONS=$BOOT/animations # les animations, lisibles depuis tout ordinateur
|
||||
|
||||
echo "=== Projet : $PROJET"
|
||||
echo "=== Partition de démarrage : $BOOT"
|
||||
|
||||
echo
|
||||
echo "=== 1/5 Installation des logiciels nécessaires (quelques minutes)"
|
||||
# python3-pil = Pillow (lire les images) ; python3-dev et gcc = pour compiler
|
||||
# la bibliothèque rpi_ws281x, qui parle aux LED.
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y python3-venv python3-pil python3-dev gcc
|
||||
|
||||
echo
|
||||
echo "=== 2/5 Environnement Python dans $ENV"
|
||||
# Un « environnement virtuel » est une boîte où l'on installe les
|
||||
# bibliothèques du projet sans toucher au reste du système.
|
||||
# --system-site-packages : la boîte peut aussi utiliser Pillow installé par apt.
|
||||
if [ ! -d "$ENV" ]; then
|
||||
python3 -m venv --system-site-packages "$ENV"
|
||||
fi
|
||||
"$ENV/bin/pip" install --upgrade rpi_ws281x
|
||||
|
||||
echo
|
||||
echo "=== 3/5 Désactivation de la sortie audio (elle utilise le même circuit que les LED)"
|
||||
if grep -q "^dtparam=audio=on" "$CONFIG"; then
|
||||
sudo sed -i 's/^dtparam=audio=on/dtparam=audio=off/' "$CONFIG"
|
||||
echo " audio désactivé (pris en compte au prochain redémarrage)"
|
||||
REDEMARRER=1
|
||||
else
|
||||
echo " déjà fait"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "=== 4/5 Dossier des animations : $ANIMATIONS"
|
||||
# Il est sur la partie « bootfs » de la carte SD, que Windows, macOS et Linux
|
||||
# savent tous ouvrir : on pourra y copier des GIF depuis n'importe quel ordinateur.
|
||||
sudo mkdir -p "$ANIMATIONS"
|
||||
if [ -z "$(ls -A "$ANIMATIONS")" ]; then
|
||||
sudo cp -r "$PROJET/animations/." "$ANIMATIONS/"
|
||||
echo " exemples copiés"
|
||||
else
|
||||
echo " le dossier contient déjà des animations : on n'y touche pas"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "=== 5/5 Service de démarrage automatique « vitrine-pixels »"
|
||||
# On recopie le modèle de service en remplaçant @PROJET@ et @PYTHON@
|
||||
# par les vrais chemins.
|
||||
sed -e "s|@PROJET@|$PROJET|g" -e "s|@PYTHON@|$ENV/bin/python|g" \
|
||||
"$PROJET/installation/vitrine-pixels.service" \
|
||||
| sudo tee /etc/systemd/system/vitrine-pixels.service > /dev/null
|
||||
sudo systemctl daemon-reload
|
||||
echo " service installé (pas encore activé)"
|
||||
|
||||
echo
|
||||
echo "================================================================"
|
||||
echo " Installation terminée."
|
||||
echo
|
||||
echo " 1. Testez d'abord la matrice :"
|
||||
echo " sudo $ENV/bin/python $PROJET/test_matrice.py"
|
||||
echo " 2. Puis le lecteur :"
|
||||
echo " sudo $ENV/bin/python $PROJET/lecteur.py"
|
||||
echo " 3. Quand tout marche, démarrage automatique à chaque allumage :"
|
||||
echo " sudo systemctl enable --now vitrine-pixels"
|
||||
if [ -n "$REDEMARRER" ]; then
|
||||
echo
|
||||
echo " ⚠ Redémarrez d'abord le Pi (sudo reboot) : le réglage audio"
|
||||
echo " ne sera pris en compte qu'après."
|
||||
fi
|
||||
echo "================================================================"
|
||||
@@ -0,0 +1,34 @@
|
||||
# =============================================================================
|
||||
# Service « vitrine-pixels » : lance lecteur.py à chaque démarrage du Pi
|
||||
# =============================================================================
|
||||
#
|
||||
# Un « service » est un programme que Linux démarre tout seul, relance s'il
|
||||
# plante, et dont il garde le journal. Ce fichier est un MODÈLE :
|
||||
# installation/installer.sh remplace @PROJET@ et @PYTHON@ par les vrais
|
||||
# chemins et le copie dans /etc/systemd/system/.
|
||||
#
|
||||
# Commandes utiles (voir MODE_VITRINE.md) :
|
||||
# sudo systemctl enable --now vitrine-pixels activer + démarrer
|
||||
# sudo systemctl disable --now vitrine-pixels désactiver + arrêter
|
||||
# sudo systemctl restart vitrine-pixels relancer (après un réglage)
|
||||
# systemctl status vitrine-pixels est-ce que ça tourne ?
|
||||
# journalctl -u vitrine-pixels -f voir ce que le lecteur affiche
|
||||
|
||||
[Unit]
|
||||
Description=Vitrine pixels : lecteur d'animations sur la matrice LED
|
||||
After=local-fs.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart="@PYTHON@" "@PROJET@/lecteur.py"
|
||||
WorkingDirectory=@PROJET@
|
||||
# Le lecteur a besoin des droits d'administrateur pour parler aux LED.
|
||||
User=root
|
||||
# S'il s'arrête (erreur, fichier abîmé…), on le relance au bout de 5 s.
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
# Afficher les messages tout de suite dans le journal.
|
||||
Environment=PYTHONUNBUFFERED=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Reference in New Issue
Block a user