Módulo Bluetooth HC-05 «Configuración», PIC C Compiler

En esta sección aprenderás a configurar el módulo bluetooth HC-05 en modo maestro y esclavo mediante comandos AT. Utilizaremos dos métodos para enviar los comandos para configurar el módulo bluetooth, el primer método es programando un microcontrolador PIC para enviar los comandos por el puerto serial Rs232, el segundo método es utilizando un convertidor USB a Serial para enviar los comandos al módulo bluetooth mediante un monitor serial. 

Bluetooth HC-05 

El Bluetooth HC-05 es un módulo de comunicación inalámbrico que utiliza la tecnología Bluetooth para establecer un enlace de comunicación serie entre dos dispositivos. Es un dispositivo muy popular en proyectos de electrónica y robótica, ya que permite la comunicación inalámbrica entre un microcontrolador, como Arduino, y otros dispositivos como un ordenador, smartphone o tablet. El HC-05 puede funcionar como maestro o esclavo y utiliza el perfil serial port profile (SPP) de Bluetooth, lo que lo hace compatible con una amplia variedad de dispositivos que soportan este perfil.

Características:

  • Tecnología: Bluetooth 2.0 + EDR (Enhanced Data Rate)
  • Alcance de comunicación: hasta 10 metros (en condiciones ideales)
  • Velocidad de transmisión: 2.1 Mbps máx. en modo EDR, 721 kbps máx. en modo estándar
  • Frecuencia: 2.4 GHz a 2.4835 GHz banda ISM
  • Potencia de transmisión: Clase 2, hasta 4 dBm (2.5 mW)
  • Sensibilidad de recepción: -80 dBm típico
  • Protocolos de soporte: Bluetooth serial port profile (SPP)
  • Modo de operación: Maestro o Esclavo
  • Compatibilidad: Compatible con dispositivos que soportan Bluetooth SPP
  • Interfaz: UART (Universal Asynchronous Receiver/Transmitter)
  • Voltaje de alimentación: 3.3V a 5V DC
  • Consumo de energía: 30 mA en modo de operación, 1 mA en modo de espera
  • Dimensiones: 28 mm x 15 mm x 2.35 mm

Modo configuración del módulo Bluetooth HC-05

Para habilitar la recepción de comandos AT en el módulo, inicialmente se debe mantener pulsado el botón integrado en el módulo, manteniendo pulsado el botón se conecta a la alimentación de voltaje y 3 segundos después de conectarlo a la alimentación puedes dejar de pulsar el botón. Si el módulo parpadea lentamente cada 2 segundos estará configurado correctamente para recibir los comandos AT.

Método 1: Microcontrolador PIC 

Circuito de conexión

Programación 

Inicialmente se establecen los parámetros para la comunicación serial RS232, se establece un velocidad de transmisión de 38400 que es una velociad de comunicación de fabrica de acuerdo a la hoja de especificaciones del modulo bluetooth HC-05.


#use rs232(baud=38400, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

Se definen los botones conectados a los pines correspondientes asignandoles un nombre y como entrada digital. 


#define restablecer  input(pin_d0)
#define maestro      input(pin_d1)
#define esclavo      input(pin_d2)

Cada botón se utiliza para hacer el llamado a una sub-rutina correspondiente cuando se pulsa el botón.


      while (restablecer)
      {
         delay_ms(10);
         if (!restablecer)
         {
            modo_restablecer();
         }
      }

En el llamado a la primer sub-rutina se envía el comando «AT+ORGL» que funciona para restablecer el módulo bluetooth con la configuración de fabrica.


void modo_restablecer()
{
   signed int8 result=1;
   int8 OK[10] = "OK\r\n"; 
 
   printf("AT+ORGL\r\n");//restablece de fabrica
   recibe();
   result = strcmp(recibido, OK);//compara, si son iguales (0), no (+-1)
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }      
   return;
}

La función «Printf()» envía el comando por el puerto seria RS232.

Al final de cada comando enviado se coloca «\r\n» que es un retorno de carro y salto de linea.


printf("AT+ORGL\r\n");//restablece de fabrica

Cuando se envía el comando por el puerto serial RS232 el módulo Bluetooth responderá con un «OK\r\n»  si el comando se recibió correctamente y un «ERROR(x)\r\n» si el comando es incorrecto. 

Para recibir la respuesta del módulo Bluetooth se utiliza la sub-rutina «recibe()» donde se guarda la cadena de caracteres enviada por el módulo Bluetooth en la variable «recibido[20]».


void recibe()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   while(true)
   {
      if (kbhit())//espera el primer caracter
      {
         int8 i=0;
         while(true)
         {
            recibido[i]=getc();//RECIBE EL CARACTER
            
            if(recibido[i]=='\n')//busca el salto de linea \r\n
            {               
               return;
            }
            i++;
         }
      }
   }
}

Se realiza una comparación de cadenas de caracteres para saber si la respuesta enviada por el módulo Bluetooth es «OK\r\n», si las cadenas de caracteres son iguales «result=0», si es diferente «result=+-1».


result = strcmp(recibido, OK);//compara, si son iguales (0), no (+-1)

Si la respuesta enviada por el módulo bluetooth es diferente de «OK\r\n» se coloca una condicional para encender un led para indicar que existe un «ERROR(x)\r\n», y se retorna a la función «main()».


   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }    

El botón definido como «maestro» hace el llamado a la sub-rutina «modo_maestro()» donde se configura el módulo bluetooth como maestro. Para enviar los comandos se utiliza el mismo formato de la sub-rutina «restablecer()»


      while (maestro)
      {
         delay_ms(10);
         if (!maestro)
         {
            modo_maestro();
         }
      }

El botón definido como «esclavo» hace el llamado a la sub-rutina «modo_esclavo()» donde se configura el módulo bluetooth como esclavo. Para enviar los comandos se utiliza el mismo formato de la sub-rutina «restablecer()»


      while (esclavo)
      {
         delay_ms(10);
         if (!esclavo)
         {
            modo_esclavo();
         }
      }

Código completo 


#include "string.h"

#FUSES NOMCLR

#use rs232(baud=38400, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)


#define restablecer  input(pin_d0)
#define maestro      input(pin_d1)
#define esclavo      input(pin_d2)
#define led          pin_d3

char recibido[20];

void recibe()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   while(true)
   {
      if (kbhit())//espera el primer caracter
      {
         int8 i=0;
         while(true)
         {
            recibido[i]=getc();//RECIBE EL CARACTER
            
            if(recibido[i]=='\n')//busca el salto de linea \r\n
            {               
               return;
            }
            i++;
         }
      }
   }
}


void modo_restablecer()
{
   signed int8 result=1;
   int8 OK[10] = "OK\r\n"; 
 
   printf("AT+ORGL\r\n");//restablece de fabrica
   recibe();
   result = strcmp(recibido, OK);//compara, si son iguales (0), no (+-1)
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }      
   return;
}


void modo_maestro()
{  
   signed int8 result=1;
   int8 OK[10] = "OK\r\n";
 
   printf("AT+NAME=PICMAESTRO\r\n");//Nombre del bluetooth
   recibe();
   result = strcmp(recibido, OK);//compara, si son iguales (0), no (+-1)
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }  
   
   printf("AT+PSWD=\"1234\"\r\n");//Pin del bluetooth
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }  
   
   printf("AT+UART=38400,0,0\r\n");//Configura la velocidad 
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
   
   printf("AT+CMODE=0\r\n");//Configura el tipo de conexión
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
   
   printf("AT+BIND=1234,56,abcdef\r\n");//Recibe la direccion del esclavo
   recibe();   
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
     
   printf("AT+ROLE=1\r\n");//Configura como maestro
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
  
   printf("AT+RESET\r\n");//Resetea al modo establecido (esclavo/maestro)
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
   return;
}

void modo_esclavo()
{  
   signed int8 result=1;
   int8 OK[10] = "OK\r\n";
 
   printf("AT+NAME=PICESCLAVO\r\n");//Nombre del bluetooth
   recibe();
   result = strcmp(recibido, OK);//compara, si son iguales (0), no (+-1)
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }   
   
   printf("AT+PSWD=\"1234\"\r\n");//Pin del bluetooth
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }  
   
   printf("AT+UART=38400,0,0\r\n");//Configura la velocidad 
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
     
   printf("AT+BIND=1234,56,ABCDEF\r\n");//Configura la direccion 
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
     
   printf("AT+ROLE=0\r\n");//Configura como esclavo
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
   
   printf("AT+RESET\r\n");//Resetea al modo establecido (esclavo/maestro)
   recibe();
   result = strcmp(recibido, OK);
   if (!result==0)
   {
      output_bit(led, 1);
      return;
   }
   return;
}


void main()
{ 
   while(TRUE)
   {
   
       while (restablecer)
      {
         delay_ms(10);
         if (!restablecer)
         {
            modo_restablecer();
         }
      }
      
      while (maestro)
      {
         delay_ms(10);
         if (!maestro)
         {
            modo_maestro();
         }
      }
            
      while (esclavo)
      {
         delay_ms(10);
         if (!esclavo)
         {
            modo_esclavo();
         }
      }
   
   }   
}

Método 2: Convertidor USB a Serial y Monitor serial

Restablecer módulo Bluetooth

Se envía el comando para restablecer el módulo Bluetooh de fabrica.

AT+ORGL

Si la respuesta del módulo es «OK», el módulo se restableció correctamente.

Configuración como Maestro

Configura el nombre del módulo Bluetooth.

AT+NAME=PICMAESTRO

Configura el PIN o la contraseña.

AT+PSWD="1234"

Configura la velocidad de transmisión, el bit de paro, y el bit de paridad.

AT+UART=38400,0,0

Configura el tipo de conexión, para vincular el modulo Maestro a un módulo Esclavo especifico.

AT+CMODE=0

Configura la dirección del módulo Esclavo al que se vinculara.

AT+BIND=1234,56,abcdef

Se configura el Rol de Maestro.

AT+ROLE=1

Se resetea el módulo a su nueva configuración.

AT+RESET

Configuración como Esclavo

Configura el nombre del módulo Bluetooth.

AT+NAME=PICESCLAVO

Configura el PIN o la contraseña.

AT+PSWD="1234"

Configura la velocidad de transmisión, el bit de paro, y el bit de paridad.

AT+UART=38400,0,0

Configura la dirección del módulo Esclavo.

AT+BIND=1234,56,ABCDEF

Se configura el Rol de Esclavo.

AT+ROLE=0

Se resetea el módulo a su nueva configuración.

AT+RESET
Scroll al inicio