Introduction: Como Usar El MIT App Inventor Con El Itead BLE Shield
Resumen
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.
Materiales
- Arduino UNO o compatible
- Itead BLE Shield
- Teléfono o tablet con Android 5.0 o mayor (4.3 no funciona con la extensión BLE de MIT App Inventor)
Step 1: Preparando El Itead BLE Shield
- Cambiar los jumpers para que estan en las siguientes posiciones (ver foto):
TX--D2
RX--D3
NOTAR que estamos conectando el TX del módulo Bluetooth a pin D2(RX) del Arduino y el RX del módulo a pin D3(TX) del Arduino. - Poner el switch del Itead BLE Shield en 5V si esta usando un Arduino UNO.
- Conectar el shield al Arduino UNO.
- UPLOAD el código abajo a su Arduino. Este código nos permite comunicar con el BLE Shield.
- Abrir el Serial Monitor y asegurar que los parámetros estan en "No line ending" y "9600 baud".
- En el campo de texto probar la conexión con "AT" en mayúsula y apretar "Send". Si todo esta funcionando bien el shield debe responder con "OK".
- El módulo de Bluetooth tiene que estar configurado como "Peripheral". Enviando el comando "AT+ROLE0" debe devolver "OK+Set:0". Sólo tenemos que hacer esto una vez. Queda grabado en el EEPROM del módulo Bluetooth.
- Es recomendable poner su propio nombre al módulo. Para averiguar el nombre actual manda el comando "AT+NAME?". El nombre debe ser corto. En mi caso puse el nombre "BLESHLD" con el comando "AT+NAMEBLESHLD".
Código para comunicar/configurar el BLE Shield
#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()); } }
Step 2: Verificando La Configuración Del Módulo
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.
Step 3: Instalando La Extension BluetoothLE En MIT App Inventor
En está página se puede bajar la extension BluetoothLE.aix
- Crear un nuevo proyecto.
- Sube el archivo BluetoothLE.aix en Palette-->Extension-->Import Extension
La extension requiere Android 5.0 o mayor instalado en su teléfono o tablet para funcionar.
Step 4: Programando Bluetooth LE En El MIT App Inventor
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.
Step 5: SCAN
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.
Step 6: CONNECT
En este evento se esta usando la versión de Bluetooth.Connect que utilice un índice porque ya lo tenemos en ListPicker.SeleccionIndex. También existe el método que conecta por la dirección MAC.
Luego de conectar al BLE shield el LED de Status debe ponerse fijo.
Step 7: DISCONNECT
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.
Step 8: SEND DATA
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.
Step 9: RECEIVE DATA
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.
Step 10: Siguientes Pasos
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.
14 Comments
Question 1 year ago on Step 4
Realmente me ha sido muy útil. Hace unos años lo usé. Y genial.
Pero ahora la aplicación BLETest ya no funciona.
Supongo que APP Inventor o Android (estoy usando Android 9) habrán hecho cambios, y ya no escanea, no es capaz de encontrar mi HM-10.
He probado otra aplicación que hice pero ahora no es capaz de conectarme con mi HM-10.
Cosa que la aplicación nRF Connect de Nordic Semiconductor ASA si hace. (en tu página aparece como nRF Master Control Panel).
No se si tendrás una versión actualizada de tu aplicación BLETest.
Muchas gracias.
Answer 1 year ago
Hola mdh2o, esta semana me encontré con el mismo problema que mencionas, el problema se resuelve actualizando la extensión del BLE en AppInventor así ya podrás conectarte a tu modulo HM-10, los módulos actuales con Bluetooth 5.0 no los detectan las extensiones pasadas, necesitas una actualización y la encuentras aquí:
http://iot.appinventor.mit.edu/#/bluetoothle/bluet...
Buen día, espero y esto solucione la conexión con tu HM-10
Reply 1 year ago
Muchísimas gracias. He usado la actualización que comentas tanto para conectarme con un HM-10 conectado a Arduino Uno como a un Raspberry Pi Pico y va de lujo.
5 years ago
Muchísimas gracias. No lo usé con Arduino pero me sirvieron los conceptos y pude poner en marcha una app para transferir un valor a través del UUID. Lo que sí, en la extensión que descargué no está el evento BluetoothLE1.ReadStringValue.
Saludos !!
6 years ago
NO SE COMUNICA LO UNICO ES QUE ESTOY USANDO UN ARDUINO MEGA NO SE SI SE PRESENTA ALGUN CAMBIO GRACIAS
6 years ago
I believe this returns the Services/Characteristics that a particular device is advertising:
Bluetooth.AdvertiserServiceUuids
After connecting to a particular device these functions return the Services/Characteristics available:
Bluetooth.SupportedServices
Bluetooth.SupportedCharacteristics
6 years ago
Dear CRCibernetica:
Is me again^_^,at the bottom there're 4 blocks of App Inventor's BLE component,do you know how to used them? Could they got the UUIDs from the BLE device?
6 years ago
Good Instr.,it made me learn a lots of things about BLE & App Inv.! Is there any way to get the BLE device's Services & Characteristic UUID by the used of APP inventor's BLE component?
Reply 6 years ago
I think maybe this is what you need:
Bluetooth.AdvertiserServiceUuids returns the list of the Services available on the advertising device.
Reply 6 years ago
Thank's for your reply, but I still don't Understand how to get the UUID in esta Instr., Hope I can see you Modify this instr. soon,so that user can connect BLE device directly with the APP inventor,instead of used the NRF Master Control Panel.
Reply 6 years ago
The app does connect directly to the BLE Shield.
Reply 6 years ago
Dear CRCibernetica:
Sorry for let you misunderstand,what I meaning is to used the APP inventor program itself to get those two UUID , so that when we want to send/receive data to/from BLE Shield(especial when used other BLE devices) we don't need to used the App "NRF Master Control Panel" to find the UUIDs. After all,a good App should let user more convenience to used.
Reply 6 years ago
When creating a BLE app you will need not only to know the Service/Characteristic UUIDs but also how the data is structured/formatted. The user should not have to do any of this. NRF Master Control Panel is the tool for the developer to investigate and create the app. This app is created especifically for the Itead BLE Shield and to be used as an example. The app is purposefully made as barebones as possible.
6 years ago
Dear Sir:
It's very sorry that Google Chrome will change my content automatically, so that I even didn't known what I talk about!