Pour cette seconde partie, nous allons voir la préparation et la pose des bandeaux lumineux ainsi que de l'anneau lumineux, puis nous aborderons la programmation de l'ensemble.
Préparation des bandeaux et de l'anneau
Les bandeaux lumineux peuvent être coupés en fonction des besoins pour avoir le bon nombre de LED et cela est très intéressant pour des applications de modélisme où la taille des maquettes et difficile à modifier. Outre les bandeaux, il y a des anneaux de LED dont la taille est prédéterminée. Dans ce cas, il faut bien faire attention au diamètre de l'anneau. Nous avons choisi un anneau avec 12 LED et des bandeaux de 26 LED pour les piliers.
La première étape consiste à souder les 3 fils sur les bandeaux et l'anneau (1 fil pour le +5V, 1 fil pour la masse, 1 fil pour la commande). Ci-après, un exemple de préparation sur un morceau de tapis caoutchouté pour le pas abîmer les LED. Le choix du type de fil dépend de l'utilisation. Si la maquette est destinée à être souvent déplacée alors utiliser le fil souple. Le fil rigide a pour avantage de prendre plus facilement une forme et de bien se loger dans les connecteurs de l'Arduino.
Vue de l'anneau avec les 3 fils soudés
Pour les bandeaux, la mise en place est d'autant plus facile qu'il y a un adhésif. Toujours bien nettoyer la surface de la maquette (essence type F) et essuyer avant de coller.
Vue des 2 bandeaux de LED sur les piliers de la grande roue
Programme de test de l'anneau:
Comme expliqué dans la première partie, il est préférable de tester les éléments séparément avant de se lancer dans l'animation de l'ensemble. Pour gagner du temps, vous pouvez simplement reprendre le programme présenté en première partie et remplacer :
// Nombre de led piliers #define NUM_LEDS 10
par (dans le cas d'un anneau avec 12 LED):
// Nombre de led anneau #define NUM_LEDS 12
Les étapes suivantes consistent à vérifier et téléverser sur l'Arduino.
Passons à présent au gros morceau, le programme d'animation de la grande roue.
Le programme d'animation
Deux facteurs importants sont à prendre en compte:
- La durée de l'animation
- Le style de l'animation
Une animation de courte durée est facile à faire mais le public s'en lasse vite. Cependant, si couplez cela avec un bouton poussoir pour déclencher l'animation alors une durée réduite est intéressante.
Le style peut-être assez calme avec juste quelques clignotements et une couleur fixe. Cela convient bien aux stands et des petits manèges. Des enchaînements plus rapides et des variations d'intensité et de couleurs correspondent beaucoup plus à des attractions à sensations fortes.
Nous avons choisi de faire une animation d'une dizaine de minutes avec beaucoup d'enchaînements qui jouent sur l'intensité et les couleurs.
La séquence est la suivante:
- Éteindre toutes les leds des piliers
- Éteindre toutes les leds de l'anneau
- Éclairer tout en blanc
- Temporisation d'une seconde
- Éteindre toutes les leds // Ceci permet de démarrer la séquence comme au démarrage d'un spectacle
- Contraste faible et chenillard pour les piliers
- Contraste fort et chenillard pour l'anneau
- Contraste faible pour tous
- Temporisation d'une seconde
- Éteindre toutes les leds
- Contraste fort et éclaire l'anneau
- Contraste faible et change les couleurs d'un coup des piliers toutes les secondes
- Contraste fort et chenillard pour l'anneau
- Contraste faible et chenillard pour les piliers
- Toutes les couleurs des piliers changées toutes les secondes
- Temporisation d'une seconde
- Éteindre toutes les leds
Voici le programme d'animation complet:
// Programme d'animation d'une Grande Roue avec deux bandeaux avant et un anneau arriere // F. LORRAIN, A. ZANDER, E ZANDER // Decembre 2018 // Bibliothéque pour piloter les leds #include <FastLED.h> // Nombre de led piliers #define NUM_LEDS 26 // Nombre de led roue #define NUM_LEDS_ROUE 12 // Nombre de fois pour le chenillard #define NUM_CHENILLE 12 // Signaux de commande // Bandeau pilier 1 #define DATA_PIN_P1 3 // Bandeau pilier 2 #define DATA_PIN_P2 4 // Bandeau roue #define DATA_PIN_ROUE 5 // Nombre de couleurs #define NB_COLOR (sizeof(led_colors)/4) // Couleur courante uint8_t current_color; // definition des tableaux des leds CRGB leds_P1[NUM_LEDS]; CRGB leds_P2[NUM_LEDS]; CRGB leds_ROUE[NUM_LEDS_ROUE]; // table des couleurs CRGB::HTMLColorCode led_colors[]= { CRGB::AliceBlue, CRGB::Amethyst, CRGB::AntiqueWhite, CRGB::Aqua, CRGB::Aquamarine, CRGB::Azure, CRGB::Beige, CRGB::Bisque, CRGB::Black, CRGB::BlanchedAlmond, CRGB::Blue, CRGB::BlueViolet, CRGB::Brown, CRGB::BurlyWood, CRGB::CadetBlue, CRGB::Chartreuse, CRGB::Chocolate, CRGB::Coral, CRGB::CornflowerBlue, CRGB::Cornsilk, CRGB::Crimson, CRGB::Cyan, CRGB::DarkBlue, CRGB::DarkCyan, CRGB::DarkGoldenrod, CRGB::DarkGray, CRGB::DarkGrey, CRGB::DarkGreen, CRGB::DarkKhaki, CRGB::DarkMagenta, CRGB::DarkOliveGreen, CRGB::DarkOrange, CRGB::DarkOrchid, CRGB::DarkRed, CRGB::DarkSalmon, CRGB::DarkSeaGreen, CRGB::DarkSlateBlue, CRGB::DarkSlateGray, CRGB::DarkSlateGrey, CRGB::DarkTurquoise, CRGB::DarkViolet, CRGB::DeepPink, CRGB::DeepSkyBlue, CRGB::DimGray, CRGB::DimGrey, CRGB::DodgerBlue, CRGB::FireBrick, CRGB::FloralWhite, CRGB::ForestGreen, CRGB::Fuchsia, CRGB::Gainsboro, CRGB::GhostWhite, CRGB::Gold, CRGB::Goldenrod, CRGB::Gray, CRGB::Grey, CRGB::Green, CRGB::GreenYellow, CRGB::Honeydew, CRGB::HotPink, CRGB::IndianRed, CRGB::Indigo, CRGB::Ivory, CRGB::Khaki, CRGB::Lavender, CRGB::LavenderBlush, CRGB::LawnGreen, CRGB::LemonChiffon, CRGB::LightBlue, CRGB::LightCoral, CRGB::LightCyan, CRGB::LightGoldenrodYellow, CRGB::LightGreen, CRGB::LightGrey, CRGB::LightPink, CRGB::LightSalmon, CRGB::LightSeaGreen, CRGB::LightSkyBlue, CRGB::LightSlateGray, CRGB::LightSlateGrey, CRGB::LightSteelBlue, CRGB::LightYellow, CRGB::Lime, CRGB::LimeGreen, CRGB::Linen, CRGB::Magenta, CRGB::Maroon, CRGB::MediumAquamarine, CRGB::MediumBlue, CRGB::MediumOrchid, CRGB::MediumPurple, CRGB::MediumSeaGreen, CRGB::MediumSlateBlue, CRGB::MediumSpringGreen, CRGB::MediumTurquoise, CRGB::MediumVioletRed, CRGB::MidnightBlue, CRGB::MintCream, CRGB::MistyRose, CRGB::Moccasin, CRGB::NavajoWhite, CRGB::Navy, CRGB::OldLace, CRGB::Olive, CRGB::OliveDrab, CRGB::Orange, CRGB::OrangeRed, CRGB::Orchid, CRGB::PaleGoldenrod, CRGB::PaleGreen, CRGB::PaleTurquoise, CRGB::PaleVioletRed, CRGB::PapayaWhip, CRGB::PeachPuff, CRGB::Peru, CRGB::Pink, CRGB::Plaid, CRGB::Plum, CRGB::PowderBlue, CRGB::Purple, CRGB::Red, CRGB::RosyBrown, CRGB::RoyalBlue, CRGB::SaddleBrown, CRGB::Salmon, CRGB::SandyBrown, CRGB::SeaGreen, CRGB::Seashell, CRGB::Sienna, CRGB::Silver, CRGB::SkyBlue, CRGB::SlateBlue, CRGB::SlateGray, CRGB::SlateGrey, CRGB::Snow, CRGB::SpringGreen, CRGB::SteelBlue, CRGB::Tan, CRGB::Teal, CRGB::Thistle, CRGB::Tomato, CRGB::Turquoise, CRGB::Violet, CRGB::Wheat, CRGB::White, CRGB::WhiteSmoke, CRGB::Yellow, CRGB::YellowGreen, // Les couleur RGB des LED sont approximatives // La couleur suivante est un blanc chaud CRGB::FairyLight, // Si pas de correction de couleur alors utiliser ceci CRGB::FairyLightNCC }; // Initialisation void setup() { // Ports de commande des leds FastLED.addLeds<WS2812B, DATA_PIN_P1, RGB>(leds_P1, NUM_LEDS); FastLED.addLeds<WS2812B, DATA_PIN_P2, RGB>(leds_P2, NUM_LEDS); FastLED.addLeds<WS2812B, DATA_PIN_ROUE, RGB>(leds_ROUE, NUM_LEDS_ROUE); // Etient toutes les leds des piliers for( uint16_t i=0; i<NUM_LEDS; i++) { leds_P1[i] = CRGB::Black; leds_P2[i] = CRGB::Black; FastLED.show(); } // Etient toutes les leds de l'anneau for( uint16_t i=0; i<NUM_LEDS_ROUE; i++) { leds_ROUE[i] = CRGB::Black; FastLED.show(); } current_color = 0; //Contraste FastLED.setBrightness(0x05); } // Animation void loop() { uint16_t i = 0; uint32_t j = 0; uint32_t contraste = 0x05; uint32_t nb_chenillard = 0; uint32_t nb_boucle_couleur = 0; //Eclaire en Blanc for (i=0; i<NUM_LEDS; i++) { leds_P1[i] = CRGB::FairyLightNCC; leds_P2[i] = CRGB::FairyLightNCC; FastLED.setBrightness(contraste+i); FastLED.show(); } for (i=0; i<NUM_LEDS_ROUE; i++) { leds_ROUE[i] = CRGB::FairyLightNCC; //Contraste maximum FastLED.setBrightness(0x80); FastLED.show(); } delay(1000); // Eteindre leds for(i=0; i<NUM_LEDS; i++) { leds_P1[i] = CRGB::Black; leds_P2[i] = CRGB::Black; } for(i=0; i<NUM_LEDS_ROUE; i++) { leds_ROUE[i] = CRGB::Black; } FastLED.show(); delay(1000); // Chenillard // Pour les piliers for (nb_chenillard=0; nb_chenillard<NUM_CHENILLE; nb_chenillard++) { // Contrate Faible FastLED.setBrightness(0x05); for (i=0; i<NUM_LEDS; i++) { leds_P1[i] = led_colors[i]; leds_P2[i] = led_colors[i]; if (i>0){ leds_P1[i-1] = CRGB::Black; FastLED.show(); delay(50); } if (i>0){ leds_P2[i-1] = CRGB::Black; FastLED.show(); delay(50); } // Eclaire l'anneau // Contrate Fort FastLED.setBrightness(0x80); if (nb_chenillard>1){ for (j=0; j<NUM_LEDS_ROUE; j++) { leds_ROUE[j] = led_colors[j]; if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } delay(50); FastLED.show(); } } // Contrate Faible FastLED.setBrightness(0x05); } for (i=NUM_LEDS; i>0; i--) { leds_P1[i] = led_colors[i]; leds_P2[i] = led_colors[i]; if (i>0) leds_P1[i-1] = CRGB::Black; FastLED.show(); delay(50); if (i>0) leds_P2[i-1] = CRGB::Black; FastLED.show(); delay(50); } } delay(1000); // Eteindre leds for( i=0; i<NUM_LEDS; i++) { leds_P1[i] = CRGB::Black; leds_P2[i] = CRGB::Black; } FastLED.show(); delay(1000); // Eclaire l'anneau // Contrate Fort FastLED.setBrightness(0x80); for (j=0; j<NUM_LEDS_ROUE; j++) { leds_ROUE[j] = led_colors[j]; FastLED.show(); } // Contrate Faible FastLED.setBrightness(0x05); // Change les couleurs d'un coup for (nb_boucle_couleur=0; nb_boucle_couleur<10; nb_boucle_couleur++) { for (j=0; j<255; j++) { for( i=0; i<NUM_LEDS; i++) { leds_P1[i] = 0x000000+j; leds_P2[i] = 0x000000+j; } FastLED.show(); } delay(1000); for (j=0; j<255; j++) { for(i=0; i<NUM_LEDS; i++) { leds_P1[i] = 0x000000+(j<<8); leds_P2[i] = 0x000000+(j<<8); } FastLED.show(); } delay(1000); for (j=0; j<255; j++) { for( i=0; i<NUM_LEDS; i++) { leds_P1[i] = 0x000000+(j<<16); leds_P2[i] = 0x000000+(j<<16); } FastLED.show(); } // Eclaire l'anneau // Contrate Fort FastLED.setBrightness(0x80); if (nb_boucle_couleur>1){ for (j=0; j<NUM_LEDS_ROUE; j++) { leds_ROUE[j] = led_colors[j]; if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } delay(50); FastLED.show(); } } // Contrate Faible FastLED.setBrightness(0x05); delay(1000); } // Chenillard for (nb_chenillard=0; nb_chenillard<NUM_CHENILLE; nb_chenillard++) { for (i=0; i<NUM_LEDS; i++) { leds_P1[i] = led_colors[i]; leds_P1[i+1] = led_colors[i+1]; leds_P2[i] = led_colors[i]; leds_P2[i+1] = led_colors[i+1]; if (i>0) leds_P1[i-1] = CRGB::Black; FastLED.show(); delay(50); if (i>0) leds_P2[i-1] = CRGB::Black; FastLED.show(); delay(50); } for (i=NUM_LEDS; i>0; i--) { leds_P1[i] = led_colors[i+1]; leds_P2[i] = led_colors[i+1]; if (i>0) leds_P1[i-1] = CRGB::Black; FastLED.show(); delay(50); if (i>0) leds_P2[i-1] = CRGB::Black; FastLED.show(); delay(50); } // Eclaire l'anneau // Contrate Fort FastLED.setBrightness(0x80); if (nb_chenillard>1){ for (j=0; j<NUM_LEDS_ROUE; j++) { leds_ROUE[j] = led_colors[j]; if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } delay(50); FastLED.show(); } } // Contrate Faible FastLED.setBrightness(0x05); } // toutes les couleurs for(i=0; i< NB_COLOR; i++) { for( j=0; j<NUM_LEDS; j++) { leds_P1[j] = led_colors[i]; leds_P2[j] = led_colors[i]; } FastLED.show(); // Eclaire l'anneau // Contrate Fort FastLED.setBrightness(0x80); if (i>1){ for (j=0; j<NUM_LEDS_ROUE; j++) { leds_ROUE[j] = led_colors[j]; if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } if (j>0){ leds_ROUE[j-1] = CRGB::Black; FastLED.show(); } delay(50); FastLED.show(); } } delay(1000); } // Eteindre leds for(i=0; i<NUM_LEDS; i++) { leds_P1[i] = CRGB::Black; leds_P2[i] = CRGB::Black; } FastLED.show(); }
Les tests
C'est la meilleure partie! Le démarrage est la séquence d'extinction et éclairage de toutes les LEDs. Puis c'est parti pour l'enchaînement des séquences!
Vues des premiers tests en situation de la grande roue sur son module et de la future platine de commandes
Une vidéo complète ici.
Dans un prochain article nous détaillerons la platine de commande pour les éclairages mais aussi pour le son et la commande du petit train de la fête. La fête continue!
Aucun commentaire:
La publication de nouveaux commentaires n'est pas autorisée.