Piloter 8 (ou plus) LEDs RGBs en PWM ?

Salut à tous :slight_smile:

Voilà, je possède un Arduino Uno possédant 6 sorties PWM.

Je souhaiterais piloter au minimum 8 LEDS RGB en PWM, donc jouer sur chacune des tensions de led rouge, verte et bleue.

Comment faire vu que je ne possède que 6 sorties ?

Je pensais utiliser 3 PWM (une pour le rouge, une pour le vert, et une pour le bleu) et les "distribuer" sur chacune des leds (car oui, je veux pouvoir les piloter indépendamment les unes des autres ^^).

J'ai donc penser aux démultiplexeurs.

Par exemple un 3->8, avec donc le fonctionnement suivant:

sel out n°
000 1
001 2
010 3
011 4
100 5
101 6
110 7
111 8

avec out : le numéro de la sortie active en fonction de l'entrée en fonction de "sel" codée un binaire.

Mais ensuite je m'embrouille un peut car je me pose plusieurs questions.

  • Dans le cas ou je ne pilote que 8 leds rgb, aurais-je besoin de 3 demux ? (un par couleur)

  • A quelle fréquence puis-je switcher entre les sortie ? (j'imagine que ça dépend du demux..)

  • Quelle est la fréquence des PWM sur l'arduino et est-elle admissible par le demux ? (la encore ça doit dépendre du modèle)

  • Comment coder tout ça ? J'avais bien cette approche mais je ne suis pas sûr ^^ :

int a0=11, a1=12, a2=13
int red=3, green=5, blue=6

//(void setup qui va bien ^^)


//Premiere LED (en rouge)
digitalWrite(a0, LOW);
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);

analogWrite(red, 255);
analogWrite(green, 0);
analogWrite(blue, 0);

//Seconde LED (en vert)
digitalWrite(a0, HIGH);
digitalWrite(a1, LOW);
digitalWrite(a2, LOW);

analogWrite(red, 0);
analogWrite(green, 255);
analogWrite(blue, 0);

//3ème LED (en blanc)
digitalWrite(a0, LOW);
digitalWrite(a1, HIGH);
digitalWrite(a2, LOW);

analogWrite(red, 255);
analogWrite(green, 255);
analogWrite(blue, 255);


//ETC pour les autres leds

Mais j'ai peur que cette approche soit trop "usine à gaz", de plus j'ignore la vitesse a laquelle les instructions sont exécutés et quel sera le résultat visuellement.

Avez-vous des conseils/remarques ?

Car j'ai vu des personnes qui utilisaient des registres à décalage il me semble mais je n'ai pas trop compris comment...

Merci par avance :slight_smile:

Je suis pas sûr d'avoir saisi ta démarche : un démultiplexeur ici nete permettra pas de commander plus de led, un démultiplexeur t epermettrait par exemple dans ce cas de piloter les LED quasiment une par une.

Deja il faut être bien sûr d'une chose : est-ce que tu veux vraiment piloter chaque partie RGB de chaque LED (c'est à dire choisir la couleur de CHAQUE LED) ? Ou bien tu veux que les 8 LED aient la même couleur ?

Oui je souhaite choisir la couleur de chaque LED :slight_smile:

Tu dis que le démultiplexeur ne conviendrait pas ici ?

Quelle autre solution est envisageable dans ce cas ? :o

Il faut utiliser un controleur PWM externe tel que :

  • WS2801, HL1606 : 1 LED RGB par chip
  • LPD8806 : 2 LED RGB par chip
  • TLC5940 : 16 LED par chip (= 5 LED RGB)

Ces chips se contrôlent par interface SPI

D'autres méthodes sont possible en faisant du PWM logiqiel avec un controleur de LED normal tel que le MBI5168
Par exemple j'ai réalise ce montage qui utilise 3 MBI5168 pour controller 8 LED RGB : http://blog.spitzenpfeil.org/wordpress/2012/01/11/rgb-led-ring-v2-sequels-dont-have-to-be-bad/
Le principe de PWM utilisé s'appelle BCM (BitCodedModulation) BAM (BitANgleModulation) ou MIBAM (MirroredBAM)

Tu suggères donc de mulitplier les PWM ?

N'y a-t-il pas moyen d'utiliser une PWM par couleur et de switcher entre les leds via un registre à décalage par exemple ?

C'est à dire envoyer 1000 à t0, 0100 à t1, 0010 à t2 et 0001 à t3 (ceci est un exemple pour 4 leds) et l'entrée de donnée vaudrait 1 (soit 5V) ?

Du coup les PWM fonctionneraient en "inverse" dans le sens ou le 5V est appliquée sur l'anode, et la PWM sur la cathode (la tension au borne des led seraient donc nulle pour la valeur haute de la PWM soit 5V) ?

Non

Le principe du PWM est que le controle doit être permanent
SI tu arrete de fournir le signal a la LED elle s'éteint
8)

Même en switchant avec les registres à décalages suffisamment rapidement pour que la persistance rétinienne fasse son office ? :o

Sinon tu peux aussi chaîner 3 Max 7219, ainsi tu peux piloter jusqu'à 64 Led RGB (via la librairie LedControl par exemple).

epsilonzero:
Même en switchant avec les registres à décalages suffisamment rapidement pour que la persistance rétinienne fasse son office ? :o

C'est pas un problème de persistance rétinienne, c'est un problème d'énergie. Quand tu n'alimentes plus la led elle s'éteint. Donc avec la persistance rétinienne tu ne verras pas l'extinction mais une luminosité réduite qui ne pourra jamais atteindre le max.

Je ne connais pas très bien le Max7219 mais il me semble qu'il ne permette pas de gérer la luminosité individuelle de chacune des 64 leds.
Le réglage de luminosité semble global.
A confirmer ?

En fait, je suis tombé sur cette vidéo

Il pilote 8 leds RGB (je dis 8 car elles sont groupés par deux)

Il utilise un arduino, 3 PNP (pour les composantes R, G et B surement) et un ULN2803 (darlington) j'ai pas trop compris pourquoi...

Malheureusement aucune idée de comment le tout est cablé et comment c'est codé, vu que le lien posté dans la vidéo est dead...

Des idées ?

Il multiplexe
Les 3 PNP pilote les lignes
Les 8 transistors de l'ULN2803 pilotent les colonnes

Avec un timer il balaye les 3 lignes et a chaque top il sort sur les colonnes le pattern

On ne peut pas utiliser de PWM dans ce cas, il faut appliquer un BAM ou MIBAM.

Le timer générant une interruption, le balayage se fait sous interruption et le loop reste libre pour l'application.

PS: le lien marche très bien : TKJ Electronics » Arduino RGB LED Controller

PPS: D'après son code il utilise le PWM (analogWrite). Il explique effectivement qu'il a augmenté la fréquence du PWM pour qu'elle soit bien supérieure a celle de son timer de balayage.
Je préfère le BAM, moins bricole.

barbudor:

epsilonzero:
Même en switchant avec les registres à décalages suffisamment rapidement pour que la persistance rétinienne fasse son office ? :o

Je ne connais pas très bien le Max7219 mais il me semble qu'il ne permette pas de gérer la luminosité individuelle de chacune des 64 leds.
Le réglage de luminosité semble global.
A confirmer ?

Oui c'est exact.
Y'a pas mal d'autres CI drivers de LED chez Maxim mais je n'ai mis en oeuvre que le Max 7219.

petite question bête mais bon
pourquoi ne pas utiliser le pwm soft pour avoir toutes les sorties que l'on veut en pwm ?

peut être une idée ici avec un multiplexeur TLC5940

shield avec 3 multiplexeurs (RGB un par couleur) pour 16 leds RGB
http://www.seeedstudio.com/wiki/RGB_LED_Shield_Kit
moins de 20 dollars