From 1ea8500b82563e9d92fc2f4cfc24c9b00625ebba Mon Sep 17 00:00:00 2001 From: bach Date: Thu, 8 Oct 2026 16:26:33 +0200 Subject: [PATCH] =?UTF-8?q?README=20g=C3=A9n=C3=A9ral=20du=20projet,=20int?= =?UTF-8?q?erface=20web=20dans=20le=20README=20du=20Pi,=20Pillow=20r=C3=A9?= =?UTF-8?q?cente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README.md (racine) : présentation du projet Vitrine pixels, parcours en trois étapes, par où commencer selon le profil, idées clés, sécurité, logiciels, état du projet, pistes pour la matrice 7 × 39, arborescence. - 8x32 PI/README.md : nouvelle partie 10 sur l'interface web (capture d'écran, actions, adresses Wi-Fi / câble, architecture, services, réglages et sécurité) ; parties suivantes renumérotées, dépannage complété. - installer.sh et INSTALLATION_PI.md : installer une Pillow récente dans ~/vitrine-env (la Pillow 8 de Raspbian 11 décodait mal les GIF optimisés). Co-Authored-By: Claude Opus 5.5 --- 8x32 PI/INSTALLATION_PI.md | 6 +- 8x32 PI/README.md | 143 ++++++++++++++-- 8x32 PI/installation/installer.sh | 4 + 8x32 PI/schemas/interface_web.png | Bin 0 -> 89499 bytes README.md | 266 ++++++++++++++++++++++++++++++ 5 files changed, 404 insertions(+), 15 deletions(-) create mode 100644 8x32 PI/schemas/interface_web.png create mode 100644 README.md diff --git a/8x32 PI/INSTALLATION_PI.md b/8x32 PI/INSTALLATION_PI.md index eb13c16..a3fe79c 100644 --- a/8x32 PI/INSTALLATION_PI.md +++ b/8x32 PI/INSTALLATION_PI.md @@ -186,9 +186,13 @@ python3 -m venv --system-site-packages ~/vitrine-env ``` ```bash -~/vitrine-env/bin/pip install rpi_ws281x +~/vitrine-env/bin/pip install rpi_ws281x pillow ``` +(Pillow est aussi installé par `apt`, mais une version **récente** dans la +boîte est indispensable : les anciennes, comme la Pillow 8 de Raspbian 11, +décodent mal certains GIF.) + C'est pour ça qu'on lance ensuite les programmes avec `~/vitrine-env/bin/python` et pas simplement `python3` : seul ce Python-là connaît `rpi_ws281x`. diff --git a/8x32 PI/README.md b/8x32 PI/README.md index cbc68e4..3743197 100644 --- a/8x32 PI/README.md +++ b/8x32 PI/README.md @@ -31,9 +31,10 @@ dessinées dans **Krita** sont jouées telles quelles, sans les traduire en code 7. [Préparer le Raspberry Pi](#7-préparer-le-raspberry-pi) 8. [Premier allumage : le test](#8-premier-allumage--le-test) 9. [Jouer les animations](#9-jouer-les-animations) -10. [Ça ne marche pas ?](#10-ça-ne-marche-pas-) -11. [Petit lexique](#11-petit-lexique) -12. [Les fichiers du dossier](#12-les-fichiers-du-dossier) +10. [L'interface web : piloter la vitrine depuis un navigateur](#10-linterface-web--piloter-la-vitrine-depuis-un-navigateur) +11. [Ça ne marche pas ?](#11-ça-ne-marche-pas-) +12. [Petit lexique](#12-petit-lexique) +13. [Les fichiers du dossier](#13-les-fichiers-du-dossier) --- @@ -381,7 +382,7 @@ puis **Ctrl + O**, **Entrée** (enregistrer) et **Ctrl + X** (quitter). chaîne. **3. Les couleurs pleines** : rouge, vert, bleu, puis blanc. Si le rouge -apparaît vert, l'ordre des couleurs est faux (voir partie 10). +apparaît vert, l'ordre des couleurs est faux (voir partie 11). --- @@ -401,8 +402,9 @@ dans le dossier des animations : | Séquence de PNG | `03_vague/` contenant `vague_0000.png`, `vague_0001.png`… | la vitesse est dans `images_par_seconde.txt` (sinon 12) | | Image fixe | `logo.png` | affichée 10 secondes | -Le dossier lu est **`/boot/firmware/animations`** s'il existe (créé par -l'installation, voir [MODE_VITRINE.md](MODE_VITRINE.md)), sinon le dossier +Le dossier lu est **`/boot/firmware/animations`** (ou **`/boot/animations`** +sur Raspbian 11, comme sur le Pi de l'école) s'il existe : il est créé par +l'installation, voir [MODE_VITRINE.md](MODE_VITRINE.md). Sinon, c'est le dossier [`animations`](animations/) à côté du programme. Il est **relu à chaque tour** : on peut ajouter un GIF pendant que ça tourne. @@ -434,7 +436,116 @@ Une fenêtre s'ouvre avec 256 ronds de couleur qui imitent la matrice. --- -## 10. Ça ne marche pas ? +## 10. L'interface web : piloter la vitrine depuis un navigateur + +Le Pi fait aussi tourner un **petit site web**. Depuis un ordinateur ou un +téléphone connecté au même réseau, on ouvre l'adresse du Pi dans un +navigateur, et on gère la vitrine sans terminal ni carte SD. + +![L'interface web, sur le Pi de l'école](schemas/interface_web.png) + +### Ce qu'on peut faire + +| Action | Comment | +|---|---| +| **Déposer** des GIF, PNG animés, WebP, images fixes | cadre « Un ou plusieurs fichiers » | +| **Déposer une séquence de PNG** exportée de Krita | cadre « Une séquence de PNG » (+ nom et images/s) | +| **Voir un aperçu animé** de chaque animation | il est fabriqué comme le lecteur verra l'image (taille adaptée, rotation) | +| **Changer l'ordre** de lecture | ▲ ▼ (les fichiers sont renumérotés `01_`, `02_`…) | +| **Retirer** une animation de la boucle, sans la supprimer | ⏸ (elle passe dans « Pas jouées ») ; + pour la remettre | +| **Jouer tout de suite** une animation, ou **passer** à la suivante | ▶ et **Suivante ⏭** | +| **Supprimer** | ✕ : elle va à la corbeille ; « Vider » efface pour de bon | +| **Savoir ce que joue la matrice** | en haut de la page, mis à jour toutes les 2 secondes | + +Chaque fichier envoyé est **ouvert et vérifié** avant d'être accepté : un +fichier abîmé ou d'un format inconnu est refusé, une mauvaise taille est +signalée par ⚠. Les noms sont nettoyés (pas d'accents ni d'espaces). + +### L'adresse de la page + +Le Pi de l'école a **deux adresses**, une par réseau. Le réseau Wi-Fi et le +réseau filaire de l'école ne communiquent pas entre eux : prenez celle de +**votre** réseau. + +| Vous êtes connecté… | Adresse | +|---|---| +| en **Wi-Fi** (téléphone, portable) | **http://172.16.50.27** | +| par **câble** | http://172.16.7.199 | + +Ces adresses sont distribuées par le réseau et **peuvent changer** : les +adresses du moment sont toujours écrites **en bas de la page web**, et +`hostname -I` les affiche sur le Pi. + +### Comment c'est construit + +Deux programmes tournent **en même temps**, chacun dans son propre +**service** (un programme que Linux lance au démarrage et relance s'il +s'arrête) : + +``` + téléphone / ordinateur + │ (réseau, page web) + ▼ + serveur_web.py ──── range les fichiers ───▶ /boot/animations/ + service vitrine-web 01_…, 02_…, .desactivees/, .corbeille/ + │ │ + │ « post-it » dans /run/vitrine-pixels/ │ relu à chaque tour + │ (jouer maintenant, suivante, en cours) ▼ + └──────────────────────────────────▶ lecteur.py ──▶ matrice + service vitrine-pixels +``` + +- [`serveur_web.py`](serveur_web.py) est écrit avec **Flask**, une + bibliothèque Python pour fabriquer des sites web. La page elle-même est dans + [`web/page.html`](web/page.html), son style dans [`web/style.css`](web/style.css). +- Le serveur **ne parle jamais à la matrice** : il range les fichiers dans le + dossier des animations, et laisse des « post-it » (de tout petits fichiers, + en mémoire vive) que le lecteur consulte en permanence. Ainsi, une erreur + dans la page web ne peut pas figer la vitrine. +- « Pas jouées » et la corbeille sont des sous-dossiers dont le nom commence + par un point (`.desactivees`, `.corbeille`) : le lecteur les ignore. + +### Démarrer, arrêter, surveiller + +L'installation (`installation/installer.sh`) installe les deux services, et +**active l'interface web** tout de suite. Le lecteur, lui, s'active à la main +une fois la matrice testée (partie 8). + +| Je veux… | Commande (sur le Pi) | +|---|---| +| activer le lecteur au démarrage | `sudo systemctl enable --now vitrine-pixels` | +| savoir si l'interface web tourne | `systemctl status vitrine-web` | +| la relancer (après une modification) | `sudo systemctl restart vitrine-web` | +| voir ses messages et erreurs en direct | `journalctl -u vitrine-web -f` | +| la lancer à la main, pour tester | `sudo systemctl stop vitrine-web` puis `sudo ~/vitrine-env/bin/python serveur_web.py` | + +**Sur son ordinateur**, sans Pi : `python3 serveur_web.py --port 8080`, puis +ouvrir . Avec `python3 lecteur.py --simulateur` dans un +autre terminal, la fenêtre du simulateur réagit aux boutons de la page. +(Il faut Flask : `pip install flask`.) + +### Réglages et sécurité + +En haut de [`serveur_web.py`](serveur_web.py) : + +| Réglage | Valeur | À quoi ça sert | +|---|---|---| +| `MOT_DE_PASSE` | `None` | ⚠️ sans mot de passe, **toute personne sur le réseau** peut ajouter ou supprimer des animations. Ex. `"pixels"` : le navigateur le demandera | +| `PORT` | `80` | le port web habituel ; un autre port s'ajoute à l'adresse (`http://172.16.50.27:8080`) | +| `TAILLE_MAX_MO` | `50` | taille maximum d'un envoi | + +> **Avec la protection contre les coupures de courant** (overlay, voir +> [MODE_VITRINE.md](MODE_VITRINE.md#4-survivre-aux-coupures-de-courant)), si la +> partition de démarrage est protégée en écriture, la page ne peut plus rien +> modifier : elle affiche une erreur, mais « jouer » et « suivante » marchent +> toujours. + +Le mode d'emploi détaillé, pour l'équipe design, est dans +**[INTERFACE_WEB.md](INTERFACE_WEB.md)**. + +--- + +## 11. Ça ne marche pas ? | Symptôme | Causes probables | Solution | |---|---|---| @@ -447,6 +558,8 @@ Une fenêtre s'ouvre avec 256 ronds de couleur qui imitent la matrice. | **`ModuleNotFoundError: rpi_ws281x`** | Mauvais Python | Utiliser `~/vitrine-env/bin/python`, pas `python3` | | | Installation incomplète | Relancer `bash installation/installer.sh` | | **Le simulateur s'ouvre au lieu de la matrice** | Même cause : `rpi_ws281x` introuvable | Idem | +| **La page web ne s'ouvre pas** | Mauvaise adresse pour votre réseau (Wi-Fi ou câble) | Voir partie 10 ; adresses du moment : `hostname -I` | +| **Un GIF s'affiche en morceaux ou avec un fond coloré** | Pillow trop ancienne dans `~/vitrine-env` | `~/vitrine-env/bin/pip install --upgrade pillow`, puis relancer les services | | **Ça marche, puis tout se fige ou scintille quand on branche un casque / lance un son** | La sortie audio utilise le même circuit que GPIO 18 | Vérifier `dtparam=audio=off` dans `/boot/firmware/config.txt`, redémarrer | | **Couleurs aléatoires, scintillement** | Puce absente ou de type HC (sans T) | Vérifier les lettres sur la puce | | | Montage sans puce (solution A) | Baisser encore un peu l'alimentation (4,2 V), raccourcir le fil vert, ou passer à la solution B | @@ -464,7 +577,7 @@ Pour voir ce que fait le lecteur quand il tourne tout seul (mode vitrine) : --- -## 11. Petit lexique +## 12. Petit lexique | Mot | Signification | |---|---| @@ -488,7 +601,7 @@ Pour voir ce que fait le lecteur quand il tourne tout seul (mode vitrine) : --- -## 12. Les fichiers du dossier +## 13. Les fichiers du dossier | Fichier | Pour qui | Contenu | |---|---|---| @@ -505,6 +618,7 @@ Pour voir ce que fait le lecteur quand il tourne tout seul (mode vitrine) : | [`test_matrice.py`](test_matrice.py) | | test de branchement et d'orientation | | [`mes_animations.py`](mes_animations.py) | | les animations de l'Arduino, traduites en Python | | [`animations/`](animations/) | | exemples : GIF, séquence de PNG, APNG | +| [`schemas/`](schemas/) | | schémas de branchement, brochage de la puce, chaîne Krita → matrice, capture de l'interface web | | `apercus/` | design | créé par `verifier_animation.py` : aperçus « façon LED » à partager | | [`krita/palette_vitrine_pixels.gpl`](krita/palette_vitrine_pixels.gpl) | design | palette de couleurs adaptée aux LED, à importer dans Krita | | [`outils/verifier_animation.py`](outils/verifier_animation.py) | design | vérifie un export et crée un aperçu « façon LED » | @@ -516,10 +630,11 @@ Pour voir ce que fait le lecteur quand il tourne tout seul (mode vitrine) : ## Pour aller plus loin -- **La matrice finale 7 × 39** : changez `LARGEUR`, `HAUTEUR` et la fonction - `XY()` dans `matrice.py` ; il faudra une alimentation 5 V de 10 A environ. - Les dessins Krita se feront alors en 39 × 7. +- **La matrice finale 7 × 39** : changez `COLONNES_PANNEAU`, + `LIGNES_PANNEAU` et, si besoin, `ROTATION` dans `matrice.py` ; il faudra une + alimentation 5 V de 10 A environ. - **Plusieurs matrices** : la bibliothèque sait piloter deux chaînes à la fois (GPIO 18 et GPIO 13). -- **Interactivité** : le Pi peut lire un bouton, un capteur de présence, une - page web… et changer d'animation en conséquence. +- **Interactivité** : la page web sait déjà déclencher une animation. Sur le + même principe (un « post-it » pour le lecteur), un bouton ou un capteur de + présence branché sur le Pi pourrait en déclencher une quand quelqu'un passe. diff --git a/8x32 PI/installation/installer.sh b/8x32 PI/installation/installer.sh index cb1d43c..41fc283 100755 --- a/8x32 PI/installation/installer.sh +++ b/8x32 PI/installation/installer.sh @@ -49,6 +49,10 @@ if [ ! -d "$ENV" ]; then python3 -m venv --system-site-packages "$ENV" fi "$ENV/bin/pip" install --upgrade rpi_ws281x +# Une Pillow récente DANS la boîte : celle des systèmes anciens (Pillow 8 sur +# Raspbian 11) décode mal les GIF « optimisés » (images partielles) : le cœur +# n'apparaissait qu'en morceaux sur la matrice. +"$ENV/bin/pip" install --upgrade pillow echo echo "=== 3/5 Désactivation de la sortie audio (elle utilise le même circuit que les LED)" diff --git a/8x32 PI/schemas/interface_web.png b/8x32 PI/schemas/interface_web.png new file mode 100644 index 0000000000000000000000000000000000000000..69cf8b1bbe690b649bbd4aead79afedb7e54b08e GIT binary patch literal 89499 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%0AKuf(~gre<5C%T2wlKI>_)G0qF-`_o5X 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b40b7a --- /dev/null +++ b/README.md @@ -0,0 +1,266 @@ +# Vitrine pixels — l'électronique + +Workshop **« Vitrine pixels »**, ESADHaR, 2026-2027. + +Le but : fabriquer un **écran de pixels lumineux** pour une vitrine, une +matrice de LED de couleur de **7 × 39 pixels**, avec un écart de **1 cm** +entre les pixels. Des étudiantes et étudiants en art y affichent leurs +animations, dessinées dans **Krita** ou écrites en code. + +Ce dossier rassemble tout le volet électronique : montages, programmes, +schémas et modes d'emploi. Il est écrit pour des **débutants** : pas besoin +de savoir souder, programmer ou lire un schéma pour commencer, tout est +expliqué pas à pas, en français. + +![De Krita à la matrice](8x32%20PI/schemas/chaine_krita_matrice.svg) + +--- + +## Sommaire + +1. [Le parcours en trois étapes](#1-le-parcours-en-trois-étapes) +2. [Par où commencer ?](#2-par-où-commencer-) +3. [Les trois dossiers](#3-les-trois-dossiers) +4. [Les idées à retenir](#4-les-idées-à-retenir) +5. [Les règles de sécurité communes](#5-les-règles-de-sécurité-communes) +6. [Les logiciels utilisés](#6-les-logiciels-utilisés) +7. [Où en est le projet ?](#7-où-en-est-le-projet-) +8. [Vers la matrice finale 7 × 39](#8-vers-la-matrice-finale-7--39) +9. [Organisation des fichiers](#9-organisation-des-fichiers) + +--- + +## 1. Le parcours en trois étapes + +On ne construit pas un écran de 273 pixels du premier coup. Le projet avance +par étapes, chacune avec son dossier, sa documentation et son programme : + +| | Dossier | Quoi | Cerveau | On apprend… | +|---|---|---|---|---| +| **1** | [`matrice_3x3/`](matrice_3x3/README.md) | **9 pixels** soudés à la main : LED RGB classiques, transistors, résistances | Arduino Uno | souder, lire un schéma, le **multiplexage** (allumer une ligne à la fois, très vite) | +| **2** | [`matrice_8x32/`](matrice_8x32/README.md) | un panneau souple de **256 LED « intelligentes »** (WS2812B), 5 fils à brancher | Arduino Uno | les LED adressables, la **chaîne** de LED, l'alimentation, dessiner en code | +| **3** | [`8x32 PI/`](8x32%20PI/README.md) | le même panneau, **posé debout**, piloté par un ordinateur | Raspberry Pi | jouer les **animations Krita** telles quelles, une **page web** pour gérer la vitrine, le mode « vitrine » autonome | + +Chaque étape s'appuie sur la précédente : la fonction `XY()` qui retrouve une +LED à partir de sa position, par exemple, apparaît à l'étape 2 en C++ et est +reprise telle quelle, en Python, à l'étape 3. + +--- + +## 2. Par où commencer ? + +| Vous êtes… | Lisez d'abord | Puis | +|---|---|---| +| dans l'**équipe design** (Krita) | [Guide Krita](8x32%20PI/GUIDE_KRITA.md) : dessiner en 8 × 32 pour des LED | [Interface web](8x32%20PI/INTERFACE_WEB.md) : déposer et ordonner vos animations | +| dans l'**équipe électronique** | [Maquette 3 × 3](matrice_3x3/README.md), puis [panneau 8 × 32 avec Arduino](matrice_8x32/README.md) | [Raspberry Pi : montage](8x32%20PI/README.md) et [installation](8x32%20PI/INSTALLATION_PI.md) | +| curieux de **code** | les programmes Arduino [`matrice_3x3.ino`](matrice_3x3/matrice_3x3.ino) et [`matrice_8x32.ino`](matrice_8x32/matrice_8x32.ino), très commentés | [Coder en Python](8x32%20PI/CODER_EN_PYTHON.md) | +| responsable de la **vitrine** | [Mode vitrine](8x32%20PI/MODE_VITRINE.md) : démarrage automatique, coupures de courant, horaires | [Interface web](8x32%20PI/INTERFACE_WEB.md) | + +> **Vous voulez juste mettre une animation en vitrine ?** Exportez-la de +> Krita en GIF de **8 × 32 pixels**, ouvrez **http://172.16.50.27** depuis le +> Wi-Fi de l'école, et déposez-la. C'est tout. + +--- + +## 3. Les trois dossiers + +### Étape 1 — [`matrice_3x3/`](matrice_3x3/README.md) : la maquette multiplexée + +![Implantation de la maquette 3 × 3](matrice_3x3/schemas/implantation_plaque.svg) + +9 LED RGB à cathode commune, soudées sur une plaque à pastilles, et 3 +transistors qui allument les lignes une par une. L'Arduino balaie les 3 lignes +environ 333 fois par seconde : l'œil voit une image fixe. + +- **Mode d'emploi** : [`README.md`](matrice_3x3/README.md) (matériel, + reconnaître les composants, souder pas à pas, dépannage). +- **Programme** : [`matrice_3x3.ino`](matrice_3x3/matrice_3x3.ino), 6 + animations (test des pixels, aplats, chenille, damier, balayages, + scintillement). +- **Schémas** : schéma électrique, plan d'implantation recto-verso, fichier + Fritzing [`matrice_3x3.fzz`](matrice_3x3/matrice_3x3.fzz) ; régénérables par + les scripts du dossier [`outils/`](matrice_3x3/outils/). + +### Étape 2 — [`matrice_8x32/`](matrice_8x32/README.md) : le panneau WS2812B et l'Arduino + +![Branchement du panneau 8 × 32 à l'Arduino](matrice_8x32/schema_branchement.svg) + +Un panneau souple de 256 LED WS2812B : chaque LED contient une puce, et +toutes sont reliées en une seule chaîne. Un seul fil de données suffit. +L'énergie vient d'une alimentation d'établi réglée sur 5 V. + +- **Mode d'emploi** : [`README.md`](matrice_8x32/README.md) (repérer les fils, + régler l'alimentation, brancher, téléverser, vérifier l'orientation). +- **Programme** : [`matrice_8x32.ino`](matrice_8x32/matrice_8x32.ino), avec la + bibliothèque FastLED : arc-en-ciel, pluie, pixel art qui défile, étincelles. + +### Étape 3 — [`8x32 PI/`](8x32%20PI/README.md) : le Raspberry Pi, Krita et la vitrine + +![L'interface web de la vitrine](8x32%20PI/schemas/interface_web.png) + +Le même panneau, posé **debout** (8 de large, 32 de haut), piloté par un +Raspberry Pi. Le Pi sait lire des fichiers : les animations Krita sont jouées +sans conversion, et une **page web** permet de les déposer et de les ordonner +depuis un téléphone. + +| Document | Pour qui | Contenu | +|---|---|---| +| [`README.md`](8x32%20PI/README.md) | électronique | Arduino ou Pi, montage, le problème des 3,3 V, test, interface web, dépannage | +| [`INSTALLATION_PI.md`](8x32%20PI/INSTALLATION_PI.md) | électronique | de la carte SD vide à la matrice allumée | +| [`GUIDE_KRITA.md`](8x32%20PI/GUIDE_KRITA.md) | design | dessiner, animer, exporter et vérifier pour les LED | +| [`INTERFACE_WEB.md`](8x32%20PI/INTERFACE_WEB.md) | tous | la page web : déposer, ordonner, jouer | +| [`MODE_VITRINE.md`](8x32%20PI/MODE_VITRINE.md) | vitrine | démarrage automatique, coupures de courant, horaires, entretien | +| [`CODER_EN_PYTHON.md`](8x32%20PI/CODER_EN_PYTHON.md) | code | Python pour qui connaît l'Arduino, exercices | + +Les programmes : [`lecteur.py`](8x32%20PI/lecteur.py) (joue les animations), +[`serveur_web.py`](8x32%20PI/serveur_web.py) (la page web), +[`matrice.py`](8x32%20PI/matrice.py) (le moteur, avec un **simulateur** pour +travailler sans matériel), [`test_matrice.py`](8x32%20PI/test_matrice.py), +[`mes_animations.py`](8x32%20PI/mes_animations.py), et des outils pour vérifier +un export Krita ou redessiner les schémas. + +--- + +## 4. Les idées à retenir + +**Le multiplexage** (étape 1) : avec peu de fils, on commande beaucoup de LED +en n'allumant qu'**une ligne à la fois**, très vite. L'œil, trop lent, voit +une image fixe : c'est la **persistance rétinienne**. Simple pour 9 pixels, +trop lourd pour 273 (il faudrait 117 fils de couleur et de gros transistors). + +**Les LED adressables** (étapes 2 et 3) : chaque LED a sa puce. On envoie une +longue liste de couleurs dans **un seul fil** ; la 1re LED garde la 1re +couleur et passe le reste à la suivante, et ainsi de suite. Les LED sont +câblées en **serpentin** (une colonne descend, la suivante remonte) : la +fonction `XY()` traduit une position (x, y) en numéro de LED. + +**L'énergie et l'information sont séparées** : l'Arduino ou le Pi envoient +les couleurs, mais l'énergie vient d'une **alimentation** à part. 256 LED en +blanc à fond demandent plus de 15 A ; un port USB en donne 0,5. Le programme +**limite le courant** pour ne jamais dépasser ce que l'alimentation fournit. + +**L'écran et les LED ne voient pas les couleurs pareil** : les couleurs +sombres disparaissent, les couleurs saturées rendent très bien, le noir est +une LED éteinte. Le programme applique une **correction gamma** pour que la +matrice ressemble au dessin de Krita. + +**Microcontrôleur ou ordinateur** : l'Arduino exécute un seul programme, sans +système, et démarre instantanément ; idéal pour apprendre. Le Raspberry Pi +est un vrai ordinateur (Linux, fichiers, réseau) ; idéal pour diffuser les +créations d'une équipe. + +--- + +## 5. Les règles de sécurité communes + +1. **5 volts, pas plus** pour les LED WS2812B. On règle l'alimentation + **avant** de brancher, et on n'y touche plus. +2. **Jamais le 5 V de l'Arduino ou du Pi vers le panneau** : il est alimenté + uniquement par son alimentation. +3. **Toutes les masses (GND) reliées ensemble** : sinon le signal de données + n'est pas compris. +4. **On câble hors tension**, et on fait **vérifier** avant d'allumer. +5. **Jamais de 5 V sur une broche du Raspberry Pi** : elles supportent 3,3 V + au maximum. +6. **Le 230 V** (alimentation fixe de la vitrine) est câblé ou vérifié par une + personne compétente. +7. **Pas plus de 3 flashs par seconde** dans les animations : une vitrine est + vue par tout le monde, y compris des personnes épileptiques. + +En cas de chaleur ou d'odeur de brûlé : **on coupe tout** et on appelle +l'encadrant. + +--- + +## 6. Les logiciels utilisés + +| Logiciel | Pour quoi | Étapes | +|---|---|---| +| [IDE Arduino](https://www.arduino.cc/en/software) | écrire et téléverser les programmes Arduino | 1, 2 | +| Bibliothèques **TimerOne** et **FastLED** | multiplexage par interruption ; pilotage des WS2812B | 1 ; 2 | +| [Krita](https://krita.org) | dessiner et animer en pixel art | 3 | +| [Python 3](https://www.python.org) + **Pillow** | lecteur, outils de vérification, simulateur | 3 | +| **rpi_ws281x**, **Flask** | pilotage des LED par le Pi ; la page web | 3 | +| [Raspberry Pi Imager](https://www.raspberrypi.com/software/) | préparer la carte SD du Pi | 3 | +| [Fritzing](https://fritzing.org) (facultatif) | ouvrir le schéma de la maquette 3 × 3 | 1 | + +Tout est libre et gratuit. + +--- + +## 7. Où en est le projet ? + +*Mis à jour le 8 octobre 2026.* + +- ✅ **Maquette 3 × 3** : programme et documentation prêts. +- ✅ **Panneau 8 × 32 avec Arduino** : programme et documentation prêts. +- ✅ **Raspberry Pi** : un Pi 3 Model B (Raspbian 11) est installé et mis à + jour ; le lecteur, la page web et les exemples y tournent. Adresse Wi-Fi : + **http://172.16.50.27** (câble : 172.16.7.199). L'équipe design y dépose + déjà ses premières animations. +- ✅ **Matrice debout** : tout le logiciel travaille en 8 × 32 (`ROTATION = 90`). +- ⏳ **Premier test sur la vraie matrice** avec le Pi : régler le sens de + l'image (`INVERSER_X` / `INVERSER_Y`) avec `test_matrice.py`, puis activer + le lecteur au démarrage. +- ⏳ **Adaptateur de niveau 74AHCT125** : pas disponible pendant le workshop ; + on utilise le **montage A** (panneau alimenté en 4,4 V) ou le **montage B** + (un transistor). Voir le [README du Pi, partie 4](8x32%20PI/README.md#4-le-problème-des-33-v-et-le-74ahct125). +- ⏳ **Mode vitrine** : protection contre les coupures de courant (overlay), + mot de passe de la page web, adresse fixe à demander au service informatique. + +--- + +## 8. Vers la matrice finale 7 × 39 + +Pistes et décisions à ce jour (le détail technique est dans +[`CLAUDE.md`](CLAUDE.md)) : + +- **LED WS2812B** plutôt que du multiplexage : à 273 pixels, le multiplexage + demanderait 117 fils de couleur, des circuits spécialisés et de gros + transistors, pour une image 7 fois moins lumineuse. +- **Format envisagé** : un panneau 8 × 32 + un panneau 8 × 8, chaînés, au pas + de 10 mm (soit 8 × 40, dont on n'utilise que 7 × 39). La 8e rangée reste + éteinte : on ne la coupe pas, ça casserait la chaîne. +- **Alimentation** : 5 V, environ 10 A, réinjectée à plusieurs endroits de la + chaîne ; limite de courant réglée dans le programme. +- **Cerveau** : le Raspberry Pi de l'étape 3 ; le programme s'adapte en + changeant quelques réglages dans `matrice.py`. +- **À préciser** : sens de pose (couché ou debout) de la matrice finale, + choix définitif des panneaux (ou d'une bande à 100 LED/m). + +--- + +## 9. Organisation des fichiers + +``` +vitrine pixel electronique/ +├── README.md ← ce document +├── CLAUDE.md ← notes techniques du projet (décisions, chiffres clés) +│ +├── matrice_3x3/ ← étape 1 : maquette multiplexée, Arduino +│ ├── README.md +│ ├── matrice_3x3.ino +│ ├── matrice_3x3.fzz (Fritzing) +│ ├── schemas/ schéma électrique, plan d'implantation +│ └── outils/ scripts qui redessinent les schémas +│ +├── matrice_8x32/ ← étape 2 : panneau WS2812B, Arduino +│ ├── README.md +│ ├── matrice_8x32.ino +│ ├── schema_branchement.svg +│ └── photos du panneau +│ +└── 8x32 PI/ ← étape 3 : panneau WS2812B debout, Raspberry Pi + ├── README.md montage, test, interface web, dépannage + ├── INSTALLATION_PI.md GUIDE_KRITA.md INTERFACE_WEB.md + ├── MODE_VITRINE.md CODER_EN_PYTHON.md + ├── matrice.py le moteur (+ simulateur) + ├── lecteur.py joue les animations en boucle + ├── serveur_web.py la page web (+ dossier web/) + ├── test_matrice.py mes_animations.py + ├── animations/ exemples (GIF, APNG, séquence de PNG) + ├── krita/ palette de couleurs pour les LED + ├── outils/ vérifier un export, générer exemples et schémas + ├── schemas/ branchements, brochage, chaîne Krita → matrice + └── installation/ script d'installation et services du Pi +```