lunes, 26 de enero de 2015

Proyecto #1 Parte 4

Etapa de control y comunicación bluetooth



La comunicación Bluetooth que se usará es serial y asíncrona, gracias a que el modulo Bluetooth que se usará en el proyecto hace esto posible, ver la fig.1. En nuestro caso tenemos que el PIC se comunica a través de un módulo UART con el módulo Bluetooth; esta pareja a su vez se  comunicará con el celular o incluso con alguna computadora con adaptador Bluetooth (Bluetooth dongle).


Fig. 1 Módulo bluetooth HC05 y su pin-out



El módulo UART del PIC, anteriormente mencionado, es un módulo que permite que la comunicación serie sea posible. En la programación del PIC se establece el Byte a comunicar y el módulo se encarga de mandar el Byte de forma serial, es decir, bit por bit a una velocidad determinada por el Baud-Rate. Dicha velocidad debe de ser la misma entre ambos dispositivo, por lo que se debe de configurar el Baud-Rate del módulo Bluetooth.

Para nuestro proyecto se usa el módulo HC-05 (fig. 1) y para poderlo configurar se siguieron los pasos sugeridos por [1]. Se configuro para tener 9600 baudios. En caso de no contar con un Arduino se puede realizar la configuración a través de una tarjeta de interfaz serial (que puede ser construida con un PIC, un MAX232 y un cable USB/Serial) y cualquier monitor serial donde se ingresarán los comandos AT especificados en el datasheet del HC05 o en [1].

Una vez configurado el HC05, se debe de configurar el PIC18F4550 para que se pueda comunicar con el módulo bluetooth. Por lo que, al PIC, se le programa el siguiente código:



//Programa desarrollado por Guillermo Lebron, Roberto Campos y Fernando Godoy
//Proyecto#1 Programa:        Control del puente H para accionar los motores de un carro de juguete
//                                            al recibir datos mediante comunicación serial de un módulo bluetooth
//                                            HC05 a 9600 baudios.

                //Cabecera de Núcleo*
                #include <p18f4550.h>
                #include <xc.h>
                #include <delays.h>

                //Directivas para activar los bits de configuración*

           #pragma config FOSC = INTOSCIO_EC //Oscilador Interno, PuertoA RA6 activo*
           #pragma config WDT = OFF //Watchdog timer apagado*
           #pragma config PBADEN = OFF //Parte baja del puerto B digitales
           #pragma config MCLRE = OFF //MCLRE no Disponible
           #pragma config DEBUG = OFF //Modo de depuración no disponible*
           #pragma config LVP = OFF //Fuente de ISCP apagada*


                //Definición de pines como variables
                #define adelante   RD0
                #define atras      RD1
                #define derecha    RD2
                #define izquierda  RD3


//Programa principal
void main()
{

  //Configuración de los pines digitales como salida
                TRISD=0;
               
                //Configuración del reloj interno         
                IRCF2=1;
                IRCF1=1;
                IRCF0=1;
               
                //Configuración del módulo EUSART del PIC18F4550.
                //Referencia: Datasheet del PIC18F4550
                PORTC=0;
                TRISC=0xB0;
                SPBRGH=0;
                SPBRG=0x33;
                TXSTA=0x2C;
                RCSTA=0x90;
                BAUDCON=0;
               
  //Declaración de variables locales
  char variable;

                //Bucle infinito para el programa principal
                while(1)
                {
                               //Condición para asegurar que se ha recibido un dato en el pin Rx
                               if (RCIF=1)
                               {
                                                               //Si se recibió una "a" mueva el carro hacia adelante activando el pin RD0
                                                               if (variable=='a')
                                                               {
                                                                 adelante = 1;
                                                                 atras = 0;             
                                                               }
                                                               else
                                                               {
                                                                              //Si se recibió una "b" mueva el carro hacia atras activando el pin RD1
                                                                              if (variable=='b')
                                                                              {
                                                                                adelante = 0;
                                                                                atras = 1;
                                                                              }
                                                                              else
                                                                              {
                                                                                              //Si se recibió una "c" que detenga el motor trasero
                                                                                              if (variable=='c')
                                                                                              {
                                                                                                              adelante = 0;
                                                                                                              atras = 0;               
                                                                                              }             
                                                                              }
                                                               }
                                                               //Si se recibió una "d" que vire a la derecha
                                                               if (variable=='d')
                                                               {
                                                                 derecha = 1;
                                                                 izquierda = 0;      
                                                               }
                                                               else
                                                               {
                                                                              //Si se recibió una "e" que vire a la izquierda
                                                                              if (variable=='e')
                                                                              {
                                                                                derecha = 0;
                                                                                izquierda = 1;
                                                                              }
                                                                              else
                                                                              {
                                                                                              //Si se recibió una "f" que detenga el motor delantero
                                                                                              if (variable=='f')
                                                                                              {
                                                                                                              derecha = 0;
                                                                                                              izquierda = 0;        
                                                                                              }             
                                                                              }
                                                               }
                               }
                }
}



Con ello tanto el PIC como el HC05 se estarán comunicando a 9600 Baudios y sin bit de paridad. A partir de esto se hizo el circuito de la fig. 2. En él se indica el orden en que se debe de conectar el módulo HC05. 

Dado que la alimentación de las baterías será de entre 9 a 12 Voltios se emplea un regulador de voltaje 7805 a fin de garantizar un voltaje cercano a 5V y poder alimentar de forma segura al PIC y al módulo Bluetooth. Además el circuito cuenta con LEDs para poder verificar que las señales son mandadas de forma correcta hacia el puente H para poder accionar los motores.

Es importante señalar que el código aún no incluye la parte de control de velocidad por PWM, solo permite controlar el sentido de giro y el paro de los motores. Por tal motivo, el pin de control PWM no debe de ser conectado a la etapa de potencia, y el pin correspondiente de la etapa de potencia (EN2) se deberá de conectar a 5V.


Fig. 2 Circuito de la etapa de control con el PIC18F4550 y el HC05.

Finalmente, es muy importante mencionar el hecho de que se deben de emparejar los dispositivos que se estarán comunicando. Así, en nuestro caso, el celular o computadora se debe de emparejar con el módulo Bluetooth que se usará; de tal forma que, dicho celular o computadora actúa como maestro en la comunicación (decide con quién comunicarse), mientras el módulo Bluetooth actúa como esclavo. 

El emparejamiento se lleva a cabo de forma similar a cuando dos celulares se preparan para transferir archivos. El celular que enviará la información (maestro) debe de tener una aplicación donde se buscará el dispositivo que recibirá los datos (esclavo). Por defecto, el módulo Bluetooth tiene el nombre: HC05 y el password: 1234 para poderse emparejar.

Una aplicación que se puede usar, desde celulares Android, para poder establecer comunicación con el HC05 es blueterminal, la cual funciona similar a los monitores seriales tales como Tera terminal. Otra forma de hacerlo es a partir de una laptop con adaptador de Bluetooth. El adaptador, que estamos usando, trae un programa llamado blue manager, el cual permite emparejar a la computadora con el módulo HC05. Este programa, además, permite que el adaptador Bluetooth, conectado a la computadora, pueda emular un puerto COM. De esta forma se posibilita el uso de Tera Terminal para poder interactuar con el módulo HC05.
  

A continuación se muestra un vídeo del funcionamiento de la etapa de control, 


Video 1: Prueba del funcionamiento correcto de la etapa de control


Fuentes citadas:    



14 comentarios:

  1. disculpa con que programa haces el codigo para el pic 18f4550

    ResponderEliminar
    Respuestas
    1. Hola! perdón la demora, el código se hizo en mplab x. Saludos!

      Eliminar
  2. hola, disculpa se puede utilizar el pic 16f877a??'

    ResponderEliminar
    Respuestas
    1. Sin ningun problema, puesto que cuenta con módulo de comunicación serial

      Eliminar
    2. entonces solo tendira que declarar el pic y quitar el otro???

      Eliminar
    3. No, también hay que revisar los registros porque estos cambian de nombre.

      Eliminar
  3. Ola,
    Lo que hace la entrada RC2?

    ResponderEliminar
  4. Hola, yo creo que hay un error en el problema, no llegas a igualar RCREG al caracter variable.

    ResponderEliminar
  5. hola donde te puedo mandar mensaje?
    me urge :(

    ResponderEliminar
    Respuestas
    1. Buenas tardes!

      Mi correo es rob23654@gmail.com, y estoy dispuesto a apoyarle!

      Saludos!

      Eliminar
  6. Disculpen, donde se le asigna el valor a variable?. solo veo que la comparas con caracteres pero desde que se declara no obtiene un valor

    ResponderEliminar
  7. que tal, de primera mano te comento que me intereso tu proyecto, como punto numero dos te hago una pregunta, bueno varias, ¿el codigo quepro gramaste actua como esclavo? si bien, ahora, yo quisiera enviar datos por bluetooth a otro pic que los reciba mediante bluetooth ¿como seria el codigo?, por ejemplo al pulsar un switch en el maestro envie el dato por bluetooth al segundo pic(slave) y que este al recibir el dato encienda un led, si me ayudas te lo agradeceria infinitamente, gracias!

    ResponderEliminar