Arduino+Java: Ejemplo de LED Blink con Java Threads

En los primeros posts que hice de Arduino, utilizé el ejemplo Blink.

En dicho ejemplo utilizábamos un delay de 1 segundo para provocar un parpadeo. En este post haremos lo mismo, sin embargo no colocaremos el delay en el código Arduino, sino en Java.

Para poder utilizar un delay en Java es necesario implementar los Hilos o Threads, los cuales ya vimos en un post pasado.

Crearemos una interfaz en Java con un botón de encendido y apagado, tal como lo hicimos en el post de Encender un LED desde la PC con Arduino y Java.

Los resultados obtenidos con dicho post los podemos apreciar en el siguiente video:


Ahora usaremos la misma interfaz, con solo algunas variaciones en el código.

Sin título

El código de los botones lo modificaremos ligeramente. Necesitaremos declarar una variable global del tipo boolean llamada state.

En dicha variable guardaremos el estado del LED, ya sea encendido(parpadeando) o apagado.

Eliminaremos la función enviar datos de los 2 botones que hemos colocado.

Sin títuloReemplazamos el “EnviarDatos()” por el state, que será true para encendido y false para apagado.

Sin embargo, para poder comunicarnos con Arduino tenemos que utilizar obligatoriamente la función EnviarDatos.

Esta será la función que manejaremos con los Threads. Declaramos una variable tipo Thread a la que llamaremos Hilo y la iniciaremos en el start del programa.

Sin título

Recuerden implementar la interfaz Runnable que es esencial para el uso de los Hilos.

Sin título

Esto también implica que se agregue el método public void run() al final del código.

Ahí es donde llamaremos a EnviarDatos().

El código para el método Run es el siguiente:

 

Esto funciona de la siguiente manera:

En la variable ct se guarda el CurrenThread que es el hilo que se esté ejecutando en determinado instante.

Mientras ct sea igual a Hilo que es el thread que declaramos, entonces se ejecutará determinado código.

Si la variable state es igual a true, es decir, LED encendido, entonces se entra en un ciclo en donde se enviará un “1” que es el que enciende el LED, se “dormirá” el hilo durante 1000 milisegundos, que es un segundo, luego se enviará un “0” que apagará el LED. Se espera 1 segundo más y luego se enciende el LED y así sucesivamente.

Sin título

Si la variable state cambia a falso, el programa no encontrará ningún código que ejecutar y permanecerá sin hacer nada.

Con el comando Thread.sleep(1000) podemos retrasar la ejecución de un hilo la cantidad de tiempo que nosotros decidamos.

En Arduino el código es extremadamente sencillo, el mismo que usamos en el post Comunicación Serial con Arduino: Encender luces desde el teclado de nuestra computadora.

 

Cargando este código en Arduino y ejecutando nuestro programa en Netbeans podemos probar si lo que hemos hecho funciona o no.

Como podemos observar en un momento cambié la frecuencia del parpadeo de 1 Hz a 10 Hz modificando el tiempo en el que el thread permanece “dormido”.

Espero sus comentarios acerca de este tema. Saludos.

Leer Más

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

Arduino + Java: Enviando mensajes a pantalla LCD desde Java con Arduino

En este post explicaré como podemos enviar una cadena de caracteres desde una interfaz Java a una pantala LCD utilizando Arduino.

En mi anterior post vimos como utilizar una pantalla LCD con Arduino.

Lo primero que explicaré será como crear la interfaz en Java. Nos vamos a Netbeans IDE y creamos un proyecto llamado LCDprinter.

Yo coloqué un jFrame con los siguientes controles:

Netbeans IDE

A mis controles le coloqué los siguientes nombres:

Netbeans IDE

Como programador soy un poco Old School y tiendo a dejar los nombres de los controles con el prefijo que los identifica (jButton, jFrame, JLabel, jTextField, etc…) y luego escribo el nombre que le quiero dar.

El código es bastante sencillo. Aparte de la función ArduinoConection() y EnviarDatos() solo se utilizará una función a la que he llamado letras().

  1. [crayon-55177d8ec6cf9908197085/]

 

Netbeans IDE

Ahora vamos a definir cuando llamaremos a esta función. Queremos que a medida que vamos escribiendo en el jTextField se vaya actualizando la cantidad de caracteres disponibles.

Utilizaremos un evento llamado KeyReleased.

Java permite utilizar eventos con sus componentes, los cuales estaremos viendo de manera más detallada en futuras aportaciones.

El evento KeyReleased se ejecuta cada vez que una tecla pasa de estar presionada a cuando el usuario deja de presionarla. Al escribir presionamos las teclas de nuestra computadora, por lo que este evento se ejecutará cada vez que introduzcamos un caracter.

Para establecer las acciones que se ejecutarán en el evento KeyReleased, vamos a el jTextFieldMensaje, le damos clic derecho, vamos a eventos/events, Key, KeyReleased.

Netbeans IDE

Se nos abrirá la ventana de código y entre las líneas que nos aparecen escribimos letras().

Netbeans IDE

Ahora programaremos los botones.

El botón “Enviar Texto” tendrá el siguiente código.

EnviarDatos(jTextFieldMensaje.getText());
jTextFieldMensaje.setText(“”);
letras();

Con esto le enviamos a Arduino el contenido del TextField.

El botón “Limpiar Texto” tendrá el siguiente código:

jTextFieldMensaje.setText(“”);
letras();

En ambos casos se limpia el contenido del jTextFieldMensaje y se actualiza la cantidad de caracteres.

Un último toque que le agregaremos: la posibilidad que al presionar ENTER el mensaje se envíe.

Le damos clic derecho al TextField y buscamos el evento Action/ActionPerformed.

Este permite que cuando alguien teclea ENTER mientras está escribiendo en un TextField, se ejecute determinado comando.

Ahi colocamos:

EnviarDatos(jTextFieldMensaje.getText());
jTextFieldMensaje.setText(“”);

Cuando hagamos esto el código nos debe quedar de la siguiente forma:

Netbeans IDE

No olviden colocar ArduinConnection() y EnviarDatos(), junto con las variables que hacen posible la comunicación Arduino-Java.

Netbeans IDE

[crayon-55177d8ec6d13148440874/]

Con esto debe ser suficiente para que podamos hacer lo que queremos hacer. Ahora vamos a Arduino IDE.

Cuando Java envía letras a Arduino a través del puerto Serie, Arduino las recibe en código ASCII, por lo que necesitamos transformar cada variable. Usaremos una función que yo mismo he preparado para este propósito. Se llama Decimal_to_ASCII().

[crayon-55177d8ec6d22116876922/]

Solamente se utiliza un switch, que ya lo vimos en el post Java+Arduino: Enciendiendo un LED RGB desde un programa en nuestra PC.

Reemplazamos los números por caracteres y devolvemos un char que será el que vamos a imprimir en la pantalla LCD.

[crayon-55177d8ec6d30618280522/]

Estamos listos con la programación. Para probar esto utilizaré el Arduino Nano que previamente adapté a la placa perforada y a la pantalla LCD.

2013-02-08-219 2013-02-08-220

Ahora estamos listos para probar si lo que hemos hecho funciona o no.

Si tienen alguna preguntas, sugerencias o comentarios no duden en contactarme.

Los archivos de este proyecto están disponibles en Google Drive.

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

Leer Más