viernes, 6 de enero de 2012

RGB la combinación perfecta




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í:

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.

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;
}
}

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 max 232 con sus condensadores.


El puerto serie.


















domingo, 1 de enero de 2012

Mi intención

Sí. Ya se que estáis pensando; hay muchas páginas y blogs dedicados a la electrónica y robótica en general. No os quito la razón , pero mi intención con este blog es exponer con ejemplos básicos y sencillos mis trabajos con el Arduino, la electrónica, programación y proyectos para el Orbiter Space Flight Simulator. El blog será orientado a personas que no poseen conocimientos avanzados en electrónica y programación como en mi caso.
Un punto que he observado en otros sitios es que la información está muy dispersa, no muy bien explicada o complicada y no se centra en explicar simples conceptos con una programación sencilla.
Pienso utilizar como herramienta adicional Robotbasic y usarlo para realizar comunicaciones con el Arduino y crear proyectos curiosos y simples.
Espero que os guste y sea útil a todos aquellos entusiastas en la robótica y el Orbiter y poder agarrar con ganas el camino de introducirse en este mundo apasionante y se preguntan ¿Cómo hacerlo?.