Estoy intentando construir un control de regulación para una tira de LEDs RGBW de 24V utilizando potenciómetros como entradas analógicas. Es bastante similar al ejemplo de analogWrite() en el sitio web de arduino (arduino.cc/es/Referencia/AnalogWrite), pero con cuatro entradas y salidas en lugar de una.
Estoy usando el IDE de Arduino con el bootloader optiboot (optiboot_atmega328_pro_8MHz.hex) para compilar y flasheo los chips usando avrdude desde los pines GPIO de una Raspberry Pi. Los fusibles están ajustados a:
efuse: 0x05
hfuse: 0xd6
lfuse: 0xe2
Configurar
Código
int RGBW_LED[4] = {10, 9, 5, 6};
int RGBW_POT[4] = {A5, A4, A3, A2};
int RGBW_VAL[4] = {0, 0, 0, 0};
void setup()
{
for (int i = 0; i < 4; ++i)
{
pinMode(RGBW_LED[i], OUTPUT);
pinMode(RGBW_POT[i], INPUT);
}
}
void loop()
{
for (int i = 0; i < 4; ++i)
{
RGBW_VAL[i] = 0;
analogRead(RGBW_POT[i]); // read once and discard
for (int j = 0; j < 5; ++j) // then calculate mean to avoid flickering
{
RGBW_VAL[i] += analogRead(RGBW_POT[i]);
}
RGBW_VAL[i] /= 20; // divide by 5 for mean, then by 4 to scale to output range [0, 255]
analogWrite(RGBW_LED[i], RGBW_VAL[i]);
}
}
Problemas
- Parpadeo aleatorio en (diferentes) salidas al girar los potenciómetros
- El controlador se "bloquea" aleatoriamente y necesita ser reiniciado cuando se giran simultáneamente los potenciómetros para el rojo/verde y el azul/blanco. Esto no parece ocurrir en otras combinaciones.
- El controlador se calienta (creo que es por el lado de los pines de salida) cuanto más potenciómetros encienda. Esto también lleva a que el microcontrolador se cuelgue y necesite ser reiniciado.
Lo que he hecho hasta ahora
La configuración parece funcionar bien siempre y cuando sólo esté girando un potenciómetro. También he "resuelto" más o menos el problema 1 calculando la media en código y escribiéndola en los pines de salida. Me parece más bien una solución, pero al menos es funcional. Si hay una solución adecuada, soy todo oídos.
Problema 2 parece estar relacionado con los mismos relojes PWM que se ejecutan en los pines 5/6 y 9/10 ya que la atenuación simultánea en diferentes combinaciones de pines parece funcionar. Dado que necesito cuatro controles PWM para RGBW y el Atmega328p sólo tiene tres relojes PWM independientes no puedo "engañar" a este sin embargo.
No tengo ni idea de lo que está pasando con el problema 3 . He probado a utilizar una fuente de alimentación independiente (VCC de la Raspberry Pi) para el controlador (dejando así de lado el regulador de tensión y separando los circuitos), eso no cambió nada. He probado a quitar la fuente de 24V y la tira de LEDs - mismo resultado. Lo único que evitó que los pines se calentaran fue quitar los transistores, pero estoy bastante seguro de que están cableados correctamente y como también sucede sin la fuente de 24V no puedo imaginar que la corriente esté fuera de las especificaciones.
He intentado modificar el código añadiendo retardos, regulando el valor máximo de analogWrite(), y conmutando la alimentación de los potenciómetros antes y después de la lectura conectándolos a una salida digital en lugar de a VCC, todo ello sin resultado.
También he probado a utilizar un chip Atmega328p diferente (tengo unos cuantos por ahí) por si acaso, y definitivamente no se debe a un chip defectuoso.
Se agradece cualquier ayuda. ¡Muchas gracias!
EDITAR:
He incluido el diagrama del circuito a continuación. Tenga en cuenta que he omitido el regulador de voltaje y he utilizado fuentes de alimentación de 5V y 24V por separado. He probado el circuito con ambas configuraciones y no hay ninguna diferencia. Como ya he dicho, incluso puedo desconectar la fuente de 24V y la tira de LEDs (cortar la línea dibujada a mano en el diagrama) y el calentamiento sigue produciéndose.