Pages: [1]   Go Down
Author Topic: Piloter 8 (ou plus) LEDs RGBs en PWM ?  (Read 1928 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut à tous smiley

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:

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 smiley
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3654
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


France
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui je souhaite choisir la couleur de chaque LED smiley

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

Quelle autre solution est envisageable dans ce cas ? :o
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 ?

France
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
 smiley-cool
Logged

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 ?

France
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 ?

France
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.



« Last Edit: September 04, 2012, 01:29:30 pm by barbudor » Logged

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 ?

Rennes
Offline Offline
Sr. Member
****
Karma: 1
Posts: 313
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 334
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: