Led RVB (ou RGB) controlé par USB

Résumé du projet

Prolight 3W RGB

Prolight 3W RGB

J'avais trouvé très intéressante l'idée de faire une lampe aux couleurs changeantes en utilisant un LED RGB de haute puissance. (voir l'article en question sur le blog de Make). Quand un ami m'a dit qu'il commandait des LEDs similaires (prolight 3W RGB, photo à droite), je lui ai dis d'en prendre un pour moi, question de m'amuser un peu.

Je souhaitais pouvoir contrôler la lampe par USB afin d'être capable de l'influencer selon différents événements. Par exemple, un flash pour un nouveau courriel, intensité d'une couleur liée à la charge du système ou l'utilisation de la mémoire, synchronisation avec la musique...

Prototype

Prototype

J'ai fabriqué un prototype à l'aide des composantes que j'avais en stock. Ensuite, je me suis empressé de programmer le microcontrôleur de manière à pouvoir contrôler l'intensité lumineuse de chaque couleur séparément, d'après les commandes transmises via USB. J'ai également programmé un mode ou la lampe passe progressivement d'une couleur à l'autre.

Circuit imprimé de contrôle

Circuit imprimé de contrôle

Mon ami par qui j'ai obtenu le LED a bien aimé le résultat et il souhaitait fabriquer des lampes basés sur ce concept. Nous nous sommes donc entendus pour que je développe un circuit imprimé du projet. Ceci rends le projet reproductible facilement en grande quantités.


Nouvelles

  • Mai 2011: Après 4 ans d'oubli, rédaction des paragraphes manquants et publication.
  • 10 Février 2007: Rédaction de ce texte.


Led

3 couleurs

3 couleurs

Il s'agit d'un led 3 couleurs (RGB) de 3W de prolight. Voici le datasheet: 3WRGB.pdf. Le datasheet nous révèle que la limite absolue de courant pour le Rouge est de 385mA et 350mA pour le vert et le bleu.

Un led d'une telle puissance produit une lumière intense tout en chauffant énormément. Il est essentiel de le refroidir convenablement sans quoi il pourrait s'auto-détruire. Et puisque la luminosité diminue avec la température (Voir courbes dans datasheet), il est d'autant plus désirable de minimuser l'élévation de température.

J'ai utilisé un refroidisseur (heat-sink) normalement destiné aux CPU socket 7 (Pentium 1 par exemple). Une pâte thermique (Je ne suis pas certain du nom français... En anglais c'est Thermal Joint Compound) facilite le passage de la chaleur du Led au heat-sink. Pour fixer le LED au heat-sink solidement, j'ai perçé des trous légèrement plus petit que mes vis et j'ai forcé un peu pour visser les vis. Heureusement, l'aluminium est un métal relativement malléable.
Perçage

Perçage

Pâte thermique? (Thermal joint compound)

Pâte thermique? (Thermal joint compound)

Pâte thermique appliquée

Pâte thermique appliquée

Led installé

Led installé




Prototype

Cablage sur circuit snes/nes à USB

Cablage sur circuit snes/nes à USB

Comme microcontrôleur, j'ai utilisé un Atmega8 cadencé à 12Mhz (fréquence nécéssaire pour l'implémentation USB au niveau logiciel que j'utilise). Justement, c'est exactement ce qu'il y a sur mes circuits de conversion manettes Snes/Nes à USB. Il y a aussi les diodes zeners pour USB D+ et D-, très important pour permettre au circuit de fonctionner sur tout les ports USB. À gauche, j'ai mis une photo montrant à quels endroits j'ai soudé les fils USB et les 3 signaux de contrôle (rouge, vert et bleu). Les autres fils sont ceux qui servent à programmer l'Atmega8.

Je voulais pouvoir alimenter le tout par USB. Puisqu'il n'est pas permis qu'un périphérique USB consomme un courant supérieur à 500 mA, j'ai ajusté la valeur des résistances pour que chaque partie du LED (rouge, vert et bleu) consomme environ 150mA. Ainsi, lorsque les 3 sont à l'intensité maximale, le total s'élève à 450 mA. Cela laisse tout de même une marge pour la consommation du reste du circuit.

Transistors Darlignton et resistances

Transistors Darlignton et resistances

Il était hors de question de brancher les 3 LEDs directement au microcontrôleur. Selon le datasheet, l'Atmega8 peut pousser 20 mA par broche d'ES, le total de toutes les broches ne devant pas dépasser 300mA. C'est pourquoi j'utilise des transistors pour contrôler les LEDs.
Voici comment j'utilise des transistors avec l'Atmega8:
darlignton mcu 5 volts Explication du circuit: Lorsque la broche de l'Atmel est à 5 volts (logique 1), le voltage présent sur la base et l'émetteur du transistor est le même. Il n'y a donc aucun courant circulant entre ces deux broches. Puisqu'aucun courant ne circule de l'émetteur à la base, il n'y en a pas non plus qui circule de l'émetteur au collecteur. Par conséquant, le LED ne s'allume pas. Mais lorsque la broche de l'Atmel est à 0 volts (logique 0), il y a une différence de potentiel entre l'émetteur et la base du transistor. Un courant circule donc entre l'émetteur et la base. La résistance R1 permet de limiter ce courant à un niveau acceptable et suffisant. Mais puisqu'il y a un petit courant circulant entre l'émetteur et la base, un courant beaucoup plus grand peut circuler entre l'émetteur et le collecteur, allumant ainsi le LED.

Parlons maintenant des résistances pour les LEDs. Pour calculer la résistance, il faut d'abord savoir combien de volts on perds dans le circuit. Selon le datasheet, à 150mA, le LED rouge prends 2 volts et les LEDs vert et bleu prennent 3.3 volts. Le transistor aussi en prends une partie. Par exemple, le transistor 2SB1067 que j'ai utilisé en prends 0.9volts à 300mA à 25 degré C. Bien sur, il est possible que ces caractéristiques varient d'une pièce à l'autre...

Calcul de la résistance idéale avec alimentation à 5 Volts et courant cible de 150mA. Perte de voltage du transistor (Vce)=0.9 Volts
Couleur Voltage LedCalcul Resistance
Rouge 2.00 (5V - 2V - 0.9V) / 0.150A 14 ohms
Vert 3.30 (5V - 3.3V - 0.9V) / 0.150A 5.33 ohms
Bleu 3.30 (5V - 3.3V - 0.9V) / 0.150A 5.33 ohms

Voici les mesures que j'ai obtenu en pratique, en allumant un led à la fois. On remarque que le voltage des LEDs rouge et vert sont assez près de la théorie. Par contre, le voltage du LED bleu et du transistors sont plus bas que prévu. Il faut savoir aussi que le voltage d'alimentation n'était pas de 5 volts, mais de 4.86 volts. Probablement des pertes à cause du cablage USB. Lorsque les 3 LEDs sont allumés, le voltage chute a 4.63 volts...
Courants et voltages mesurés dans la réalité
Couleur Voltage ledVoltage transistorVoltage resistances Courant
Rouge 2.08V 0.75V 2.03V 250mA
Vert 3.23V 0.72V 0.96V 180mA
Bleu 3.12V 0.74V 1.06V 190mA
Dans le prototype, je n'ai pas utilisé les bonnes valeurs de résistances alors j'excède de 20mA la limite de courant permise sur USB. Car lorsque les 3 leds sont allumés, le courant total n'est pas de 620mA (addition des courants de la table ci-haut) mais de 520mA. Rien n'a sauté, mais dépasser la limite n'est pas une bonne idée pour autant.

Alors, voici les valeurs de résistances (PAS BONNES POUR USB! car trop basses...) du prototype:
Bleu et Vert: 4.7 ohms, Rouge: 7.9 ohms (6.8 ohms en série avec 1.1 ohms)

Résistances idéales après mesures dans la vie réelle (transistor .75Volts)
Couleur Courant Valeur resistance
Rouge 150 mA (5V - 2.08V - 0.75V) / 0.150A = 14 ohms
Vert 150 mA (5V - 3.23V - 0.75V) / 0.150A = 6.8 ohms
Bleu 150 mA (5V - 3.12V - 0.75V) / 0.150A = 7.53 ohms

Maintenant, quelques photos supplémentaires du prototype en fonction:
Led bleu seulement à très basse intensité

Led bleu seulement à très basse intensité

Le rouge à pleine puissance dans une pièce bien éclairée.

Le rouge à pleine puissance dans une pièce bien éclairée.




Version 1

Suite au succès du prototype, j'ai décidé de faire une version améliorée, et facilement reproductible. Ceci veut dire un circuit imprimé et une liste de composantes faciles à obtenir à notre époque.

Voici les changements et améliorations que j'ai visé pour la version 1:
  • Permettre une alimentation indépendante d'USB, pour pouvoir utiliser les leds à leur pleine puissance ou presque.
  • Permettre une alimentation plus élevée que 5 volts. Échec: Les résistances chauffent trop. Il faudrait des résistances de plusieurs watts ou conçevoir un circuit fonctionnant différemment.
  • Avoir un circuit imprimé unique pour tout les composantes. Fini les fils et le petit circuit avec transistors cablés manuellement.
  • Utiliser des pièces facile à obtenir en 2007 chez mon fournisseur habituel, Digikey.
Voici les schémas en format PDF:
cpu power/drivers
Voici la liste de composantes:
Référence Description Quantité # Digikey
Q2,Q3,Q4 Transistor MPSA63 3 MPSA63-ND
U2 Buffers 'open-collector' 1 296-14647-5-ND
J3 Connecteur d'alimenatation 1 PJ-202AH
U1 Microcontrôleur ATmega8-16PC 1 ATMEGA8-16PC-ND
Y1 Crystal 12 mhz 1 X983-ND
C2,C3 Condensateurs 30pf 2 490-3721-ND
C1 Condensateur 10uf 1 493-1077-ND
J2 Connecteur 'header' 2x3 1 WM7406-ND
D3,D6 Diode 2A 20V 2 SR202-TPCT-ND
C5 Condensateur .1uf 2 BC1148CT-ND
C4 Condensateur 1uf 1 P993-ND
R1 Resistance 1.5K 1 P1.5KBACT-ND
R2,R3 Resistances 68 ohms 2 P68BACT-ND
R6,R8,R10 Resistances 470 ohms 3 P470BACT-ND
D1,D2 Diode Zener 3.6 volts 2 1N4729A-TPCT-ND

Mais ce n'est pas tout!
Puisque les transistors utilisés ne sont pas les mêmes que ceux du prototype, il faut recalculer la valeur des résistances. Selon le 'datasheet' du MPSA63, le voltage de saturation maximum Collecteur-Emetteur est de 1.5 volts. Mais en pratique, le transistor ne semble pas se comporter ainsi. Le voltage Collecteur-Emetteur est de seulement 0.75 volts.

Valeurs des résistances pour 150 et 300 mA, avec voltage C-E de 0.75 volts.
Couleur Courant cible Calcul ohms Dissipation de la resistance
Rouge 150mA (5V - 2.08V - .75V) / .150A = 14.5 ohms (5V - 2.08V - 0.75V) * .150A = 0.33 Watts
300mA (5V - 2.08V - .75V) / .300A = 7.2 ohms (5V - 2.08V - 0.75V) * .300A = 0.7 Watts
Vert 150mA (5V - 3.23V - .75V) / .150A = 6.8 ohms (5V - 3.23V - 0.75V) * .150A = 0.15 Watts
300mA (5V - 3.23V - .75V) / .300A = 3.4 ohms (5V - 3.23V - 0.75V) * .300A = 0.30 Watts
Bleu 150mA (5V - 3.12V - .75V) / .150A = 7.5 ohms (5V - 3.12V - 0.75V) * .150A = 0.17 Watts
300mA (5V - 3.12V - .75V) / .300A = 3.8 ohms (5V - 3.12V - 0.75V) * .300A = 0.34 Watts

Alors maintenant que les valeurs voulues ainsi que le wattage nécéssaire sont connus, il faut acheter ces résistances. Il est important d'utiliser des résistances d'un wattage d'environ le double.

Si le but est d'alimenter le circuit par USB (donc 150mA par couleur) et qu'il n'est pas possible de trouver la valeur exacte, il est préférable de choisir une valeur plus haute (pour un courant un peu plus bas que 150mA). Par contre, si vous prévoyez alimenter le circuit autrement, vous pouvez prendre des valeurs plus basses (ce qui augmente le courant) car les résistances sont calculés pour 300mA alors que la limite des LEDs est de 350mA.
Référence Description # Digikey Pourquoi
R7 Resistance 15 ohms, 0.6W PPC15.0ZCT-ND Rouge 150mA
R7 Resistance 7.5 ohms, 2W PPC7.5W-2CT-ND Rouge 300mA
R7 Deux resistances 3.6 ohms, 2W BC3.6W-2CT-ND Un peu mieux pour le rouge 300mA
R9 Resistance 6.8 ohms, 1W PPC6.8W-1CT-ND Vert 150mA
R9 Resistance 3.3 ohms, 1W PPC3.3W-1CT-ND Vert 300mA
R11 Resistance 7.5 ohms, 1W BC7.5W-1CT-ND Bleu 150mA
R11 Resistance 3.6 ohms, 2W BC3.6W-2CT-ND Bleu 300mA
Optionel: Un bon choix pour une alimentation séparé est T977-P6P-ND disponible chez digikey.


Circuit imprimé v1

Voici de quoi a l'air le circuit imprimé:


J'ai utilisé un logiciel nommé PCB pour le dessiner. Voici le fichier source:
prod1.pcb

Si vous voulez en produire un mais ne pouvez pas utiliser PCB (car vous n'êtes pas sous Unix), voici une archive contenant les fichiers gerbers:
rgbledsA.zip

Le PCB assemblé pour l'utilisation d'une alimentation externe pour les LEDs, permettant environ 300mA par couleur. Le CPU tant qu'a lui, s'alimente d'USB ou par l'alimentation externe.



Théorie

L'intensité de la lumière produite par le LED est contrôlée en faisant varier la durée d'une période où le LED est alimenté versus une période où le LED n'est pas alimenté. La fréquence d'opération a été choisie pour ne pas être visible à l'oeil nu, créant ainsi l'illusion d'une lumière ininterrompue, mais modulée en intensité.

Il s'agit du principe de Modulation de largeur d'impulsion. Pour plus d'information, je vous recommande l'article Wikipedia:
http://fr.wikipedia.org/wiki/Modulation_de_largeur_d'impulsion


Code source microcontrôleur

Voici le code source pour le micro-contrôleur: rgbleds-1.0.tar.gz. Sur un système linux sur lequel les outils de développement pour avr sont présent (avr-gcc, avr-libc, etc), il suffit de taper make dans le répertoire racine de cette archive pour compiler. Voir les cibles 'fuse' et 'flash' du makefile pour le transfert vers l'AVR. Référez-vous au besoin à ma page plus détaillée sur la programmation des AVR.

Pour la partie USB, une ancienne version de V-USB par Objective development est utilisée (désolé, je n'ai pas le temps de mettre ce projet à jour pour le moment).



Logiciels de contrôle pour PC

Ces logiciels sont fournis avec l'archive offerte ci-haut. Ces logiciels sont très simple et peuvent servir d'exemple. Tous sont bâtis pour fonctinner sous Linux via libusb.
LocationDescription
cmdline/Outil en ligne de commande simple
misc_examples/Contrôle des LEDS en fonction du degré d'activité du système et stroboscope
qt/Interface graphique comportant des 'sliders' pour contrôler chaque LED. Utilise la librairie QT


Photos du circuit en action

Démonstration de l'éclairage. Il y avait aussi une petite lampe de 20Watts et un écran d'ordinateur dans la pièce...
Une portion de mon bureau éclairé en rouge...

Une portion de mon bureau éclairé en rouge...

puis en mauve...

puis en mauve...

ensuite en bleu...

ensuite en bleu...

et en vert...

et en vert...

maintenant en jaune...

maintenant en jaune...

et finalement en orange.

et finalement en orange.



En déposant un cylindre de papier sur le led, on obtient un rond au plafond. On peut voir les couleurs séparément sur certaines partie du contour car les 3 source lumineuse ne sont pas précisément au même endroit sur le LED:
Rouge + Bleu

Rouge + Bleu

Vert + Bleu

Vert + Bleu

Rouge + Vert

Rouge + Vert

Rouge + Vert + Bleu

Rouge + Vert + Bleu



Deux photos du salon avec le LED comme seul éclairage:




Photos provenant des utilisateurs

J'aime bien voir comment les autres s'y prennent pour assembler mes projets. Vous pouvez me faire parvenir des photos de vos montages et je les afficherai ici.


Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.