Control de colores y de tira de leds
Constantes
El control de colores, tanto de la iluminación superior como inferior se basa en las dos salidas PWM de arduino.
Lo primero que hay que hacer es identificar tanto la entrada analógica que sirve para controlar el valor a emplear de color como las dos salidas de control RGB.
//Constant definitions
//RGB PWM for lateral pair of RGB leds
#define RED_LATERAL 3
#define GREEN_LATERAL 5
#define BLUE_LATERAL 6
//RGB PWM for central illumination pair of RGB leds
#define RED_CENTRAL 9
#define GREEN_CENTRAL 10
#define BLUE_CENTRAL 11
//RGB RGB potentiometers for controling the color
#define RED_INPUT A0
#define GREEN_INPUT A1
#define BLUE_INPUT A3
//For changing from 10 to 8 bits and perform a rounding, not truncating
#define ROUNDING 2
#define MAX_POWER 256
//Variables
//Input in 10 bits resolution
int PreviousRed, PreviousGreen, PreviousBlue;
La entrada analógica es de 10 bits y la salida PWM es de 8, por lo tanto, el valor de 10 bits hay que escalarlo sobre el de 8.
Típicamente el redondeo se realiza añadiendo 0.5 unidades al valor a redondear de 10 bits y truncando el valor obtenido. El valor 0.5 en 8 bits cuando se proyecta sobre un valor de 10 es 2. Esta es la razón por la que aparece la constante ROUNDING anterior.
Inicialización
El siguiente paso es indicar a arduino cual es la configuración de pines que se va a utilizar el resto de la ejecución del programa. Para ello, se realiza el siguiente código:
void setup() {
//RGB PWM for central pair of RGB leds are outputs
pinMode(RED_LATERAL, OUTPUT);
pinMode(GREEN_LATERAL, OUTPUT);
pinMode(BLUE_LATERAL, OUTPUT);
//RGB PWM for lateral illumination pair of RGB leds are outputs
pinMode(RED_CENTRAL, OUTPUT);
pinMode(GREEN_CENTRAL, OUTPUT);
pinMode(BLUE_CENTRAL, OUTPUT);
//RGB potentiometers for controling the RGB leds are inputs
pinMode(RED_INPUT, INPUT);
pinMode(GREEN_INPUT, INPUT);
pinMode(BLUE_INPUT, INPUT);
//Input in 10 bits resolution
PreviousRed = PreviousGreen = PreviousBlue = 0;
}
Bucle principal de ejecución
En cada iteración, arduino leerá el valor que ha indicado el usuario en los potenciómetros de control y si ha cambiado, modificará los registros de salida. Si no hay variaciones, todo se dejará igual. Este es el programa que lee el valor de cada potenciómetro, lo redondea antes de convertirlo en un valor de 8 bits y finalmente, si se ha producido un cambio en el valor leído, modifica la iluminación a realizar tanto de los leds laterales como centrales.
void loop() {
// put your main code here, to run repeatedly:
//Input in 10 bits resolution
int Red = analogRead(RED_INPUT);
int Green = analogRead(GREEN_INPUT);
int Blue = analogRead(BLUE_INPUT);
//Change resolution from 10 bits to 8
//First add rounding
Red += ROUNDING;
Green += ROUNDING;
Blue += ROUNDING;
//Second shift two bits to the right
Red = Red >> 2;
Green = Green >> 2;
Blue = Blue >> 2;
if (PreviousRed != Red)
{
analogWrite(RED_LATERAL, Red);
analogWrite(RED_CENTRAL, Red);
PreviousRed = Red;
}
if (PreviousGreen != Green)
{
analogWrite(RED_LATERAL, Green);
analogWrite(RED_CENTRAL, Green);
PreviousGreen = Green;
}
if (PreviousBlue != Blue)
{
analogWrite(RED_LATERAL, Blue);
analogWrite(RED_CENTRAL, Blue);
PreviousBlue = Blue;
}
}
Aquí os dejo el programa completo de arduino que recoge el control de las luces del teclado.
Iluminación inferior
La iluminación inferior simplemente consiste en encender una batería de relés de estado sólido que toma como referencia el valor entregado en las salidas de las luces laterales y modula estos relés para cambiar el color de la cinta de leds. Por lo tanto, esta iluminación no cambia la programación del arduino sino que sólo se activa cuando se alimenta a la batería de relés de estado sólido. Si el interruptor correspondiente está apagado, la iluminación inferior, desaparece.
Comentarios
Publicar un comentario