Description :
Un afficheur à led multiplexer classique, controle des colonnes par transistors.
8 led par colonnes sur 12 colonnes.
Photo :
Video de démonstration :
V1 (animation fixe)
V2 (avec scrolling)
La Vcard de watterott modifié qui m’as servi de base pour mon hardware.
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
..."
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







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>> Comment est faite l’alimentation ? Elle n’est pas indiquée sur le schéma.
C’est les sorties digitales qui fournissent la tension aux led 😉
Publié par skywodd | 19 août 2012, 19 h 12 minAïe, avec des leds standard 5mm à 10mA, plein feux ça va tirer environ 960mA, le régulateur va faire la geule…
C’est bien dommage
Publié par Quentin G. | 19 août 2012, 23 h 06 minOk, tu n’as rien compris au montage 😉
Toute leds allumaient la consommation est de 80mA.
Au maximum seul 8 leds sont allumées simultanément, pas plus, tout le montage fonctionne par multiplexage 😉
http://www.sonelec-musique.com/electronique_bases_affichage_multiplexage.html
Publié par skywodd | 20 août 2012, 13 h 57 minOups, j’avais pourtantbien lu et compris cette page de Sonelec il y a peu…
Mea culpa et merci !
Publié par Quentin G. | 24 août 2012, 6 h 16 minNo problém 😉
Publié par skywodd | 24 août 2012, 15 h 42 minBonjour 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 minC’est un « if inline » :
(test) ? valeur_si_vrai : valeur_si_faux
Publié par skywodd | 13 février 2013, 19 h 33 minSalut, 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 minIl 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 minBonjour, 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 minBonjour!Je suis tellement content de tomber dans cette site!Et ce sujet concernant la matrice de LED est très important pour moi!S’il vous plaît!Vous pouvez m’ expliquer un peu le programme et le montage en gros car je suis encore débutant en électronique et en programmation Arduino?
Publié par Friedman | 12 janvier 2016, 16 h 13 min