Bandeaux lumineux pour décors de train - 2


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: