Integración Bluetooth con Arduino y Android: Construye Proyectos Inalámbricos
Componentes y suministros
| Arduino UNO | ×1 |
| Módulo Bluetooth HC-06 | ×1 |
| LED (genérico) | ×1 |
Aplicaciones y servicios en línea
- Arduino IDE
- MIT App Inventor 2
Sobre este proyecto
Una red de área local (y personal) inalámbrica muy eficaz es sin duda el Bluetooth (BT). Hoy en día, en nuestro día a día, es común encontrarnos usando teléfonos móviles, estéreos, cámaras, etc., interconectados con la ayuda de la famosa "luz azul".
En el mundo del IoT y la automatización en general, es muy común encontrar controles remotos mediante teléfonos móviles usando tecnología BT. Esto se debe a dos componentes básicos pero muy importantes:
- Plataformas de desarrollo simples para apps de ANDROID (como MIT App Inventor 2)
- Módulos BT asequibles (como el HC-06)
En este tutorial, desarrollaré algunas ideas sobre el control de las salidas de Arduino a través de un dispositivo móvil para mover un robot, encender lámparas en una casa, etc.
Paso 1: El módulo Bluetooth y el Arduino
En el mercado es muy común encontrar módulos BT 3.0 "Maestro-Esclavo" como el HC-05 y módulos "Esclavo" como el HC-06. Más recientemente, aparecieron el HC-08 y HC-10 que funcionan con tecnología BT 4.0 o BLE ("Bluetooth Low Energy"). Los módulos BLE son los únicos que pueden conectarse a un iPhone, ya que Apple no proporciona soporte para BT 3.0.
Para los proyectos aquí discutidos, usaré un HC-06 que es muy popular y barato (¡Adiós, iPhone! Aquí mandan los Androids). El módulo BT se alimenta con 5V, lo que facilita su conexión a un Arduino UNO. Sus pines de transmisión (Tx) y recepción (Rx) pueden conectarse directamente al UNO, sin necesidad de divisores de voltaje como en el caso del ESP8266. Normalmente, el HC-06 debería conectarse directamente a los pines 0 y 1 del Arduino ("Serial 0"):
- HC06-Tx al pin 0 del Arduino (Rx)
- HC06-Rx al pin 1 del Arduino (Tx)
Al usar las entradas "Serial 0" (el único puerto serial HW en el UNO), es muy importante recordar que el HC-06 no debe estar físicamente conectado a los pines 0 y 1 durante la carga del programa, porque el puerto USB también usa el mismo serial. Una forma sencilla de evitar este problema (si tu proyecto no usa muchos GPIOs del UNO) es usar un "puerto serial por software" mediante la librería SoftwareSerial. En nuestro caso, usaremos los pines 10 y 11 del UNO (Tx, Rx respectivamente).
Paso 2: Prueba y configuración del HC-06
El siguiente paso será escribir un código simple para probar, programar e inicializar el HC-06. Para empezar, incluimos la librería SoftwareSerial, configurando la variable "BT" al nuevo puerto serial.
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); // RX, TX
String command = ""; // Almacena la respuesta del dispositivo bluetooth
void setup() {
Serial.begin(9600);
Serial.println("Escribe comandos AT");
BT.begin(9600); // HC-06 usualmente baud-rate por defecto
}
Luego viene el cuerpo principal del código que simplemente espera datos provenientes del BT. Cuando llegan, los datos se escriben en el Monitor Serial. Asimismo, los comandos AT pueden enviarse desde el monitor serial al módulo HC-06.
void loop() {
if (BT.available()) { // recibir datos si están disponibles
while (BT.available()) { // "seguir recibiendo"
delay(10); // Delay añadido para estabilidad
char c = BT.read(); // Lectura serial
command += c; // Construir la cadena
}
Serial.println(command);
command = ""; // Sin repeticiones
}
if (Serial.available()) {
delay(10);
BT.write(Serial.read());
}
}
Una vez cargado el programa, usando el Monitor Serial se hacen algunas pruebas básicas, por ejemplo:
- Enviar "AT", el módulo debería responder "OK".
- Preguntar versión de firmware: "AT+VERSION", el módulo debe responder, por ejemplo: "linvorV1.8".
- Con HC-06 puedes definir un nombre para el módulo, por ejemplo: "AT+NAME=MJRoBot_BT_HC06". Pero a diferencia de otros módulos, no puedes saber cuál es el nombre que está configurado. Al enviar el comando anterior, el HC-06 simplemente responde: "OKsetname".
En general, el HC-06 viene de fábrica con la contraseña (o PIN): 1234. Puedes establecer una nueva con el comando AT:
- AT+PINxxxx donde 'xxxx' serán 4 números.
Paso 3: El dispositivo Android
¡Bien! Módulo conectado al UNO y funcionando. Es hora de introducir el dispositivo Android.
Hay muchas apps en la Google Play Store que pueden usarse. Usaré una app que desarrollé yo usando la herramienta MIT App Inventor 2 y disponible gratis en la Play Store: MJRoBot BT Digital Analog Voice Control.
La app envía comandos digitales (mediante botones o voz) y comandos analógicos para controlar dispositivos PWM como servos (envía datos de 0 a 255).
- Descarga la App
- Ve a la configuración del dispositivo Android y busca el módulo BT para hacer la conexión (ingresa PIN 1234 u otro definido por ti). Esto debe hacerse una vez, ya que el dispositivo guardará los datos de conexión.
- Una vez que el dispositivo y el HC-06 están comunicándose, lanza la App. En la segunda vez, al lanzar la app, el módulo BT debería conectarse automáticamente.
- Selecciona el nombre del módulo (en mi caso es el que termina con HC-06).
La App mostrará "CONNECTED", informando que está "emparejada" con el HC-06. En este punto, prueba los botones de la App y observa en el Monitor Serial de tu PC qué datos está enviando la App. Por ejemplo, presionando los botones "ON" y "OFF" secuencialmente para los 4 dispositivos, el resultado sería:
dev1on dev1off dev2on dev2off dev3on dev3off dev4on dev4off
Ahora que tenemos una App para Android hablando con el módulo BT, ¡creemos algo útil!
Paso 4: Controlando salidas de Arduino
Construyamos el circuito como se muestra arriba. La idea es usar la App para encender y apagar los LEDs y también controlar su intensidad.
Conexiones:
- Dispositivo 1: "dev1on / dev1off" → LED Rojo → Pin 3 UNO
- Dispositivo 2: "dev2on / dev2off" → LED Amarillo → Pin 5 UNO
- Dispositivo 3: "dev3on / dev3off" → LED Verde → Pin 6 UNO
- Dispositivo 4: "dev4on / dev4off" → LED Azul → Pin 9 UNO
Es decir, al activar el botón "ON" relacionado con "Dispositivo 1", se enviará el mensaje de texto "dev1on" al Arduino. Al recibir este mensaje, el LED rojo debería encenderse, y así sucesivamente.
Observa que los 4 pines son capaces de generar PWM (no todos los pines digitales del UNO pueden hacerlo. Busca los marcados con "~"). Esto es importante para el uso de "sliders" en la App, para enviar datos numéricos que controlen la intensidad de los LEDs mediante PWM:
- Dev A0: "r / 0-255" → LED Rojo → Pin 3 UNO
- Dev A1: "y / 0-255" → LED Amarillo → Pin 5 UNO
- Dev A2: "g / 0-255" → LED Verde → Pin 6 UNO
- Dev A3: "b / 0-255" → LED Azul → Pin 9 UNO
En el caso de los sliders, antes del valor de datos PWM (0 a 255), se envía un carácter al Arduino para informarle que viene un comando "slider".
Paso 5: Control de dispositivos IoT por comandos de voz
Para el control de dispositivos IoT, la voz es una tendencia hoy en día. Lograr este tipo de control usando Arduino / HC-06 / Android es extremadamente simple. Los dispositivos Android ya tienen esta característica "de fábrica". En la app que desarrollé, se añadió un botón que hace que Android "escuche" un comando y lo envíe en formato de texto al Arduino. El código se encarga de "leer" la cadena que llega.
Añadí algunos ejemplos en mi código. Cuando el Arduino recibe un comando "Conectar TV", por ejemplo, el LED verde (correspondiente al dispositivo 3) se enciende (en lugar del LED, podrías tener un relé que conecte la TV).
Deberás cambiar las cadenas que están en la parte Loop del código, con comandos en tu idioma. Usé portugués que es mi lengua materna y fue más fácil de gestionar en Google debido al diferente acento con mi inglés. Deberás usar frases cortas o solo palabras allí. Lo importante es una coincidencia perfecta entre lo que escribiste y lo que devuelve la app de reconocimiento de voz de Google.
Paso 6: Conclusión
Creo que con este tutorial es posible darse cuenta del enorme potencial de controlar "cosas" usando BT / Android / Arduino. Como siempre, espero que este proyecto pueda ayudar a otros a encontrar su camino en el apasionante mundo de la electrónica, la robótica y el IoT. Para más proyectos, visita mi blog: MJRoBot.org
¡Saludos desde el sur del mundo!
Nos vemos en mi próximo tutorial.
Gracias
Marcelo
Código
Fragmento de código #1
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); // RX, TX
String command = "";
void setup() {
Serial.begin(9600);
Serial.println("Escribe comandos AT");
BT.begin(9600);
}
Fragmento de código #2
void loop() {
if (BT.available()) {
while (BT.available()) {
delay(10);
char c = BT.read();
command += c;
}
Serial.println(command);
command = "";
}
if (Serial.available()) {
delay(10);
BT.write(Serial.read());
}
}
Fragmento de código #3
dev1on dev1off dev2on dev2off dev3on dev3off dev4on dev4off
Proceso de manufactura
- Construya un robot Raspberry Pi controlado por Bluetooth con retroalimentación de audio
- Programa fácilmente la serie Atmel AT89 con Arduino Uno – Guía paso a paso
- Mando universal Android con Arduino, 1Sheeld y control IR
- Vehículo Controlado por Android con Raspberry Pi, Arduino y Motor Shield: Guía Completa
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Electrodomésticos activados por voz: Control Bluetooth con Google Assistant
- Arduino UNO + Shield WiFi: Visualización de Temperatura en Tiempo Real en Web vía Serial
- Sistema de iluminación activado por movimiento con Intel Curie (Arduino 101)
- Controla el Parpadeo del LED de Arduino desde tu App iOS/Android vía WiFi/Ethernet
- Control Remoto de una Bombilla con Arduino Uno, Relé y App Android
- Controla tu brazo robótico Arduino con app Android dedicada