[RESOLU] Un ruban a leds qui veut pas faire comme les autres

Bonjour,

Je ne suis pas un expert dans le domaine mais j'arrive a m'y retrouver un peu en général.

Mon projet (pour ma compagne cosplayeuse) consiste en un casque disposant d'une queue composer de 10 dreds dans les quelles sont insérer un morceau de ruban a leds.
Le code a été trouver sur internet mais je ne pense pas que mon problème viens de lui.

voici un vidéo qui le montre bien (un image est bien plus parlant, qui description bancale ) :

10 dreds, elles sont brancher par paire a une broche de l’Arduino. chaque paire a sa broche. on peu voir que pour 8 (4 paire) pas de soucie mais pour la paire de gauche la 1ere led reste allumer en vert, j'ai l'impression que l'effet se joue correctement mais de manière arc-en-ciel au lieu du rouge voulue.

Après plusieurs recherches différentes source du problème semble possible, vue mon manque d'experience et l'endroit exiguë ou se trouve le microcontrôleur maintenant. je souhaiterais votre avis sur le sujet avant d'entreprendre les modifs pour ne pas faire pire que mieux.

  1. LE CÂBLAGE

J'ai contrôler le câblage et les soudures et tous me parait correcte. Est ce que sa peut-être une des raison du problème.

  1. LA BATTERIE PAS ASSEZ PUISSANTE

J'utilise du WS2812E 5050 60 leds par mètres en 5V comme ruban, le projet compte 524 leds en tout.
Alimenter par une batterie Lithium - ION de 3,7 V 10500mah 38.85 Wh.
Ayant d'autre projet avec ruban a leds, je savais que les leds peuvent changer de couleur qu'en on arrive a la fin de la batterie mais la sa me semble bizarre que sa ne touche que une paire de dred et non toute pour que se sois sa.....

Bien que je pense pas que sa viennent du code, étant donner que sa ne touche pas toute les dreds, je vous le mets juste au cas ou :

// ---------- Casque Nova (Terminer) ----------

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

const uint8_t gamma[] PROGMEM = { // Gamma correction table for LED brightness
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
  2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5,
  5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10,
  10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 109, 110, 112, 114,
  115, 117, 119, 120, 122, 124, 126, 127, 129, 131, 133, 135, 137, 138, 140, 142,
  144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 167, 169, 171, 173, 175,
  177, 180, 182, 184, 186, 189, 191, 193, 196, 198, 200, 203, 205, 208, 210, 213,
  215, 218, 220, 223, 225, 228, 231, 233, 236, 239, 241, 244, 247, 249, 252, 255
};

#define STRIPLEN 74// Length of LED strips
#define MAXDROPS 5 // Max concurrent 'raindrops'
#define N_STRIPS 5

uint8_t pins[N_STRIPS] = { 2, 3, 4, 5, 6 }; // Connect strips to these pins

Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIPLEN, pins[0]);

// Everything's declared volatile because state changes inside
// an interrupt routine.
volatile struct {
  uint8_t strip;
  int16_t pos;
  uint8_t speed;
  uint16_t brightness;
} drop[MAXDROPS];
volatile uint8_t
nDrops = 0, // Number of 'active' raindrops
prevStrip = 255; // Last selected strip
volatile uint16_t
countdown = 0; // Time to next raindrop

void setup() {

  // Turn strips off
  strip.begin();
  for (uint8_t s = 0; s < N_STRIPS; s++) {
    strip.setPin(pins[s]);
    strip.show();
  }

  // Set up Timer/Counter1 for ~30 Hz interrupt
  // ARDUINO UNO (and similar boards) VERSION (not for Trinket)
  TCCR1A = _BV(WGM11); // Mode 14 (fast PWM), 1:64 prescale
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11) | _BV(CS10);
  ICR1 = F_CPU / 64 / 30; // ~30 Hz (~33 ms)
  TIMSK1 |= _BV(TOIE1); // Enable overflow interrupt
}

void loop() { } // Not used -- everything's in interrupt below

// A timer interrupt is used so that everything runs at regular
// intervals, regardless of current amount of motion.
ISR(TIMER1_OVF_vect) {

  uint16_t mag[STRIPLEN];
  uint8_t s, d, p, r, g, b;
  int mx1, m, level;

  if (countdown == 0) { // Time to launch new drop?
    if (nDrops < MAXDROPS - 1) { // Is there space for one in the list?
      do {
        s = random(N_STRIPS);
      } while (s == prevStrip); // Don't repeat prior strip
      drop[nDrops].strip = prevStrip = s;
      drop[nDrops].pos = -32; // Start off top of strip
      drop[nDrops].speed = 1+ random(3);
      drop[nDrops].brightness = 250 + random(520);
      nDrops++;
      countdown = 9 + random(28); // Time to launch next one
    }
  } else countdown--;


  for (s = 0; s < N_STRIPS; s++) { // For each strip...
    memset(mag, 0, sizeof(mag)); // Clear magnitude table

    // Render active drops for this strip into magnitude table
    for (d = 0; d < nDrops; d++) {
      if (drop[d].strip == s) {
        for (p = 0; p < STRIPLEN; p++) { // For each pixel...
          mx1 = (p << 2) - drop[d].pos; // Position of LED along wave
          if ((mx1 <= 0) || (mx1 >= 32)) continue; // Out of range
          if (mx1 > 24) { // Rising edge of wave; ramp up fast (2 px)
            m = ((long)drop[d].brightness * (long)(32 - mx1)) >> 4;
          } else { // Falling edge of wave; fade slow (6 px)
            m = ((long)drop[d].brightness * (long)mx1) / 24;
          }
          mag[p] += m; // Accumulate result in magnitude buffer
        }
      }
    }

    // Remap magnitude table to RGB for strand
    for (p = 0; p < STRIPLEN; p++) { // For each pixel in strip
      level = mag[p]; // Pixel magnitude (brightness)
      if (level < 255) { // 0-254 = black to red-1
        r = pgm_read_byte(&gamma[level]);
        b = 0;
        g = 0;
      } else if (level < 510) { // 255-509 = red-1
        r = 255;
        g = 0;
        b = 0;
      } else if (level < 765) { // 510-764 = red-1
        r = 255;
        g = 0;
        b = 0;
      } else { // 765+ = black
        r = g = b = 0;
      }
      strip.setPixelColor(p, r, g, b);
    }

    strip.setPin(pins[s]); // Select output pin
    strip.show(); // Strips don't need to refresh in sync
  }

  // Move 'active' drops
  for (d = 0; d < nDrops; d++) {
    drop[d].pos += drop[d].speed;
    if (drop[d].pos >= (STRIPLEN * 4)) { // Off end?
      // Remove drop from list (move last one to this place)
      memcpy((void *)&drop[d], (void *)&drop[nDrops - 1], sizeof(drop[0]));
      nDrops--;
    }
  }
}

Voila en gros les différent source de mon problème selon mes recherche.

Ne sachant pas la quelle privilégier, je me tourne donc vers vous pour m'éclairer.
En vous remerciant d'avance pour le temps que vous aller donner a mon Problème.

Bonjour Helric

Pour tester le soft, tu croises 2 paires de lignes

uint8_t pins[N_STRIPS] = { 2, 3, 4, 5, 6 }; // Connect strips to these pins
en
uint8_t pins[N_STRIPS] = { 6, 3, 4, 5, 2 }; // Connect strips to these pins

Est ce que le défaut est à la même place, à gauche?

A+
Cordialement
jpbbricole

Bonjour,

La définition de la constante gamma contient un commentaire, essayer de le mettre avant la définition ???

// Gamma correction table for LED brightness
const uint8_t gamma[] PROGMEM = { 
....

A+

bonjour,

maintenant que je suis rentrée du travaille, j'ai pu essayer vos modif.

Aucune des deux ne change rien au problème et le probleme ne change pas de place en croisant les paires de ligne mais merci de m'accorder de votre temps!

J'avais identifier que la derd défectueuse étais souder a la broche D5 et je m'étais dis que j'avais peut-être un broche défectueuse.
J'ai donc dans un premier temps ajouter un dred ou j'y ai connecter mon petit morceau de ruban pour mes test (10 leds), sa a marcher sans problème.
Ensuite dans le projet j'ai donc supprimer la D5 pour la remplacer par D7, je déconnecte la dred problématique de la broche D5, rebranche mon morceau test. Tout va toujours bien mais une fois la dit dred souder a la broche D7 et l'alimentation rallumer le soucie revient direct....

Quel est l'Arduino utilisé ? Ça vient peut-être de l'utilisation d'une pin qu'il n'est pas adaptée à cette bibliothèque.

J'utilise l'Arduino Nano (mais de marque Elegoo).

Bonjour Helric

Tout ceci semble dire que tu as simplement la première led de chacune des 2 lignes "D5", qui sont défectueuses, peut-être "fusillée" au cours d'un essai, est ce que tes bus des WS2812 sont bien c'ablés comme préconisé:
image_2022-05-19_161557116

Cordialement
jpbbricole

Mon branchement est presque pareille, j ai juste le 5V de mon alimentation qui est connecter a la broche 5V.

Je dois juste supprimer le 1er led du ruban ou tout le ruban est problématique?

Bonjour Helric

A quelle broche, pas celle de l'Arduino?

2 solutions, couper la bande pour éliminer les LED défectueuses et ressouder les fils d'alimentation et de bus ou, plus simple, comme le reste des rubans fonctionnent, masquer ces LED avec de la toile isolante noire.

Cordialement
jpbbricole

Si, c'est bien a la broche 5V de l'Arduino...
L'arduino est alimenter par la batterie lithium également et non pas le port USB.
Le different schema que j'ai pu trouver sur le net pour alimenter le tout avec une batterie (souvant représenté par un pile 9V) faisait comme çà.

Vous n'avez jamais pu voir cela, s'ils utilisaient du 9V, ils le faisaient via la broche Vin. Regardez-le mieux

C'est exact, mais vous devez faire attention à ne pas connecter le port USB pour la reprogrammation. Il pourrait y avoir un conflit d'alimentation et le port USB de l'ordinateur pourrait être endommagé s'il n'est pas protégé.

Il est plus prudent d'alimenter l'arduino. (à l'aide d'un câble de charge USB, uniquement + et gnd), de la batterie, via le connecteur USB, de cette façon vous n'oublierez jamais de déconnecter la batterie au lithium lors de la reprogrammation.

Cela ne vient pas du code, je viens de le tester et cela fonctionne correctement. Avez-vous la résistance et le condensateur, comme @jpbbricole l'indique dans le post #7 ?
Si vous ne les avez pas, ces deux premières leds sont détériorées, il va falloir les éliminer. Et placez la résistance et le condensateur sur toutes les bandes, sur les 8 bandess.

Bonjour,

Je sais, sur le schéma il utilisais l'image d'un pile 9V pour représenter la batterie mais expliquais bien les différente broches a utilise selon la batterie utiliser.

Ne vous inquiéter pas, je fais bien attention a ne jamais brancher les 2 en même temps. J'ai un arduino uno pour mes test et rechercher. Une fois que j'ai trouver je téléverse seulement dans un Nano avant de cabler quoi que se soit dessus.

Je vais recommencer le câblage, afin de repartir sur de bonne bas et revient vers vous une fois que c'est fais.

Ce serait l'occasion de retester les bandes douteuses avec une arduino sur table. Et de confirmer ainsi que c'est bien la première LED qui est fusillée.

Bonsoir,

Je peux me présenter devant vous se soir et vous annoncer que tous fonction correctement maintenant. Chaque dred s'allume avec l'effet et la couleur voulue.

Merci a vous pour votre aide.
Merci a vous pour l’enrichissement de mes connaissances limiter dans se domaine.

C'est chose faite. La 1ere LED retirer et le ruban brancher plus rien ne fonctionnais mais un fois la 2eme LED retirer tout est revenue a la normale.
J'aurai donc perdue 4 LEDS dans cette histoire.

Encore MERCI

Pour éviter d'en perdre d'autres, voici un schéma qui explicite les connexions :

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.