Tutoriales
 

Creando nuestro robot móvil

6.- Software de control

 

6.1.- Programación microcontrolador

6.1.1 Compilador

El compilador es un programa enfocado a realizar la vida más sencilla al programador, esto se dice porque antiguamente el buen programador de ensamblador o de binario necesitaba un gran conocimiento interno de señales que sucedían dentro del PIC ya que necesitaba realizar muchos pasos para mover un registro y no digamos implementar una comunicación serie. Los compiladores nos ayudan para que de manera sencilla con un par de líneas de código podamos realizar algo antiguamente tan tedioso como una comunicación serie, pues aunque a nuestra vista implementemos el programa en C, internamente el compilador hace la tarea de programar en ensamblador.

A día de hoy existen varios compiladores de microcontroladores, entre los cuales cabe destacar dos de ellos pues usan programación en C.

 

6.1.1.1 MPLab

Programa gratuito de 30 días de evaluación, este compilador es el que nos ofrece el fabricante de nuestro PIC, Microchip, es por ello quizá sea el más avanzado pues ofrece un sin fin de posibilidades pero a cambio perdemos simpleza ya que aunque se programe en C a mi gusto sigue usando todavía muchos conceptos de ensamblador para poder programar un micro con programas avanzados como podrían ser interrupciones externas, temporizadores, comunicación serie, etc…

 


Entorno MPLab IDE

 

6.1.1.2 CCS

Compilador simple e intuitivo que realmente hace brillar en su interior todo un lenguaje avanzado en C. Resulta sencillo realizar un sin fin de programas distintos y de diversas dificultad, de hecho con un par de líneas de código podemos implementar desde una comunicación serie hasta el manejo de un LCD.

Contiene en su interior diversas librerías que hacen de la programación de un PIC un juego de niños, el cual además incluye media centena de ejemplos de diversos tipos.

El único inconveniente, no es gratuito, con lo que hay que hacerse con una licencia para poder disfrutar de esta pequeña maravilla.

 


Entorno CCS

 

6.1.2 Herramientas

La programación del PIC es sin duda la parte estrella de toda interface, pues hoy en día el hardware puede ser copiado fácilmente y en muy poco tiempo, es por eso que hoy en día la parte más importante es la programación del PIC, cuyo código puede ser guardado de forma sencilla destruyendo el fusible de que permite la lectura y escritura de la memoria.

Las empresas, fabricantes de microcontroladores programables se gastan gran parte del presupuesto sólo en aumentar la seguridad y bloqueos de estos mismos.

Para programar el PIC nos hace falta una parte hardware capaz de enviar las señales para programar la memoria y una parte software que actúe como interfaz gráfica entre nosotros y el PC, es por ello que vamos a estudiar estos dos puntos a continuación.

 

6.1.2.1 Hardware

La programación del microcontrolador 18F4550 se ha realizado con el programador GTP USB Lite mediante el puerto ICSP el cual tiene como principal característica que el micro puede ser programado sin ser sacado de la tarjeta de funcionamiento, en nuestro caso la placa interface.

 


Esquemático GTP Usb Lite

 

Este tiene otras ventajas como podría ser su precio pues su hardware es gratuito y libre y sólo hay que hacer un desembolso por el micro 18F2550 que lleva el programador, pues este contiene el programa que permite la programación de PIC´s. También resaltar, que este programa los PIC´s por puerto USB (5V) y bien es sabido que para programar un PIC es necesario al menos 12 voltios por lo que dicho programador incluye una bomba electrónica que es capaz de subir la tensión de programación de 5 a 12V.

Al realizarse la programación por USB podemos programar nuestro micro a una velocidad asombrosa si la comparamos con los antiguos métodos de programación como la programación serie por el puerto RS-232.

Actualmente existen otros métodos de programación más avanzados, como son la autoprogramación o bootloader, dicho método consiste en que el propio PIC se autoprograme mediante la inserción de un programa en el PIC el cual hay que guardarlo en una dirección de memoria que reservaremos y protegeremos. Así pues podremos utilizar el micro en modo programador o en modo usuario mediante un simple botón de reset y los adecuados programas.

 

6.1.2.2 Software

En nuestro caso para programar el PIC usaremos el propio programa del programador, WinPic800.

 


Ventana principal WinPIC800

 

Dicho programa no sólo es compatible con nuestro programador sino también con otro tipo de programadores como el famoso TE-20 de programación por puerto serie.

Es aquí donde abriremos el archivo .hex generado por nuestro compilador CCS, donde veremos el código que hemos programado en C en hexadecimal y la posición de memoria donde se encuentra cada línea de código que hemos programado.

 


Ventana principal WinPIC800 con .hex abierto

 

6.1.3 Software microcontrolador

El código en CCS es muy similar a C, de hecho guardan la misma estructuración, declaración de bibliotecas, declaración de funciones, declaración de variables globales y código principal (main).

En las siguientes páginas describiremos el código empleado en nuestro microcontrolador, así como una pequeña descripción del ciclo de trabajo.

 

6.1.3.1 Descripción del código

#include <18F4550.h>
Añade las funciones y variables para poder compilar nuestro microcontrolador, en realidad no es más que un archivo que traduce nuestro código en C a un nivel ensamblador.

#device adc=8
Indica el número de bits que queremos que sea nuestro conversor analógico digital, a mayor número de bits, mayor tiempo de ciclo tardará el microcontrolador en realizar la conversión.

#fuses HS,NOWDT,NOPROTECT,NOLVP
Constantes definidas por CCS para nuestro micro, como no activar watchdog, no proteger el código, no usar voltaje bajo de 3.3V…CCS tiene muchas constantes para definir diferentes funciones y estados de nuestro micro.

#use delay(clock=12000000)
Define la velocidad del reloj del microcontrolador en HZ

#USE RS232(BAUD=115200, XMIT=PIN_C6, RCV=PIN_C7, stream=PC)
Declaración para utilizar la UART del micro, donde se define la velocidad, patillas de transmisión y recepción y periférico que se comunica. Es importante saber que una de las ventajas de CCS es que puede simular por código diferentes UART con lo que podemos comunicarnos con un mismo PIC con diferentes periféricos.

#include <stdlib.h>
Funciones de cadenas de caracteres en general.

#define use_portb_lcd TRUE
Indica a nuestro micro que vamos a utilizar un lcd y lo vamos a conectar en el puerto B.

#include <lcd.c>
Añade las funciones para el manejo de lcd.

lcd_init();
Inicia la comunicación entre el microcontrolador y el lcd.

setup_adc_ports(AN0_TO_AN1||VSS_VDD);
Indica las propiedades del convertidor analógico digital, en este caso las patillas que vamos a usar como CAD y la tensión de referencia que vamos a utilizar.

setup_adc( ADC_CLOCK_INTERNAL );
Indica la velocidad del reloj que vamos a usar para el ADC.

setup_ccp1(CCP_PWM);
Activa el comparador uno de pulsos a modo de PWM.

setup_ccp2(CCP_PWM);
Activa el comparador dos de pulsos a modo de PWM.

setup_timer_2(T2_DIV_BY_16, 255, 1);
Temporizador del PWM, de 16 bits, con un máximo de 255 y con prescaler a uno.

enable_interrupts(GLOBAL);
Activa el flag de interrupción a uno, si no se pone dicha sentencia, aunque declaremos funciones de interrupción como son el temporizador y CAD estos no funcionarán.

if(kbhit(PC))
Condicional que nos dice si ha habido interrupción debida al PC.

gets(string_buffer,PC);
Recibe una cadena de caracteres del PC hasta que encuentre un retorno de carro y la guarda en la variable.

printf(lcd_putc,"\f%S\n%S",string_buffer_Init,string_buffer_End);
Imprime en el lcd una cadena de caracteres, en este caso dos cadenas de caracteres, lo que contengan las variables string_buffer_Init y string_buffer_End

set_adc_channel(0);
Seleccionamos la conversión analógica para la patilla AN0.

value0 = Read_ADC();
Leemos la conversión del canal AN0 y lo guardamos en la variable value0.

fprintf(PC,"0%4LuT%4Lu\r",value0,value1);
Envía una cadena de caracteres al PC, en este caso la CAD del micro de los canales AN0 y AN1.

set_pwm2_duty(atoi(velocidad_Left));
Saca un PWM entre 0 y 255. Para ello convertimos la cadena "velocidad_Left" en un entero mediante la función atoi.

 

6.1.3.2 Ciclo de trabajo

Describiremos brevemente el ciclo de trabajo del micro para hacernos una idea de cómo funciona este internamente con el código implementado.

El microcontrolador inicia una serie de constantes, como son la comunicación con el lcd, las características del temporizador y del CAD, una vez definidas estas, el bucle entra en un bucle infinito, del cual sólo podrá salir en caso de activarse una interrupción.

La comunicación entre micro y PC es asíncrona, siendo el PC el maestro y el micro el esclavo. El PC envía una serie de información como velocidad y frases para el LCD, estos son recibidos por la UART del micro, el cual ejecuta una interrupción y gestiona dicha información, guardándola en el buffer que éste tiene.

Una vez acabado dicho proceso el micro sigue en la línea de ejecución donde se quedó antes de la interrupción, donde “liberará” la información que contiene en la UART gracias a las funciones que acceden a ella como gets, read_ADC, printf.

Siguiendo así un proceso que se repite infinitamente en el tiempo hasta que desconectemos la comunicación entre el PC y el micro.

 

6.2.- Programación PC

Para comunicar la tarjeta o interface, necesitamos un programa en el portátil que sea capaz de leer y escribir datos en ambos lados, para ello se ha utilizado el lenguaje de programación C++, pues este es un lenguaje de programación avanzado que nos permite realizar cantidad de aplicaciones y es de sobra conocido por nosotros.

El compilador que usaremos es Microsoft Visual Studio 6.0 ya que la propia universidad tiene licencia de dicho programa.

 

6.2.1 Distribución del programa

La aplicación se divide en dos partes:

- Diálogo principal:
Los diálogos se programan mediante eventos y es dentro de estos eventos donde realizaremos las operaciones que deseemos, tales como enviar una cadena de caracteres al pulsar un botón o recibir cada cierto tiempo una información de la interface.

- Comunicación USB.
La comunicación por puerto USB como bien hemos dicho con anterioridad es en realidad un VCP, puerto serie emulado, el cual nos permite programar la comunicación entre el PC y la interface con sencillas librerías de puerto serie como las ComPort.

 


Entorno de programación Microsoft Visual C++ 6.0

 

6.2.1 Protocolo de comunicación

La comunicación entre PC e interface se realiza por medio de envíos de cadenas de caracteres con protocolo serie RS-232.

El puerto tiene que ser configurado con la siguiente configuración:

 


Propiedades VCP de Windows XP

 

A continuación veremos el protocolo que se usa el PC para enviar datos a la interface.

TEXTO LCD:

Para enviar una cadena de texto al LCD se seguirá la siguiente estructura.

Cabecera
Fin línea '/r'
Fin de cadena
Texto
0X0D
NULL

Texto tiene que ser una cadena de caracteres obligatoriamente de 32 caracteres, si esta es menor de 32 caracteres se recomienda llenar con espacios en blanco.

INICIAR ENCODERS:

Los datos que recibe la interface siguen la siguiente estructura para que la interface comience el envío de los datos que provienen del encoder al PC.

Cabecera
Fin línea '/r'
Fin de cadena
'8'
0X0D
NULL

VELOCIDAD MOTORES:

Para enviar la velocidad y dirección de los motores tenemos que enviar la siguiente cadena de caracteres.

Inicio
Dir Drch
Vel Drch
Dir Izq
Vel Izq
Fin línea '/r'
Fin de cadena
'9'
'0' ó '1'
'0' - '255'
'0' - '1'
'0'-'255'
0X0D
NULL

 

6.2.3 Programación PC en Visual C++

6.2.3.1 Interface

Interface agradable de una de las primeras versiones creadas.

 


Captura entorno gráfico plataforma móvil del PC

 

6.2.3.2 Diagrama de clases

Diagrama de casos de uso

 

 

Diagrama de clases de diseño

 

 

Diagramas de secuencias

DDS: Interface

 

 

DDS: Enviar posición

 

 

DDS Recibir posición

 

 
 



Inicio | Foro | FAQ | MapaWeb | BuscadorWeb