Go Down

Topic: Piloter 8 (ou plus) LEDs RGBs en PWM ? (Read 2230 times) previous topic - next topic

Salut à tous :)

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 ^^ :

Code: [Select]


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 :)

B@tto

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 ?
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Oui je souhaite choisir la couleur de chaque LED :)

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

Quelle autre solution est envisageable dans ce cas ? :o

barbudor

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)
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

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) ?

barbudor

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)
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

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

patg_

Sinon tu peux aussi chaîner 3 Max 7219, ainsi tu peux piloter jusqu'à 64 Led RGB (via la librairie LedControl par exemple).
Mes Arduineries: http://breizhmakers.over-blog.com/

barbudor


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 ?
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

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

http://www.youtube.com/watch?v=4uFrFR31z8s

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 ?

barbudor

#10
Sep 04, 2012, 08:27 pm Last Edit: Sep 04, 2012, 08:29 pm by barbudor Reason: 1
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 : http://blog.tkjelectronics.dk/2011/08/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.



Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

patg_



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.
Mes Arduineries: http://breizhmakers.over-blog.com/

anthology

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

Go Up