Pour ceux qui ont une matrice de LED à cathodes communesVoici les changements à faire dans le programme si votre matrice est à cathodes communes sur les lignes (ou rangées). N'ayant pas ce genre de matrice, je ne pourrai pas tester mais je pense que certains pourront le faire à ma place.
Reprenons la figure 3 et imaginons que nos LED soient inversées (cathodes communes sur les lignes).
Dans ce cas, c'est un niveau bas L (au lieu de H) qu'il faut appliquer à la ligne et un niveau haut H (au lieu de L) qu'il faut appliquer à la colonne pour allumer la LED.
Le balayage se fera toujours sur les lignes, mais avec un niveau LOW et l'affichage de toute la ligne (donc les différentes colonnes) se fera avec un niveau HIGH. Il suffit de changer tout cela dans la fonction affiche(,).
Oui mais dans ce cas, faut-il réécrire les motifs en changeant les 0 en 1 et les 1 en 0 ?
Heureusement non ! D'ailleurs, ce serait assez fastidieux alors que le programme peut s'en charger pour nous grâce à l'opérateur bitwise NOT (noté par un tilda) dont la propriété est d'inverser tous les bits d'une donnée binaire (les 0 sont remplacés par 1 et réciproquement). (voir
https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitwisenot )
Dans le setup, on met les lignes de la matrice à l'état HIGH au lieu de LOW (ligne 180) et les colonnes à l'état LOW au lieu de HIGH (ligne 183).
Dans la fonction affiche(,), à la ligne 194, on commande la ligne par un état LOW et à la ligne 196, on utilise l'opérateur bitwise NOT (le caractère tilda -> Alt Gr 2) ce qui fait que chaque bit du motif est inversé (0 au lieu de 1 et 1 au lieu de 0). Les lignes 199 et 200 sont également changées pour normaliser la matrice en fin de traitement.
Finalement, voici la nouvelle fonction affiche(,) qui doit être mise à la place de l'ancienne dans le programme que vous avez téléchargé :
void affiche(const byte motif[7], const unsigned long duree){
// Réalise l'affichage d'un motif sur la matrice pendant un certain temps (duree)
unsigned long topDuree;
topDuree = millis();
while(millis() - topDuree < duree){
// tant que la durée n'est pas réalisée, on affiche une trame de 7 lignes
for(int ligne=1; ligne<=7; ligne++){
// On met la broche à l'état LOW. N° broche = N° ligne + 7
digitalWrite(ligne+7, LOW);
// On met les colonnes comme il se doit
PORTD = ~motif[ligne-1]; // la première ligne est l'indice 0 du tableau !
delay(3);
// On éteint la ligne avant de passer à la suivante
digitalWrite(ligne+7, HIGH);
PORTD = 0b00000000; // On met les colonnes à l'état LOW
} // fin de boucle for
} // fin du while
} // fin de la fonction affiche
J'espère ne rien avoir oublié. Le montage est exactement le même, donc ceux qui ont une matrice de LED à cathodes communes (peu importe la couleur) vont pouvoir tester et me dire ce qu'il en est...