Bonjour à tous,
Voici un moyen "simple" pour allumer les leds de la UNO-Q. Je vous propose un tableau ASCII.
Comment encoder un dessin ASCII de LED 13×8 en 4 mots de 32 bits pour matrixWrite() (UNO Q) :
La matrice LED de la UNO Q possède 13 colonnes × 8 lignes = 104 LEDs.
La fonction interne matrixWrite() attend un buffer de 4 mots de 32 bits, soit 128 bits, dont 104 uniquement sont utilisés pour les LEDs.
1/ Structure des 4 mots (128 bits) pour la fonction matrixWrite() :
Voici la répartition des bits dans les 4 mots de 32 bits :
mot 0 – bits 0 à 31 :
bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
mot 1 – bits 32 à 63 :
bit 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48
bit 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
mot 2 – bits 64 à 95 :
bit 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80
bit 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64
mot 3 – bits 96 à 127 :
bit 127 126 125 124 123 122 121 120 119 118 117 116 115 114 113 112
bit 111 110 109 108 107 106 105 104 103 102 101 100 99 98 97 96
Dans le mot 3 les bits 104 à 127 sont inutilisés.
2/ Correspondance physique LED/ index :
Les LEDs sont numérotées ligne par ligne :
- voici les formules utiles à la conversion :
index = y * 13 + x;
mot = index / 32;
bit = index % 32;
3/ Exemple : allumer uniquement la LED 46
LED 46 :
index = 46
x = 46 % 13 = 7
y = 46 / 13 = 3
mot = index / 32 = 1
bit = index % 32 = 14
LED 46 = bit 14 du mot 1
Voici le tableau ASCII qui représente cette LED :
const char *tabLed[8] = {
"_____________", // y=0
"_____________", // y=1
"_____________", // y=2
"_______#_____", // y=3, x=7
"_____________", // y=4
"_____________", // y=5
"_____________", // y=6
"_____________" // y=7
};
4/ Fonction d’encodage ASCII : 4 mots de 32 bits :
Cette fonction transforme un dessin ASCII (8×13, avec "_" = 0 et "#" = 1) en un buffer de 4 × 32 bits compatible avec matrixWrite() :
void encodeAsciiToFrame(const char *ascii[8], uint32_t out[4]) {
out[0] = out[1] = out[2] = out[3] = 0; // mise à 0 des 128 bits
for (int y = 0; y < MATRIX_HEIGHT; y++) {
for (int x = 0; x < MATRIX_WIDTH; x++) {
char c = ascii[y][x];
if (c != '#') continue; // '_' = éteint - reste à ‘0´
int index = y * MATRIX_WIDTH + x; // index 0 à 103
int mot = index / 32; // mot 0 à 3
int bit = index % 32; // bit 0 à 31
out[mot] |= (1u << bit); // mise à 1 du bit correspondant
}
}
}
5/ Programme complet :
extern "C" void matrixWrite(const uint32_t *buf); // on importe la fonction C : matrixWrite()
extern "C" void matrixBegin(); // on importe la fonction C : matrixBegin()
const int MATRIX_WIDTH = 13; // (13 colones de leds)
const int MATRIX_HEIGHT = 8; // (8 lignes de leds )
const char *tabLed[8] = { // tableau ASCII qui sera ransformé
"_____________", // y=0
"_____________", // y=1
"_____________", // y=2
"_______#_____", // y=3, x=7
"_____________", // y=4
"_____________", // y=5
"_____________", // y=6
"_____________" // y=7
};
uint32_t tabMatrix[4]; // Tableau
void encodeAsciiToFrame(const char *ascii[8], uint32_t out[4]) {
out[0] = out[1] = out[2] = out[3] = 0; // on met tous les bits à 0
for (int y = 0; y < MATRIX_HEIGHT; y++) {
for (int x = 0; x < MATRIX_WIDTH; x++) {
char c = ascii[y][x];
if (c != '#') continue; // '_' = éteint - reste à ‘0’
int index = y * MATRIX_WIDTH + x; // 0..103 - on obtient l'index simplement en multipliant le nombre de la colonne par le nombre de colones du tableau ascii plus le nombre de la ligne
int mot = index / 32; // 0..3 - on détermine dans quel mot en divisant l'index par 32
int bit = index % 32; // 0..31 - on détermine le numéro de bit dans le mot avec le modulo 32 de l’index
out[mot] |= (1u << bit); // on met le bit à 1 dans les 32 bits (0 à 31) en effectuant un décalage à gauche du 1 non signé
}
}
}
void setup() {
matrixBegin();
encodeAsciiToFrame(tabLed, tabMatrix);
matrixWrite(tabMatrix);
}
void loop() {
}
–> Du coup il suffit de transformer les “_” par des “#” dans le tableau ASCII pour créer votre dessin de leds.
bonne journée à tous
PS : Bon j’espère avoir été clair mais je n’en suis pas certain
l’algorithme provient de ChatGPT



