Aujourd’hui je vais vous parler d’un de mes projets ayant pour objectif de créer un ruban de LED créant une ambiance lumineuse colorée dans une pièce.
Pour ce projet j’ai choisi d’utiliser la carte Arduino. La carte Arduino se programme facilement et donc on peut faire un peu tout ce qu’on veut avec.
Pour l’éclairage de la pièce, mon choix s’arrêta rapidement sur la technologie LED du fait de sa faible consommation électrique, de sa faible chauffe et de sa bonne durée de vie.
Maintenant, choisissons la couleur de la LED !
Rouge, vert ou bleu ?
Eh, attendez ! Moi je veux toutes les couleurs !
J’ai donc choisi les diodes électroluminescente de type RGB. Car elles permettent d’avoir accès à différentes combinaisons de couleurs pour l’éclairage.
Je me suis posé la question si il fallait les piloter individuellement ou en même temps.
J’ai longuement hésité pour enfin partir sur la solution des LED pilotées individuellement.
Mais ça nécessite beaucoup de fils me direz vous !
Si pour l’analogique c’est effectivement le cas, ça ne l’est pas avec un bus numérique qui ne nécessite qu’un seul fil !
Je me suis arrêté sur le ruban de LED RGB WS2812 de 5 mètres.
Il est utilisable uniquement en intérieur même si la solution utilisable en extérieur existait.
C’est un ruban ou chaque LED (environs 150) utilise des fils d’alimentation (+ et -), et un seul fil pour les piloter et c’est là tout l’intérêt d’un bus de données.
Les LED WS2812 peuvent afficher 16 777 216 couleurs différentes et 256 niveaux de luminosité différentes avec une fréquence de rafraîchissement de 400 Hz ( 400 fois par seconde).
Pour ceux qui veulent en savoir plus sur le ruban de LED voici la documentation en Anglais bien sûr.
J’ai aussi trouvé la documentation de chaque LED WS2812.
Le ruban à été acheté sur le site Tmart.com : voici le lien pour les acheter.
Installation du matériel
L’installation n’a pas été si compliquée. Je vous montre le schéma :
Je me suis vite rendu compte que l’alimentation que j’avais pris de 5 V/ 2 A était très juste car les LED consommait au total 7,5 A.
J’ai donc commandé une alimentation de 5V / 10A sur Amazon. Elle s’avère plus puissante que l’ancienne et arrive à fournir en intensité le ruban de LED. Du fait qu’elle est supérieure au courant total consommé Alimentation 10 A > Ruban LED 7,5 A.
J’ai également profité pour intégrer la nouvelle alimentation dans un boîtier pour isoler le 230 V (car c’est très dangereux).
J’ai prix une ancienne alim de PC dont j’ai enlevé la carte électronique puis enlever tout les fils qui était en trop.
J’ai relié le connecteur 230 V de l’alimentation de PC à l’alimentation 5V/10A puis j’ai sorti le V+ qui correspond au 5V et le V- qui correspond à la masse pour pouvoir alimenter directement sur le ruban de LED.
J’en ai aussi profité pour alimenter directement l’Arduino qui utilisait avant une alimentation externe pour fonctionner.
Pour la programmation rien de plus simple j’ai téléchargé une bibliothèque développée par l’équipe d’Adafruit pour piloter les LED RGB comme je le voulais.
Bien sûr après il faut comme même programmer les effets que l’on veux.
/!\ Attention tant que vous n’avez pas envoyée les commandes, les LED restent éteintes même si vous les avez branchées.
Développement du programme
Pour cela je suis parti d’une structure de base :
#include <Adafruit_NeoPixel.h> // Charge la librairie Neo Pixel d'Adafruit utilisé pour piloter le ruban de LED
#define PIXEL_PIN 6 // On définit le pin où est connecté la patte DATA du bandeau
#define PIXEL_COUNT 150 // On définit le nombre de LED compris sur le Ruban de LED soit 150 pour le ruban de 5m50
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); // Paramètre l'objet strip qui correspond à toute les LED du ruban
void setup() {
strip.begin(); // Lance la connection
strip.show(); // Initialise toute les led à 'off'
}
/* Définition des couleurs */
int RED[3] = {255, 0, 0}; // Couleur Rouge
int GREEN[3] = {0, 255, 0}; // Couleur Verte
int CYAN[3] = {0, 255, 255}; // Couleur Cyan
int YELLOW[3] = {255, 125, 0}; // Couleur Jaune
int ORANGE[3] = {255, 40, 0}; // Couleur Orange
int PURPLE[3] = {255, 0 , 255}; // Couleur Violette
int PINK[3] = {255, 0, 100}; // Couleur Rose
int BLUE[3] = {0, 0, 255}; // Couleur Bleu
int WHITE[3] = {255, 255, 255}; // Couleur Blanche
void loop() {
strip.setBrightness(100); // Règle la luminosité à 100 % de la luminosité maximale
}
Structure de base du programme
La partie setup ne fait qu’initialiser les 150 LED à l’état éteint. C’est dans la partie loop que le programme sera joué en boucle. J’ai donc commencé par créer pour chaque effet une fonction.
Création de divers effets
Le chenillard de LED
Le premier que j’ai créé est un effet de chenillard de LED dans un sens dont voici le code :
void chenillardUp(int temps, int r, int v, int b)
{
for(int i = 0 ; i < 150 ; i++)
{
strip.setPixelColor(i, r, v, b);
strip.show();
strip.setPixelColor(i, 0, 0, 0);
strip.show();
delay(temps);
}
}
Chennilard de LED
Ensuite il suffit de l’intégrer dans le loop et le tour est joué :
#include <Adafruit_NeoPixel.h>
// On définit le pin où est connecté la patte DATA du bandeau
#define PIN 6
// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//Ici, le 150 correspond au nombre de led
Adafruit_NeoPixel strip = Adafruit_NeoPixel(150, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
strip.show(); // Initialise toute les led à 'off'
}
void loop() {
// La première valeur correspond au temps, la seconde à l'intensité du rouge, la troisième au vert, et la quatrième au bleu
chenillardUp(10, 255, 255, 255);
}
Résultat :
Allumage de toutes les LED du ruban (avec choix de la couleur)
Voici le code de la fonction pour l’allumage de toutes les LED :
void all(int temps, int r, int v, int b)
{
for(int i = 0 ; i < 150 ; i++)
{
strip.setPixelColor(i, r, v, b);
}
strip.show();
delay(temps);
}
Allumage de l'ensemble du bandeau de LED
Avec le résultat :
Allumage de toute les LED de façon progressive
Voici le code de la fonction pour l’allumage de toute les LED de façon progressive :
void progressiveUp(int temps, int r, int v, int b)
{
for(int lumi = 0 ; lumi < 100 ; lumi++)
{
for(int i = 0 ; i < 150 ; i++)
{
strip.setPixelColor(i, r, v, b);
}
strip.setBrightness(lumi);
strip.show();
delay(temps);
}
}
Allumage de toute les LED de facon progressive
Avec le résultat :
Allumage en chenillard de façon progressive
Voici le code pour allumer toutes les LED progressivement :
void progressiveUp(int temps, int r, int v, int b)
{
for(int lumi = 0 ; lumi < 100 ; lumi++)
{
for(int i = 0 ; i < 150 ; i++)
{
strip.setPixelColor(i, r, v, b);
}
strip.setBrightness(lumi);
strip.show();
delay(temps);
}
}
Allumage en chenillard de toute les LED
Résultat :
Animation de séquence de 9 couleurs à la suite
Le code :
void anim_nineColor(int temps)
{
for(int i = 0 ; i < PIXEL_COUNT ; i = i + 9)
{
strip.setPixelColor(i, RED[0], RED[1], RED[2]);
strip.setPixelColor(i+1, GREEN[0], GREEN[1], GREEN[2]);
strip.setPixelColor(i+2, CYAN[0], CYAN[1], CYAN[2]);
strip.setPixelColor(i+3, YELLOW[0], YELLOW[1], YELLOW[2]);
strip.setPixelColor(i+4, ORANGE[0], ORANGE[1], ORANGE[2]);
strip.setPixelColor(i+5, PURPLE[0], PURPLE[1], PURPLE[2]);
strip.setPixelColor(i+6, PINK[0], PINK[1], PINK[2]);
strip.setPixelColor(i+7, BLUE[0], BLUE[1], BLUE[2]);
strip.setPixelColor(i+8, WHITE[0], WHITE[1], WHITE[2]);
}
strip.show();
delay(temps);
}
Effet de vague
Le code :
/*
Animation : Effet de vague avec toute les couleur
> uint8_t wait => temps d'attente en ms
*/
void anim_rainbowCycle(uint8_t wait) {
uint16_t i, j, numbers;
numbers = 256 * 5;
for(j=0; j < numbers; j++) { // 5 cycles of all colors on wheel
for(i=0; i < PIXEL_COUNT; i++) {
strip.setPixelColor(i, Wheel(((i * 256 / PIXEL_COUNT) + j) & 255));
}
strip.show();
delay(wait);
}
}
Effet de lumière façon manège
Le code :
/*
Animation : Effet lumière manège
> uint8_t wait => temps d'attente en ms
*/
void anim_theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (int i=0; i < PIXEL_COUNT; i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();
delay(wait*2.5);
for (int i=0; i < PIXEL_COUNT; i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
Effet de flamme
Le code :
/*
Animation : Effet flame
*/
void anim_fire()
{
int r = ORANGE[0];
int g = ORANGE[1]+5;
int b = ORANGE[2];
int variation = 45;
for(int x = 0; x <PIXEL_COUNT; x++)
{
int flicker = random(0,variation);
int r1 = r-flicker;
int g1 = g-flicker;
int b1 = b-flicker;
if(g1<0) g1=0;
if(r1<0) r1=0;
if(b1<0) b1=0;
strip.setPixelColor(x,r1,g1, b1);
}
strip.show();
delay(random(50,115));
}
Effet moitié 1 couleur, moitié autre couleur
Le code :
/*
Animation : Effet deux couleur
> int temps => temps en ms
> int colorLeft => Couleur de Gauche
> int colorRight => Couleur de Droite
*/
void anim_allBiColor( int temps, int colorLeft[3], int colorRight[3])
{
for(int i = 0 ; i < PIXEL_COUNT/2 ; i++)
{
strip.setPixelColor(i, colorRight[0], colorRight[1], colorRight[2]);
}
for(int i = PIXEL_COUNT/2 ; i < PIXEL_COUNT ; i++)
{
strip.setPixelColor(i, colorLeft[0], colorLeft[1], colorLeft[2]);
}
strip.show();
delay(temps);
}
Changement d’une couleur à une autre
Le code :
/*
Animation : Changement d'une couleur à une autre de manière progressive
> int temps => temps d'attente en ms
> int colorDebut => Couleur 1
> int colorFin => Couleur 2
*/
void anim_changeColor(int temps, int colorDebut[3], int colorFin[3])
{
int color[3] = {0};
color[0] = colorDebut[0];
color[1] = colorDebut[1];
color[2] = colorDebut[2];
while(color[0] != colorFin[0] || color[1] != colorFin[1] || color[2] != colorFin[2])
{
if(color[0] > colorFin[0])
{
color[0]--;
}
else if(color[0] < colorFin[0])
{
color[0]++;
}
if(color[1] > colorFin[1])
{
color[1]--;
}
else if(color[1] < colorFin[1])
{
color[1]++;
}
if(color[2] > colorFin[2])
{
color[2]--;
}
else if(color[2] < colorFin[2])
{
color[2]++;
}
anim_all(temps, color);
}
}
Résultat :
Enregistrer
Enregistrer
Enregistrer
Enregistrer
Enregistrer
Enregistrer
Enregistrer
Enregistrer
C’est vraiment super ce tuto. Tu es allé très loin. J’ai acheté une carte Bluno (une Arduino équipée de Bluetooth). Est-ce que la prochaine fois que tu passes à la Vilaine Bidouille tu pourras me réexpliquer tout ça de vive voix ? Je pense que ça peux me servir pour mon boulot.
Bonjour a Tous
Super le TUTO il y a de très bonnes animations très variées, mais j’ai un probléme avec l’une d’elle.
je ne voie pas comment l’activer
void anim_allBiColor( 5000, ????,?????)
Merci a tout ceux qui pourront m’aider
Effet moitié 1 couleur, moitié autre couleur
Le code :
/*
Animation : Effet deux couleur
> int temps => temps en ms
> int colorLeft => Couleur de Gauche
> int colorRight => Couleur de Droite
*/
void anim_allBiColor( int temps, int colorLeft[3], int colorRight[3])
Merci à toi pour ton retour sur le tutoriel.
Pour la fonction void anim_allBicolor : le premier paramètre est le temps de l’animation, le deuxième paramètre est la couleur des LED voulue pour la première moitié du ruban de LED vous avez juste à spécifier une couleur en envoyant un des tableau suivant :
– RED[3] (Couleur Rouge),
– GREEN[3] (Couleur Verte),
– CYAN[3] (Couleur Cyan),
– YELLOW[3] (Couleur Jaune),
– ORANGE[3] (Couleur Orange),
– PURPLE[3] (Couleur Violette),
– PINK[3] (Couleur Rose),
– BLUE[3] (Couleur Bleu),
– WHITE[3] (Couleur Blanche).
Ça fonctionne deux le même manière pour le troisième paramètre qui permet de choisir la couleur de la deuxième moitié du ruban de LED.
Ce qui nous donne par exemple :
anim_allBiclolor(2, RED[3], WHITE[3]);
Soit le ruban de LED allumée en première moitié de Rouge et en seconde moitié de Blanc pendant une durée de 2 ms.
Vous pouvez aussi crée votre propre couleur en déclarant une couleur sous ce format :
int VOTRE_COULEUR = { Valeur de rouge, Valeur de verte, Valeur de bleu};
Bonjour et grand merci pour la réponse
Mais a force de chercher une solution j’ai trouvé
il faut passer la commande :
anim_allBiColor(2000, RED, GREEN);
pareil pour la fonction :
anim_changeColor(5000, ORANGE, PURPLE);
Sinon il y a systématique l’erreur
invalid conversion from ‘int’ to ‘int*’ [-fpermissive] du fait qu’il attend en paramètre un int et un tableau d’int et la il en a deux
Merci encore pour votre réponse et Bravo pour ce TUTO
Bonjour,
J’ai vraiment adoré ce tuto, il est vraiment tip top pour apprendre à manipuler les leds et faire ses propres programmes. Un grand merci.
Par contre, lors de ma compilation pour l’effet de vague, mon compilateur me trouve une erreur sur le mot « Wheel ». Est-ce que ce mot dépend de la bibliothèque Neopixel, ou bien s’agit-il d’une autre bibliothèque que je n’aurais pas installer ?
Je vous remercie
C’est un appel à une fonction que j’ai oublier de mettre dans le code. Désolé.