Table of Contents
Generale led matrix
Goals
- Plusieurs dalles de matrice de LED “obsolètes” se trouvent à la Générale.
- L'idée serait de les “reverse engineer”, comprendre leur fonctionnement en le documentant.
- Piloter graphiquement ces dalles, sur du matériel type Arduino pour le bas niveau.
Ressources
Etapes
Nous avons une barre de 8 X 160(a verifier) pixels avec une alimentation 5V 20A MeanWell.
Un module indépendant représente l'“intelligence de la carte”, il sera utile pour comprendre quels signaux sont envoyés mais sera inutile car propriétaire et présente peu d'intérêt a reverser comparé l'idée de partir sur notre propre contrôleur.
L'autre module est composé de dalles chainées de 8×32 (a verifier).
Nous allons faire l'analyse d'une de ces dalle en comprenant chaque composant, son mode opératoire comme expliqué dans son datasheet, et la manière dont ils sont reliés entre eux.
En combinant ces deux données, nous pourrons déterminer dans quel ordre et avec quelle donnée que notre microcontroleur doit opérer.
Cela constituera le driver de base du programme.
Analyse du circuit
doc des composants clefs :
Premiers tests
Après avoir débranché la carte de contrôle propriétaire, nous relions une arduino UNO, en logique TTL 5V, donc compatible avec ce vieux circuit.
Quelques indices (sérigraphie, étiquettes) sur le circuit nous indiquent les broches de pilotage “classique” de ce genre de circuit avec des registres a décalage :
CLOCK, DATA et STROBE (se référer au datasheet du registre a décalage plus haut).
Cette partie pilote la partie horizontale de l'affichage (1 seule ligne).
La partie verticale (sélection de la ligne parmis les 8) est faire via 3 broches :
A1, A2, A3
Premier programme de test pour voir si quelque-chose “bouge” à l'affichage (le débug sur panneau de LED est visuel, et se passe d'instrument de mesure en première approche).
#define LINE_ENABLE 2 #define LINE_A3 3 #define LINE_A2 4 #define LINE_A1 5 #define COL_DATA 6 #define COL_CLOCK 7 #define COL_STROBE 8 void setup() { pinMode(LINE_ENABLE, OUTPUT); pinMode(LINE_A3, OUTPUT); pinMode(LINE_A2, OUTPUT); pinMode(LINE_A1, OUTPUT); pinMode(COL_DATA, OUTPUT); pinMode(COL_CLOCK, OUTPUT); pinMode(COL_STROBE, OUTPUT); } void loop() { //digitalWrite(LINE_ENABLE, LOW); digitalWrite(LINE_A3, LOW); digitalWrite(LINE_A2, HIGH); digitalWrite(LINE_A1, HIGH); delay(100); digitalWrite(LINE_A3, LOW); digitalWrite(LINE_A2, HIGH); digitalWrite(LINE_A1, HIGH); //digitalWrite(COL_STROBE, LOW); //delay(1); for (int i = 0; i < 8; i++) { //digitalWrite(COL_CLOCK, LOW); int val = HIGH; //random(2) ? HIGH : LOW; /* if (i > 16) { val = LOW; }**/ //digitalWrite(COL_DATA, val); //digitalWrite(COL_CLOCK, HIGH); delay(50); } //digitalWrite(COL_STROBE, HIGH); //digitalWrite(LINE_ENABLE, HIGH); // Varier le délai affecte position & longueur de la ligne affichée //delay(50); }
Roadmap
- démontage, compréhension du circuit : 80%
- tests des circuit par une arduino : 10%
- trouver une librairie graphique adaptée, ou en faire une
- tests d'affichage
- quelle architecture de plus haut niveau (DMX, Stream, Commandes de Controle, …)
Follow-up
- Project created on Sat 11-04-20 by barzi