¿Cómo puedo desplazarme por todos los colores de un LED RGB con un microcontrolador Arduino y un solo potenciómetro?

1

Se supone que el LED RGB está controlado por PWM, ¿cómo puedo asignar la posición de un potenciómetro a una combinación de colores?

    
pregunta Andreas Hartmann

4 respuestas

3

Para empezar, no hay un conjunto discreto definitivo de "todos los colores" para un LED RGB: cada uno de los emisores, rojo, azul y verde, se puede variar esencialmente a través de un conjunto infinito de valores interinos desde completamente apagado a completamente iluminado.

Si tuviéramos que simplificar la declaración del problema por la conveniencia de adaptarnos a las funciones de la biblioteca de Arduino para leer valores analógicos y escribir valores PWM, esto se reduce a esto:

  • El pin ADC conectado al potenciómetro puede leer 1024 valores distintos en un caso ideal: AnalogRead() devuelve un número entero entre 0 y 1023, es decir, un valor sin signo de 10 bits
  • Los pines PWM pueden aceptar valores entre 0 y 255: AnalogWrite() acepta un valor entero sin signo de 8 bits. Por lo tanto, 24 bits para describir todos los valores RGB posibles admitidos por las funciones de la biblioteca Arduino.

Por lo tanto, un enfoque razonable asignaría el valor de entrada de 10 bits a 8 x 3 = 24 bits para la salida.

Dado que el ojo humano es más sensible al verde, un mapeo propuesto sería de 3 bits cada uno, del valor de entrada, para rojo y azul, 4 bits para verde - cada uno asignado a 8 bits para el rojo, verde y azul AnalogWrite () valores.

redVal = (inputVal >> 2) & 0xE0; // Values 0, 32, 64, 96 ... 224
grnVal = (inputVal << 1) & 0x78; // Values 0, 16, 32, 48 ... 240
bluVal = (inputVal << 5) & 0xE0; // Values 0, 32, 64, 96 ... 224

Esto proporcionaría una forma sencilla de recorrer la mayoría de los posibles valores RGB dentro de las restricciones de simplicidad y las funciones de la biblioteca Arduino.

La transición no será, por supuesto, un recorrido suave a través de los tonos. Si ese también es un requisito, entonces se requiere un mapeo de colores en Hue-Luminescence-Saturation.

    
respondido por el Anindo Ghosh
4

¡Mapear un espacio tridimensional a una sola dimensión es inherentemente difícil!

Utilizaría un modelo de HSV y utilizaría el potenciómetro para variar H para S y V. fija. Buscaría un algoritmo de Google para traducir HSV a RGB e implementarlo en el Arduino.

Supongo que sabes cómo conectar potes a las entradas ADC y leerlas. También que sabe cómo conectar los LED RGB y manejarlos.

    
respondido por el RedGrittyBrick
1

La parte más difícil del "problema" es decidir cómo asignar un espacio de color 3D intrínsecamente a una sola dimensión de una manera que sea útil y "significativa". Hay muchas formas posibles, y la mayoría no será demasiado fácil de usar o intuitiva. Aquí hay una manera posible -

A continuación, diga N1 = 9 y N2 = 10.
Aquí he sugerido un mapeo lineal con la posición del pot y las amplitudes de R G B max iguales. En la práctica, es posible que otras "leyes" produzcan mejores resultados, pero esto se agrega fácilmente como un nivel adicional de "abstracción" al sistema básico.

Tenga, por ejemplo, un aumento de R en los pasos de N1 en toda la gama de potes.
Haga que, por ejemplo, G varíe de cero a máximo en pasos N2 para cada uno de los niveles N1 de R Haga que, por ejemplo, B varíe de cero a máx. N2 veces para cada paso de G. B puede tener tantos o tan pocos niveles por paso en G como se desee.

Supongamos que la olla tiene una variación de ángulo de 360 grados; ajusta las figuras según convenga.
Supongamos que N1 = 9, por lo que G varía de min a max 9 veces en un barrido de 360 grados, por lo que un ciclo de G ocurre sobre 360/9 = 40 grados.
Si N2 = 10, B aumentará de 0 a máximo cada 40/10 = 4 grados.

El efecto final de esto es

  • R aumentará en pasos de 9 x 40 grados en un barrido de 360 grados.
  • G variará entre 0 y 100% una vez por cada paso de 40 grados.
    Así, por ejemplo, G_10 = G_50 = G210 ...
  • B variará entre 0 y 100% cada 4 grados.

Entonces

Un barrido completo de la olla te dará 0-100% de R
A través de cada 40 grados, R será constante y G variará de 0 a 100%.
A través de cada 4 grados R & G será constante y B variará de 0 a 100%.

Con el debido cuidado, cualquier combinación de colores podrá ser "marcada" sujeto solo a las resoluciones elegidas.

Esto no será totalmente intuitivo de usar, pero es muy poco probable que haya algo. El uso de 2 o 3 ollas o similar sería preferible.

    
respondido por el Russell McMahon
0

La biblioteca FastLED es genial. Incluso tiene ejemplos para tiras analógicas RGB. Muy simplemente para conectar un potenciómetro y tener un ciclo de tiras a través de Hues basado en la rotación del Pot.

enlace

    
respondido por el joshjingles

Lea otras preguntas en las etiquetas