4 de febrero de 2016

Arduino y Processing 1: Comunicación básica por puerto serie

Hace tiempo que había publicado una entrada de cómo comunicarnos con nuestra Arduino desde Python. Esta vez vamos a ver cómo puedo comunicarme desde Arduino con un programa realizado en Processing.

En esta explicación he utilizado el IDE Arduino 1.6.0 con una Arduino UNO, el IDE de Processing 3.0.1 y tengo todo instalado en openSuse 13.2 64bit.

Para ver cómo comunicar nuestra Arduino con Processing, empezaremos por algo muy básico. Vamos primero con la Arduino. Este es el código que he utilizado:

void setup() {
  Serial.begin(9600);

}

void loop() {
  Serial.println("Hola!");
  delay(100);
}

Como veis, es muy simple. En la sección setup, utilizo Serial.begin(9600) para inicializar el puerto serie y, en la sección loop, imprimo por el puerto serie la palabra "Hola!", seguida de una espera de 100 milisegundos para no saturar el puerto serie.

Con esto, ya tenemos nuestra Arduino enviando una y otra vez la palabra "Hola!" a través del puerto serie.

Vamos ahora con la parte de Processing.

Lo primero que necesitamos saber es en qué puerto tenemos conectada la Arduino. Para ello, primero ejecutamos el siguiente código en Processing:

import processing.serial.*; // librería necesaria para comunicación serie

void setup(){
  println(Serial.list());
}
Con esto, podremos ver en el terminal de Processing la lista de puertos de una forma similar a esta:

 
Vamos al IDE de Arduino y, en el menú Herramientas, podemos ver el puerto en la que tenemos conectada nuestra placa:


En mi caso, está en /devtty/ACM0. Si comprobamos la lista que se nos ha mostrado en Processing, el primer elemento corresponde a mi puerto. Como en el listado se numeran como 0, 1, 2... nos quedamos con que mi puerto es el número 0 de la lista.
Volvemos a Processing, borramos la línea que imprime la lista y ampliamos el código, quedando así:

import processing.serial.*;

Serial puerto; // creamos un objeto de la clase Serial
String dato;   // para los datos recibidos por el puerto serie

void setup(){
  String nombrePuerto = Serial.list()[0];
  println("Puerto establecido a " + nombrePuerto + ".");
  puerto = new Serial(this, nombrePuerto, 9600);
}

void draw(){
  if(puerto.available() > 0){
    dato = puerto.readStringUntil('\n');
  }
  println("Dato recibido: " + dato);
}
Hemos añadido dos variables, una para gestionar el puerto y otra para guardar el dato recibido.

Antes hemos averiguado qué puerto es el nuestro, ahora guardamos su nombre obteniéndolo con Serial.list()[0], donde el número 0 es el número de puerto en la lista.

El println que he utilizado, podéis omitirlo. Simplemente es para ver que el nombre elegido es el correcto.

En la sección setup, la última línea es para inicializar el puerto. Como podemos observar, le pasamos el nombre del puerto y la velocidad, que es la misma que habíamos indicado en nuestra Arduino también.

No vamos a dibujar nada en la sección draw. De momento, solamente mostramos datos en el terminal de Processing.

Con la primera línea, comprobamos si el puerto está disponible. Si sí lo está, guardamos el dato en la variable con puerto.readStringUntil('\n'), que lee todos los datos hasta que encuentra un salto de línea.

Una vez hecho esto, mostramos el dato.

A continuación, vemos una imagen de cómo ha quedado la ejecución:


Como vemos, se está recibiendo la palabra "Hola!" una y otra vez. También notaréis que, a veces nos aparece algún "null". Eso es normal, simplemente habría que tenerlo en cuenta en nuestra programación para obviarlo.

Para continuar viendo cómo comunicarnos por el puerto serie con nuestra Arduino y processing, podéis echarle un ojo a la siguiente entrega: Arduino y Processing 2: Lluvia controlada por puerto serie.

Espero que os haya sido de ayuda para poder empezar con vuestros proyectos de Arduino con Processing.

Un saludo.