Configuración inicial

Esquema de conexión

008 bb 1a8a9

Código para configuración inicial del módulo Bluetooth HC-06

Ejecutando el siguiente código desde el entorno de desarrollo de Arduino, podrás configurar el módulo Bluetooth HC-06 con el nombre, contraseña y velocidad que desees que tengas conectado a la placa Arduino donde lo ejecutes. Para ello, modifica a tu gusto las variables nombre y password.

El pin TX del HC-06 debe estar asociado al pin digital 10 de Arduino, y el Pin RX al pin digital 11.

La velocidad que se va a establecer por defecto en el módulo Bluetooth es 57600 baudios, ya que es la velocidad que utiliza la aplicación Snap4Arduino, y así, posteriormente también podrías usar la conexión Bluetooth para enviar el código de Snap4Arduino sin necesidad del cable USB (deberás tener en cuenta, para ese caso, que las conexiones de los pines RX y TX del módulo Bluetooth deberían cambiarse a los pines TX y RX de la placa Arduino cuando vayas a usar Snap4Arduino).

Cuando ejecutes este código asegúrate de tener abierto el monitor serie para ver los mensajes que emite y así comprobar que todo vaya correctamente. Recuerda que puedes abrir el monitor serie con el botón de la parte superior derecha del entorno de Arduino.

Captura de pantalla 2019 07 02 a las 13.58.44 419a9

El resultado de la ejecución debería ser similar al siguiente:

Captura de pantalla 2019 07 02 a las 14.06.05 2f2fe 

Asegúrate especialmente de cambiar el nombre del módulo Bluetooth si estás haciendo esta configuración en un aula u otra sala con más personas, de manera que puedas identificar claramente cuál es tu dispositivo.

/*
 * Aplicación de configuración del módulo bluetooth HC-06.
 * Detecta la velocidad de conexión actual del HC-06 (por defecto 9600 baudios) y la
 * cambia a una nueva velocidad junto con el nombre y password que se especifique en el código.
 * 
 * Requiere conectar el pin TX del HC-06 al pin 10 de Arduino, y el Pin RX al 11.
 * Si se desean utilizar otros pines, se debe modificar la línea: SoftwareSerial BT(10,11);
 * 
 * Indica en las variables <nombre> y <password> los valores deseados para el módulo Bluetooth.
 * Indica en la variable <baud> el código asociado a la nueva velocidad deseada.
 * 
 * Puedes utilizar el monitor serie de Arduino para ver los mensajes generados por esta aplicación 
 * y comprobar así si la configuración se ha realizado correctamente.
 */

String nombre = "Squitty";
String password = "0000";
char baud = '7'; 
// '1'=1200, '2'=2400, '3'=4800, '4'=9600, '5'=19200, '6'=38400, '7'=57600, 
// '8'=115200, '9'=230400, 'A'=460800, 'B'=921600, 'C'=1382400
  
#include <SoftwareSerial.h>
SoftwareSerial BT(10,11);

void setup() {
  Serial.begin(9600);
  Serial.println("Buscando velocidad de conexión ...");
  long baudiosConexion = getBtBauds();
  Serial.println();

  if(baudiosConexion != 0) {
    BT.begin(baudiosConexion);
     
    Serial.print("Cambiando nombre a " + nombre + "... ");
    BT.print("AT+NAME" + nombre); 
    delay(1000);
    Serial.println(getMensajeRespuestaBT());
  
    Serial.print("Cambiando contraseña a " + password + "... ");  
    BT.print("AT+PIN" + password);  
    delay(1000);
    Serial.println(getMensajeRespuestaBT());
    
    Serial.print("Cambiando velocidad a 57600 baudios... ");  
    BT.print("AT+BAUD"); 
    BT.print(baud); 
    delay(1000);
    Serial.println(getMensajeRespuestaBT());
  
    Serial.println("\nConfiguración finalizada\n");
  } else {
    Serial.println("ERROR: No se ha podido realizar la conexión con el módulo Bluetooth HC-06");
  }
}
  
void loop() {
}

/* 
 * getBtBauds()
 * Función para detectar la velocidad actual de conexión con el módulo Bluetooth.
 * Retorna la velocidad detectada en baudios o 0 si no se ha conseguido la conexión.
 */
long getBtBauds() {
  long listaBauds[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1382400};
  boolean conectado = false;
  long baudiosConexion = 0;
  for(int i=0; i<12 && !conectado; i++) {
    BT.begin(listaBauds[i]);
    Serial.print("Probando conexión a ");
    Serial.print(listaBauds[i]);
    Serial.println(" baudios");
    BT.print("AT");
    delay(1000);
    String respuesta = getMensajeRespuestaBT();
    if(respuesta == "OK") {
      conectado = true;
      baudiosConexion = listaBauds[i];
      Serial.print("Conectado! Usando ");
      Serial.print(listaBauds[i]);
      Serial.println(" Baudios");
    }
  }
  return baudiosConexion;
}

/*
 * getMensajeRespuestaBT()
 * Función que obtiene el mensaje pendiente de leer del módulo Bluetooth
 * Retorna el mensaje leído o una cadena vacía "" si no hay nada pendiente de leer
 */
String getMensajeRespuestaBT() {
  String mensaje = "";
  while(BT.available()) {
    mensaje += char(BT.read());
  }
  return mensaje;
}

Pruebas de conexión

Código para pruebas de conexión

Ejecuta el siguiente código desde el entorno de desarrollo de Arduino para subirlo a la placa Arduino. Así podrás probar que la transmisión de información es correcta entre un dispositivo móvil con conexión Bluetooth y la placa Arduino que tenga conectado el módulo HC-06. A continuación de este código verás cómo puedes hacer las pruebas de comunicación

Las líneas de código más importantes se encuentran en la función loop, donde de manera indefinida se comprobará si hay alguna información recibida desde el módulo Bluetooth, y si es así se mostrará dicha información en el monitor serie. De igual manera, si en el monitor serie se escribiera alguna información, ésta será enviada al módulo Bluetooth.

#include <SoftwareSerial.h>     
SoftwareSerial BT(10,11);    
 
void setup() {
  Serial.begin(9600);  
  // Establecer la conexión con el módulo Bluetooth 
  Serial.println("Buscando velocidad de conexión ...");
  long baudiosConexion = getBtBauds();
  Serial.println();
  if(baudiosConexion != 0) {
    BT.begin(baudiosConexion);
    Serial.println("Envía un mensaje desde otro dispositivo por Bluetooth y se mostrará en este monitor serie");
    Serial.println();
  } else {
    Serial.println("ERROR: No se ha podido realizar la conexión con el módulo Bluetooth HC-06");
  }
}
 
void loop() {
  if(BT.available()) {   // Si llega un dato por el puerto BT se envía al monitor serie
    Serial.write(BT.read());
  }
  if(Serial.available()) { // Si llega un dato por el monitor serie se envía al puerto BT
     BT.write(Serial.read());
  }
}

/* 
 * getBtBauds()
 * Función para detectar la velocidad actual de conexión con el módulo Bluetooth.
 * Retorna la velocidad detectada en baudios o 0 si no se ha conseguido la conexión.
 */
long getBtBauds() {
  long listaBauds[] = {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1382400};
  boolean conectado = false;
  long baudiosConexion = 0;
  for(int i=0; i<12 && !conectado; i++) {
    BT.begin(listaBauds[i]);
    Serial.print("Probando conexión a ");
    Serial.print(listaBauds[i]);
    Serial.println(" baudios");
    BT.print("AT");
    delay(1000);
    String respuesta = "";
    while(BT.available()) {
      respuesta += char(BT.read());
    }
    if(respuesta == "OK") {
      conectado = true;
      baudiosConexion = listaBauds[i];
      Serial.print("Conectado! Usando ");
      Serial.print(listaBauds[i]);
      Serial.println(" Baudios");
    }
  }
  return baudiosConexion;
}

Si conoces con seguridad la velocidad de conexión con el módulo Bluetooth, el código se puede simplificar para que sea como el siguiente, donde se indica que la velocidad de conexión va a ser 57600:

#include <SoftwareSerial.h>     
SoftwareSerial BT(10,11);    
 
void setup() {
  Serial.begin(9600);   
  BT.begin(57600);
  Serial.println("Envía un mensaje desde otro dispositivo por Bluetooth y se mostrará en este monitor serie");
  Serial.println();
}
 
void loop() {
  if(BT.available()) {   
    Serial.write(BT.read());
  } 
  if(Serial.available()) { 
     BT.write(Serial.read());
  }
}

Emparejamiento del dispositivo móvil Android

Entra en la configuración Bluetooth de tu dispositivo móvil Android, busca los dispositivos cercanos y emparéjalo con tu módulo Bluetooth teniendo en cuenta el nombre que le habías asignado.

Screenshot 20190702 142359 59eb6 Screenshot 20190702 142426 97de7 Screenshot 20190702 142441 ef01d

Aplicación de terminal Bluetooth para Android

Instala en tu dispositivo móvil (si no la tienes ya) la aplicación Arduino Bluetooth Controller para Android. 

Sube a la placa Arduino el código anterior (pruebas de conexión) y abre la ventana del monitor serie donde debe aparecer algo como esto:

Captura de pantalla 2019 07 02 a las 18.38.06 e1cea

Ejecuta la aplicación Arduino Bluetooth Controller que habías instalado en tu Android, selecciona el dispositivo que aparece con el nombre de tu módulo Bluetooth, e indica que deseas conectarte a él en modo Terminal.

Screenshot 20190702 182748 a479f Screenshot 20190702 182800 c5b0c

En la ventana que aparece escribe algún texto (por ejemplo, "hola") y envíalo pulsando Intro en el teclado del dispositivo móvil.

Screenshot 20190702 183206 73a72 Screenshot 20190702 184724 05b68

El texto que has escrito en el dispositivo móvil deberá aparecer en el monitor serie de la placa Arduino, confirmándose así que la placa Arduino recibe por Bluetooth la información que se le envíe.

Captura de pantalla 2019 07 02 a las 18.37.05 5ff58

Control de dispositivos a través de Bluetooth

Ejemplo de control de servomotor

Para probar este ejemplo necesitarás conectar a la placa Arduino un servomotor, además de tener conectado el módulo Bluetooth. En el código que se mostrará a continuación se considerará que el servomotor esté conectado al pin D2 de la placa Arduino, por lo que el esquema de conexión será el siguiente:

009 bb e4d9b

Vamos a programar la placa Arduino de manera que cuando reciba por Bluetooth la letra 'a', el servomotor se gire a 30º, y cuando reciba una letra 's', el servomotor gire a 150º.

#include <SoftwareSerial.h>    
#include <Servo.h> 
 
SoftwareSerial BT(10,11);    
Servo servo1;

void setup() {
  BT.begin(57600);  // Si la velocidad de conexión Bluetooth es otra hay que indicarla aquí
  servo1.attach(2);
}
 
void loop() {
  char caracterLeidoBT = '0'; // Establecer un valor por defecto cuando no se recibe nada
  // Si hay algún dato en el módulo Bluetooth hay que leerlo
  if (BT.available()) {
    caracterLeidoBT = BT.read();
  }
  // Según el carácter que se reciba se hará una acción u otra
  switch(caracterLeidoBT) {
    case 'a':
      servo1.write(30);    
      break;
    case 's':
      servo1.write(150);    
      break;
    // Podrás añadir aquí del mismo modo tantos casos (carácter > acción) como desees
  }
}

Para probar este código, una vez que los hayas subido a la placa vuelve a usar la aplicación Arduino Bluetooth Controller y envía desde el terminal tantas letras 'a' y 's' como quieras y el servomotor deberás girar según las letras que vayas enviando.

Configuración del modo controlador en la aplicación

Vuelve a la pantalla de inicio de la aplicación Arduino Bluetooth Controller y conecta ahora el dispositivo en modo Controller mode.

Screenshot 20190702 182800 0dafd

Aparecerá una pantalla con una especie de mando de videoconsola.

Screenshot 20190702 191955 f5a42

Utiliza el icono en forma de rueda dentada (esquina superior derecha) y ahí podrás asociar un carácter a cada botón del mando. Asocia la letra 'a' a la flecha izquierda, y la letra 's' a la flecha derecha.

Screenshot 20190702 192027 62b8a

Vuelve a la pantalla del mando y comprueba que, al pulsar la flecha derecha o la flecha izquierda, se mueve el servomotor en la dirección indicada.

Aplicación personalizada con App Inventor

Una vez que tengas dominada esta forma de trabajar (al recibir Arduino un carácter se ejecuta una determinada acción), puedes diseñar una aplicación Android a tu gusto con App Inventor, donde se asocies a determinados botones o iconos el envío de un determinado carácter por Bluetooth.

En el artículo Tutorial de Arduino, Bluetooth y Android #2 – Crear una app con MIT inventor (http://robologs.net/2015/10/29/tutorial-de-arduino-bluetooth-y-android-2-crear-una-app-con-mit-inventor/) puedes ver un ejemplo sencillo.