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.
- 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.
- 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.