Bluetooth HC-05 y App Inventor «botones», Pic C Compiler

En esta sección aprenderás a establecer una comunicación inalámbrica en modo simplex, utilizado un módulo Bluetooth HC-05 y el Bluetooth de un teléfono celular. El el objetivo es enviar comandos desde el teléfono celular utilizando una aplicación que se programara en App Inventor a un microcontrolador PIC para encender un LED correspondiente al pulsar un botón.

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

Circuito de conexión

Configuración

Inicialmente se debe configurar el módulo Bluetooth en modo esclavo para poder recibir los datos mediante una comunicación inalámbrica.

Programación PIC Esclavo

Inicialmente se establecen los parámetros de la comunicación RS232.

  • baud = Velocidad de transmisión y recepción configurada en el módulo Bluetooth.
  • stop = Bits de parada.
  • parity = Bit de paridad. 
  • xmit = Pin de transmisión.
  • rcv = Pin de recepción. 
  • bits = Datos de transmisión.
  • stream = identificación de transmisión.

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

Se definen los pines de salida y se asigna un nombre correspondiente al LED conectado al pin de acuerdo con el circuito.


#define LED1   PIN_D0
#define LED2   PIN_D1
#define LED3   PIN_D2

Inicialmente se habilitan las interrupciones para la recepción de datos por el puerto RS232.


   enable_interrupts(int_rda);
   enable_interrupts(global);

Cuando se habilita la interrupción, el programa se aloja en la sub-rutina «rda_isr()» para recibir el comando y guardarlo en la variable «recibido[]»


#int_rda
void rda_isr()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if(recibido[i]=='\r')//busca el salto de linea \r
      {
         recibido[i]='\0';//fin de la cadena = caracter nulo \0
         leds();
         return;
      }
      i++;
   }
}

En la sub-rutina «leds()», se identifica el comando recibido y realiza la instrucción correspondiente.


void leds()
{
   signed int8 result;

   char LED1_ON[10] = "LED1_ON";
   char LED1_OFF[10] = "LED1_OFF";

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

      if(result==0)
      {
         OUTPUT_BIT(LED1, 1); //enciende el LED 1
         return;
      }

      result = strcmp(recibido, LED1_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED1, 0); //apaga el LED 1
         return;
      }
      .
      .
      .

La instrucción «strcmp()» compara dos cadenas de caracteres, se compara la variable «recibido» que contiene el comando recibido y la variable «LED1_ON» que contiene el comando «LED1_ON», si las dos cadenas de caracteres resultan iguales entra en la sentencia «if » y se habilita la salida del «LED1» que corresponde al «pin_d0» y enciende el LED 1, si los comandos son diferentes, salta a la siguiente comparación para identificar el comando recibido. 


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

      if(result==0)
      {
         OUTPUT_BIT(LED1, 1); //enciende el LED 1
         return;
      }

Código completo PIC Esclavo


#include "string.h"

#FUSES NOMCLR

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

#define LED1   PIN_D0
#define LED2   PIN_D1
#define LED3   PIN_D2

char recibido[20];

void leds();

#int_rda
void rda_isr()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if(recibido[i]=='\r')//busca el salto de linea \r
      {
         recibido[i]='\0';//fin de la cadena = caracter nulo \0
         leds();
         return;
      }
      i++;
   }
}


void leds()
{
   signed int8 result;

   char LED1_ON[10] = "LED1_ON";
   char LED1_OFF[10] = "LED1_OFF";

   char LED2_ON[10] = "LED2_ON";
   char LED2_OFF[10] = "LED2_OFF";

   char LED3_ON[10] = "LED3_ON";
   char LED3_OFF[10] = "LED3_OFF";


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

      if(result==0)
      {
         OUTPUT_BIT(LED1, 1); //enciende el LED 1
         return;
      }

      result = strcmp(recibido, LED1_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED1, 0); //apaga el LED 1
         return;
      }

      result = strcmp(recibido, LED2_ON);

      if(result==0)
      {
         OUTPUT_BIT(LED2, 1);
         return;
      }

      result = strcmp(recibido, LED2_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED2, 0);
         return;
      }

      result = strcmp(recibido, LED3_ON);

      if(result==0)
      {
         OUTPUT_BIT(LED3, 1);
         return;
      }

      result = strcmp(recibido, LED3_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED3, 0);
         return;
      }

}


void main()
{

   enable_interrupts(int_rda);
   enable_interrupts(global);

   while(TRUE)
   {


      //TODO: User Code
   }

}

App Inventor

MIT App Inventor es un entorno de programación visual e intuitivo que permite a todos, incluso a los niños, crear aplicaciones completamente funcionales para teléfonos Android, iPhones y tabletas Android/iOS. La herramienta basada en bloques facilita la creación de aplicaciones complejas y de alto impacto en mucho menos tiempo que los entornos de programación tradicionales. El proyecto MIT App Inventor busca democratizar el desarrollo de software al empoderar a todas las personas, especialmente a los jóvenes, para pasar del consumo de tecnología a la creación de tecnología.

Aplicación 1

 Aplicación 2

Scroll al inicio