lunes, 26 de enero de 2015

Proyecto #1 Parte 5

Circuito de control y accionamiento de motores mediante bluetooth



Una vez se comprueba el correcto funcionamiento de las etapas de control y de potencia por separado, se procede a conectarlas entre sí. De esta forma se arma el circuito mostrado en la fig. 1.

En este circuito (fig. 1) se debe de conectar una alimentación de entre 9 a 12 Voltios. Además, posee los pines de conexión para el HC05. Se indica el orden de los pines, en que se debe de conectar al HC05, al señalizar el que corresponde al pin Key de dicho módulo bluetooth.

Finalmente se tiene la conexión para los motores, para los cuales, los pines 1 y2 del conector J2 van hacia el motor trasero; mientras los pines 3 y 4 van para el motor delantero.


Fig. 1 Circuito para el control y el accionamiento de dos motores a través de bluetooth.



A continuación se muestra un video del funcionamiento del circuito:


Video 1: Funcionamiento del circuito para el control y accionamiento de dos motores a través de bluetooth.



Pd.:
Recuerda el código del PIC y explicaciones más detalladas sobre la etapa de control y de potencia, respectivamente, las puedes encontrar en las entradas anteriores de este blog.


 


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:    



domingo, 25 de enero de 2015

Proyecto #1 Parte 3

Introducción a la comunicación Serial



Las comunicaciones seriales han cobrado un gran auge con respecto a las comunicaciones paralelas. Al irse haciendo más complejas las redes de comunicación una disminución del número de cables usados resulto ser la mayor ventaja de lo serial sobre lo paralelo. Entre las comunicaciones seriales se encuentran una gran cantidad de estándares  y protocolos para poder llevar a cabo la comunicación, y a su vez, se cuenta con módulos y chips para la implementación de dichos protocolos.

Hay dos tipos de comunicación serial:

*Síncrona: es gobernada por una señal de reloj (un tren de pulsos lógicos). Que indica en qué momento se inicia la transmisión de datos y en qué momentos se debe de leer cada bit que va llegando a través de la línea de datos.

*Asíncrona: no es gobernada por ninguna señal de reloj, cada uno de los bits que llegan por la línea de datos se leen a una velocidad constante.

Para un tipo de comunicación serial y asíncrona se usan los estándares RS232, RS485, entre otros, para poder comunicar entre diferentes equipos. Por ejemplo, las computadoras que cuentan con puerto serial (puerto COM) usan este estándar. Otro ejemplo de comunicación serial y asíncrona es la comunicación Bluetooth que se hará en este proyecto.

Dentro de la comunicación serial y asíncrona se tienen los siguientes conceptos que son de importancia:

*Estado inactivo: La línea de datos se mantiene en un estado (ya sea uno lógico o cero lógico) para indicar que no hay datos que están siendo transmitidos.

*Bit de inicio: hay un cambio en el estado inactivo de la línea de datos. De esta forma se indica que está a punto de ser transmitido un dato.

*Bit de parada: la línea de datos vuelve al estado inactivo, una vez que los datos han terminado de ser transmitidos.

*Baud-Rate: Velocidad a la cual se está transmitiendo los datos. Además es  un indicador de la velocidad a la cual deben de ser leídos los bits.

*Bit de paridad: Es un bit que indica si el dato ha sido transmitido de forma correcta. Este bit se antepone al dato. El bit de paridad indica si el número de ceros o unos es par o impar. Por ejemplo: si se desea enviar los siguientes bits: “0010111”, se cuenta el número de unos que es par y se decide que el bit de paridad es “1” para este caso, entonces finalmente se enviará a través de la línea de datos: “10010111”. Si por alguna razón se recibiese: “00010111”, esto indicaría que hay un error de transmisión dado que el bit de paridad, que cuando es “1” indica que el número de unos es par, ahora es “0”.


Fig.1 Ilustración de los conceptos básicos para una comunicación serial.


Con estos conceptos ya es posible tener una comunicación serial asíncrona, siempre y cuando ambos dispositivos estén de acuerdo en cuanto al estado de línea inactiva, el bit de inicio, el bit de parada, baud-rate y el bit de paridad; es decir, que ambos dispositivos manejen el mismo lenguaje o dicho de forma más sofisticada, el mismo protocolo. Un protocolo hecho con lo mencionado anteriormente es de los más básicos y menos estructurados para la comunicación serial y asíncrona.

En base a estos conceptos luego surgieron estándares como el RS232 donde se especifican los voltajes, cable, tipos de conectores, estado inactivo en la línea, bits de inicio, bit de parada, baud-rate, entre otras características.

Por lo tanto, en nuestro proyecto usaremos un protocolo de comunicación serial-asíncrona básico donde se tendrán las siguientes características (que son usadas normalmente):

*Estado de línea inactiva:”1”
*Bit de inicio:”0”
*Bit de parada: “1”
*Sin bit de paridad
*Baud-Rate: 9600 bps

Este tipo de comunicación serial-asincróna tan básico es posible llevarlo a cabo mediante el uso de módulos UART. Dicho módulo es incluido en el PIC y permite configurar las características antes mencionadas y transmitir y leer los datos bit por bit a la velocidad prefijada por el baud-rate.



Fig.2 Módulo UART en el PIC18F4550. Normalmente los pines del módulo son llamados Rx y Tx, además se resalta el pin de Vss dado que la “tierra” debe de ser común en los dispositivos que se comunican.


Proyecto #1 Parte 2

Etapa de potencia para los motores



Para el control de los motores se usará un PIC18F4550, sin embargo, sería muy imprudente conectar sus salidas directamente a los motores; por tal motivo se ha optado por emplear el circuito integrado L293D, uno de los “puentes h-en-chip” más usados para el accionamiento de motores pequeños.  En la fig. 1 se muestra el pin-out de un L293D de 16 pines tal y como el que se usará en el proyecto.


Fig. 1 Pin-out de un L293D de 16 pines.


Siguiendo la propuesta hecha por el fabricante en el datasheet (fig. 2) se ha armado el circuito mostrado en la fig. 3, el cual se explicará a continuación.

Fig. 2 Circuito para el accionamiento de motores propuesto en el datasheet.


Fig. 3 Circuito armado para el accionamiento de los motores delantero y trasero del carro de juguete.


Se espera que el circuito de la fig. 3, este alimentado por un voltaje de entre 9 a 12 Voltios. Dicha alimentación vendrá de baterías y será regulada por 7808. La razón del regulador es la siguiente: Se espera que a los motores llegue un voltaje seguro para que estos trabajen y, dado que, el integrado L293D tiene una caída de voltaje para nada despreciable, se tiene que los motores finalmente reciben aproximadamente 6 de los 8 Voltios a la salida del regulador.

Se nota que se  conectan a las salidas del regular 7808 todos los Vcc (Vss y Vs) y GND. Además los GND de este circuito con el GND de la fuente que alimenta la etapa de control, donde está el microcontrolador deberán de ser unidos. Esto se explicará más a detalle en las siguientes entradas.

Ahora, al centrar la atención al L293D se tiene que las salidas OUT1 y OUT2 controlan el sentido de giro del motor delantero, mientras que las salidas OUT3 y OUT4 controlan el sentido de giro del motor trasero. El sentido de giro se controla siguiendo lo mostrado en la fig. 4. Donde 1A equivale a IN1 (en la fig. 3) y 2A equivale a IN2 (en la fig. 3), de igual forma se aplica para IN3 e IN4, respectivamente.

La tabla se puede leer de la siguiente manera: Cuando la entrada EN1 y EN2 estén recibiendo un estado alto, del microcontrolador, y las entradas IN1, IN2, IN3 e IN4 estén recibiendo un estado bajo ambos motores se mantendrán detenidos. Ahora, al concentrar la atención en el motor delantero, si IN1 recibe un alto mientras IN2 se mantiene con un estado bajo entonces el motor girará en un sentido, en caso contrario si IN1 recibe un bajo e IN2 un alto el motor comenzará a girar en el sentido contrario, siempre y cuando EN1 siempre se mantenga en alto. Si ambas entradas (IN1 e IN2) se ponen en alto entonces el motor se detendrá. Este comportamiento es igual para el motor trasero (EN2, IN3 e IN4) y se puede observar su funcionamiento en el Video 1.


Fig. 4 Tabla de verdad del control bidireccional de un motor mediante los pines EN,1A y 2A (EN1, IN1 e IN2 en la fig. 3)


Video 1: Comportamiento del L293D accionando únicamente un motor.

Es posible también accionar ambos motores simultáneamente como es mostrado en el Video 2. Sin embargo, se debe de tener en cuenta que al accionar ambos motores habrá más caída de potencial en el L293D y como resultado se puede notar como el motor se ralentiza un poco. Si la caída de Voltaje es excesiva puede que los motores dejen de funcionar.


Video 2: Comportamiento del L293D accionando los dos motores simultáneamente.


En los videos la etapa de potencia, con el puente h, y la etapa de control, con el microcontrolador, no están unidas; así que, se simula el microcontrolador enviándole estados altos y bajos a las entradas mediante cables y conectando los mismos a Vcc o GND de la alimentación.

Ya con esta etapa en funcionamiento, ahora solo resta la etapa de control y una fuente de alimentación apropiada para el carro.



viernes, 23 de enero de 2015

Proyecto #1 Parte 1

Chasis y mecanismo del carro de juguete




Se ha desarmado un carro de control remoto para usar su chasis y controlar sus mecanismos a través de un celular Android con Bluetooth. El carro a desarmar se muestra en la fig. 1.


Fig. 1 Carro de control remoto a desarmar. A la izquierda aún con todo el chasís pero sin las llantas delanteras. A la derecha con el chasís naranja removido.
 

Al remover el chasis naranja y el chasis negro, y además de remover la circuitería antigua se obtiene lo mostrado en la fig. 2.


Fig. 2 Interior del carro de control remoto sin la circuitería antigua.


Ahora se centrará la atención a los mecanismos que permiten el movimiento de las llantas. En el caso de las llantas traseras se tiene el mecanismo mostrado en la fig. 3. En la fig. 3 se puede observar el motor que está conectado a una caja reductora de velocidad que a su vez se conecta al eje que une ambas llantas. El objetivo de la caja reductora es sencillo, le resta velocidad al motor para aumentar la fuerza del mismo, de tal forma que la fuerza entregada del motor a las llantas se ve aumentada mediante la caja reductora.

Fig. 3 Mecanismo y motor para el movimiento del carro de control remoto en las llantas traseras.
 

No se debe de perder de vista que la caja reductora de velocidad es un juego de engranes que permitirán obtener la fuerza suficiente del motor para el movimiento adecuado del carro. En la fig. 4 se muestra el interior de la caja reductora de este carro de control remoto, en particular. Se cuenta con tres engranes: el engrane 2 aumenta la fuerza del motor en el doble y disminuye su velocidad en el mismo factor. Esta fuerza aumentada se vuelve a incrementar al transmitirse al engrane 3 y 4. Notar que el gran tamaño del engrane 4 hace que la fuerza del motor se incremente notablemente mientras su velocidad, al contrario, disminuye bastante.

Fig. 4 Interior de la caja reductora del carro a control remoto: 1-Motor, 2,3,4-Engranes que reducen la velocidad del motor pero aumentan su fuerza, 5- Eje que va a las llantas, 6-Llantas.


Mientras que con el mecanismo de las llantas traseras se logra el desplazamiento del carro, con el mecanismo de la parte delantera se logra que el carro vire a la izquierda o a la derecha. El mecanismo se muestra en la fig. 5. Es un mecanismo sencillo, el motor transmite su movimiento al engrane, el cual, cuenta con un eje que lo mantiene siempre en contacto con el motor e intenta minimizar lo más posible pedidas de potencia por no engranar bien el motor con dicho engrane.

Este último, a su vez transmite el movimiento (con una fuerza aumentada y velocidad reducida) a una pieza plástica que es una sección circular y está dentada. Dicha pieza al moverse se encarga de girar las llantas delanteras, mediante el eje que las une, lo suficiente para que el carro pueda virar.

Se debe señalar que, el motor debe de estar energizado para que las llantas se mantengan en su posición, ya sea para virar a la izquierda o a la derecha, esto dado que al des-energizar el motor un resorte (justo debajo de la pieza de sección circular) hará que las llantas vuelvan a posicionarse “derechas” y el carro vuelva a desplazarse en línea recta.

Este es un mecanismo que hace más fácil el control en los motores, ya no se requiere el uso de sensores para determinar la posición en que las llantas se encuentran “derechas” para un desplazamiento en línea recta, únicamente se requiere una calibración manual de dicha posición a través del tornillo de la fig. 6.

Estos son todos los mecanismos con los que cuenta el carro de juguete a usar para el proyecto.


Fig. 5 Mecanismo para el movimiento de las llantas delanteras que permiten los giros hacia la derecha o izquierda del carro de control remoto.


Fig. 6 Tornillo para calibrar la posición de las llantas para un desplazamiento en línea recta.

 
A continuación se procederá a trabajar el carro solo con el chasis negro así como se muestra en la fig. 7

Fig. 7 Chasis del carro de juguete, así como se usará en el proyecto.