Arduino - LED 3 Couleurs

2018-08-02

En lisant le Starter Kit de SainSmart, fourni avec le clone de l'Arduino Uno (disponible sur cette page), j'ai voulu aller plus loin et faire allumer/éteindre successivement les 3 LEDs de chaque couleur.

Chronogramme de cette histoire

Pour plus de claireté, voici le chronogramme du résultat voulu :

chronogramme

Etant donné que je suis incapable de faire des pentes avec Chronogram Editor, imaginez les pentes montantes & descendantes comme prenant tout la période, afin de faire un effet doux.

Observation

On peut voir que c'est le même cycle qui se répète à l'infini en changeant de LED :

  • LED A : allumage progressif
  • LED B : allumée à 100%
  • LED C : extinction progressive

Il suffit donc de répéter la séquence en changeant à chaque période les LEDs définies par A, B et C :

LED A (allumage) LED B (allumée) LED C (extinction)
Cas 1 : Bleu Rouge Vert
Cas 2 : Vert Bleu Rouge
Cas 3 : Rouge Vert Bleu

Programmation

Le câblage fait ressemble à ça, avec les connexions de la LED de bas en haut : 3,3V , Rouge , Vert , Bleu

Schéma de la breadboard

Prototypage de la boucle

Pour éviter les erreurs, j'ai d'abord prototypé le logiciel, ce qui m'a permit de vérifier le fonctionnement.
Voici le contenu de la boucle, ce qui est le plus important :

// Attribution des couleurs aux LEDs A, B et C
noLED[0] = nbSequence;
noLED[1] = nbSequence+1;
noLED[2] = nbSequence+2;

// "Correction" des calculs : si dépassement du nombre de LEDs, soustraction pour revenir "au début"
for (int i=0; i < nbLEDs; i++) {
    if (noLED[i] > 2) noLED[i] = noLED[i] - nbLEDs;
}

// Sortie sur les LEDs
analogWrite(pinLEDs[noLED[0]], 255);
analogWrite(pinLEDs[noLED[1]], 0);
analogWrite(pinLEDs[noLED[2]], 255);

// Mise à jour du compteur, mise à zéro si dépassement
nbSequence++;
if (nbSequence >= nbLEDs) nbSequence = 0;

La variable nbSequence permet de savoir dans quel cas on est (voir tableau).
J'ai choisi de travailler en tableau, chacun de dimension du nombre de LEDs (nbLEDs) :

  • noLED est équivalent à la LED A, B et C (citées plus haut)
  • pinLEDs contient les n° de port réel des LEDs, qui permettent de les allumer / éteindre

Intégration du fondu

Je me suis inspiré d'une fonction disponible dans les exemples Arduino (Examples > Basics > Fade) :

brillance = 0;                                          // Remise à zéro !
for (int i=0; i < 255; i++) {                           // si i < 256 : la LED s'éteind
    brillance = brillance + intensite;                  // intensite = 1 (dans la définition des variables)
    analogWrite(pinLEDs[noLED[0]], 255-brillance);      // allumage progressif
    analogWrite(pinLEDs[noLED[1]], brillance);          // extinction progressive
    delay(25);
}

Vous pouvez télécharger la source ici.