Driver de LED RGB à 8 canaux (8-CHANNEL RGB Led Driver)

par François Finfe | dernière mise à jour: August 21 2008 13:56:49.

Introduction

Cette article présente une carte qui permet de contrôler 8 canaux de leds RGB. Chaque canal peut piloter jusqu'à 5 led RGB.
Les 8 canaux sont commandés de manière à réaliser un effet arc-en-ciel, se déplaçant d'un canal à l'autre.

Ce projet est en cours de développement. Son état d'avancement est bien avancé. La version du programme actuelle fonctionne correctement. Il existe néanmoins un petit "bug" au niveau des leds qui n'a pas encore été résolu. Ce bug n'est cependant pas très génant.

Pour rappel, les LEDs RGB contiennent 3 LEDs au sein d'un même package.
On retrouve 1 led verte, 1 led rouge et 1 led bleue.

Principe de fonctionnement

Pour faire varier la couleur d'une LED RGB, il faut jouer sur l'intensité lumineuse de chaque qui la compose. Pour faire du rouge, on règle l'intensité lumineune de la LED rouge à 100 % (de son intensité lumineuse nominale).

L'illustration à droite "Led RGB" montre les 3 couleurs fondamentales activée successivement.

Pour obtenir les autres couleurs, nous allons jouer sur les intensités. Par exemple, pour obtenir de l'orange, on règle le rouge à 100 % et le vert à 50%.

Variation de l'intensité

Pour faire varier cette intensité lumineuse, il y a plusieurs méthodes. On peut par exemple, moduler le courant entre 0 et le courant nominal à l'aide de par exemple, d'un transistor, en fonctionnement linéaire.

Cette méthode présente plusieurs inconvénients:

Une solution beaucoup plus simple est d'employer une modulation à largeur d'impulsion (PWM = pulse width modulation).
Le courant peut prendre 2 valeurs: le courant nominal ou 0 mA. En fonction du rapport cyclique, l'intensité lumineuse. Etant donné du nombre de canaux à géré (8 canaux x 3 led = 24 rapports cyclique à générer), la fréquence du signal ne sera pas trop élevée, de l'ordre de quelques dizaines de Hertz.

Le temps de réponse de l'oeil fait que l'on ne perçoit pas les variations instantannée de la lumière (on ne voit pas les led clignotée). L'oeil aperçoit l'intensité lumineuse moyenne. Ce phénomène est connu sous le nom de persistance rétinienne.

Il faut également savoir que le spectre lumineux émis par chaque led varie légèrement en fonction du rapport cyclique. Le pic de spectre se déplace souvent légèrement. Mais normalement, il se déplace dans une moindre mesure avec la commande PWM qu'avec une commande linéaire. A droite est mis à titre d'exemple le spectre d'une LED qui doit être celui d'une LED UV.



Schema

Feuille 1/2 - la logique de commande et circuit de puissance




Schema (cliquer pour agrandir)


Il n'y a pas grand chose à dire sur le schéma. Il est assez simple.

La pièce centrale est un microcontrolleur ATmega 88 qui convient très bien pour cette fonction. Il est cadencé par un quartz à 20 MHz, ce qui donne une bonne vitesse d'éxecution. Il faut savoir que le processeur ne fait rien 70 % du temps. On pourrait penser qu'un quartz à 5 MHz pourrait suffire. En réalité, il faut maintenir cette vitesse, car après chaque période d'échantillonage les programmes se mettent à jour et le processeur peut passer à 100 % d'occupation pendant quelques ms. Avec un processeur cadencé plus lentement, on risque de voir des discontinuité dans le programme.

La programmation se fait par un connecteur ISP 10 pin standard (IDC10). J'utilise pour le programmer le programmateur USBprog. Si votre PC dispose encore d'un port série, vous pouvez vous construire un programmateur très simple avec très peu de composants (voir ici).

Le port D est multiplexé par 3 latchs de type 74HCT573. Chaque latch commande les 8 canaux d'une couleur. Par exemple, IC4 commande les 8 leds vertes. Chaque latch est activé en mettant à 1 sa ligne C(ontrol?) ou aussi nommé LE (Latch Enable).
Vous pouvez également utilisez des latchs de type 74HCT574. La différence est qu'ils sont triggés au front montant la ligne CP (Clock), équivalent de la ligne LE du 573.
Il faut apporter quelques modifications minimes au programmes.

La puissance des sorties des latchs est évidemment insuffisante pour commander directement plusieurs LED (la somme des courants en sorties des buffers peut être au maximum de 70 mA). Des transistors PNP (BC516) montés en émetteur commun font office de "circuit de puissance". Ici, c'est la solution la moins cher qui a été préfèré pour la puissance. Ma première idée était d'utilisé un IC qui contient 8 paires de darlingtons PNP (du type UDN2981) mais pour une raisons que je ne connais pas ceux-ci sont difficile à trouver, et coûtent environ 5 € la pièce, contrairement à son homologue NPN ULN2803. De plus, le routage est plus simple pour un circuit imprimé simple face.

A titre d'exemple, une connexion d'une led RGB est montré (encadré en gris). Les valeurs des résistances pour la led RGB sont celles que j'ai utilisé pour les leds dont je dispose. Je vous conseille de les redimensionner en fonction de la tension Vforward@Inom de vos leds et en tenant compte de Vec_sat des transistors PNP.

Le circuit dispose d'une horloge temps réel (RTC) disposant d'une interface I2C. Celle-ci peut vous être utile si vous souhaitez programmer des heures et/ou des dates de fonctionnement pour le montage. Cette fonction n'est pas encore implémenté dans le programme.

Le circuit dispose d'une connexion (via un bornier) pour une LDR. De nouveau, si vous installez les leds dehors, vous pouvez choisir d'activer (ou de désactiver) le driver s'il fait jour ou nuit. Cette fonction n'est pas implanté en H.W.. Pour l'implanté, il suffit de faire une simple conversion analogique numérique, et selon la tension, activer ou désactiver le driver.

Feuille 2/2 - Alimentation



Schema Power Supply(cliquer pour agrandir)

La consommation du montage n'est pas négligeable.

Voici un rapide calcul de la consommation dans le pire des cas.

Dans chaque led RGB, il y a 3 leds. J'utilise pour ce montage 4 leds par canal. Il y a 8 canaux. Chaque led consomme environ 20 mA, ce qui nous donne une consommation de:

3.20 mA. 4 . 8 = 1920 mA sous 5 V

Bien sûr, il s'agit du plus mauvais cas, avec le programme qui est dans le µc cela ne se produit jamais (le courant est au max environ 66 % de celui calculé).

L'utilisation d'une alimentation linéaire n'est pas concevable en raison de la forte consommation et du faible rendement de cette dernière. J'ai donc opté pour une alimentation à découpage. Ces circuits sont presque aussi facile à implanter qu'un classique 7805. Le régulateur utilisé est un LT1076 (qui peut sortir jusqu'à 2 A).

En théorie on peut donc mettre un total de 6 leds/canal (soit un total de 50 leds) pour une alimentation de 2 A. Si vous désirez utilisé plus de led, vous pouvez utiliser un LT1074 (qui peut sortir jusqu'à 5 A). Il faut alors redimensionner certains composants (la self: Rdc et Isat), la capacité d'entrée et de sortie (Capacité, Zmax@Fdécoupage,...) ainsi que la diode shottky. Linear Technology a publié sur son site un application note (AN) pour le dimensionnement des composants, que j'ai suivi pour dimensionner les composants. Il faudra probablement modifier le circuit imprimé pour ces nouveaux composants. Le circuit à découpage garantit un rendement compris entre 75 et 80 %. La carte alimenté peut être alimentée en DC ou en AC grâce au pont de graetz. La tension minimale d'entrée est d'environ 10..12 Vdc ou environ 10 Vac. La tension maximale d'entrée est limitée par la tension max que supporte la capacité d'entrée (ici 24 Vdc) et par le régulateur (40 Vdc max). Il va de soi que c'est pas plus petite des 2 valeurs qui détermine Vin_max.

Photos de la carte (proto)

Améliorations à apporter

Horloge temps réel

Une RTC est présente sur la carte mais cette fonction n'est pas encore implanté dans le H.W.Il y a plusieurs problèmes à résoudre qui sont: le réglage de l'heure et le réglage des heures de fonctionnement.
La solution qui me parait la plus simple est d'utiliser la liaison SPI. Il n'est pas possible d'utiliser l'usart car celui-ci est occuppé par le bus.

On pourrait également envisager d'activer l'usart au démarrage pendant quelques secondes. Le uC envoit alors une demande de connexion. Si un PC est connecté celui-ci détecte la demande et envoit un acquittement. Le µc reste dans ce mode jusqu'au prochain reset. Si le µc ne reçoit pas d'acquitement (fonctionnement normal, sans pc connecté), il retourne dans le mode normal (driver de led).

Code source

Le programme est écris en assembleur et occuppe moins de 600 bytes (sur les 8K disponible). L'assembleur s'impose, car le programme doit être très optimisés pour que les routines soit suffisamment rapide (et donc avoir un foncionnement "continu" du programme, sans discontinuité. L'assembleur a permit d'avoir un code très compacte et rapide à l'éxecution.

Toute suggestion d'amélioration est la bienvenue ...

Ressources / Download

Description Lien/Fichier(s)
Circuit imprimé (PCB) et schema.

Fichier au format Eagle (+pdf)
   PCB & layout v1.0

PCB (pdf)

Implantation composants (PDF)
Code source

Projet AVR Studio
Projet AVR studio (zip) contenant tout les fichiers (code source asm & projet aps, programme assemblé (.hex))

Fichier assembler (.asm)