You are on page 1of 14

ARDUINO

SERIAL

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

Como podreis observar a continuacin, el cdigo para Arduino es terriblemente sencillo: void setup () { Serial.begin(9600); } void loop () { if ( Serial.available() > 0) { //Serial.print(Serial.read(),BYTE); // Ya no valido desde Arduino 1.0 Serial.write(Serial.read()); } } Simplemente lo que hace el programa es averiguar si hay informacin almacenada en el buffer (zona de memoria intermedia) del puerto serie ( if ( Serial.available() > 0) ) para poder asi despus leerla e imprimirla por puerto serie como byte Serial.write(Serial.read()); ( Serial.print(Serial.read(),BYTE) (Ya no es vlido desde Arduino 1.0) ). Hay que tener en cuenta que la funcin available() devuelve de manera aproximada la cantidad de informacin en el buffer como un valor entero, esa es la razn por la que hago el >0.

Por otra parte, a print le paso BYTE como parmetro, la razn es que de esta forma escribe en el puerto serie de forma que el programa en Java lo entienda como carcter sin necesidad de hacer nada ms, aunque esto podra traernos problemas con caracteres especiales como la ya que se utiliza ms de 1 byte para representarlo y podria ocurrir que Arduino o el programa en Java leyera cada byte como un nico carcter en alguna ocasin.

SERIAL
Se utiliza para la comunicacin entre la placa Arduino y un ordenador u otros dispositivos. Todas las placas Arduino tienen al menos un puerto serie (tambin conocido como UART o USART): Serial. Se comunica a travs de los pines digitales 0 (RX) y 1 (TX), as como con el ordenador mediante USB. Por lo tanto, si utilizas estas funciones, no puedes usar los pines 0 y 1 como entrada o salida digital.

read()

Descripcin Lee los datos entrantes del puerto serie. Sintaxis Serial.read() Solamente en Arduino Mega: Serial1.read() Serial2.read() Serial3.read() Parmetros Ninguno Devuelve el primer byte disponible recibido por el puerto serie (devuelve -1 si no hay datos disponibles) - int

Ejemplo int incomingByte = 0; void setup() { Serial.begin(9600); // abre el puerto serie a 9600 bps } // para el byte leido

void loop() {
// envia datos solamente cuando recibe datos if (Serial.available() > 0) { // lee el byte entrante: incomingByte = Serial.read(); // dice lo que ha recibido: Serial.print("He recibido: ");

Serial.println(incomingByte, DEC);
} }

BIBLIOTECA RxTx
Despus de buscar bastante por internet diferentes soluciones de como comunicarse con Arduino a travs de puerto serie se decidio conservar una biblioteca en particular. Tiene una interface sencilla de entender y usar, adems de que existe cdigo de ejemplo en el que basarse. La biblioteca en cuestin se llama RxTx, y puedes descargar la ltima versin en:http://rxtx.qbang.org/wiki/index.php/Download.

RXTX 2.1 es el desarrollador principal de RXTX. El nombre usado es gnu.io* a menos que se tengan motivos especficos, este es el recomendado para descarga. Si necesitas compatibilidad con javax.comm.* entonces descarga RXTX 2.0 pero cabe destacar que no se invierte demasiado esfuerzo en esta rama por lo cual se podrn encontrar bastantes fallas ya arregladas en la rama principal. Tambin cabe destacar que se tuvo un cambio en la manera en que las cosas se distribuyeron. 2.1 incluye un paquete binario que contiene los datos de varias plataformas y un paquete fuente. 2.0 por otro lado no tiene este tipo de soporte y es mucho mas complicado cumplir con sus requerimientos RXTX 2.2 will replace RXTX 2.1 once it is stable. TODO: The 2.2pre2 bins contain the 2.2pre1 jar file and the 2.2pre2 native lib which causes a mismatch warning
Release rxtx 2.1-7r2 (stable) Binary rxtx-2.1-7-bins-r2.zip Source rxtx-2.1-7r2.zip

rxtx 2.0-7pre2 (stable) Release


rxtx 2.2pre2 (prerelease)

Linux/x86 Win32 (incomplete) Binary


rxtx-2.2pre2-bins.zip

source Source
rxtx-2.2pre2.zip

En la pgina web de RxTx definen a la biblioteca de la siguiente forma: RXTX is a Java library, using a native implementation (via JNI), providing serial and parallel communication for the Java Development Toolkit (JDK). All deliverables are under the GNU LGPL license. It is based on the specification for Suns Java Communications API, though while many of the class descriptions are the same the package used it not, since gnu.io is used instead. A certain amount of compatibility is intended with API, though this project should be considered as a fork and therefore compatible in spirit, but not in implementation. Por lo tanto RxTx es una biblioteca para Java multiplataforma, la cual nos permite realizar comunicaciones por puerto serie y paralelo desde JDK. La licencia que utiliza es GNU LGPL. Est basado en la especificacion para la API de comunciones de Java, pero utilizan su propio paquete, gnu.io, bastante compatible con la especificacin.

En este link se pueden encontrar diversos ejemplos del funcionamiento de la biblioteca: http://rxtx.qbang.org/wiki/index.php/Examples los cuales resultan realmente tiles.

Actualmente se esta desarrollando una clase para comunicarse con el arduino, basndome en los ejemplos. La clase seria capaz de abrir una comunicacin por puerto serie y realizar operaciones de lectura y escritura, de una manera sencilla. La versin que tenia en el escner era una versin bastante mala, y estoy intentado hacerla ms genrica y que pueda servir para mas proyectos, por eso estoy tardando ms de lo planeado.

Pues ya se retoma el cdigo en Java y una mini aplicacin para Arduino para mostrar como comunicaros con Arduino desde Java. Al final se ha decidido utilizar un cdigo que se encontraba en la pagina web de Arduino en el que muestran como mantener una conversacin con Arduino desde Java. Me ha gustado sobre todo porque viene bien explicado y porque hace posible utilizar ese mismo cdigo en diferentes plataformas comentando un par de lneas. La nica pega es que esta en ingls, pero no creo que os de problemas, es sencillo de comprender. Con este cdigo se realizara un sencillsimo programa de Eco (le envo un mensaje a Arduino, este me lo devuelve y lo imprimo por pantalla).

La clase se llama SerialTest, la cual hereda la clase abstracta SerialPortEventListener de gnu.io (RxTx) por lo tanto, como es abstracta, debemos implementar sus mtodos. La clase solo tiene un mtodo abstracto, serialEvent(SerialPortEvent ev) en cual se implementa como tratar un evento de ese tipo, en el ejemplo de la web de Arduino simplemente lo lee y lo imprime por pantalla, se le aadiran un par ms de lineas de cdigo para poder distinguir cuando recibimos un mensaje desde Arduino.

Pero claro, solo con ese mtodo no vamos a ningn sitio, as que en el ejemplo codifican tambin un mtodo para iniciar y parar la conexin, con esto ya tenemos todo lo necesario para recibir datos desde Arduino y manejarlos.

You might also like