Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème : Rouge ON AIR, Arduino et NEOPIXEL

Créer un rouge "ON AIR" comme à la radio avec Arduino et NEOPIXEL

    14 janvier 2016 à 16:27:56

    Bonjour à tous, voilà un petit résumé de mon projet:

    Je dois éclairer un bandeau de 210 LEDs NEOPIXEL et un RING NEOPIXEL de 24 LEDs à l'aide d'un arduino.

    Tous est alimenté par une alim 5V 15A car je sais que les LEDS bouffent énormément de courant.

    L'objectif est d'éclairer toutes les LEDs en bleu et lorsque l'arduino reçoit une tension en A0, faire passer ces LEDS en rouge.

    J'ai fait ce code :

    #include <Adafruit_NeoPixel.h>
    
    #define STRIP_PIN 3
    #define RING_PIN 6
    
    
    int NUMPIXEL = 0;
    int NUMPIXELRING = 0;
    
    const int capteur = A1;
    int valCapteur = 0;
    
    // Paramètre 1 = Le nombre de NéoPixels chainés
    // Paramètre 2 = No de broche de données (Sur votre Arduino, la plupart convient)
    // Paramètre 3 = Type de pixel (flags/drapeaux), a combiner ensemble en fonction du besoin:
    //   NEO_KHZ800  flux de données à 800 KHz (plupart des NéoPixel basé sur les LEDs w/WS2812)
    //   NEO_KHZ400  flux de données à 400 KHz (Pour les Pixels classiques 'v1' FLORA (pas les V2) pilotés par WS2811)
    //   NEO_GRB     Pixels sont raccordés en flux de donnée GRB (GRB=Green,Red,Blue=Vert,Rouge,Bleu - la plupart des produits NéoPixel)
    //   NEO_RGB     Pixels sont raccordés en flux de donnée RGB (RGB=Red,Green,Blue=Rouge,Vert,Bleu - Pixels FLORA v1, pas la v2)
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(210, STRIP_PIN, NEO_GRB + NEO_KHZ800);
    Adafruit_NeoPixel ring = Adafruit_NeoPixel(24, RING_PIN, NEO_GRB + NEO_KHZ800);
    
    
    void setup() {
      
      strip.begin();
      strip.setBrightness(128);
      strip.show();
      
      ring.begin();
      ring.setBrightness(64);
      ring.show();
    }
    
    void loop() {
      
      valCapteur = analogRead (capteur);
      
     
        
        if(valCapteur <400) {
          
          for(NUMPIXEL = 0; NUMPIXEL < 150; NUMPIXEL++) {
            
          strip.setPixelColor(NUMPIXEL, strip.Color(0,0,255));
          strip.show();
          }
          for(NUMPIXELRING = 0; NUMPIXELRING < 24; NUMPIXELRING++) {
          ring.setPixelColor(NUMPIXELRING, ring.Color(0,0,255));
          ring.show();
          }
        
        }
        
        else {
          
             for(NUMPIXEL = 0; NUMPIXEL < 150; NUMPIXEL++) {
          strip.setPixelColor(NUMPIXEL, strip.Color(255,0,0));
          strip.show();
        }
          
          for(NUMPIXELRING = 0; NUMPIXELRING < 24; NUMPIXELRING++) {
          ring.setPixelColor(NUMPIXELRING, ring.Color(255,0,0));
          ring.show();
     
          
        }
        }
      }
    
          
    
    

    et j'ai un soucis car mon ring fonctionne très bien mais le bandeau pas du tout : lorsqu'il est alimenté, toutes les LEDs ne sont pas allumées et elles ne sont pas forcément bleu ( on obtient un joli arc en ciel...) et rien ne change lorsque j'injecte une tension en A0 sur l'arduino, auriez vous une idée pour me secourir ?

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      14 janvier 2016 à 21:31:02

      D'un coté tu parles de la pin A0 alors que de l'autre, tu écris A1 dans ton code, c'est assez étrange.

      Quand au ruban qui ne marche pas, je suis prêt à parier que c'est un problème de mémoire.

      Afin de pouvoir gérer la couleur de chaque LED indépendamment, la lib Adafruit_NeoPixel a besoin de mémoire pour retenir une copie de la couleur de chaque LED.

      Pour un ruban de 210 LED, la lib essaye donc d'allouer 840 octets de mémoire.

      Sachant que l'arduino n'a que 2048 octets de mémoire et qu'une partie servent déjà pour les variables, la stack et autre, je pense que la lib n'arrive pas à faire son allocation de mémoire donc elle ne peut pas gérer le ruban.

      Pour le vérifier, tu peux afficher la taille effectives des rubans dans le setup :

      void setup() {
      	
      	Serial.begin(9600);
      
      	strip.begin();
      	strip.setBrightness(128);
      	strip.show();
      
      	ring.begin();
      	ring.setBrightness(64);
      	ring.show();
      
      	Serial.print("ring=");
      	Serial.print((int)ring.numPixels());
      	Serial.println();
      
      	Serial.print("strip=");
      	Serial.print((int)strip.numPixels());
      	Serial.println();
      	
      }

      Puis ouvres la console de ton arduino et regarde ce qu'il s'affiche.

      Si tu vois ring=24 strip=210, c'est bon.

      Par contre, tu vois ring=24 strip=0, c'est que ton arduino n'a pas assez de mémoire pour gérer le ruban de 210 pixels avec la lib Adafruit.

      Mais rien ne t’empêche de gérer toi même le ruban sans la lib ;)

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2016 à 12:00:16

        Merci pour ta réponse !

        Oui dans le descriptif je parlait de la pin A0 mais entre temps je l'avais basculé sur la A1 c'est vrai.

        J'ai rentré tes lignes dans mon code et j'ai bien eu ring= 24 et strip= 210 donc ce n'est pas un problème de mémoire.

        J'ai tenté le coup avec un Arduino MEGA au cas où mais rien n'y fait les LEDS font n'importe quoi A PART les 4 premières...!?!

        Je n'ai pas d'autres idées. Ne pense tu pas que les rubans seraient buggés?

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2016 à 14:24:00

          Pour moi, il y a deux possibilité en supposant que tous est bien câblées, bien alimenté et que le bandeau ne soit pas défectueux.

          1/ Le problème est peut être du a une mauvaise configuration du "système d'horloge":

          Apparemment la bibliothèque fournit est super précise dans le timing de la commande (il n'y a qu'une seule broche de l'Arduino qui est utilisé) donc si'il y a un petit décalage dans le protocole, ça fait n'importe quoi !

          essaye de mettre un delay après chaque :

          ring.show();


          ET/OU

          2/ Le problème viendrais plutôt d'un mauvais timing de la commande. Je m'expliques:

          Dans ta boucle infinie, a chaque itération de la boucle et quelque soit la valeur du capteur, tu rafraîchis l'affichage. Imaginons que ton µC tourne à 8Mhz ce qui fait une durée d'instruction de 125ns. On va prétendre que tous ce qu'il y a dans ta boucle s’exécute en un temps d'environ 50µs ce qui nous donne un taux de rafraîchissement de la matrice de 20kHz !

          Enfin je me perds un peu dans mes explication mais d’après la description sur adafruit et si je ne me trompe pas, on y explique bien qu'il suffit de commander la led une seul fois et le reste du travail sera fais par le neopixels:

          "The PWM is built into each LED-chip so once you set the color you can stop talking to the strip and it will continue to PWM all the LEDs for you."

          Donc pour cette deuxième hypothèse, essaye de n'effectuer les instructions de chaque condition qu'une seule fois :

          #include <Adafruit_NeoPixel.h>
           
          #define STRIP_PIN 3
          #define RING_PIN 6
           
           
          int NUMPIXEL = 0;
          int NUMPIXELRING = 0;
          int indexCondition = 0;
          int instructionExecutee = 0;
           
          const int capteur = A1;
          int valCapteur = 0;
           
          // Paramètre 1 = Le nombre de NéoPixels chainés
          // Paramètre 2 = No de broche de données (Sur votre Arduino, la plupart convient)
          // Paramètre 3 = Type de pixel (flags/drapeaux), a combiner ensemble en fonction du besoin:
          //   NEO_KHZ800  flux de données à 800 KHz (plupart des NéoPixel basé sur les LEDs w/WS2812)
          //   NEO_KHZ400  flux de données à 400 KHz (Pour les Pixels classiques 'v1' FLORA (pas les V2) pilotés par WS2811)
          //   NEO_GRB     Pixels sont raccordés en flux de donnée GRB (GRB=Green,Red,Blue=Vert,Rouge,Bleu - la plupart des produits NéoPixel)
          //   NEO_RGB     Pixels sont raccordés en flux de donnée RGB (RGB=Red,Green,Blue=Rouge,Vert,Bleu - Pixels FLORA v1, pas la v2)
          Adafruit_NeoPixel strip = Adafruit_NeoPixel(210, STRIP_PIN, NEO_GRB + NEO_KHZ800);
          Adafruit_NeoPixel ring = Adafruit_NeoPixel(24, RING_PIN, NEO_GRB + NEO_KHZ800);
           
           
          void setup() {
             
            strip.begin();
            strip.setBrightness(128);
            strip.show();
             
            ring.begin();
            ring.setBrightness(64);
            ring.show();
          }
           
          void loop() 
          {
          	valCapteur = analogRead (capteur);
          	
          	if(valCapteur < 400)
          	{
          		if(indexCondition == 0 && instructionExecutee == 0)
          		{
          			for(NUMPIXEL = 0; NUMPIXEL < 150; NUMPIXEL++) 
          			{
          
          				strip.setPixelColor(NUMPIXEL, strip.Color(0,0,255));
          				strip.show();
          			}
          
          			for(NUMPIXELRING = 0; NUMPIXELRING < 24; NUMPIXELRING++) 
          			{
          				ring.setPixelColor(NUMPIXELRING, ring.Color(0,0,255));
          				ring.show();
          			}
          			
          			instructionExecutee = 1;
          		}
          		else
          		{
          			indexCondition = 1;
          			instructionExecutee = 0;
          		}
          		
          	 }
          	 else
          	 {
          		if(indexCondition == 1 && instructionExecutee == 0)
          		{
          			for(NUMPIXEL = 0; NUMPIXEL < 150; NUMPIXEL++) 
          			{
          				strip.setPixelColor(NUMPIXEL, strip.Color(255,0,0));
          				strip.show();
          			}
          
          			for(NUMPIXELRING = 0; NUMPIXELRING < 24; NUMPIXELRING++) 
          			{
          				ring.setPixelColor(NUMPIXELRING, ring.Color(255,0,0));
          				ring.show();
          			}
          			
          			instructionExecutee = 1;
          		}
          		else
          		{
          			indexCondition = 0;
          			instructionExecutee = 0;
          		}
          	 }
          }

          Les deux hypothèse sont plus ou moins liée, essaye les une par une ou en les combinant pour voir le résultat...

          • Partager sur Facebook
          • Partager sur Twitter
            27 septembre 2018 à 11:08:00

            Bonjour,

            J'ai eu ce probléme car je n'avais pas bien déclaré le type de Neopixel.

            Essai en changeant le paramétre "NEO_RGB" dans la ligne : Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, RING_PIN, NEO_GRB + NEO_KHZ800);et eventuellement NEO_KHZ800.

            • Partager sur Facebook
            • Partager sur Twitter
              27 septembre 2018 à 15:38:08

              Cela part d'une bonne intention mais le post date du 14 janvier 2016...

              En 2 ans, je pense que l'auteur a eu le temps de résoudre son problème, ou d'abandonner.

              Au passage, j'en profite pour dire qu'appeler "show" dans le boucle for n'est pas une bonne idée.

              La fonction "show" doit être appelée une fois que tous les appels à "setPixelColor" ont été fait.

              Sinon, cela va rafraichir n fois le ruban, ce qui prend énormément de temps.

              -
              Edité par lorrio 27 septembre 2018 à 15:40:24

              • Partager sur Facebook
              • Partager sur Twitter

              Problème : Rouge ON AIR, Arduino et NEOPIXEL

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown