Una de las posibilidades más atractivas que posee Arduino es poder comunicarse con otros programas, y si estos son libres, mejor que mejor. El IDE de Arduino está basado en el de Processing, un lenguaje y entorno de programación en código abierto basado a su vez en Java, utilizado por artistas y diseñadores gráficos.
Aprovechando el divisor de tensión, ddt, con LDR de la entrada anterior, queremos que al acercar o alejar la mano del circuito, un círculo cambie su tamaño y su color. En este vídeo podemos ver lo que queremos.
Para conseguir nuestro objetivo necesitaremos dos programas: uno para Arduino, que deberá leer los valores del ddt y escribirlos en el puerto USB o serie virtual, y otro para Processing que deberá leer dichos valores y operar en consecuencia.
El programa de Arduino es muy sencillo. Aquí tenemos su listado:
int ldrPin=3;
void setup(){
Serial.begin(9600);
}
void loop(){
int val=analogRead(ldrPin);
Serial.print(val,BYTE);
delay(75);
}
Veamos sus líneas principales, de las cuales, las dos primeras ya las hemos visto anteriormente:
- Serial.begin(9600): configura la velocidad de transmisión del puerto; en este caso 9600 baudios.
- analogRead(ldrPin): lee el valor del ddt conectado al pin 3. Dicho valor, comprendido entre 0 y 255, se almacena, en la variable val.
- Serial.print(val. BYTE): envía el valor de la variable val al puerto en formato byte.
El programa para Processing es algo más complicado y lo vamos a analizar por partes. Aquí tenemos sus primeras líneas:
import processing.serial.*;
String portname = "/dev/ttyUSB0";
Serial port;
int valorUSB;
int valorMin=62;
int valorMax=240;
- import processing.serial.*: carga la librería necesaria para la comunicación con el puerto serie.
- String portname = «/dev/ttyUSB0»: se asigna a la variable portname el nombre del puerto al que está conectado nuestro Arduino. Este nombre lo podemos ver marcado desde la barra de menú Tools==>Serial port en el IDE de Arduino. En mi máquina ese nombre es ttyUSB0, muy familiar para quienes trabajamos libremente con GNU/Linux.
- Serial port: crea un objeto denominado port de la clase Serial.
- valorUSB, valorMin, valorMax: variables para almacenar los valores presente en el puerto, mínimo y máximo respectivamente. Los dos últimos dependerán de la luz ambiental que tengamos por lo que habrá que ajustarlos como se detalla más delante.
La función setup() se ejecuta al arrancar el programa y en ella se incluyen las características que se desean.
void setup() {
size(300, 300);
stroke(255);
smooth();
port = new Serial(this, portname, 9600);
}
- size(300, 300): define la dimensión de la ventana, en nuestro caso de 300×300 píxeles.
- stroke(255): proporciona el color del borde del círculo. El valor 255 se corresponde con el blanco.
- smooth(): suaviza el borde del círculo mejorando su aspecto visual.
- port=new Serial(this, portname, 9600): se asigna a port un nuevo objeto denominado Serial. La opción this hace referencia al propio objeto. De este modo se abre el puerto al que está conectado la placa a una velocidad de 9600 bps.
La función draw() se ejecutará continuamente como un bucle infinito:
void draw() {
background(0);
int valorColor= 255*(valorUSB-valorMin)/(valorMax-valorMin);
fill(valorColor,255-valorColor,255);
int radio = height*(valorUSB -valorMin)/(valorMax-valorMin);
ellipse(width/2,height/2,radio,radio);
if (port.available() > 0) {
valorUSB = port.read();
}
println(valorUSB);
}
- backgroun(0): define el color de fondo de la ventana. El valor 0 se corresponde con el negro.
- valorColor: esta variable permitirá cambiar el color del círculo. La fórmula ajusta los valores desde 0 a 255.
- fill(): establece el color de relleno del círculo. Dicho color viene definido por defecto en términos RGB. Al dejar el tercer parámetro fijo a 255, las variaciones se corresponden con distintos tonos desde el azul al rosa, como se aprecia en el vídeo. Se puede cambiar el orden de estos tres prámetros para obtener otros colores.
- radio: valor del radio. La fórmula permite que varía desde 0 hasta el alto de la ventana.
- ellipse(): dibuja una elipse en la ventana. En nuestro caso será un circulo puesto que los dos últimos parámetros son iguales al valor de radio. Los dos primeros, width/2 y height/2 proporcionan las coordenadas de su centro, que se correponden en esye caso con el centro de la ventana. Las constantes width y height se corresponden con los valores, en píxeles del ancho y alto de la ventana, respectivamente, en nuestro caso 300 y 300, definidos en size().
- if(port.available()>0): si el dato está disponible…
- valorUSB=port.read(): … lee su valor y lo almacena en la variable valorUSB.
- println(valorUSB): muestra en el IDE el valor leído. Esto nos permitirá obtener las asignaciones a la variables valorMin y valorMax.
El programa funciona, descárguelo desde este enlace y compruébelo. Alguna vez se me ha bloqueado el puerto y he tenido que reiniciar el ordenador. También he observado que si ela prueba se hace en un ambiente donde la luz varía constantemente, sobre todo si esa luz proviene de fluorescentes, las variaciones de tamaño y color son demasiado bruscas.