Comunicación serial java y arduino

Voy a mostrarles a continuación un sencillo ejemplo de interacción y comunicación vía Serial con una placa Arduino (one). Tengo aproximadamente un mes jugando con mi arduino one y confirmo lo que me habían contado, «es sencillamente emocionante ver que haces encender y apagar un LED», como me comento una amiga «es un juego para adultos», no me queda mas que reirme y aceptar que en mi caso es así y disfruto del poco tiempo que he podido dedicarme a hacer ejemplos.

Ha sido de esta manera, haciendo ejemplos del libro Getting Started with Arduino y leyendo por internet que me nació el gusanillo (curiosidad) por hacer un sencillo ejemplo pero donde en vez de comunicar los lenguajes Processing y Arduino, lo hiciera usando Java, C o C++ (estos 2 últimos espero poder hacerlos y de ser posible publicarlos mas adelante). ¿Con qué finalidad? además de aprender, sencillamente poder gozar de las bondades y herramientas que nos ofrece el trabajar con los lenguajes anteriormente mencionados.

Ahora si vamos al grano, primero indicare los componentes utilizados:

  • 1 Placa arduino one
  • 1 bombillo LED
  • 1 cable usb AM/BM (para cargar programa arduino)

La conexión es muy sencilla, consiste únicamente de colocar el LED (la pata mas larga) en el pin 13 y la otra pata en GND (tierra).

Una vez, hecho esto pasamos a hacer el sketch Arduino.

Compilamos el sketch y lo cargamos en la placa Arduino. Cargado el sketch, procedemos entonces con el programa Java. Para poder conectarnos con la placa arduino será necesario que tengamos la biblioteca RXTX (una biblioteca semejante a la Java Communications API extension), esta biblioteca posee los jar necesarios para poder establecer comunicación vía serial con la placa. La instalación dependerá del sistema operativo que utilicen, así que les recomiendo seguir los pasos de instalación indicados en el fichero README de la versión de la biblioteca (así sea la versión con los binarios o los fuentes) que se descarguen, o en el sitio web en la sección de instalación.

Una vez descargada e instalada la biblioteca RXTX, seguimos con nuestro programa Java, que consistirá unicamente de una interfaz grafica sencilla (un JFrame) con 2 botones para encender o apagar el LED.

Aqui les dejo el código fuente java:

NOTA: Tener en cuenta que para programar en Java podremos usar el IDE de nuestra preferencia, en mi caso he utilizado Eclipse. [Actualización] En el código Java no olvidar editar la constante PORT_NAME e indicar el puerto que utilicen[/Actualización]

Para compilar escribir en consola:
javac -classpath path_instalacion_biblioteca/RXTXcomm.jar:. JPanelTurnOnOffLED.java

Después de haber compilado nuestro programa Java, procedemos a ejecutarlo, de la siguiente manera:

java -Djava.library.path=. -cp path_instalacion_biblioteca/RXTXcomm.jar:. JPanelTurnOnOffLED

path_instalacion_biblioteca: Ruta de instalación de la biblioteca, es decir, donde estarán alojados los jar.

Voilà!!!, ya deberíamos poder visualizar el JFrame con sus respectivos botones de encendido y apagado. Así que, ¿qué esperas? empieza ya a encender y apagar tu LED.

Recomendación: En el libro Getting Started with Arduino, nos sugieren que en caso de mantener el LED mucho tiempo encendido usar una resistencia de 270 ohm, en cuyo caso necesitaríamos adicionalmente para hacer nuestro ejemplo una breadboard y par de cables.

Puntos importantes a tener en cuenta para usuarios Mac OS X (snow leopard)

– Si colocas (copiar con el comando sudo) la biblioteca RXTX en /Library/Java/Extensions, nuestro programa java podrá ser compilado y ejecutado de la siguiente manera:

javac JPanelTurnOnOffLED.java

java JPanelTurnOnOffLED

Aunque esta quizás no es la forma más recomendada en caso de que se llegase a trabajar con distintas versiones de la biblioteca, ya que en ese caso lo adecuado sería tener una instalación para cada versión y compilar y ejecutar nuestro programa Java de la manera indicada en un principio para poder indicarle al compilador y a la maquina virtual con que versión de la biblioteca estamos trabajando.

– Puede que te sea necesario al momento de ejecutar el programa Java indicar que se ejecute en 32 bits, si obtienes una exception similar a la que te muestro a continuación

«java.lang.UnsatisfiedLinkError: /Library/Java/Extensions/librxtxSerial.jnilib: no suitable image found. Did find: /Library/Java/Extensions/librxtxSerial.jnilib: no matching architecture in universal wrapper thrown while loading gnu.io.RXTXCommDriver»

Lo que implicará que tengamos que añadir un argumento a nuestro comando de ejecución , quedando de la siguiente manera

java -d32 JPanelTurnOnOffLED

– Ir a la carpeta /var/lock (si no existe, crearla) y otorgarle permisos de escritura al o los usuarios que vayan a ejecutar el programa, esto podrás hacerlo desde el finder o por linea de comandos con el comando chmod.

Conclusión

Cada día que pasa y me involucro más con mi nuevo hobbie, me fascino con su versatilidad, pues además de ser una arquitectura abierta, nos permite interactuar con una gran gama de lenguajes de programación entre los que les puedo mencionar C, C++, Java, Objective-C, entre otros, de una gran lista, lo cual como les dije antes, nos permite gozar de las bondades (ventajas) de un lenguaje o plataforma de software, como lo es en este caso Java, ya que podríamos aprovechar el gran numero de bibliotecas existentes, así como también de su variedad de frameworks (que son unos cuantos). Este ejemplo ha resultado interesante para mi, ya que además de lo mencionado anteriormente, es un ejemplo que podemos extrapolar a algo mas complejo, es decir, podemos imaginar que en vez de ser 2 botones, podemos crear una interfaz mas compleja con unos 5 o 6 botones y cada uno de ellos con una instrucción distinta, que nos permita por ejemplo dado el botón pulsado, ver en una pantalla, la temperatura, posicionamiento global, etc…, o incluso controlar un servomotor.

En fin, como comente en un post anterior, aquí el limite es nuestra imaginación y mas aun cuando podemos interactuar con una variedad de lenguajes, lo que no resulta en un impedimento el no saber Processing, pues si tu fuerte es Perl, Python o Java, no importa, puedes empezar a programar ya!!!.

Video de la aplicación Java en ejecución

32 respuestas a “Comunicación serial java y arduino”

  1. Epa viejo, seria interesante si pudieras publicar un video del la pantalla y la tarjeta arduino y como interactuan en el video. Solo curiosidad 🙂

    Responder

  2. Exactamente lo que buscaba, la librería Rxtx también te permite recibir información sobre el puerto serial? Seria interesante ver que activaras un led digital en la pantalla del ordenador al presionar un botón desde el arduino.
    Gracias por el vinculo a tu blog, seria agradable que pusieras un vinculo en la descripción de tu video en Youtube, que así fue como te encontré, en hora buena.

    Responder

    1. Hola Julio, si según entiendo la biblioteca (librería) Rxtx también nos permite recibir información. Como bien dices sería bastante interesante hacer un ejemplo donde se activara un led digital (o cualquier señal) por pantalla una vez presionado un boton desde el arduino, es más te confieso que me llama la atención hacer ese ejemplo (intentare hacerlo pronto). Con respecto al canal de youtube agradezco la sugerencia y apenas tenga unos minutos actualizo mi perfil para que de alguna manera se pueda indicar en el canal la dirección del blog. Muchas gracias

      Responder

      1. Sería tan fácil como leer del puerto serie

        Responder

  3. Hola, tengo una pregunta trabajando con Ubuntu cuando conecto mi Arduino me aparece que la ubicacion del puerto es /dev/ttyACM0 pero lo que veo es que el programa recorre en mi caso /dev/ttyS0 y /dev/ttyS4 solamente y a pesar de que cambio el PORT_NAME por /dev/ttyACM0 me sigue sin funcionar por que no pasa por ese puerto… Que podria hacer?? Gracias

    Responder

    1. Hola, actualmente no tengo trabajo en mis sistemas con Linux, pero intentare ayudarte, de todas formas si hayas la respuesta no dudes en compartirla con nosotros. Un saludo

      Responder

      1. Es demasiado tarde pero igual
        sudo usermod -aG dialout username
        sudo chmod a+rw /dev/ttyACM0

        Responder

    2. Como se puede averiguar el puerto usando Ubuntu

      Responder

  4. Hola solo una consulta, sera que funciona sin el pic? digo asi como en el paralelo que funciona de una sin necesidad de pic se logra mandar datos al puerto, sera que si me funciona???

    Responder

  5. Gracias… la explicacion esta muy buena e interesante…. excelente trabajo y pues seria agradable q hubieran mas tutoriales acerca de este tema…

    Responder

  6. Brutal y sencilla la explicación y el código. Me viene de perlas para cierto proyectillo que tengo en mente.

    Muchas gracias por la info, y si ya descubriste el como leer del puerto en vez de escribir, mejor que mejor!

    Responder

  7. Hola, pudiste averiguar el puerto al que se debe conectar, es que tengo el mismo problema con Ubuntu

    Responder

  8. graaaacias!
    excelente tutorial, de veras me sirvió bastante…
    es la base que me ayudara mucho, ya que trabajo en la representación de datos que se reciban de arduino por medio de sensores. gracias nuevamente

    Responder

  9. Que hay man! muy interesante tu proyecto, lo quiero hacer tambien, copio tu codigo ya despues de generar el jframe en net beans, y para la libreria del rxtx solo la adquiero con el el mismo netbeans o necesito instalar algo?
    saludos compañero!

    Responder

  10. Excelente, gracias por tu ejemplo. Solo aclarar para los principiantes como yo:
    RXTXcomm.jar goes in C:\Program Files (x86)\Java\jdk1.7.0_06\jre\lib\ext
    rxtxSerial.dll goes in C:\Program Files (x86)\Java\jdk1.7.0_06\jre\jre\bin
    esto en mi caso.
    Gracias otra vez.

    Responder

  11. Hola, como ser el nombre del puerto en windows, seria bueno que lo agregaras 🙂

    Responder

  12. Querido amigo muchas gracias por tu tutorial
    como haces para agregar la libreria
    import processing.serial.*;
    a eclipse o a NetBeans
    De antemano muchas gracias por tu colaboracion

    Responder

  13. […] menos de lo que hubiera querido pero aun así me he divertido haciendo cosas simples (p.e. java y arduino) y quiero seguir haciendolas pero ahora con usando también mi nueva raspberry […]

    Responder

  14. Buen ejemplo y una gran ayuda para lo que estamos empezando, a mi no me resulto a la primera la conexion de java y arduino yo utilizo ubuntu de x86_64 y quisiera contarles algunos de mis problemas para que otros no les pase lo mismo.

    primero que nada yo no lo lograba instalar correctamente la libreria RXTXcomm.jar la descarge del sitio y intente compilarla manualmente para 64 bit encontre otra manera mas facil de trabajar con la libreria y fue haciendo lo siguiente.

    sudo apt-get install gcc-avr avr-libc openjdk-7
    sudo usermod -aG dialout paguilera
    cd $HOME
    wget http://arduino.googlecode.com/files/arduino-1.0.5-linux64.tgz
    tar xzvf arduino-1.0.5-linux64.tgz
    rm -R arduino-1.0.5-linux64.tgz
    dmesg | grep ttyACM
    resiltado: [25714.468493] cdc_acm 3-1:1.0: ttyACM0: USB ACM device
    sudo chmod 666 /dev/ttyACM0
    cd $HOME/arduino-1.0.5

    editen el archivo arduino dentro de la carpeta arduino-1.0.5 y realizen los siguientes cambios

    #comment out this line:
    #java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel processing.app.Base

    #change it to this:
    java processing.app.Base

    agregen en su archivo .profile lo siguiente con esto instalaremos la libria RXTXcomm.jar

    for LIB in \
    java/lib/rt.jar \
    java/lib/tools.jar \
    /home/noimat/arduino-1.0.5/lib/*.jar \
    ;
    do
    CLASSPATH=»${CLASSPATH}:${LIB}»
    done
    export CLASSPATH

    ./arduino

    despues de hacer esto deben cargar nuevamente su profile o reiniciar el pc despues de estos pueden seguir los pasos descritos en este tutorial

    Responder

  15. Les recomiendo que visiten el sitio web http://panamahitek.com donde se ha publicado una librería especial para Arduino, llamada Librería Arduino para Java.

    La pueden encontrar en el siguiente enlace:
    http://panamahitek.com/libreria-arduino-para-java/

    Responder

    1. Tu ejemplo es bueno Antony pero no para Linux. Este lo he seguido al pie de la letra y me ha funcionado. Aunque tengo que hacer algunos ajustes.

      Responder

      1. Que bueno Paco que pudiste resolverlo, yo en su momento lo hice en un Mac OS X, seguramente habra que hacer cambios, pero esperaría que pocos, te importaría compartir con nosotros que tuviste que hacer para que te funcionara en Linux.

        Gracias Un saludo

        Responder

  16. Muchas gracias Jose, debe ser satisfactorio para ti que aun sigas ayudando, y repito , Gracias por compartir.

    Responder

  17. No es nada Daniel, la idea es que todos aprendamos de todos. Un saludo

    Responder

  18. Buenas tardes quisiera saber que librerías se utilizan para lograr la conexión a arduino me seria de mucha ayuda si puedieras especificar que librerias se utilizan para lograr el envio de datos, gracias de antemano

    Responder

  19. Interfaz Java y Arduino.

    Tutorial diseño de interfaz con Java bajo NetBeans para controlar Arduino desde el puerto serie / USB, odrás encender y apagar un Led, recibir mensajes de textos o comandos desde Arduino.

    Ver tutorial.
    http://www.slideshare.net/Metaconta2/interfaz-java-y-arduino

    Saludos.

    Responder

    1. Están bien para Windows, ¿lo tienes también para Linux?

      Responder

  20. muy bueno el blog, tengo una pregunta, tengo varios despositivos seriales conectados a los puertos COM de mi computadora, muchos de ellos usan diferentes baude rate, bit de paridad, etc. Mi pregunta es como puedo hacer para colocar automaticamente esos datos segun el tipo de dispositvo conectado, de antemano muchas gracias

    Responder

    1. Lo siento Marco, pero la verdad no tengo idea de como hacerlo. Quizás lo que te diré es una burrada pero ¿has investigado de SNMP? te sirve para esa opción de «monitorización» via puerto serial, entiendo que lo que deseas es dado el dato recibido identificar de que dispositivo proviene, podrías quizás enviar esa info en el dato para la cual creo que SNMP no te serviría pero si para la administración y monitorización de los dispositivos.

      De todas formas de llegar a saber como hacerlo te invito a que lo compartas con el resto por medio del blog. Un saludo

      Responder

  21. Muchas Gracias

    Por fin he visto algo que funciona a la primera.
    Y lo mas importante, las formas de compilar y ejecutar.

    SETA43

    Responder

  22. Me alegra que haya funcionado.

    Un saludo

    Responder

  23. como se el puerto que debo poner un mac. me aparece en arduino que esta en /dev/cu.usbmodem621

    Que es lo que debo poner en lugar del COM3??

    Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.