¿Cómo puedo detener el parpadeo de los LED?

4


Recientemente comencé a jugar con el control de leds RGB con Arduino para un proyecto que estoy construyendo, así que construí el siguiente esquema:

simular este circuito : esquema creado usando CircuitLab

Esencialmente, lo que hace el código en Arduino es que tengo una matriz 3D de la siguiente manera:

int paterns [][4][4] = {{{255,0,255,255},{255,0,51,255},{255,255,51,255},{255,255,0,51}}};

donde la primera dimensión contiene arrays que contienen 4 sub-arrays. La matriz de la segunda capa contiene 4 valores int, el primero es la intensidad (brillo) del led, y los otros tres son Rojo, Verde, Azul respectivamente. De esta manera, cuando quiero colorear los 4 LEDs, accedo a la matriz principal y obtengo de ella la matriz 2D, que contiene valores de brillo, rojo, verde y azul para cada uno de los 4 leds.

Luego, estos valores se escriben usando la función analogWrite para cada pin respectivamente. El brillo es esencialmente controlar el transistor como una resistencia variable.

Ahora, el problema es que después de crear el nuevo circuito (los LED se conectan con cables de cobre de núcleo sólido separados entre sí a 9 cm como se ve en el diagrama), los LED parecen parpadear mucho en ciertos colores. Por ejemplo, cuando se extrae lo siguiente de la matriz:

{{255,255,255,0},{255,153,153,0},{255,51,51,255},{255,0,255,0}}

los LED de color amarillo parpadean mucho, mientras que el azul y el verde son perfectamente estables, y por lo que puedo decir, el diodo rojo es el que causa el notable parpadeo. Dicho esto, desconecté el canal rojo y, aunque los colores están alterados, solo parpadearon muy poco. De hecho, era tan poco que se debe prestar mucha atención al diodo para notarlo.

Aquí está el código completo:

int oneGround = 11, twoGround = 13, threeGround = 12,fourGround = 10;
int red = 9, green = 8, blue = 7;
int dela = 100;

int paterns [][4][4] = 
{{{255,255,102,102},{255,153,51,0},{255,255,255,0},{255,204,255,0}},
{{255,0,255,51},{255,0,255,204},{255,51,255,255},{255,0,204,204}},
{{255,255,255,255},{255,255,0,0},{255,204,0,204},{255,153,0,153}},
{{255,102,0,102},{255,102,102,0},{255,0,153,102},{255,0,255,51}},
{{255,0,153,51},{255,10,231,84},{255,10,231,84},{255,66,120,84}},
{{255,66,120,84},{255,66,41,255},{255,255,143,17},{255,30,186,237}},
{{255,153,0,204},{255,0,0,255},{255,204,51,0},{255,0,102,102}},
{{255,153,255,51},{255,153,153,0},{255,153,153,0},{255,153,153,0}},
{{255,153,153,0},{255,0,204,204},{255,0,204,204},{255,0,204,204}}};

void setup() {
  pinMode(blue, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(oneGround, OUTPUT);
  pinMode(twoGround, OUTPUT);
  pinMode(threeGround, OUTPUT);
  pinMode(fourGround, OUTPUT);
}

int c = 0, d1 = 0;

void loop() {
  lightUpValues(oneGround, paterns[d1][0][0], paterns[d1][0][1], paterns[d1][0][2], paterns[d1][0][3]);
  lightUpValues(twoGround, paterns[d1][1][0], paterns[d1][1][1], paterns[d1][1][2], paterns[d1][1][3]);
  lightUpValues(threeGround, paterns[d1][2][0], paterns[d1][2][1], paterns[d1][2][2], paterns[d1][2][3]);
  lightUpValues(fourGround, paterns[d1][3][0], paterns[d1][3][1], paterns[d1][3][2], paterns[d1][3][3]);
  if (c == 2000) {
    d1++;
    c = 0;
  } else c++;
  if (d1 == 5) {
    d1 = 0;
  }
}

void lightUpValues(int groundPin,int brightness, int r , int g, int b) {
  analogWrite(groundPin, brightness);
  analogWrite(red, r);
  analogWrite(green, g);
  analogWrite(blue, b);
  delayMicroseconds(dela);
  digitalWrite(groundPin, LOW);
}

Entonces, ¿cómo puedo detener el parpadeo de los LED?

Notas :

  1. Todavía no he aprendido C, todo lo que sé proviene de Java. ¡Lo siento si mi código te hace daño a tus ojos!

  2. También soy un novato en electrónica, solo conozco algunos conceptos básicos y eso es todo, ¡realmente quiero aprender más! :)

  3. La matriz de color codificada está creada por un programa que hice, no se escribe bit a bit ...

¡Gracias por tu tiempo !

    
pregunta fillpant

2 respuestas

4

Tienes varias opciones:

  1. Incremente la frecuencia PWM / matrix update / strobe más allá del límite para la visión humana.

  2. Ejecútelo a un ciclo de trabajo del 100%.

  3. Filtrado de paso bajo.

  4. Ejecútelo a una corriente constante con un controlador diferente.

respondido por el winny
2

Veo algunos problemas que pueden crear parpadeo:

  1. Estás utilizando PWM tanto en el ánodo como en el cátodo de los LED, lo que hace que interfieran entre sí. El valor de brillo que está utilizando no hace que el transistor actúe como una resistencia variable; lo enciende y apaga muy rápido, manteniéndolo durante aproximadamente \ $ \ frac {100 \ veces el brillo} {255} \% \ $ del tiempo total. Por lo tanto, el LED solo estará encendido cuando ambos ciclos de PWM estén encendidos al mismo tiempo.

  2. Estás usando PWM mientras multiplexas. Estoy seguro de que hay una manera de hacer esto que evita el parpadeo, pero el proceso de multiplexación consiste básicamente en poner cada LED en un ciclo de trabajo del 25% antes de que se aplique el PWM desde el comando analogWrite , creando nuevamente dos ciclos interactivos. p>

  3. Probablemente esto no tenga mucho efecto, pero me doy cuenta de que estás activando el pin de tierra para cada LED antes de establecer sus valores RGB, lo que significa que obtendrás el destello más pequeño de los LED anteriores valores de color cuando se enciende el LED actual. Debe establecer los valores RGB antes de activar el pin de tierra.

respondido por el Cameron

Lea otras preguntas en las etiquetas