first 3x3 code

This commit is contained in:
bach
2026-10-07 11:59:07 +02:00
commit 06921fde2f
2 changed files with 634 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# Projet : matrice LED RGB 7 × 39 (Arduino)
## Objectif
Construire une matrice LED RGB de **7 lignes × 39 colonnes** (273 pixels), avec un **pas de 10 mm** entre les centres des LED (grille physique déjà définie).
Le projet avance en deux temps :
1. **Maquette expérimentale 3 × 3** en LED RGB classiques multiplexées (en cours).
2. **Matrice finale 7 × 39**, probablement en LED adressables WS2812B (piste privilégiée, pas encore arrêtée).
## Langue et conventions
- Échanges, commentaires de code et noms de variables en **français**.
- Code Arduino (C++), IDE Arduino. Préciser si on passe à arduino-cli ou PlatformIO.
- Garder le code lisible et pédagogique : c'est aussi un projet d'apprentissage du multiplexage.
---
## Étape 1 : maquette 3 × 3 (multiplexage)
### Matériel
- 1 Arduino (Uno supposé, à confirmer).
- 9 LED RGB **à cathode commune**.
- Transistors **NPN BC337** (ou 2N2222), un par ligne, pour commuter le GND des lignes.
- Kit utilisé : assortiment 10 modèles (A1015, BC327, BC337, C1815, S8050, S8550, 2N2222, 2N2907, 2N3904, 2N3906).
- Éviter C1815 et 2N3904 (courant max trop juste pour une ligne en blanc ≈ 180 mA).
- **Attention au brochage** : BC337 = C-B-E, 2N2222 / S8050 en TO-92 = E-B-C. Vérifier la datasheet.
### Principe
- **12 pins Arduino** : 9 pour les couleurs (3 colonnes × R, G, B), 3 pour les bases des transistors de lignes.
- Balayage ligne par ligne : on éteint toutes les lignes, on écrit les 9 pins couleur de la ligne suivante, on allume cette ligne, on attend ~1 à 3 ms, on recommence.
- Toujours **éteindre les lignes avant de changer les couleurs** (évite les « fantômes »).
### Câblage
- Par ligne : émetteur → GND, collecteur → les 3 cathodes de la ligne, base → pin Arduino via **1 kΩ**.
- Par ligne couleur : pin Arduino → résistance → anodes de cette couleur dans la colonne.
- Rouge ≈ **220 Ω**, vert et bleu ≈ **150 Ω** (≈ 15 mA sous 5 V).
- Logique : pin de ligne HIGH = ligne allumée ; pin couleur HIGH = couleur allumée.
### Affectation des pins (provisoire, à adapter au câblage réel)
| Rôle | Pins |
|---|---|
| Colonne 0 (R, G, B) | 2, 3, 4 |
| Colonne 1 (R, G, B) | 5, 6, 7 |
| Colonne 2 (R, G, B) | 8, 9, 10 |
| Lignes 0, 1, 2 (bases transistors) | 11, 12, 13 |
### Logiciel
- Pas de bibliothèque de matrice dédiée : balayage écrit à la main.
- Bibliothèque **TimerOne** pour rafraîchir par interruption (≈ 1 ms par ligne), afin de laisser `loop()` libre pour les animations.
- Image stockée dans `volatile byte image[3][3]` (bits : 0 = R, 1 = G, 2 = B → 7 couleurs en tout ou rien).
- Étape suivante prévue : **PWM logiciel** dans l'interruption pour mélanger les couleurs (dégradés).
---
## Étape 2 : matrice finale 7 × 39
### Pourquoi pas le multiplexage à cette échelle
- 39 × 3 = 117 lignes couleur → registres à décalage ou drivers (74HC595, TLC5940, STP16CP05).
- Une ligne allumée tire ≈ 2,3 A → MOSFET logic-level nécessaires.
- Luminosité divisée par 7 et PWM lourd pour un Arduino.
### Piste privilégiée : WS2812B
- LED avec puce intégrée, chaînées (DOUT → DIN), **un seul fil de données**.
- Protocole 800 kHz, 24 bits par LED dans l'ordre **GRB**, reset par niveau bas > 50 µs (≥ 280 µs sur versions récentes).
- Bibliothèque : **FastLED** (ou Adafruit NeoPixel).
- Format envisagé : **panneaux flexibles 8 × 32 + 8 × 8** (pas de 10 mm) → matrice 8 × 40, dont on n'utilise que 7 × 39.
- Ne pas couper la 8e ligne : le serpentin suit les colonnes de 8, couper casserait la chaîne. La 8e ligne reste éteinte (masquée ou repliée doucement à l'arrière).
- Rejeté : LED WS2812B individuelles sur PCB rond de 10 mm (se touchent au pas de 10 mm, pas de place pour le câblage).
- Alternative possible : bande à 100 LED/m (pas de 10 mm), à condition que sa largeur soit ≤ 10 mm.
### Chiffres clés
- 320 LED adressées (8 × 40) → 960 octets de RAM sur Uno (2 Ko) : serré, envisager Mega ou ESP32.
- Rafraîchissement ≈ 30 µs par LED → ≈ 10 ms pour tout le panneau.
- Consommation max ≈ 60 mA par LED en blanc plein → limiter par logiciel :
`FastLED.setMaxPowerInVoltsAndMilliamps(5, 4000);`
- Alimentation 5 V externe ≈ 10 A, jamais via le 5 V de l'Arduino.
### Câblage
- Résistance 300 à 500 Ω en série sur la ligne de données.
- Condensateur 1000 µF entre 5 V et GND à l'entrée.
- GND Arduino relié au GND de l'alimentation.
- Réinjecter 5 V / GND à plusieurs endroits de la chaîne.
### Correspondance (x, y) → index (serpentin par colonnes de 8)
```cpp
#define HAUTEUR_PANNEAU 8 // 8 LED physiques par colonne, même si on n'en utilise que 7
int XY(int x, int y) {
if (x % 2 == 0) return x * HAUTEUR_PANNEAU + y; // colonnes paires : vers le bas
else return x * HAUTEUR_PANNEAU + (HAUTEUR_PANNEAU - 1 - y); // colonnes impaires : vers le haut
}
```
Le sens réel est à vérifier sur les flèches imprimées au dos du panneau (départ en haut ou en bas).
---
## À préciser
- Modèle exact d'Arduino.
- Choix définitif pour la version finale (panneaux WS2812B, bande 100 LED/m, ou multiplexage).
- Usage visé de la matrice (texte défilant, animations, interactivité ?).