Con esta entrada expongo un circuito típico con el Arduino que es la combinación de los tres colores rojo, verde y azul para formar cualquier color.
Coloqué en tres salidas analógicas (PWM) los leds de alto brillo con luz difusa, el control del brillo de cada uno lo realizo mediante un programa en el computador hecho en Robotbasic con tres controles tipo "slider".
El Arduino está conectado al computador vía puerto serie y recibe los tres datos que van desde 0 hasta 255 y los procesa para generar PWM y conseguir el brillo de cada led.
Este proyecto tiene dos dificultades, la primera es el uso del puerto serie en el Robotbasic y la forma de hacerlo es así:
La segunda dificultad es que el puerto serie envía caracteres y el Arduino tiene que transformarlos en números para poder usarlos en la generación de PWM de cada color, esto lo consigo mediante el siguiente código:
Si se envía en serie los caracteres 2 y 3 el Arduino recibe cada uno y lo introduce en la variable ch y lo transforma en número almacenándolo en la variable dato dando como resultado el número 23.
La generación de PWM es muy sencilla y se hace eligiendo un pin de los seis que tiene el Arduino para este fin y el código a usar es:
analogWrite(6,dato); // salida de PWM por el pin 6, El dato puede variar de 0 a 255.
Para ajustar los colores uso tres resistencias variables y la forma de hacerlo es poner una hoja en blanco como pantalla y los leds deben iluminar esta, con el programa en robotbasic poner los tres colores a 255 que corresponde al blanco, ajustar las resistencias hasta conseguir el color blanco.
Un añadido al proyecto es el uso de un display LCD 16x2 conectado al Arduino y el código usado es el siguiente:
#include< LiquidCrystal.h >
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16, 2);
lcd.print("Verde: Azul: Rojo:");
El proyecto tiene en total dos programas uno para el Arduino y otro para el computador en Robotbasic.
Para el Arduino es el siguiente:
//Sergio Curci 2012
#include < LiquidCrystal.h > //librería del LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int dato;
void setup() {
Serial.begin(9600); //Configuración del puerto serie
lcd.begin(16, 2);
lcd.print("Verde: Azul: Rojo:");
}
void imprimir(int valor,int posicion){ //Rutina para el LCD
if (valor < 10){
lcd.setCursor(posicion, 1);
lcd.print(valor);
lcd.setCursor(posicion-1, 1);
lcd.print(0);
lcd.setCursor(posicion-2, 1);
lcd.print(0);
}
if ((valor >=10 ) & (valor < 99)){
lcd.setCursor(posicion-1, 1);
lcd.print(valor);
lcd.setCursor(posicion-2, 1);
lcd.print(0);
}
if ((valor >=99 ) & (valor < 256)){
lcd.setCursor(posicion-2, 1);
lcd.print(valor);
}
}
void loop() { //Programa principal
if ( Serial.available()) {
char ch = Serial.read(); //Leo el puerto serie
switch(ch) {
case '0'...'9':
dato = dato * 10 + ch - '0'; //Transformo a número
break;
case 'v': // Si se recibe el caracter v envio al pin 9 que corresponde al verde
imprimir(dato,2);
analogWrite(9,dato);
dato = 0;
break;
case 'r': // Si se recibe el caracter r envio al pin 10 que corresponde al rojo
imprimir(dato,17);
analogWrite(10,dato);
dato = 0;
break;
case 'a': // Si se recibe el caracter a envio al pin 6 que corresponde al azul
imprimir(dato,10);
analogWrite(6,dato);
dato = 0;
break;
}
}
}
Para el Robotbasic:
//Sergio Curci 2012
Setup:
ScrSetMetrics 4,4,555,400,0 //Configuración ventana del programa
clearscr (7)
xyText 5,5,"RGB control","comics",35,fs_Bold,,7
rectangleWH 420,240,100,100,0,7
setcommport 9,br9600,8,pNone,sbOne,fcNone //Configuración puerto serie (com9 en mi caso)
dim colorcaracter[3]
addslider "Verde",100,100,300,0,255 //Configuración sliders
addslider "Rojo",100,150,300,0,255
addslider "Azul",100,200,300,0,255
addedit "salidaverde",420,100,100,35 //Configuración salida
addedit "salidarojo",420,150,100,35
addedit "salidaazul",420,200,100,35
xyText 30,110,"Verde","Time New Roman",10,fs_Bold,,7
xyText 30,160,"Rojo","Time New Roman",10,fs_Bold,,7
xyText 30,210,"Azul","Time New Roman",10,fs_Bold,,7
Main:
while true
valor_verde = GetSliderPos("Verde") //Obtengo del slider el valor para el verde
valor_rojo = Getsliderpos("Rojo") //Obtengo del slider el valor para el rojo
valor_azul = getsliderpos("Azul") //Obtengo del slider el valor para el azul
total = RGB(valor_rojo,valor_verde,valor_azul) //El color para el rectángulo
gosub salidatext
colorcaracter[0] = ToString(valor_verde)+"v" //le pongo al final de la cadena la v
colorcaracter[1] = tostring(valor_rojo)+"r" //le pongo al final de la cadena la r
colorcaracter[2] = tostring(valor_azul)+"a" //le pongo al final de la cadena la a
gosub salidaserie
wend
end
salidaserie: //Envío por el puerto serie los tres datos rojo, verde y azul
for i=0 to 2
serout colorcaracter[i]
next i
return
salidatext:
rectangleWH 420,240,100,100,0,total //Pinto rectangulo con el color generado
setedit "salidaverde",valor_verde //Salida de los tres datos
setedit "salidarojo",valor_rojo
setedit "salidaazul",valor_azul
return
El esquema:
El puerto serie.
El Arduino está conectado al computador vía puerto serie y recibe los tres datos que van desde 0 hasta 255 y los procesa para generar PWM y conseguir el brillo de cada led.
Este proyecto tiene dos dificultades, la primera es el uso del puerto serie en el Robotbasic y la forma de hacerlo es así:
puerto = 1
setcommport puerto,br9600,8,pNone,sbOne,fcNone //configuración puerto serie
serout salida //envía de datos al puerto
br9600, pNone, sbOne y fcNone son constantes definidas en el Robotbasic.
setcommport puerto,br9600,8,pNone,sbOne,fcNone //configuración puerto serie
serout salida //envía de datos al puerto
br9600, pNone, sbOne y fcNone son constantes definidas en el Robotbasic.
La segunda dificultad es que el puerto serie envía caracteres y el Arduino tiene que transformarlos en números para poder usarlos en la generación de PWM de cada color, esto lo consigo mediante el siguiente código:
void loop() {
char ch = Serial.read();
switch(ch) {
case '0'...'9':
dato = dato * 10 + ch - '0';
break;
}
}
char ch = Serial.read();
switch(ch) {
case '0'...'9':
dato = dato * 10 + ch - '0';
break;
}
}
Si se envía en serie los caracteres 2 y 3 el Arduino recibe cada uno y lo introduce en la variable ch y lo transforma en número almacenándolo en la variable dato dando como resultado el número 23.
La generación de PWM es muy sencilla y se hace eligiendo un pin de los seis que tiene el Arduino para este fin y el código a usar es:
analogWrite(6,dato); // salida de PWM por el pin 6, El dato puede variar de 0 a 255.
Para ajustar los colores uso tres resistencias variables y la forma de hacerlo es poner una hoja en blanco como pantalla y los leds deben iluminar esta, con el programa en robotbasic poner los tres colores a 255 que corresponde al blanco, ajustar las resistencias hasta conseguir el color blanco.
Un añadido al proyecto es el uso de un display LCD 16x2 conectado al Arduino y el código usado es el siguiente:
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16, 2);
lcd.print("Verde: Azul: Rojo:");
El proyecto tiene en total dos programas uno para el Arduino y otro para el computador en Robotbasic.
Para el Arduino es el siguiente:
//Sergio Curci 2012
#include < LiquidCrystal.h > //librería del LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int dato;
void setup() {
Serial.begin(9600); //Configuración del puerto serie
lcd.begin(16, 2);
lcd.print("Verde: Azul: Rojo:");
}
void imprimir(int valor,int posicion){ //Rutina para el LCD
if (valor < 10){
lcd.setCursor(posicion, 1);
lcd.print(valor);
lcd.setCursor(posicion-1, 1);
lcd.print(0);
lcd.setCursor(posicion-2, 1);
lcd.print(0);
}
if ((valor >=10 ) & (valor < 99)){
lcd.setCursor(posicion-1, 1);
lcd.print(valor);
lcd.setCursor(posicion-2, 1);
lcd.print(0);
}
if ((valor >=99 ) & (valor < 256)){
lcd.setCursor(posicion-2, 1);
lcd.print(valor);
}
}
void loop() { //Programa principal
if ( Serial.available()) {
char ch = Serial.read(); //Leo el puerto serie
switch(ch) {
case '0'...'9':
dato = dato * 10 + ch - '0'; //Transformo a número
break;
case 'v':
analogWrite(9,dato);
dato = 0;
break;
case 'r': // Si se recibe el caracter r envio al pin 10 que corresponde al rojo
imprimir(dato,17);
analogWrite(10,dato);
dato = 0;
break;
case 'a':
analogWrite(6,dato);
dato = 0;
break;
}
}
}
Para el Robotbasic:
//Sergio Curci 2012
Setup:
ScrSetMetrics 4,4,555,400,0 //Configuración ventana del programa
clearscr (7)
xyText 5,5,"RGB control","comics",35,fs_Bold,,7
rectangleWH 420,240,100,100,0,7
setcommport 9,br9600,8,pNone,sbOne,fcNone //Configuración puerto serie (com9 en mi caso)
dim colorcaracter[3]
addslider "Verde",100,100,300,0,255 //Configuración sliders
addslider "Rojo",100,150,300,0,255
addslider "Azul",100,200,300,0,255
addedit "salidaverde",420,100,100,35 //Configuración salida
addedit "salidarojo",420,150,100,35
addedit "salidaazul",420,200,100,35
xyText 30,110,"Verde","Time New Roman",10,fs_Bold,,7
xyText 30,160,"Rojo","Time New Roman",10,fs_Bold,,7
xyText 30,210,"Azul","Time New Roman",10,fs_Bold,,7
Main:
while true
valor_verde = GetSliderPos("Verde") //Obtengo del slider el valor para el verde
valor_rojo = Getsliderpos("Rojo")
gosub salidatext
colorcaracter[0] = ToString(valor_verde)+"v" //le pongo al final de la cadena la v
colorcaracter[1] = tostring(valor_rojo)+"r"
wend
end
salidaserie: //Envío por el puerto serie los tres datos rojo, verde y azul
for i=0 to 2
serout colorcaracter[i]
next i
return
salidatext:
rectangleWH 420,240,100,100,0,total //Pinto rectangulo con el color generado
setedit "salidaverde",valor_verde //Salida de los tres datos
setedit "salidarojo",valor_rojo
setedit "salidaazul",valor_azul
return
El esquema: