Skyduino:~#
Articles
arduino, programmation, projet

Arduino Led Matrix

Description :
Un afficheur à led multiplexer classique, controle des colonnes par transistors.
8 led par colonnes sur 12 colonnes.

Photo :

96 led ! Un bon gros sachet !


Une vue de face plutot intérréssante non ? ^^


Vue isométrique, pour le fun


Un travail de plus de 2h pour souder les jumpers


Le driver de colonnes à transistor

Video de démonstration :
V1 (animation fixe)

V2 (avec scrolling)

La Vcard de watterott modifié qui m’as servi de base pour mon hardware.

Vcard Watterott w/ mod

Le skecth arduino :

/*
 * SkyWodd Led Matrix Demo Sketch
 */

/* à remplacer avec le code généré par le script python */
unsigned char matrix[12] = {255,129,149,165,161,161,161,161,165,149,129,255};

int colonnes[12] = {
  53,51,49,47,45,43,41,39,37,35,33,31};

void setup(){
  for(int i = 0; i<12; i++){
    pinMode(colonnes[i],OUTPUT); 
    digitalWrite(colonnes[i],LOW);
  }
  DDRF = B11111111; // Port F as output
}

void loop(){
  for(int x = 0; x<12; x++){
    for(int i = 0; i<12; i++)
      digitalWrite(colonnes[i],(x == i) ? HIGH : LOW); // Select col
    PORTF = matrix[x]; // Show data
    delay(1);
  }
}

Script de conversion bmp->.h

import Image  
im = Image.open("matrix.bmp") 
file = open("matrix.h", "w")
file.write("unsigned char matrix[12] = {")
for x in range(0,12):
    value = 0
    if im.getpixel((x,0)) == 0: value = 1
    if im.getpixel((x,1)) == 0: value += 2
    if im.getpixel((x,2)) == 0: value += 4
    if im.getpixel((x,3)) == 0: value += 8
    if im.getpixel((x,4)) == 0: value += 16
    if im.getpixel((x,5)) == 0: value += 32
    if im.getpixel((x,6)) == 0: value += 64
    if im.getpixel((x,7)) == 0: value += 128
    if x != 11:
        file.write("%d," % value)
    else:
        file.write(str(value))
file.write("};")
file.close()

L’image de test :
ICI (à renommer en matrix.bmp)

Le résultat IRL :

=)

Schémas :

Note: J’ai remplacer les BD139 par des BC547, plus petit et moins chère il sont amplement suffisant pour contrôler 8 leds.
Un grand classique, une résistance de limitation de courant par ligne et chaque colonne contrôlé par un transistor.


Nouveau :
– Support du scrolling,
– Support de n’importe quel format (script python avec arguments),
– Temps entre chaque frame réglable.

Le skecth arduino

/*
 * SkyWodd Led Matrix Demo Sketch w/ Scrolling
 */

/* à remplacer avec le code généré par le script python */
unsigned char matrix[36] = {
  255,8,8,255,0,255,145,145,129,0,255,128,128,128,0,255,128,128,128,0,255,129,129,129,255,0,46,98,66,78,64,78,66,98,46,0};
int sizeMatrix = 36;

int colonnes[12] = {
  53,51,49,47,45,43,41,39,37,35,33,31};

int scrollTime = 500; // Time between scroll in ms
long timeBefore = 0;
long timeNow = 0;
int offset = 0;

void setup(){
  for(int i = 0; i<12; i++){
    pinMode(colonnes[i],OUTPUT); 
    digitalWrite(colonnes[i],LOW);
  }
  DDRF = B11111111; // Port F as output
}

void loop(){
  timeNow = millis();
  if(timeNow - timeBefore > scrollTime){
    if((offset + 12) > sizeMatrix)
      offset = 0;
    else
      offset ++;
    timeBefore = timeNow;
  }
  for(int x = offset; x<(12+offset); x++){
    for(int i = 0; i<12; i++)
      digitalWrite(colonnes[i],((x - offset) == i) ? HIGH : LOW); 
    PORTF = matrix[x];
    delay(1);
  }
}

Script de conversion bmp->.h

import Image, sys
print "Library import success !"
try :
    im = Image.open(sys.argv[1])
    file = open(sys.argv[1][:-4] + ".h", "w")
except IOError:
    print "Error openning image ..."
    exit(0)
print "Image openning success !"
if im.size[1] < 8 :
    print "Bad Image Size (H) ..."
    exit(0) 
if im.size[1] > 8 :
    print "Image will be truncated !"
nbcol = im.size[0]
if nbcol < 12 :
    print "Bad Image Size (W) ..."
    exit(0)
print "Image Col Count :", nbcol
print "Generating Header ",
file.write("unsigned char matrix[%d] = {" % nbcol)
for x in range(0,nbcol):
    value = 0
    if im.getpixel((x,0)) == 0: value = 1
    if im.getpixel((x,1)) == 0: value += 2
    if im.getpixel((x,2)) == 0: value += 4
    if im.getpixel((x,3)) == 0: value += 8
    if im.getpixel((x,4)) == 0: value += 16
    if im.getpixel((x,5)) == 0: value += 32
    if im.getpixel((x,6)) == 0: value += 64
    if im.getpixel((x,7)) == 0: value += 128
    print ".",
    if x != (nbcol-1):
        file.write("%d," % value)
    else:
        file.write(str(value))
file.write("};\n\n")
file.write("int sizeMatrix = %d;" % nbcol)
file.close()
print " "
print "Header file generated !"

Image test : à renommer en blablabla.bmp

About these ads

Discussion

11 réflexions sur “Arduino Led Matrix

  1. Bonjour,
    Sympa cette matrice !!
    Comment est faite l’alimentation ? Elle n’est pas indiquée sur le schéma.
    Merci d’avance,
    Quentin

    Publié par quentin G. | 19 août 2012, 17 h 40 min
  2. Bonjour a tous, projet très intéressant . Il y a juste une ligne de code que je ne comprends pas c’est celle ci
    digitalWrite(colonnes[i],((x – offset) == i) ? HIGH : LOW);
    que signifie le « ? » dans cette ligne
    Merci de votre aide

    Publié par Xarolium | 13 février 2013, 13 h 20 min
  3. Salut, je ne sais pas programmer et je ne connais pas grand chose à l’électronique ( même si mon dada c’est de démonter réparer toutes sortes d’appareils, je ne connais pas la logique de fonctionnement interne de certains composants ) mais je suis électricien et je veux m’y mettre.
    J’ai un projet de matrice LED controlé par un arduino. Le truc c’est que ma matrice va être composé de 36 Led que je voudrais haute luminescence pour que chacune d’elles puissent éclairer un bloc de verre de 10cm de côté..
    Au final ma matrice fera 60cm par 60cm. Je souhaite pouvoir faire la même chose que toi, c’est à dire pouvoir afficher une série de bitmap basiques du genre des space invaders, ou faire un défilement si j’arrive à trouver plus de blocs de verre…

    J’ai commencé à me documenter et j’ai bien compris le principe du multiplexage et je sais aussi que les LED que je veux utiliser vont consommer beaucoup plus que les diodes rouges de base.
    J’ai aussi bien compris que l’arduino ne pouvait pas supporter d’alimenter ces LEDs si elles consomment trop même en multiplexage.

    Alors, à ton avis c’est jouable ?( je ne sais pas encore quelle puissance réclament mes futures LEDs et je ne connais pas encore l’intensité Max que peut fournir l’Arduino )
    J’ai vu dans un autre article que l’on pouvait envisager une source externe de courant pour alimenter la matrice . T’en penses quoi ?

    Merci pour les infos !

    Publié par Matt | 17 février 2013, 15 h 38 min
    • Il faudra un interface de puissance, sinon regarde du côté des drivers de led à courant constant (TLC5940 par exemple).
      Avec un système driver + transistor (pour les colonnes) + transistor (ou mosfet, pour les lignes) c’est jouable à mon avis.

      Publié par skywodd | 18 février 2013, 21 h 52 min
  4. Bonjour, bravo pour ton montage.
    Je ne connais pas grand chose en électronique aussi et donc besoin que quelqu un m éclaire mes lanternes.
    J ai 32 diodes a allumer les unes après les autres jusqu a ce que toute soit allumer. Elles doivent être allumer une a une à l aide d un switch. Comment puis je realiser ce montage ? Est ce sur le meme principe que ton montage, avec des colonnes et lignes ?

    Merci

    Publié par Synergie06 | 22 septembre 2013, 20 h 38 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Archives

Wow. Dogecoin. Amaze.

Laissez un tip en Dogecoin

DMMNFk6WBVTpx2Wu1Z35GL61QXSd6r6WQx

Suivre

Recevez les nouvelles publications par mail.

Rejoignez 768 autres abonnés