El 15 junio 2016 agregaron la funcionalidad de Bluetooth Low Energy al MIT App Inventor. Este tutorial demuestra como comunicar entre un Arduino UNO conectado a un Itead BLE Shield y una applicación creada en el MIT App Inventor.
El Itead BLE Shield tiene un módulo bluetooth HM-10. La ventaja del shield sobre otras soluciones es que cuando esta configurado correctamente se puede comunicar con su Arduino y aplicaciones mandando Strings. Para gente explorando Bluetooth Low Energy y el MIT App Inventor es un buen lugar empezar.
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); void setup(){ Serial.begin(9600); while(!Serial) { ; } mySerial.begin(9600); } void loop(){ if(mySerial.available()){ Serial.write(mySerial.read()); } if(Serial.available()){ mySerial.write(Serial.read()); } }
Instalar la aplicación nRF Master Control Panel en su télefono o tablet.
Durante el SCAN inicial debe aparecer el módulo Bluetooth, en mi caso el nombre es BLESHLD.
Apretando el botón "CONNECT" se puede ver los Services/Characteristics publicado por el módulo.
En este caso es interesante el "Unknown Service". Alli es donde sospechaba que el módulo estaba tramitando y recibiendo datos seriales. El Service UUID y Characteristic UUID parecen iguales pero hay un digito de diferencia:
Service UUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Characteristic UUID: 0000ffe1-0000-1000-8000-00805f9b34fb
Asegurar que desconectar antes de salir. Solo un dispositivo puede conectar a un módulo Bluetooth Low Energy a la vez.
En está página se puede bajar la extension BluetoothLE.aix
La extension requiere Android 5.0 o mayor instalado en su teléfono o tablet para funcionar.
Para los que quieren llegar directamente al código se puede bajarlo aca en formato .aia (código fuente):
CONCEPTOS BASICOS
Bluetooth Low Energy es un poco diferente que el Bluetooth clásico.
Primero hay que hacer un SCAN para registrar los dispositivos BLE cercanos. Luego hay que CONECTAR usando la dirección MAC o índice del dispostivo encontrado. Cuando uno esta conectado al dispositivo se puede ENVIAR o RECIBIR datos a través de un servicio/caracteristica. En nuestro caso el HM-10 tiene un servicio disponible que normalmente se utiliza para comunicar con un HRM (Heart Rate Monitor). Nosotros podemos aprovechar este servicio en MIT App Inventor.
Usamos un botón para iniciar el escaneo de dispositivos BLE. Cuando encuentra los dispositivos se dispara el evento .DeviceFound. En el evento .DeviceFound agregamos los dispositivos a un ListPicker para que podemos escoger el BLE deseado. Luego de que seleccionamos el dispositivo BLE los datos del dispositivo se encuentra en ListPick.Selection y el índice del dispositivo esta en ListPicker.SelectionIndex.
Por algún razón la única manera de desconectar del dispositivo es mediante la dirección MAC y no el índice como se hizo para conectar. En este caso se puede utilizar el método Bluetooth.FoundDeviceAddress con ListPicker.SelectionIndex para encontrar la dirección MAC y pasarlo a Bluetooth.DisconnectWithAddress.
BluetoothLE funciona con Services y Characteristics. En nuestro caso sabemos que el HM-10 cuenta con estos UUIDs preconfigurados:
Service UUID: 0000ffe0-0000-1000-8000-00805f9b34fb
Characteristic UUID: 0000ffe1-0000-1000-8000-00805f9b34fb
Para no tener que copiar se puede guardar los UUIDs en dos variables globales.
Para mandar un String a través de este "canal" se usa Bluetooth.WriteStringValue poniendo los parámetros service_uuid, characteristic_uuid y en value el String que queremos mandar.
Apretar click en el botón SendData debe mandar "Data Sent!!!" al Arduino. El caracter "\n" agregar una nueva linea en el terminal.
Para recibir datos hay que usar primero el método Bluetooth.ReadStringValue. Luego de que esta inicializado se puede recibir los datos cada vez que el Arduino manda datsos usando Bluetooth.StringValueChanged.
BUG!!? La primera vez que conecto al shield no veo los datos entrando. Pero luego de desconectar/conectar de nuevo todo funciona como se debe.
Este primer tutorial era para mostrar los conceptos básicos de BluetoothLE en MIT App Inventor usando lo mínimo posible. En el siguiente voy a hacer una aplicación mas completa.