Comunicación Serial: Enviando datos de Arduino a Java

La información suministrada en este post es considerada por mi persona como obsoleta debido a que fue publicada antes de mi librería Arduino para Java. Recomiendo visitar el siguiente post donde se explica el uso de la misma y donde es muy fácil comunicar Arduino con Java y vice versa.

***

Hola amigos. En las últimas semanas he estado escribiendo mucho acerca de Arduino, de Java y de como podemos utilizar ambas plataformas para realizar grandes proyectos. Empecé escribiendo como establecer Comunicación Serial con Arduino. Luego escribí como enviar datos de Java a Arduino a través de los métodos ArduinoConnection() y EnviarDatos().

Ahora es tiempo de aprender como recibir datos en Java desde Arduino. Para ello utilizaremos un método similar a EnviarDatos(): RecibirDatos().

Para poder utilizar este método necesitamos modificar nuestra función ArduinoConnection() y declarar algunas variables.

Los datos que enviamos de Arduino a Java se envían a través de una variable OutputStream llamada Output. Ahora declararemos una variable del tipo InputStream llamada Input.

private InputStream Input;

Resumiendo, las variables que necesitamos utilizar para comunicar Arduino y Java, y vice versa, son las siguientes:

 

Sin título

Ahora necesitamos inicializar la variable Input. Esto se hace en la función ArduinoConnection() donde ya existe una línea que inicializa la variable Output.

 

Como vemos, se prepara a la variable Input de la misma manera que a la variable Output. Hemos agregado 2 líneas más a nuestra función ArduinoConnection():

Esto permite que se genere un evento cada vez que Arduino envíe datos a Java. Para poder que esto funcione es necesario que implementemos la interfaz SerialPortEventListener de la misma manera que implementamos la interfaz Runnable cuando utilizamos los Java Threads.

Sin título

Por último necesitamos agregar un método en donde se establezca las acciones que se harán cuando ocurra un SerialPortEvent.

 

Por último agregamos RecibirDatos():

Con estas variables y estos métodos podemos lograr lo que queremos. Ahora es tiempo de probar si funciona o no.

Yo agregué los elementos necesarios al ejemplo Blink que ya hicimos:

Ahora vamos a Arduino y escribimos lo siguiente:

Con estos cambios estamos listos para ver como trabaja nuestro código. Lo que haremos es enviar el valor de una variable, en este caso, count, de Arduino a Java, con la salvedad de que cada segundo se aumentará el valor de count en 1 unidad.

Utilizamos Serial.print para enviar el mensaje. Si utilizamos println enviaremos el mensaje con un salto de renglón. Si utilizamos Serial.write, entonces no enviaremos el mensaje en ASCII sino como bits. El problema con esto es que es un bus de 8 bits, por lo que no podremos enviar valores más arriba del 255, ya que 2 elevado a la octava potencia es 256 y el bus solo admite 8 bits, del 0 al 255.

Aquí vemos la demostración:

Como podemos observar los datos se envían 1 a 1, es decir, caracter a caracter.

Espero sus comentarios. Saludos.

Leer Más

Java + Arduino: Encendiendo un LED RGB desde un programa en nuestra PC

El siguiente post pretende ser un ejemplo básico del control de los colores de un LED RGB, a partir del cual se espera obtener 7 diferentes tonalidades de colores. El control se lleva a cabo desde una aplicación en Java.

 

Un LED RGB es un tipo especial de LEDs que se caracteriza por ser capaz de generar luz en diferentes tonalidades.

diodo-led-tricolor-rgb-5mm

Poseen 4 patas, 3 ánodos y un cátodo. Al inducir una corriente entre uno de los ánodos y el cátodo, se producirá un color diferente. Se le dice RGB por que sus colores primarios son el rojo (Red), verde(Green) y el azul(Blue).

Combinando dichos colores obtendremos otras tonalidades.

En informática se utiliza mucho el RGB como principio básico para la creación de tonalidades. Si utilizamos un editor básico, como el Pain de Windows, podemos observar lo que sucede con los valores RGB. Dichos valores se extienden del 0 al 255. Nosotros con un LED RGB solo podemos tolerar 2 valores, el máximo y el mínimo, es decir, el 0 y el 255.

Si le damos un valor de 255 al ánodo R, es decir, si colocamos 5 voltios en la pata R del LED, obtendremos lo siguente:

red

Podemos despreciar los valores de las casillas Matiz, Sat y Lum. Concentrémonos en las casillas Rojo, Verde y Azul. El valor 255 representa 5 voltios en la pata R, lo que devuelve un color rojo. Si hacemos lo mismo con las casillas Verde y Azul obtendremos otras tonalidades.

rgb rgb blue rgb sky blue rgb violet rgb white rgb yellow

A lo último podemos observar que si colocamos los valores máximos en las 3 casillas obtendremos el blanco; si colocamos los valores mínimos en las 3 casillas, osea 0, obtenemos el color negro, que no es más que un LED apagado por ausencia de voltaje entre el cátodo y cualquiera de los 3 ánodos.

Podríamos formar el Celeste si probamos con 255 Verde y 255 Azul, pero la verdad no se aprecia mucho la diferencia así que decidí excluirlo de este ejemplo.

Ahora procedemos a crear una interfaz para nuestro programa con el que vamos a encender los colores del LED.

Primero vamos a Netbeans IDE y creamos un proyecto. En mi caso yo lo llamé RGB. Insertamos un jFrame y colocamos los siguientes botones:

rgb

En caso de que usted no sepa hacer esto, puede visitar el tutorial Cómo crear nuestro primer programa en Java con NetBeans.

Ahora que hemos insertado nuestros botones, le asignaremos un nombre a cada uno. Para ello, le damos clic derecho en el botón cuyo nombre deseamos cambiar y vamos a la opción “Change Variable Name”.

rgb

Le damos clic y colocamos el nombre con el siguiente formato: jButton_nombre del botón.

rgb

Repetimos el proceso para todos y cada uno de los botones. Al final, en la parte izquierda de nuestro NetBeans IDE podremos visualizar todos los botones con sus respectivos nombres.

Ahora es tiempo de proceder a implementar la función ArduinoConnection() y EnviarDatos().

Agregamos lo siguiente a nuestro código en Java:

 

También recuerden agregar la librería RXTXComm y los siguientes imports:

Con esto debería trabajar nuestro software a la par de Arduino. Ahora programemos los botones:

Para la comunicación serial entre Arduino y Java utilizaremos el siguiente código:

0 – Apaga el LED (Botón OFF)

1 – Enciende el rojo

2 – Enciende el verde

3 – Enciende el azul

4 – Enciende el morado

5 – Enciende el amarillo

6 – Enciende el blanco

Con esta sencilla configuración, procedemos a implementar el método EnviarDatos() en cada uno de los botones.

No olviden agregar la línea ArduinConnection(); luego de initComponents() en la función que inicia el programa. Si no lo hacen, Arduino y Java no se comunicarán.

Con esto quedamos listos en Java y procedemos a programar en Arduino. Aquí les dejo el código:

Subiendo este código a Arduino podremos interpretar los datos enviados por Java.

Ahora es tiempo de armar el circuito. Necesitaremos un LED RGB y 3 resistencias de un valor que esté entre 220 y 360 Ohm. Yo utilizo 330 para trabajar con 9 voltios, pero aún así funciona bien con los 5 voltios de Arduino. Ahora necesitamos identificar el cátodo y los ánodos. Miramos en el interior del LED y la pata que sea mas gruesa que las otras 3 será el cátodo. Generalmente es el segundo de izquierda a derecha o el tercero de derecha a izquierda.

Procedemos a colocarlo en un ProtoBoard. Introducimos el LED RGB y colocamos una resistencia en cada ánodo.

Una buena práctica que podemos realizar es identificar los colores del LED RGB. Conectaremos el cátodo al GND de Arduino  y utilizando un jumper, conectaremos un extremo en los 5V y el otro extremo en alguna de las resistencias para ver que color se produce.

Cuando hallamos probado que todos los colores encienden, conectamos el ánodo R en el pin 10, el ánodo G en el pin 11 y el B en el pin 12. Esto lo establecimos en el código que escribimos para Arduino.

Una vez hecho esto, con nuestro microcontrolador conectado a la PC mediante USB y el código cargado, procedemos a iniciar la aplicación que construimos en Arduini IDE.

Si todo está en orden y no se produce ningún error, obtendremos los siguientes resultados:

Espero sus comentarios. Saludos.

Leer Más

Proyecto con Arduino y Java: Grúa Magnética

Hola amigos. Les estoy presentando este proyecto que preparé el semestre pasado en la universidad. En él utilizo Arduino y Java como medios para controlar una grúa magnética.

Aquí les dejo el informe que presenté con todos los detalles del proyecto.

http://es.scribd.com/doc/115632708/Arduino-Java-Controlando-un-cabezal-de-impresion

Aquí está el PDF en Google Drive:

https://docs.google.com/folder/d/0B0hsUkhqWH97elQtOU42aTlHTGc/edit?usp=sharing

Leer Más