Android - Bluetooth - Arduino

Bueno, las vacaciones se acaban como todo lo bueno… Aquí os dejo un vídeo de aplicación sobre la que he estado trasteando, calibración, y de la que ya tengo un vídeo anterior. Esta vez, y aprovechando que casi todos tenemos un dispositivo con Android y Bluetooth, he aprovechado para controlar la aplicación de Arduino mediante un móvil con Android y bluetooth.

El código en Arduino es prácticamente el mismo sólo que ahora nos ocupamos de configurar el módulo bluetooth y guardar / leer la calibración en la EEPROM de Arduino.

La parte de Arduino

Yo he utilizado el módulo Grove – Serial Bluetooth para la conexión bluetooth. La verdad es que la documentación de la página web es excelente y puedes hacer funcionar el módulo en unos minutos -no digo segundos porque hay que escribir jejeje-

Aunque ellos en su código de ejemplo utilizan la librería SoftwareSerial no hace falta en absoluto y la configuración es directa. Yo por ejemplo tengo la siguiente configuración en el fichero de Arduino:

//Serial1.begin(38400);  //Velocidad por defecto 
Serial1.begin(9600);      // Cambio la velocidad por homogeneidad
delay(1000);
// Esclavo
Serial1.write("\\r\+STWMOD=0\\r\");
// Velocidad
//Serial1.write("\\r\+STBD=9600\\r\ ");
// Nombre de dispositivo
Serial1.write("\\r\+STNA=Seeeduino\\r\");
// Autoconexión no permitida
Serial1.write("\\r\+STAUTO=0\\r\");
// Permitir que se me pareen
Serial1.write("\\r\+STOAUT=1\\r\");
// El pin por defecto
Serial1.write("\\r\+STPIN=1234\\r\");
// Direccion local
//Serial1.write("\\r\+RTADDR\\r\ ");
delay(2000); // Necesario
// Habilitar peticones
Serial1.write("\\r\+INQ=1\\r\");
delay(2000); // Necesario

Recuerda que la velocidad por defecto es de 38400, lo digo porque es la velocidad con la que tendrás que comunicarte inicialmente con el módulo bluetooth. Como puedes ver, estoy utilizando el puerto 1 para el bluetooth, así tengo el 0 para hacer debug en el PC -todo lo que esté en el puerto 1 lo replico en el 0-. Para la EEPROM sólo tienes que añadir #include <EEPROM.h> y por simplicidad haremos un truco -que tampoco tiene mayores consecuencias- Los valores que podemos guardar en la EEPROM son de byte, esto es hasta 255. Pero los valores que tenemos que guardar son de hasta 1023, por tanto, y para no utilzar 4x2 bytes (un byte por cada dígito, teniendo que guardar 2 números de 4 dígitos) sólo tenemos que dividir el valor de la calibración por 4 para que nos quepa en un byte (1024 / 256 = 4). Como ya te habrás dado cuenta, al dividir por 4 -para guardar el valor de la calibración- y después multiplicar por 4 -para recuperar el valor de la calibración- vamos a tener un pequeño error al ser números enteros, pero el error es de +/-3 unidades… así que en 0 a 1023 es un error aceptable. El el setup() te quedará algo como:

// Leer valores de calibrado anteriores si los hay y enviarlos a Arduino.
// Antes los habíamos divido por cuatro.
int valCalMin = EEPROM.read(adrMin);
int valCalMax = EEPROM.read(adrMax);
if (valCalMin != 0 && valCalMax != 0) {
	sensorMin = valCalMin * 4;
	sensorMax = valCalMax * 4;
	Serial1.print("calibrado ");
	Serial1.print(sensorMin);
	Serial1.print(" ");
	Serial1.println(sensorMax);
}

Y en la función calibrar()

// Adecuar el valor. En la EEPROM guardamos bytes 0-255 pero el valor del sensor va de 0-1023
EEPROM.write(adrMin, sensorMin / 4);
EEPROM.write(adrMax, sensorMax / 4);
delay(100);

La parte de Android

También esta vez la documentación es excelente. En la API de bluetooth de Android encontramos explicados todos los pasos. Para el desarrollo de aplicaciones para Android te recomiendo utilizar Eclipse con el correspondiente plugin para Android. También en este caso, puedes encontrar toda la documentación el la página web de Eclipse. Lo único que voy a añadir es dar el UUID para la conexión serie, RFCOMM puesto que es lo único que falta en la documentación de Android que es muy completa. El UUID que tenéis que utilizar es 00001101-0000-1000-8000-00805F9B34FB que si consultas la documentación que hay en bluetooth es el UUID base 00000000-0000-1000-8000-00805F9B34FB con el UUID32 del puerto serie o RFCOMM 0x1101