Draft Idea

Proyectos, ideas y demás :D

Proyecto escáner: Como comunicarse por serie con Arduino desde Java. Parte 3

Publicado en octubre 31st, 2010 por Draft Ideader

Para poder realizar el eco entre Arduino y el programa en Java necesitamos código en ambos extremos. Ya mostramos en un post anterior el código para el programa en Java, ahora le toca el turno al código que irá en Arduino.

Como podreis observar a continuación, el código para Arduino es terriblemente sencillo:

Simplemente lo que hace el programa es averiguar si hay información almacenada en el buffer (zona de memoria intermedia) del puerto serie ( if ( Serial.available() > 0) ) para poder asi después leerla e imprimirla por puerto serie como byte Serial.write(Serial.read()); ( Serial.print(Serial.read(),BYTE)  (Ya no es válido desde Arduino 1.0) ).

Hay que tener en cuenta que la función available() devuelve de manera aproximada la cantidad de información en el buffer como un valor entero, esa es la razón por la que hago el >0.

Por otra parte, a print le paso BYTE como parámetro, la razón es que de esta forma escribe en el puerto serie de forma que el programa en Java lo entienda como carácter sin necesidad de hacer nada más, aunque esto podría traernos problemas con caracteres especiales como la ñ ya que se utiliza más de 1 byte para representarlo y podria ocurrir que Arduino o el programa en Java leyera cada byte como un único carácter en alguna ocasión.

Ahora os dejo un vídeo en el que muestro el funcionamiento:

 

P.D.: Gracias a Nestor por el aviso sobre que Serial.print(var,BYTE);  ya no es valido desde Arduino 1.0.

15 Comentarios to "Proyecto escáner: Como comunicarse por serie con Arduino desde Java. Parte 3"

  1. Muchas gracias por sus tutoriales, lamentablemente el codigo de java al momento de ejecutarlo salen los siguientes errores:

    java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
    Exception in thread “main” java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:83)
    at Serie.SerialTest.initialize(SerialTest.java:46)
    at Serie.SerialTest.main(SerialTest.java:146)
    Java Result: 1

    ¿Sabe usted de que se trata?

  2. Hola Andrés, el error significa que no puede encontrar la biblioteca gnu.io.RXTXCommDriver
    Vamos a intentar solucionarlo. Necesitas descargarte la biblioteca gnu.io.RXTXCommDriver (http://rxtx.qbang.org/wiki/index.php/Download). Descargate la versión rxtx 2.1-7r2 (stable). El link exacto es este http://rxtx.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip
    Una vez descargado el archivo zip, abrelo con un descompresor de ficheros y extrae RXTXcomm.jar. Este archivo contiene en su interior las bibliotecas que nos interesan.
    Crea un directorio que se llame Serial (ojo con las mayúsculas)
    Ahora copia el código Java del programa y pégalo en un fichero con el nombre SerialTest.java dentro del directorio Serial.
    Copia RXTXcomm.jar a la carpeta Serial.
    Abre una terminal de Windows o Linux en la carpeta Serial y ejecuta el siguiente comando: javac -cp RXTXcomm.jar SerialTest.java
    (El flag -cp sirve para indicarle el archivo jar que queremos utilizar junto con el programa que queremos compilar)
    Ahora si quieres ejecutar ejecuta desde la terminal: java SerialTest

    La otra opción es que uses un IDE como Eclipse o NetBeans, en ese caso debes de ir a las opciones del proyecto y añadir RXTXcomm.jar entre las bibliotecas que se van a utilizar.

    Espero haber servido de ayuda. Gracias por leer el blog.

  3. Gracias Draft Ideader, gracias por el link exacto de la bibloteca, al parecer me equivoque en la descarga.

  4. Gracias Draft Ideader, por mandame el link exacto para descargar la bibloteca, al parecer me equivoque en la descarga.

    Estoy utilizando el mismo IDE que tu porque ponerse hacer todo eso por consola es muy dificil.

  5. De nada, para eso estamos. Gracias por leer el blog. Ante cualquier cosa puedes comentar.

    PD: Creo que comentaste 2 veces porque creiste que no llegó el comentario. La realidad es que tengo que aprobarlos yo desde la consola de administración para evitar el spam que se salta los filtros anti-spam.

  6. Hola he realizado todos los pasos que están en la página: de play ground:

    http://playground.arduino.cc//Interfacing/Java

    me compila perfecto.

    Tengo también el programa básico en el Arduino Leonarlo,

    Pero nada que consigo ver datos.

  7. Hola Jrey, si te compila perfecto y el programa básico esta en el Arduino, lo único que se me ocurre es que no tengas bien configurado el puerto en Java. Supongo que estas trabajando en una plataforma Windows, por lo tanto debes saber que puerto COM (Serie) virtual se crea al conectar el arduino al ordenador.
    Una forma sencilla de saber el puerto COM es mirandolo en el IDE de Arduino (en el menu => Puerto Serial). Esa información debes ponerla en el programa en JAVA como indico en http://draftidea.tk/proyecto-escaner-como-comunicarse-por-serie-con-arduino-desde-java-parte-2/. Para ser más exacto, aquí:
    private static final String PORT_NAMES[] = {
    “COM3”, // Windows.
    };
    Espero que sea este el problema. Gracias por leer el blog.

  8. me dice que ya no eta en uso la palabra BYTE en la vercion de arduino

  9. Efectivamente, acabo de comprobarlo y desde Arduino 1.0 la palabra clave ‘BYTE’ ya no está soportada en Serial.print(var, BYTE).
    Debes sustituir Serial.print(Serial.read(),BYTE); por Serial.write(Serial.read());
    Gracias por el aviso.

  10. java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
    Exception in thread “main” java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:83)
    at serialtest.SerialTest.initialize(SerialTest.java:45)
    at serialtest.SerialTest.main(SerialTest.java:145)
    Java Result: 1

  11. Hola que tal, excelente el aporte, una pregunta ya realice todo al pie de la letra pero me marca este error

    java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
    Exception in thread “main” java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:83)
    at serialtest.SerialTest.initialize(SerialTest.java:45)
    at serialtest.SerialTest.main(SerialTest.java:145)
    Java Result: 1

    ya lo intente pero no puedo resolverlo me podrías ayudar ?

    otra pregunta hay algún problema con que este trabajando con un arduino uno r3?

  12. Tiene pinta de que no es capaz de encontrar la biblioteca RXTX. Prueba la solución que le di a Andrés unos comentarios más abajo, en especial lo de añadir la biblioteca en el IDE (Eclipse o NetBeans) o compilar así: javac -cp RXTXcomm.jar SerialTest.java (ambas cosas son equivalentes).

    Con respecto a lo del Arduino UNO r3, creo que no debería haber ningún problema en principio.

    Espero que se solucione el problema, si aún así no te funciona avísame. Gracias por leer el blog.

  13. 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.

  14. me da error en public static void main(String[] args) throws Exception {n

  15. Lo siento, no he podido reproducir tu error.

¡Comenta la entrada!

XHTML: Puedes usar los siguientes tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Copyright © 2009 Draft Idea. Theme by THAT Agency powered by WordPress.

div class=The short URL is: