No puedo hacer funcionar mas de 8 tiras de ws2812b

Hola, espero me puedan ayudar, estoy diseñando un juego con 10 tiras de leds ws2812b, cada una esta conectada a un pin del 1 al 10 en una placa Mega, utilizo la libreria Adafruit_NeoPixel y este el sketch basico para probar:

#include <Adafruit_NeoPixel.h>

#define Numpixels 300

//*** DEFINO LAS COLUMNAS CON EL PIN CORRESPONDIENTE

#define PIN_1   1 
#define PIN_2   2
#define PIN_3   3
#define PIN_4   4
#define PIN_5   5
#define PIN_6   6
#define PIN_7   7
#define PIN_8   8
#define PIN_9   9
#define PIN_10  10

Adafruit_NeoPixel Columna_1 = Adafruit_NeoPixel (Numpixels, PIN_1); 
Adafruit_NeoPixel Columna_2 = Adafruit_NeoPixel (Numpixels, PIN_2);
Adafruit_NeoPixel Columna_3 = Adafruit_NeoPixel (Numpixels, PIN_3);
Adafruit_NeoPixel Columna_4 = Adafruit_NeoPixel (Numpixels, PIN_4);
Adafruit_NeoPixel Columna_5 = Adafruit_NeoPixel (Numpixels, PIN_5);
Adafruit_NeoPixel Columna_6 = Adafruit_NeoPixel (Numpixels, PIN_6);
Adafruit_NeoPixel Columna_7 = Adafruit_NeoPixel (Numpixels, PIN_7);
Adafruit_NeoPixel Columna_8 = Adafruit_NeoPixel (Numpixels, PIN_8);
Adafruit_NeoPixel Columna_9 = Adafruit_NeoPixel (Numpixels, PIN_9);
Adafruit_NeoPixel Columna_10 = Adafruit_NeoPixel (Numpixels,PIN_10);

void setup() 
{

  //*** INICIALIZO LAS COLUMNAS DE LEDS
  
  Columna_1.begin(); 
  Columna_2.begin();
  Columna_3.begin();
  Columna_4.begin();
  Columna_5.begin();
  Columna_6.begin();
  Columna_7.begin();
  Columna_8.begin();
  Columna_9.begin();
  Columna_10.begin();  
}
void loop() 
{
Columna_1.fill(Columna_1.Color(150,0,0));
Columna_1.show();
delay(200);
Columna_1.clear();
Columna_1.show();

Columna_2.fill(Columna_2.Color(150,0,0));
Columna_2.show();
delay(200);
Columna_2.clear();
Columna_2.show();

Columna_3.fill(Columna_3.Color(150,0,0));
Columna_3.show();
delay(200);
Columna_3.clear();
Columna_3.show();

Columna_4.fill(Columna_4.Color(150,0,0));
Columna_4.show();
delay(200);
Columna_4.clear();
Columna_4.show();

Columna_5.fill(Columna_5.Color(150,0,0));
Columna_5.show();
delay(200);
Columna_5.clear();
Columna_5.show();

Columna_6.fill(Columna_6.Color(150,0,0));
Columna_6.show();
delay(200);
Columna_6.clear();
Columna_6.show();

Columna_7.fill(Columna_7.Color(150,0,0));
Columna_7.show();
delay(200);
Columna_7.clear();
Columna_7.show();

Columna_8.fill(Columna_8.Color(150,0,0));
Columna_8.show();
delay(200);
Columna_8.clear();
Columna_8.show();

Columna_9.fill(Columna_9.Color(150,0,0));
Columna_9.show();
delay(200);
Columna_9.clear();
Columna_9.show();

Columna_10.fill(Columna_10.Color(150,0,0));
Columna_10.show();
delay(200);
Columna_10.clear();
Columna_10.show();

}

El codigo es mas complejo pero use este para probar el funcionamiento y las conexiones. Del 1 al 8 funciona bien, cuando debe encender la tira 9 y 10, no lo hace. Ahora, si comento cualquiera de las otras tiras para que no la ejecute, la 9 y la 10 funcionan, es como si 8 fuera el limite, pero ademas no estan todas encendidas, es una tira a la vez. No logro descubrir el problema.
No quiero tener que conectar dos tiras unidas y manejar desde el led 0 a 299 una columna y de la 300 hasta 599 la otra columna y asi tener solo 5 pines utilizados. La fuente de alimentacion de las tiras es externa y puse una resistencia de 470 ohms en cada pin.
Agradeceria toda ayuda posible.

¿Limites en tiras?, no lo se , nunca he manejado ni tantas tiras ni tantos Led. Otras librerias si tienen limites de leds como la Fastled que si no recuerdo mal son 600.
Haz un par de pruebas a ver que sacas.

Primero baja el numero de led por tira por ejemplo Numpixels 30 a ver si traga.
Segundo yo nunca defini las tiras como tu lo haces:

Adafruit_NeoPixel Columna_1 = Adafruit_NeoPixel (Numpixels, PIN_1); 

En sus ejemplos y yo siempre lo hice como ellos, la definen asi:

Adafruit_NeoPixel Columna_1(Numpixels, PIN_1, NEO_GRB + NEO_KHZ800);

Prueba ambas cosas y si no se soluciona no tengo ni idea, es la primera vez que veo intentar manejar 3000 leds.

No uses delay() de ningun tipo.

Los 3000 leds requieren RAM y eso ya plantea limitaciones asi que descarta UNO/NANO o similares.
Pero si algun Arduino o simil puede con 3000 lo lógico es que los pongas en una sola tira, todo se maneja como bits en serie con un solo pin y por dentro haces los cambios o manejas todo en grupos.
Cada led requiere 3 bytes de la RAM asi que 3000x 3 = 9000 bytes.
Apunta a los MKR que tienen 32Kb RAM, los Teensy, los ESP32 por ejemplo.

Gracias gonpezzi, te comento que tambien lo habia definido por primera vez como vos lo indicas y no funciono. Tambien habia probado con Fastled y al compilar me tiro insuficiente memoria. Pero con Adafruit_Neopixel, me indica que consumo poca memoria, no da error simplemente no funcionan las dos ultimas tiras. Tendre que poner dos tiras juntas y manejarla con un pin para reducir el manejo a 5 pines. Gracias por tu colaboracion

Surbyte, gracias por tu informacion sobre el consumo de memoria. Te comento que uso una Mega y al compilar no da error de falto de memoria. Otra opcion es poner dos arduinos que cada una maneje 5 tiras y que se comuniquen por I2C en vez de poner dos tiras en una como sugeri a gonpezzi. Lo ves viable? y si quitare el delay(). Gracias

Es cuestion de memoria, aunque no de error de compilacion.
He hecho un experimento con mi Uno y tu codigo, si fijo Numpixels = 54, funcionan las 10 tiras, si fijo Numpixels = 55 , me falla la ultima fila y asi sucesivamente van cayendo . Cuantos mas leds mas tiras fallan.
Deberias plantearte usar otra placa con mas memoria , ¿ quizas un SP32 como indica @Surbyte ?

PD: Repetido el experimento con un MEGA el maximo numero de leds por tira es de 259.

gonpezzi, hice lo mismo que vos y llegue hasta 250 para que menje las 10 tiras. Como bien decian Surbyte y vos, el problema es la memoria. Pondre, las mega necesarias para poder manejar la cantidad de tiras de led que necesito. Muchas gracias a ambos por su tiempo. Saludos

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