Problema con tira de 300 LED WS2812B

Buenos días,

Acudo a vosotros con unas dudas acerca de este tema.

He leído en muchos sitios cómo realizar configuraciones y efectos con tiras LED de 1-3 metros, necesitando únicamente una placa Arduino UNO y lo típico de 1 resistencia en la línea de datos y 1 condensador en la salida de la fuente.

Sin embargo, probando mi tira LED de 5 metros, he notado una bajada brutal de rendimiento. Es decir, cuando uso un programa y lo configuro para 30 LED va bien, rápido. Pero cuando pongo 300, tarda mucho más en realizar el mismo recorrido. No sé si esto es un problema de memoria que se solucionaría con un Arduino Mega, es cosa de los chips de cada uno de los LED o simplemente es normal y pasará haga lo que haga. Algo me ha parecido leer por ahí que para tantos LED se necesita algo así como un conversor de señal ("signal converter"), pero no sé qué es ni cómo encajaría en este proyecto.

¿Podéis echarme una mano con esto?

Gracias!!

Un saludo.

Pero cuando pongo 300, tarda mucho más en realizar el mismo recorrido. No sé si esto es un problema de memoria que se solucionaría con un Arduino Mega, es cosa de los chips de cada uno de los LED o simplemente es normal y pasará haga lo que haga.

Nada dices de como alimentas los 300 y eso es crucial.

Hace pocos dias alguien estuvo con un problema similar asi que revisa las 4 o 5 paginas de Hardware y lee los comentarios y sugerencias.

surbyte:
Nada dices de como alimentas los 300 y eso es crucial.

Hace pocos dias alguien estuvo con un problema similar asi que revisa las 4 o 5 paginas de Hardware y lee los comentarios y sugerencias.

Voy a revisarlo, sí.

Pues está alimentada con una buena fuente de alimentación de PC de 750W Gold (63A en 5V). Más que de sobra.

Que conste que he realizado las pruebas a un 10% de la intensidad de los LED por si el problema era ese.

También he alimentado la tira desde ambos extremos.

Pues está alimentada con una buena fuente de alimentación de PC de 750W Gold (63A en 5V). Más que de sobra

Ese impreso no resiste 63A, eso es simple sentido común mi amigo.

63A deben circular por un cable de al menos 10 mm2, tienes 10 mm2 en ese impreso flexible? Claro que no.

Entonces la obvia solución cual es? Distribuir la corriente en tiras mas cortas.

surbyte:
Ese impreso no resiste 63A, eso es simple sentido común mi amigo.

63A deben circular por un cable de al menos 10 mm2, tienes 10 mm2 en ese impreso flexible? Claro que no.

Entonces la obvia solución cual es? Distribuir la corriente en tiras mas cortas.

El problema no reside ahí, puesto que una fuente de alimentación (o lo que sea) no suministra los 63A o el tope de la intensidad, sino que únicamente indica el máximo que puede ofrecer. Si le enchufas 1 solo LED, este no va a explotar (que sería lo que ocurriría si le mandas 63A).

Tu viniste por esta consulta no?

Sin embargo, probando mi tira LED de 5 metros, he notado una bajada brutal de rendimiento. Es decir, cuando uso un programa y lo configuro para 30 LED va bien, rápido. Pero cuando pongo 300, tarda mucho más en realizar el mismo recorrido.

Te estoy diciendo que no puedes alimentar 300 leds con una unica fuente, no importa si lo pones a FULL o no.
Simplemente no puedes.

Te dije donde mirar, lo hiciste?

300 les x 8 bis o digamos algunos mas, supongamos el doble 16 bits x led

300 x 16 = 4800 bits o sea 600 bytes

Tu crees que arduino no puede enviar 600 bytes ?

Si algo es rápido hasta 4 Mhz si mal recuerdo es la interfaz SPI que estas usando, o lo supongo.

La interfaz envia cada bit a tasas altísimas. De modo que ahi no esta el problema.

Espero haber respondido esta parte de la pregunta.

surbyte:
Tu viniste por esta consulta no?

Te estoy diciendo que no puedes alimentar 300 leds con una unica fuente, no importa si lo pones a FULL o no.
Simplemente no puedes.

Te dije donde mirar, lo hiciste?

300 les x 8 bis o digamos algunos mas, supongamos el doble 16 bits x led

300 x 16 = 4800 bits o sea 600 bytes

Tu crees que arduino no puede enviar 600 bytes ?

Si algo es rápido hasta 4 Mhz si mal recuerdo es la interfaz SPI que estas usando, o lo supongo.

La interfaz envia cada bit a tasas altísimas. De modo que ahi no esta el problema.

Espero haber respondido esta parte de la pregunta.

Sí, me he leído los 4 hilos que tratan sobre LEDs y tiras LED en las 10 últimas páginas, y son problemas totalmente distintos.

Mi problema es el rendimiento de la tira LED. Soy capaz de iluminar los 300 LEDs y que en todos se realicen los efectos programados, pero cuando el programa gestiona todos los LEDs (también pasa con 200), va lento.

¿Por qué dices que no puedo alimentar una tira de 300 LEDs con una misma fuente? La fuente tiene potencia de sobra para hacerlo, y como te he comentado antes, los LEDs se encienden sin problema, todos.

Yo sé que Arduino puede enviar 600 bytes perfectamente, de ahí que esté preguntando qué puede ocurrir.

La tira LED (datos) está conectada al PWM ~6, y los cables + y - de la tira a la fuente. Luego, Arduino se alimenta por USB. Hay un cable uniendo GND del Arduino al negativo de la fuente. Vamos, que está todo conectado como debería... Y sí, mi Arduino me funciona con otros proyectos.

Un saludo.

PD. He probado a alimentar Arduino con un transformador de 9V y nada, mismo problema.

Tienes puesta la resistencia de 470 ohms entre el pin de arduino y la entrada de la tira led?

surbyte:
Tienes puesta la resistencia de 470 ohms entre el pin de arduino y la entrada de la tira led?

Sí, la tengo. También tengo un condensador de 1000 uF entre + y -. Mismo resultado si se lo quito (la resistencia siempre la tengo puesta).

Porque no pones el programa?
Fue hecho por ti o usas una librería como FastLed?

Me pasa tanto con NeoPixel como con FastLed. Este es “Cylon”, el ejemplo que viene con la librería FastLED:

#include <FastLED.h>

// How many leds in your strip?
#define NUM_LEDS 300 

// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806, define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 6
#define CLOCK_PIN 13

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
	Serial.begin(57600);
	Serial.println("resetting");
	LEDS.addLeds<WS2812,DATA_PIN,RGB>(leds,NUM_LEDS);
	LEDS.setBrightness(255);
}

void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }

void loop() { 
	static uint8_t hue = 0;
	Serial.print("x");
	// First slide the led in one direction
	for(int i = 0; i < NUM_LEDS; i++) {
		// Set the i'th led to red 
		leds[i] = CHSV(hue++, 255, 255);
		// Show the leds
		FastLED.show(); 
		// now that we've shown the leds, reset the i'th led to black
		// leds[i] = CRGB::Black;
		fadeall();
		// Wait a little bit before we loop around and do it again
		delay(10);
	}
	Serial.print("x");

	// Now go in the other direction.  
	for(int i = (NUM_LEDS)-1; i >= 0; i--) {
		// Set the i'th led to red 
		leds[i] = CHSV(hue++, 255, 255);
		// Show the leds
		FastLED.show();
		// now that we've shown the leds, reset the i'th led to black
		// leds[i] = CRGB::Black;
		fadeall();
		// Wait a little bit before we loop around and do it again
		delay(10);
	}
}

No sé si dispones de una tira WS2812B de 5 metros, pero te valdría con una de 2. Si pones 120 LEDs en el programa, se nota más lento que si pones 50, y cuando pones 300, se nota mucho más.

Lo mismo el problema está en la tira.

La cuestión es que hay muy pocos hilos aquí y en cualquier otro foro donde se conecten 5 metros de tira LED, pero yo lo necesito. Igual es algo que pasaría a todo el mundo en mis mismas condiciones, no lo sé.

Comienza quitando esos dos delay(10)

10 mseg x 300 = 3000 mseg o 3 seg

Quitando esos delays consigo que en 300 LEDs vaya más rápido. Se asemeja a como cuando pongo 50, es decir, me parece una solución aceptable, sí.

Ahora, si dejando esos delays quitados disminuyo a 50 LEDs, entonces va extremadamente rápido, una exageración.

Entonces, digamos que hemos encontrado una solución para "acelerar" el programa cuando uso 300 LEDs. Pero sería interesante averiguar por qué hay tanta diferencia de velocidad al usar pocos LEDs en comparación con cuando se usan muchos, cuando Arduino tiene la suficiente potencia para hacerlo.

Igual pruebo con una Raspberry Pi 3 que tengo. Así descarto problemas.

Te lo acabo de explicar?

50 led x 10 mseg = 500 mseg algo que aceptas para y cylon.

300 leds x 10 mseg son 3 seg de ida y 3 de vuelta

A ver, que sí, pero si tengo 300 LEDs y pongo delay(1), que sería 1ms, debería tardar menos de medio segundo, y tarda mucho más.