[TUTORIEL] Matrice de LEDs 8x8

Forum dédié aux produits Seeedstudio

[TUTORIEL] Matrice de LEDs 8x8

Message non lude Laetitia » Jeu 1 Aoû 2013 17:37

Bonjour,

Aujourd'hui nous allons apprendre à afficher une image sur une matrice de LEDs. Celle que nous allons utiliser est une matrice de 8x8, câblée avec les cathodes reliées en colonnes et les anodes reliées en lignes.
L'image que nous allons faire clignoter n'est autre que le nombre 42. Pourquoi 42 ? Parce que c'est La Réponse, voyons ;)

- MATÉRIEL -

- Arduino Uno (x1)
- Matrice de LEDs 8x8 (x1)
- Résistances 1 KOhms (x8)

- SCHÉMA DU MONTAGE -

Schéma_42.png
Schéma_42.png (116.47 Kio) Vu 9646 fois

Précisions sur le choix de la résistance

Le courant maximum passant (peu importe le sens) par chaque broche de l'Arduino ne doit pas excéder 40 mA. Chaque colonne ou ligne reliée à chaque broche alimentant 8 LEDs, le courant maximal pour chaque LED doit être d'un huitième de 40 mA, soit 5 mA. Chaque LED dans une matrice de LEDs rouges classique a une tension directe (notée Vf) d'environ 1.8 V. En calculant la résistance nécessaire avec Vf = 1.8V et une tension d'alimentation de 5V, on trouve une valeur de 680 Ohms. Vérifiez bien sur la datasheet les valeurs de Vf correspondant à votre matrice.
N'ayant pas de résistance de 680 Ohms sous la main, j'ai pris celle dont je disposais qui avait la valeur directement supérieure, soit 1 KOhms : mieux vaut trop que pas assez :mrgreen:

Le schéma sous Fritzing étant un poil indigeste, je vous laisse le schéma technique pour savoir à quelle pin correspond quelle colonne/ligne :

schema_matrice.png
schema_matrice.png (34.43 Kio) Vu 12958 fois
pinout_matrice.png
pinout_matrice.png (31.67 Kio) Vu 12958 fois

- EXPLICATIONS -

Chaque LED de la matrice ne peut avoir que deux états (éteinte ou allumée), tout comme un bit ('0' ou '1').
Partant de ce principe, il nous faut trouver un moyen de faire correspondre des bits à une commande (HIGH ou LOW) sur les LEDs. Nous allons pour cela nous servir d'un tableau d'octets (1 octet = 8 bits, correspondant à 8 LEDs, soit une ligne sur la matrice) dans lequel nous allons stocker, ligne par ligne, l'état souhaité des LEDs. Une fois la carte dessinée (littéralement, car il s'agit de "bitmapping"), il nous faut traiter les données pour les envoyer vers la matrice.
Revenons un peu sur le fonctionnement de celle-ci :

Arduino a écrit:Pour contrôler une matrice, connectez ses lignes ainsi que ses colonnes à votre microcontrôleur.
Les colonnes sont connectées aux cathodes (-) des LEDs, donc une colonne doit être mise à l'état BAS pour pouvoir allumer une LED dans celle-ci. Les lignes sont connectées aux anodes (+) des LEDs, donc une ligne doit être mise à l'état HAUT pour que la LED concernée s'allume. Si la ligne et la colonne sont toutes les deux à l'état BAS ou HAUT, aucun courant ne traverse la LED et elle ne s'allume pas.

Pour contrôler une LED individuellement, on met sa colonne à l'état BAS et sa ligne à l'état HAUT.
Pour contrôler plusieurs LEDs sur une même ligne, il faut mettre celle-ci à l'état HAUT, puis la colonne à l'état HAUT, et enfin activer les lignes appropriées : une ligne à l'état BAS allumera la LED correspondante, une autre à l'état HAUT l'éteindra.

Même s'il existe des matrices préfabriquées, vous pouvez aussi construire la vôtre avec 64 LEDs, en utilisant le schéma ci-dessus.
Vous pouvez brancher les lignes et les colonnes à n'importe quelles pins du microcontrôleur, puisque vous les paramétrez dans le code.

Nous savons maintenant comment afficher des données. Reste à les envoyer correctement.

Dans notre algorithme, chaque octet va être lu du bit de poids faible vers le bit de poids fort (de la droite vers la gauche), or nos colonnes sont numérotées dans le sens inverse. Lorsque l'image est symétrique ça ne pose pas de problème mais dans le cas présent ça pose problème pour la lecture...

Pour faire correspondre le bit le plus à gauche à la colonne la plus à gauche, il suffit d'une simple astuce mathématique : en calculant 7 - [poids du bit], on obtient le bon numéro de colonne !

Regardons ça d'un peu plus près : le poids du bit correspond à l'indice du tableau. Lorsqu'on est sur la première itération (col = 0), soit le bit le plus à droite, on calcule 7 - 0 = 7 , soit la colonne la plus à droite. Sur la deuxième, on a 7 - 1 = 6, soit la deuxième colonne... et ainsi de suite jusqu'à la dernière : 7 - 7 = 0, et on se retrouve bien tout à gauche.
Pourquoi 7 et pas 8 ? Parce que les électroniciens commencent toujours à compter à partir de 0 :)

Précisions sur la déclaration des variables

Les pins analogiques de l'Arduino peuvent être utilisées de la même manière que les pins digitales, numérotées de D14 à D19 respectivement pour les pins A0 à A5.

- CODE -

Code: Tout sélectionner
/*
  Tutoriel : Matrice de LEDs 8x8
  Affichage d'une image personnalisée (clignotement du nombre 42)
*/

// Déclaration du tableau définissant l'image
// Un bit à '0' correspont à une LED éteinte, un bit à '1' à une LED allumée
byte fortyTwo[] =
{
  B00000000,
  B00100000,
  B01100111,
  B10100001,
  B11110111,
  B00100100,
  B00000111,
  B00000000,
};

// Déclaration des pins utilisées pour le branchement de la matrice
const int columnPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int rowPins[] = {10, 11, 12, 15, 16, 17, 18, 19};

void setup()
{
  // Utilisation d'une boucle for pour optimiser l'initialisation
  for (int i = 0; i < 8; i++)
  {
    pinMode(rowPins[i], OUTPUT);        // lignes en sorties
    pinMode(columnPins[i], OUTPUT);     // colonnes en sorties
   
    /* Optionnel - permet d'éviter un "scintillement" au démarrage du programme
    digitalWrite(columnPins[i], HIGH);  // déconnexion des cathodes de la masse
    */
  }
}

void loop()
{
  // Délai entre deux affichages
  int tempo = 250 ;
  // Afficher le nombre pendant une seconde
  aff(fortyTwo, 1000);
  // ne rien afficher pendant la temporisation définie
  delay(tempo);
}

// Sous-routine pour la commande des LEDs à partir des données du tableau
// Elle s'affiche pendant la durée donnée en second paramètre
void aff(byte * image, unsigned long duree)
{
  // On note le moment où l'on commence
 unsigned long debut = millis();
 // On joue la boucle tant qu'on n'a pas atteint la durée souhaitée
 while (debut + duree > millis())
  {
    // Première itération (boucle for) sur les lignes
    for(int row = 0; row < 8; row++)
    {
      // Connexion de la ligne au +5V
      digitalWrite(rowPins[row], HIGH);
      // Seconde itération sur les colonnes
      for(int col = 0; col < 8; col++)
      {
        // Miroir sur le poids du bit pour avoir le bon numéro de colonne
        int situ = 7 - col;
        // Lecture du bit concerné
        boolean pixel = bitRead(image[row],col);
        // S'il est à un...
        if(pixel == 1)
        {
          // ...on connecte la colonne concernée à la masse pour allumer la LED
          digitalWrite(columnPins[situ], LOW);
        }
        // On attend un peu entre chaque LED (délai total ~20ms pour 64 LEDs)
        delayMicroseconds(300);
        // Et on déconnecte la colonne de la masse...
        digitalWrite(columnPins[situ], HIGH);
      }
      // ...puis la ligne de l'alimentation
      digitalWrite(rowPins[row], LOW);
    }
  }
}

Et voilà, vous savez maintenant vous servir d'une matrice de LEDs avec un Arduino !
Le "42" n'était qu'un exemple et vous pouvez désormais designer vos propres images, faire défiler un point sur la matrice en fonction des données d'un capteur...

Il existe également plusieurs possibilités d'optimisation : vous pouvez passer par un registre à décalage ou un composant comme le MAX7219 ou le MAX7221 (des tutoriels sont dispo sur le Playground Arduino) pour piloter votre matrice en utilisant moins de pins, voire en rajouter d'autres à la suite pour faire des petits écrans à pixels 8-)

C'est tout pour aujourd'hui, j'espère que ce tutoriel vous aura plu, et bonne bidouille en attendant le prochain !
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: [TUTORIEL] Matrice de LEDs 8x8

Message non lude Gilles8700 » Sam 21 Mar 2015 16:25

Bonjour,
ça ne marche pas,chez moi j'ai toute la matrice qui s'allume lol !
Gilles8700
 
Messages: 1
Inscription: Sam 21 Mar 2015 16:18

Re: [TUTORIEL] Matrice de LEDs 8x8

Message non lude Laetitia » Mer 8 Avr 2015 13:48

Bonjour,

J'ai repris le schéma du montage, avec seulement deux couleurs de fils c'était un peu difficile de s'y retrouver. C'est toujours aussi brouillon mais on voit mieux à quelles pins de l'Arduino sont branchées celles de la matrice ;)
Je l'ai testé avec le code donné en exemple, tout fonctionne comme prévu.
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: [TUTORIEL] Matrice de LEDs 8x8

Message non lude creecreeps » Ven 25 Sep 2015 18:45

Bonjour, et merci pour ce tutoriel détaillé !
J'ai malheureusement un petit problème :/ Le numéro 42 clignote correctement, mais la plupart des leds éclaire de manière très faible. Seulement les leds 1-4, 1-5, 7-3, 7-5 et 7-7 sont éclairées selon moi de manière normale.
(Pour les leds, j'indique les coordonné COL puis ROW, j’espère que c'était assez claire)
Encore merci pour ce tuto :D
creecreeps
 
Messages: 1
Inscription: Ven 25 Sep 2015 18:37

Re: [TUTORIEL] Matrice de LEDs 8x8

Message non lude Laetitia » Mer 21 Oct 2015 16:20

Bonjour,

Il n'y a pas de raison pour que l'intensité lumineuse soit différente d'une LED à l'autre... avez-vous bien fait attention aux valeurs des résistances ? Suivant la matrice que vous utilisez les valeurs ne correspondent pas forcément à celle du tutoriel...
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: [TUTORIEL] Matrice de LEDs 8x8

Message non lude Deguich » Lun 3 Avr 2017 09:49

Bonjour,

Le sujet est ancien mais une précision s'impose sur la gestion de la luminosité et il me semble aussi qu'une erreur s'est glissée dans le commentaire de Mr Arduino !

1) Si le schéma pinout_matrice.png juste au dessus du commentaire est correcte, les colonnes sont connectées aux cathodes ( c'est le - pas le +) des leds donc une colonne doit être mise à l'état BAS pour pouvoir allumer une led dans celle-ci. Et à l'inverse, les lignes sont connectées aux anodes (le +), donc une ligne doit être mise à l'état HAUT pour que la led s'allume.

2) Autre point, le fait d'allumer les led les une après les autres comme dans le programme proposé provoque la différence de luminosité car elle ne sont pas toutes allumées sur la même durée. Il faudrait plutôt mettre à LOW les colonnes qui doivent s'allumer. puis mettre la ligne à HIGH afin que les huit leds de la ligne soient allumée en même temps. Attendre quelque millisecondes puis éteindre toute la ligne pour passer à la suivante. Actuellement, le programme fait ceci, allumage de l'alimentation de la ligne puis allumage d'une colonne puis une autre puis une autre ... puis extinction de la ligne. La première led allumée aura eu quelques millisecondes de plus et paraitra plus lumineuse.
Deguich
 
Messages: 1
Inscription: Lun 3 Avr 2017 08:33

Re: [TUTORIEL] Matrice de LEDs 8x8

Message non lude Laetitia » Jeu 6 Avr 2017 14:21

Bonjour,

Deguich a écrit:1) Si le schéma pinout_matrice.png juste au dessus du commentaire est correcte, les colonnes sont connectées aux cathodes ( c'est le - pas le +) des leds donc une colonne doit être mise à l'état BAS pour pouvoir allumer une led dans celle-ci. Et à l'inverse, les lignes sont connectées aux anodes (le +), donc une ligne doit être mise à l'état HAUT pour que la led s'allume.

En effet ! Erreur corrigée :)

Deguich a écrit:2) Autre point, le fait d'allumer les led les unes après les autres comme dans le programme proposé provoque la différence de luminosité car elle ne sont pas toutes allumées sur la même durée.

Oui, je l'avais remarqué lors de la rédaction de ce tutoriel mais je n'ai pas souhaité m'étendre sur le sujet, le but étant simplement de faire comprendre le fonctionnement d'une matrice de LEDs. Si besoin est je pourrai rédiger une mise à jour du tutoriel avec un code prenant en compte les contraintes de luminosité mais il me semble que ça complique un peu la compréhension pour un débutant...

Merci des retours et corrections !
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Seeedstudio

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron