Está en la página 1de 76

Pr acticas de Dise no de Robots M oviles

Dr. Jes us Savage Carmona Ing. Rub en Anaya Garc a

Contenido

1 Introducci on general 1.1 1.2 1.3 Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Actividad 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Actividad 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 3 3 4 4 5 7 8 8 9 9 9 9

2 Sistema m nimo del microcontrolador PIC16F877 2.1 2.2 2.3 Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5

Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Actividad 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Actividad 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 i

ii 3 Control de puertos paralelos 3.1 3.2 3.3

CONTENIDO 13

Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.3.1 3.3.2 3.3.3 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4 Operaci on de un robot m ovil usando el microcontrolador PIC16F877 17 4.1 4.2 Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.2.1 4.2.2 4.2.3 4.2.4 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Actividad 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 27

5 Generaci on de Modulaci on de Ancho de Pulso PWM 5.1 5.2 5.3

Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.3.1 5.3.2 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 33

6 Temporizadores 6.1 6.2

Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.2.1 6.2.2 Encoders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Interrupci on (TIMER2) . . . . . . . . . . . . . . . . . . . . . 34 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

6.3

Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 6.3.1 6.3.2

CONTENIDO 6.3.3 6.3.4

iii Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Actividad 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 43

7 Controlador PID 7.1 7.2

Duraci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 7.2.1 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

iv

CONTENIDO

Lista de guras

1.1 1.2 1.3 4.1 4.2 5.1 6.1 6.2 1 2 3 4 5 6 7 8 9

Diagrama por trayectoria . . . . . . . . . . . . . . . . . . . . . . . . . Robot m ovil que evade obst aculos . . . . . . . . . . . . . . . . . . . . Algoritmo de un robot m ovil evasor de obst aculos . . . . . . . . . . .

5 6 7

Robot m ovil que evade obst aculos . . . . . . . . . . . . . . . . . . . . 24 Algoritmo de un robot m ovil evasor de obst aculos . . . . . . . . . . . 25 Modulaci on de ancho de pulso . . . . . . . . . . . . . . . . . . . . . . 28 Captura de pulsos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Encoders usando sensores reectivos . . . . . . . . . . . . . . . . . . . 38 Terminales L293 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Control con tres se nales . . . . . . . . . . . . . . . . . . . . . . . . . 51 Control con dos se nales . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Uso de optoacopladores . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Entorno PIC C Compiler . . . . . . . . . . . . . . . . . . . . . . . . . 53 Compilaci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Ventana de estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Entorno MPLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Conguraci on Ccsc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 v

vi 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

LISTA DE FIGURAS Selecci on Ccsc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Selecci on del dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . 57 Creaci on de un proyecto . . . . . . . . . . . . . . . . . . . . . . . . . 58 Creaci on de un archivo nuevo . . . . . . . . . . . . . . . . . . . . . . 58 Agregar archivo al proyecto . . . . . . . . . . . . . . . . . . . . . . . 59 Opciones de conguraci on del proyecto . . . . . . . . . . . . . . . . . 59 Conguraci on del proyecto . . . . . . . . . . . . . . . . . . . . . . . . 60 Compilar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Resultado de la compilaci on . . . . . . . . . . . . . . . . . . . . . . . 61 Entorno PICDOWNLOADER . . . . . . . . . . . . . . . . . . . . . . 62 Proceso de programaci on . . . . . . . . . . . . . . . . . . . . . . . . . 63 Sistema m nimo del microcontrolador PIC . . . . . . . . . . . . . . . 64 Terminal para comunicaci on serie . . . . . . . . . . . . . . . . . . . . 65 Conguraci on de la terminal . . . . . . . . . . . . . . . . . . . . . . . 66 Entorno de la hyperterminal . . . . . . . . . . . . . . . . . . . . . . . 67

Lista de Tablas

3.1 3.2 3.3 4.1 1

Puertos paralelos PIC16F877

. . . . . . . . . . . . . . . . . . . . . . 13

Control a trav es del puerto serie . . . . . . . . . . . . . . . . . . . . . 14 Control de motores de CD . . . . . . . . . . . . . . . . . . . . . . . . 15 Lectura de dos sensores de contacto . . . . . . . . . . . . . . . . . . . 18 Control de motores de CD . . . . . . . . . . . . . . . . . . . . . . . . 49

vii

viii

LISTA DE TABLAS

Introducci on

El manual de pr acticas para el laboratorio de Dise no de robots m oviles servir a como apoyo y gu a a los alumnos que cursen la materia del mismo nombre, as como de materias anes, los objetivos se centran en encaminar al estudiante a comprender con mayor profundidad el marco pr actico que involucra el uso de los robots m oviles. Construir a el robot m ovil que ser a utilizado durante el semestre, as mismo aprender a programar en lenguaje de alto nivel usando el compilador CCS para la familia de microcontroladores PIC; conocer a y programar a los perif ericos m as utilizados en el control de robots m oviles.

ctica 1 Pra

Introducci on general

Objetivo: Familiarizar al alumno en los comportamientos de los robots empleando m aquinas de estados. Dise no de la estructura b asica del robot m ovil que se usar a durante el semestre.

1.1

Duraci on

Dos semanas

1.2

Introducci on

Un robot m ovil es un dispositivo que permite realizar tareas de manera aut onoma, que pueden variar su complejidad dependiendo de la aplicaci on que se quiera dar; en general, un robot est a compuesto b asicamente de tres etapas: 1. Etapa mec anica Distribuci on diferencial Distribuci on tipo omnidireccional Distribuci on tipo bicicleta Distribuci on tipo triciclo 2. Etapa electr onica Microcontrolador 3

Sensores Driver de pot encia Pilas Reguladores de voltaje 3. Software Agoritmos de control implantados Es necesario adaptar a los motores un sistema de transmisi on que proporcione la pot encia con la que nalmente se desplazar an en el piso; pudiendo ser atrav es de engranes, poleas o bandas. Existen sistemas que tienen integrado un mecanismo de reducci on; en estos se encuentran los motoreductores y los llamados servomotores; los u ltimos requieren ser modicados para operar como motoreductores. El microcontrolador o cualquier otro dispositivo de control no entrega la corriente suciente para mover los motores, por lo que se requiere de sistemas de pot encia externos que proporcionen esta corriente; para efectos del curso se recomienda el uso de los circuitos integrados L293 (B/D) o el L298. En el ap endice de esta pr actica se encontrar a la informaci on requerida para el correcto desarrollo de la misma.

1.3

Desarrollo

Para cada uno de los siguientes apartados, realizar los circuitos electr onicos y las tareas que se piden.

1.3.1

Actividad 1

Leer detalladamente la informaci on del ap endice A; construir el diagrama electr onico para controlar dos motores de CD en una protoboard y colocarlo sobre la base del robot.

1.3.2

Actividad 2

El direccionamiento por trayectoria guarda el estado siguiente y las salidas de cada estado de una carta ASM en una localidad de memoria. La porci on de la memoria que indica el estado siguiente es llamada la liga, mientras que la porci on que indica las salidas es llamada la parte de las salidas, como se muestra en la gura 1.1.

Figura 1.1: Diagrama por trayectoria Concatenando la liga del estado presente junto con las entradas se forma la direcci on de memoria que contiene la direcci on del estado siguiente. Esta direcci on se guarda en un registro que est a concatenando a las l neas de direcci on de la memoria, como se muestra en la gura 1.1. La seal de reloj conectada a los registros es la que indica la velocidad de la m aquina de estados. Usando un direccionamiento por trayectoria, construya una m aquina de estados que ejecute el algoritmo de un robot m ovil que evada obst aculos, como se muestra en la gura 1.2.

Figura 1.2: Robot m ovil que evade obst aculos

En la gura 1.3 se muestra el algoritmo de un robot m ovil que evade obst aculos, cuando los sensores Si y Sd sensan un obst aculo son iguales a cero, en caso contrario es uno.

Figura 1.3: Algoritmo de un robot m ovil evasor de obst aculos

1.3.3

Actividad 3

Usando dos sensores de contacto pruebe la m aquina de estados, observando la secuencia de los estados y las salidas con leds. 7

1.3.4

Actividad 4

Conecte la etapa de pot encia con las salidas de la m aquina de estados.

1.3.5

Actividad 5

Pruebe el algoritmo que evade los obst aculos con el robot constru do.

ctica 2 Pra

Sistema m nimo del microcontrolador PIC16F877

Objetivo: Conocer la estructura y caracter sticas de la tarjeta del microcontrolador PIC que se dispone en el laboratorio, la programaci on en lenguaje C, programaci on del microcontrolador y la ejecuci on en tiempo real.

2.1

Duraci on

Una semanas

2.2

Introducci on

El sistema de desarrollo del microcontrolador PIC se representa en el gura 21 del ap endice B; se distingue el circuito del sistema m nimo (fuente de reloj, sistema de reset y el microcontrolador). Este se comunica al circuito convertidor RS232-TTL (MAX232) a trav es de la USART interna, lo que permite enviar y recibir informaci on con formato serie as ncrono con una computadora personal.

2.3

Desarrollo

Realizar las siguientes actividades. 9

2.3.1

Actividad 1

Leer las notas anexas, que describen el uso del ambiente de desarrollo integrado MPLAB y el PIC C COMPILER

2.3.2

Actividad 2

Usando el entorno de su elecci on (MPLAB o el PIC C Compiler), escribir el siguiente programa en C y compilarlo. #include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1F00, 0x1FFF void loader16F877(void){} void main(){ int i,j; char buffer[20]; float x; i=0; while(1) { printf("\n\r type gets(buffer); j=atoi(buffer); printf("\n\r type gets(buffer); x=atof(buffer); printf("\n\r type gets(buffer); printf("\n %d i++; } }

an integer ->");

a float number ->");

a string ->"); %d %f %s\n\r",i,j,x,buffer);

10

2.3.3

Actividad 3

Cargue este programa en la tarjeta de desarrollo del PIC usando el PICDOWNLOADER, como se indica en el anexo.

2.3.4

Actividad 4

Usando un programa de emulaci on de una terminal (hyperterminal) vea el texto que env a el programa por el puerto serie e introduzca los datos que se piden.

2.3.5

Actividad 5

Escriba un programa en C que instrumente un contador; en el cu al se ingrese el valor inicial, nal y el incremento deseado; este u ltimo puede ser positivo o negativo. Mostrar los valores del contador en una terminal.

11

12

ctica 3 Pra

Control de puertos paralelos

Objetivo: Emplear los puertos paralelos que tiene el microcontrolador PIC para obtener datos de dispositivos externos y controlar la operaci on de dos motores de corriente directa.

3.1

Duraci on

Dos semanas

3.2

Introducci on

El microcontrolador PIC16F877 tiene 5 puertos paralelos, la tabla 3.1 indica la disposici on de ellos. Puerto A B C D E Tama no en bits 6 8 8 8 3 Funci on Bidireccional Bidireccional Bidireccional Bidireccional Bidireccional

Tabla 3.1: Puertos paralelos PIC16F877

13

3.3

Desarrollo

Realizar las siguientes actividades.

3.3.1

Actividad 1

Empleando el puerto paralelo B del microcontrolador; realizar las acciones de control indicadas por la tabla 2. Donde x es un dato que es ingresado a trav es de una terminal externa hyperterminal. Valor x 0 1 Acci on puerto B 00000000 11111111

Tabla 3.2: Control a trav es del puerto serie

3.3.2

Actividad 2

Empleando el puerto paralelo del microcontrolador, congurado como entrada; conectar un dip-switch a este. Modicar el siguiente programa, de tal forma que el dato actual del puerto A sea transmitido a una terminal, adem as de ser mostrado en el puerto B. #include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1F00, 0x1FFF void loader16F877(void){} void main(){ int var1; while(1) { var1=input_a(); output_b(var1); } } 14

3.3.3

Actividad 3

De acuerdo a la asignaci on reservada para las se nales de control de la etapa de pot encia de los motores; realizar un programa que permita controlar el funcionamiento y sentido de giro de estos por separado. La se nal que indica el sentido de giro de los motores se realiza por medio del puerto A y las seales de control al driver por el puerto B; la tabla 3.3 presenta los requerimientos. Entrada puerto A 000000 000010 000100 001000 010000 Motor izquierdo Parado Adelante Atr as Adelante Atr as Motor derecho Parado Adelante Atr as Atr as Adelante Operaci on del robot Parado Adelante Atr as Gira a la derecha Gira a la izquierda

Tabla 3.3: Control de motores de CD

15

16

ctica 4 Pra

Operaci on de un robot m ovil usando el microcontrolador PIC16F877

Objetivo: Controlar la operaci on del robot m ovil constru do en las pr acticas anteriores empleando m aquinas de estados en un microcontrolador.

4.1

Duraci on

Tres semanas

4.2

Desarrollo

Para cada uno de los siguientes apartados, realizar los dise nos electr onicos y programas que se piden.

4.2.1

Actividad 1

Congurando el puerto A del PIC como entrada, conecte dos sensores de contacto a dos pines de este. Muestre el valor le do de los sensores en una hyperterminal cada 10 segundos. 17

SWIizquierdo OFF OFF ON ON

SWDderecho OFF ON OFF ON

Salida a la terminal SWI ABIERTO SWD ABIERTO SWI ABIERTO SWD CERRADO SWI CERRADO SWD ABIERTO SWI CERRADO SWD CERRADO

Tabla 4.1: Lectura de dos sensores de contacto

4.2.2

Actividad 2

Escriba una funci on en C que controle los movimientos de un robot m ovil, en el se indicar a el angulo en radianes que el robot primero girar a y la distancia que despu es avanzar a. La funci on deber a tener el siguiente formato:

move_robot(float distancia, float angulo) { }

4.2.3

Actividad 3

Escriba una funci on en C que regrese el valor del sensor indicado. La funci on deber a tener el siguiente formato: float show_sensor(char *sensor, int num_sensor) { float x; return(x); }

4.2.4

Actividad 4

Cargue el siguiente programa en C , este ejecuta el algoritmo de un robot m ovil que evade obst aculos, como el que se muestra en la gura 4.1, en su robot. En la gura 4.2 se muestra el algoritmo de un robot m ovil que evade obst aculos, cuando 18

los sensores de tacto Si y Sd sensan un obst aculo sus valores son igual a cero, en caso contrario es uno.

19

Programa en C para un robot m ovil que evade obst aculos.

#include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1F00, 0x1FFF void loader16F877(void){} // Constantes #define #define #define #define #define #define #define ADELANTE move_robot(AVANCE, 0.0f); ATRAS move_robot(-AVANCE, 0.0f) GIRO_IZQ move_robot(0.0f, 0.7854f) GIRO_DER move_robot(0.0f, -0.7854f) SENSOR_IZQ 1 SENSOR_DER 2 SECURE 5.0f

move_robot(float distancia, float angulo) { } float show_sensor(char *sensor, int num_sensor) { float x; return(x); }

// Esta funci on lee el sensor indicado int lee_sensor(int num_sensor){ float sensor; int valor_sensor; char buffer[20]; char nombre_sensor[20];

20

strcpy(nombre_sensor,"contacto"); sensor = show_sensor(nombre_sensor, num_sensor); if (sensor > SECURE)valor_sensor=0; else valor_sensor=1; return(valor_sensor); } // Funci on que evade obst aculos void evade() { float AVANCE=10.; int estado; int Si, Sd; char buffer[20]; // Estado inicial estado = 0; // Loop infinito while(1) { printf("Estado presente: %d\n\r",estado); // Acciones switch ( estado ) { case 0: // est0 // Lee sensores Sd = lee_sensor(SENSOR_DER); Si = lee_sensor(SENSOR_IZQ); printf("\n\rLectura sensores Si %d Sd %d\n\r",Si,Sd); if (Si == 0) if (Sd == 0) ADELANTE; break; case 1: // est1 ATRAS; break; 21

case 2: // est2 GIRO_IZQ; break; case 3: // est3 ATRAS; break; case 4: // est4 GIRO_DER; break; case 5: // est5 ATRAS; break; case 6: // est6 GIRO_IZQ; break; case 7: // est7 GIRO_IZQ; break; case 8: // est8 ADELANTE; break; case 9: // est9 ADELANTE; break; case 10: // est10 GIRO_DER; break; case 11: // est11 GIRO_DER; break; } // Transiciones switch ( estado ) { case 0: if (Si == 0) if (Sd == 0) estado = 0; else estado = 1; else if (Sd == 0) estado = 3; else estado = 5; 22

break; case 1: estado= 2; break; case 2: estado = 0; break; case 3: estado = 4; break; case 4: estado = 0; break; case 5: estado = 6; break; case 6: estado = 7; break; case 7: estado = 8; break; case 8: estado = 9; break; case 9: estado = 10; break; case 10:estado = 11; break; case 11:estado = 0; break; } } } void main(){ // Ejecuta el algoritmo evasor de obstaculos evade(); }

23

Figura 4.1: Robot m ovil que evade obst aculos

24

Figura 4.2: Algoritmo de un robot m ovil evasor de obst aculos

25

26

ctica 5 Pra

Generaci on de Modulaci on de Ancho de Pulso PWM

Objetivo: Utilizar el m odulo de PWM de un microcontrolador para controlar la operaci on de los motores de un robot.

5.1

Duraci on

Dos semanas

5.2

Introducci on

Se genera una se nal a un per odo constante y se modula el tiempo en alto de la misma; con lo que se obtendr a un ciclo de trabajo variable, en respuesta a esta acci on el robot se podr a desplazar a diferentes velocidades. Es usado el TIMER2 y los m odulos CCP del microcontrolador PIC para jar la se nal y controlar el PWM; el per odo est a dado por (5.1):

(5.1)

T = (Tosc int )(P R2 + 1)(P REDIV ISOR)

donde Tosc int es el ciclo de m aquina de procesador y es el inverso del reloj externo dividido por cuatro; P R2 valor cargado en un registro interno de ocho bits y el 27

Figura 5.1: Modulaci on de ancho de pulso P REDIV ISOR es el valor seleccionado para que el registro TMR2 se incremente cada cantidad de ciclos de reloj congurados por este par ametro, pudiendo ser de 1, 4 o 16. El oscilador externo es de 20 MHz, con lo cual se obtiene un ciclo de m aquina de 0.2s; considerando un predivisor de uno y un valor en PR2 de 255, al usar la ecuaci on (5.3) se tendr a: T = (0.2s)(P R2 + 1)(1) = 51.2s por lo tanto la frecuencia de la se nal ser a: f = 19.531KHz

Para ser programado usando el compilador CCS se usa la funci an: SET U P T IM ER 2(T 2 DIV BY 1, 255, 10); T 2 DIV BY 1 indica el predivisor de uno, 255 el valor que tendr a PR2 y el n umero 28

10 es usado para generar peticiones de interrupci on. El tiempo de la se nal en alto, es calculado con la ecuaci on 5.2 cuando sea empleado una resoluci on de 8 bits.

(5.2)

TON = (V ALOR)(

1 )(4)(P REDIV ISOR) XT AL

Para una resoluci on de 10 bits se usar a 4.8.

(5.3)

TON = (V ALOR)(

1 )(P REDIV ISOR) XT AL

5.3

Desarrollo

Para cada uno de los siguientes apartados, realizar los dise nos electr onicos y programas que se piden.

5.3.1

Actividad 1

Busque en la ayuda del compilador CCS C informaci on sobre las siguientes funciones las cuales conguran pines del puerto C del PIC como salidas PWM: setup_ccp1(CCP_PWM) setup_ccp2(CCP_PWM) set_pwm1_duty(duty) set_pwm2_duty(duty) setup_timer_2(T2_DIV_BY_1, 127, 10) enable_interrupts(INT_TIMER2) 29

5.3.2

Actividad 2

Tomando como base el programa en C que se muestra a continuaci on, controle la velocidad de los motores del robot m ovil que se ha construido en las pr acticas anteriores. Conecte las l neas de la etapa de pot encia que controlan los motores izquierdo y derecho a los pines 1 y 2 del puerto C los cu ales generan las salidas PWM.

#include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200,xmit=PIN_C6, rcv=PIN_C7) #org 0x1F00, 0x1FFF void loader16F877(void){}

// Inicializa puertos inicializa_puertos(){ setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); }

// Inicializa interrupciones inicializa_temporizadores(){ // // The cycle time will be (1/clock)*4*t2div*(period+1) In this program clock=10000000 and period=127 (below) setup_timer_2(T2_DIV_BY_1, 127, 10); }

// Se indica el ancho del periodo positivo del PWM mv(long duty){ 30

// Se indica la direccion de movimiento de las llantas output_d(0x0a); // Se indican los tiempos del pwm set_pwm1_duty(duty); set_pwm2_duty(duty); }

// Programa principal void main(){ char linea[20]; long duty; // Se inicializan las interrupciones inicializa_temporizadores(); // Se inicializan los puertos inicializa_puertos(); // Loop infinito while(TRUE){ // Se lee el valor del periodo positivo printf("\n\r-> "); gets(linea); duty=atol(linea); // Actualiza el ciclo de trabajo mv(duty); } }

31

32

ctica 6 Pra

Temporizadores

Objetivo: Utilizar el sistema de temporizadores de un microcontrolador, para capturar las formas de onda generadas por los encoders de los motores de un robot m ovil.

6.1

Duraci on

Dos semanas

6.2
6.2.1

Introducci on
Encoders

La lectura de los pulsos se realiza con las funciones del TIMER0 y TIMER1; estos temporizadores pueden se congurados como temporizadores o como acumuladores de eventos externos; en esta La lectura de los pulsos se realiza con las funciones del TIMER0 y TIMER1; estos temporizadores pueden se congurados como temporizadores o como acumuladores de eventos externos; en esta ultima modalidad, la informaci on que generan los encoders permitir an conocer la velocidad de rotaci on de los motores. Con el valor de los encoders y el radio de la llanta servir an para estimar la distancia recorrida por el robot y la velocidad angular de las llantas. En ambos temporizadores se requiere congurar el tipo de anco que incrementar los registros internos asociados a estos, la gura 6.1 muestra la adecuaci on de los encoders al microcontrolador. 33

Figura 6.1: Captura de pulsos La funci on de conguraci on empleada para la detecci on de ancos de subida en el motor izquierdo es: SET U P T IM ER 1(T 1 EXT ERN AL|T 1 DIV 1); Para la congurar la detecci on del mismo tipo de pulsos en el motor derecho se emplea: SET U P T IM ER 0(RT CC EXT ERN AL L T O H |T 1 DIV 1); La lectura del encoder izquierdo ser a adquirida con: CntLef t = get timer0(); y para el derecho: CntRight = get timer1();

6.2.2

Interrupci on (TIMER2)

El per odo de interrupci on es controlado por el TIMER2, este ser a usado para generar el tiempo de muestreo para la actualizaci on de la lectura de los encoders; adem as de las conguraciones descritas en el PWM se utiliza un POSTESCALADOR, el cu al indicar el peri odo de la petici on de interrupci on del TIMER2; la expresi on quedar a ahora como:

(6.1)

T = (Tosci nt )(P R2)(P REDIV ISOR)(P OST ESCALADOR) 34

Cuando el valor del registro TMR2 sea igual a PR2 entonces se genera una comparaci on exitosa; cuando se han cumplido la cantidad de comparaciones indicadas en el POSTESCALADOR, entonces se genera una solicitud de interrupci on. Para congurar el per odo de interrupci on se usa la funci on: SET U P T IM ER 2(T 2 DIV BY 1, 255, 10);

Con estos datos se especica que se usar a un predivisor de uno, el valor de PR2 es 255 y el postescalador de 10; con lo que se obtiene un tiempo de 512s.

6.3

Desarrollo

Para cada uno de los siguientes apartados, realizar los dise nos electr onicos y programas que se piden.

6.3.1

Actividad 1

1. Busque en la ayuda del compilador CCS C informaci on sobre las siguientes funciones de los temporizadores:

setup_timer_0() setup_timer_1() setup_timer_2() enable_interrupts()

6.3.2

Actividad 2

Tomando como base el programa en C que se encuentra en el programa 1 var e los tiempos en los cuales ocurren las interrupciones de los temporizadores. Programa 1 35

#include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1f00, 0x1FFF void loader16F877(void){}

// Esta interrupcion es llamada en forma automatica por el TIMER0. #INT_TIMER0 void timer0() { static long i=0,j=0; set_timer0(0x00); i++; if(i>1024){ j++; printf("T0 %ld\n\r",j); i=0; if(j>100)j=0; } } // Esta interrupcion es llamada en forma automatica por el TIMER1. #INT_TIMER1 void wave_timer1() { static long i=0,j=0; set_timer1(0xF000); i++; if(i>1024){ j++; printf("T1 %ld\n\r",j); i=0; if(j>100)j=0; } 36

// Esta interrupcion es llamada en forma automtica por el TIMER2. #INT_TIMER2 void wave_timer2() { static long i=0,j=0; i++; if(i>4096){ j++; printf("T2 %ld\n\r",j); i=0; if(j>100)j=0; } }

// Inicializa interrupciones incializa_interrupciones(){ setup_timer_0(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(INT_TIMER0); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(INT_TIMER1); setup_timer_2( T2_DIV_BY_1, 128, 10); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); } // setup interrupt 0

// setup interrupt 1

// setup interrupts 2

void main()

incializa_interrupciones(); 37

while(TRUE); }

6.3.3

Actividad 3

Coloque a un lado de las llantas un fondo negro y l neas blancas para detectar cuanto han girado usando sensores infrarrojos, como se muestran en la gura 6.1. Conecte estos encodicadores a las pines C0 y A4 del PIC. Programe los temporizadores T0 y T1 con contador de eventos externos dados por las l neas de los encodicadores. El programa 2 captura los pulsos detectados en las transiciones de los encoders usando interrupciones.

Figura 6.2: Encoders usando sensores reectivos Programa 2

#include <16f877.h> #device ADC=8 #include <stdlib.h> 38

#fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1F00, 0x1FFF void loader16F877(void){} // Definicion de Constantes #define NUM_PULSES_0 0xFF #define NUM_PULSES_1 0xFFFF

//Variables Globales static long CntRight=0,CntLeft=0; // Esta interrupcion es llamada en forma automatica por el TIMER0. #INT_TIMER0 void timer0() { static long i=0; CntLeft++; printf("T0 %x\n\r",CntLeft); set_timer0(NUM_PULSES_0); } // Esta interrupcion es llamada en forma automatica por el TIMER1. #INT_TIMER1 void wave_timer1() { static long i=0; CntRight++; printf("T1 %ld\n\r",CntRight); set_timer1(NUM_PULSES_1); } // Inicializa interrupciones inicializa_interrupciones(){ set_timer1(NUM_PULSES_1); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); 39

enable_interrupts(INT_TIMER1); set_timer0(NUM_PULSES_0); setup_timer_0(RTCC_DIV_1|RTCC_EXT_L_TO_H); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); } void main(){ inicializa_interrupciones(); while(TRUE); }

6.3.4

Actividad 4

Utilice el temporizador T2 para mostrar los contadores de los temporizadores T0 y T1; como se muestra en el programa 3. Programa 3 #include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1FFF, 0x1FFF void loader16F877(void){}

// Definicion de Constantes #define NUM_TIMES_T2 256 #define NUM_SECOND 14

40

// Esta interrupcion es llamada en forma automatica por el TIMER2. #INT_TIMER2 void wave_timer2() { static long k=0,l=0,m=0; long i,j; k++; i=get_timer0(); j=get_timer1(); if(k>NUM_TIMES_T2){ set_timer0(0); set_timer1(0); k=0; l++; if(l>NUM_SECOND){ printf("T2 Temp. %ld motor Iz. %lu De. %lu\n\r",m,i,j); l=0; m++; } } } /* Inicializa interrupciones*/ incializa_interrupciones(){ set_timer1(0); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); set_timer0(0); setup_timer_0(RTCC_DIV_1|RTCC_EXT_L_TO_H); setup_timer_2(T2_DIV_BY_1, 127, 10); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); } 41

// Programa Principal void main(){ char linea[20]; long duty; incializa_interrupciones(); while(TRUE); }

42

ctica 7 Pra

Controlador PID

Objetivo: Controlar la velocidad de los dos motores del robot construido en las practicas anteriores usando un controlador PID

7.1

Duraci on

Dos semanas

7.2

Desarrollo

Realizar la actividad indicada.

7.2.1

Actividad 1

1. 1. Tomando como base el siguiente programa, vari e las constantes Kp, Ki y Kd del controlador PID y modique el c odigo, si es necesario, para controlar las velocidades de los motores de su robot.

/******************************************** * robot_pid.c * * * * v. 1.0 * * * 43

* Este programa controla la * * velocidad de dos motores * * usando un control PID * * * * Jesus Savage * * Ruben Anaya * * Carlos Munive * * * * FI-UNAM, Nov-2007 * * * *********************************************/ // Definiciones PIC #include <16f877.h> #device ADC=8 #include <stdlib.h> #fuses HS,NOPROTECT #use delay(clock=20000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) #org 0x1FFF, 0x1FFF void loader16F877(void){} // Definicion de Constantes #define CNT_T2 3 #define NUM_TIMES_T2 64*CNT_T2 #define NUM_SECOND 80/CNT_T2 #define SIZE_DATA 50 #define ADELANTE 0x0a // Constantes de acondicionamiento motor izquierdo #define Kci 0.2 #define Kci1 Kci*2.7 #define Kci2 Kci*2.2 #define Kci3 Kci*2.0 #define Kci4 Kci*1.6 #define Kci5 Kci*1.2 // Constantes de acondicionamiento motor derecho #define Kcd 0.18 #define Kcd1 Kcd*2.7 #define Kcd2 Kcd*2.2 #define Kcd3 Kcd*2.0 44

#define Kcd4 Kcd*1.6 #define Kcd5 Kcd*1.2 // Constantes del control PID #define Kp 0.7 //1.7 #define Ki 0.0 //0.35 #define Kd 0.000 //0.005 //Variables Globales long CntRight=0,CntLeft=0; int flag=0; long wi=0,wd=0; float fCntRight,fCntLeft; // Control PID mv_pid(){ long rni=0,rnd=0; float frni=0.0,frnd=0.0; float ewi=0,ewd=0; static float prev_rni=0,prev_rnd=0,prev_ewi=0,prev_ewd=0; static float prev2_ewi=0,prev2_ewd=0; float cntder,cntizq; //Acondiciona los valores de las entradas (encoders) if(wd<=62)cntder=wd*Kcd1; else if(wd<125)cntder=wd*Kcd2; else if(wd<250)cntder=wd*Kcd3; else if(wd<350)cntder=wd*Kcd4; else cntder=wd*Kcd5; if(wi<=62)cntizq=wi*Kci1; else if(wi<125)cntizq=wi*Kci2; else if(wi<250)cntizq=wi*Kci3; else if(wi<350)cntizq=wi*Kci4; else cntizq=wi*Kci5; cntizq=cntizq/1024.0; cntder=cntder/1024.0; // Calcula el error ewd=cntder-fCntRight; 45

ewi=cntizq-fCntLeft; // Calcula el control para cada motor frni= prev_rni + Kp*(ewi-prev_ewi)+ Ki*(ewi-prev_ewi)+ Kd*(ewi-2*prev_ewi+prev2_ewi); frnd= prev_rnd + Kp*(ewd-prev_ewd)+ Ki*(ewd-prev_ewd)+ Kd*(ewd-2*prev_ewd+prev2_ewd); // Guarda valores para la siguiente iteracion prev_rni=frni; prev_rnd=frnd; prev_ewi=ewi; prev_ewd=ewd; //Acondiciona los valores de las salidas if(frni<0)frni=0; else if(frni>1.0)frni=1.0; if(frnd<0)frnd=0; else if(frnd>1.0)rnd=1.0; rni=2048.0*frni; rnd=2048.0*frnd; // Coloca los valores para generar los PWM set_pwm1_duty(rni); set_pwm2_duty(rnd); } // Rutina para la interrupcion del TIMER2. #INT_TIMER2 void wave_timer2() { static long k=0; static int i=0; k++; if(k>NUM_TIMES_T2){ k=0; CntLeft=get_timer0(); CntRight=get_timer1(); fCntRight=CntRight/1024.0; fCntLeft=CntLeft/1024.0; 46

// Muestra los datos if(flag==1){ i++; if(i > SIZE_DATA)flag=0; printf("%f %f\n\r",fCntLeft,fCntRight); } else i=0; // Ejecuta el algoritmo de control PID mv_pid(); // Inicializan los contadores de los temporizadores de nuevo set_timer0(0); set_timer1(0); } } /* Inicializa puertos */ inicializa_puertos(){ // Se inicializan los pines para generar los pwms setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); // Se indica la dirrecion de los motores output_d(ADELANTE); } // Inicializa interrupciones y temporizadores inicializa_interrupciones(){ // Se inicializan los temporizadores 0 y 1 como encoders set_timer1(0); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); set_timer0(0); setup_timer_0(RTCC_DIV_1|RTCC_EXT_L_TO_H); // Se inicializa el temporizador 2 para generar el PWM setup_timer_2(T2_DIV_BY_1, 127, 10); // Se habilitan las salidas enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); } /* Programa principal */ void main(){ 47

char linea[5]; inicializa_interrupciones(); inicializa_puertos(); while(TRUE){ // lee las velocidades de los motores gets(linea); wi=atol(linea); flag=1; gets(linea); wd=atol(linea); flag=1; } }

48

Apendice A Circuito L293 B/D


El L293 es un circuito integrado dise nado para manejar motores hasta de 1 A. Entre las aplicaciones t picas, incluye manejo de cargas inductivas como solenoides, relevadores, motores de corriente directa y motores a pasos, emplea internamente los transistores de potencia y utiliza un buer para se nales de nivel bajo. Algunas de sus caracter sticas son: Salida por canal de 1 A. Reemplazo directo L293B y L293D Empaquetado DIP de 16 terminales Cero logico hasta 1.5 volts Cuatro se nales de control independientes Dos puentes H independientes Dos se nales de habilitador para cada puente H Alimentaci on independiente al motor (0 a 32 volts) Alimentaci on al circuito de 5 volts La distribuci on de pines se muestra en la gura 1 y la asignaci on de ellos en la tabla 4. Terminal 16 8 3, 4, 12, 13 2, 7, 10, 15 3, 6, 11, 14 2, 9 Funci on Alimentaci on al circuito 5 volts Alimentaci on independiente al motor (0V a 32 V) 0 Volts Control de direcci on de los motores Salida a motores Habilitadores Tabla 1: Control de motores de CD

49

Figura 1: Terminales L293 Algunas de las conguraciones mas usadas se numeran a continuaci on: 1. Control directo usando tres se nales de para cada motor (gura 2) 2. Control directo usando dos se nales para cada motor (gura 3) 3. Control usando optoacopladores en cada se nal (gura 4)

50

Figura 2: Control con tres se nales

Figura 3: Control con dos se nales 51

Figura 4: Uso de optoacopladores Es recomendable contar con una fuente de alimentaci on para el circuito controlador y otra para el driver para evitar el efecto de las cargas inductivas. Para los dos primeros casos es necesario conectar la tierra de ambos sistemas con la nalidad de cerrar el circuito; mientras que en la tercera se contar a con independencia total en la alimentaci on de ambos sistemas.

52

Apendice B Compilador CCS


El compilador CCS permite programar los algoritmos empleando programaci on en lenguaje C, es posible la implantaci on de estos usando el entorno de desarrollo integrado del PIC C Compiler o el IDE del MPLAB. Se recomienda consultar la ayuda del compilador para conocer las funciones espec cas que vienen integradas en este.

IDE PIC C Compiler


Es un entorno f acil de usar, permite editar los programas, compilar y cuenta con una terminal que es u til en la comunicaci on serie as ncrona; una v ez que se ha compilado un programa y se desea trabajar con otro, es necesario cerrar este, para continuar trabajando con el nuevo; en caso contrario seguir a compilado el c odigo original. Al ejecutar el PIC C Compiler, presenta su entorno, como se muestra en la gura 5.

Figura 5: Entorno PIC C Compiler

53

Una v ez terminado el programa, se debe seleccionar la opci on Microchip 14 bits, para congurar las versiones compatibles con los PIC16F877; una vez hecho esto se procede a compilar; tal como se muestra en la gura 6.

Figura 6: Compilaci on En caso de no existir error en el programa, presenta los mensajes que se indican en la gura 7; generando el c odigo de m aquina *.HEX y se proceder a programar el dispositivo mediante las opciones que se describen ms adelante. En caso de tener error en el programa, indicar a el tipo de este y la l nea donde se encuentra.

54

Figura 7: Ventana de estado

MPLAB
Usar este entorno para compilar programas escritos en C, requiere un proceso m as largo; se necesita crear un proyecto, agregar un programa fuente a este y compilar, de igual manera generar a un programa*.HEX. El entorno de tabajo se muestra en la gura 8. La conguraci on de la heramienta empleada para compilar los programas; seleccionar P roject y despu es select languaje toolsuite; deber a seleccionar CCS C Compiler PIC12/14/16/18 (gura 9).

55

Figura 8: Entorno MPLAB

Figura 9: Conguraci on Ccsc

56

Comprobar la ubicaci on del compilador; nuevamente seleccionar project, set languaje T ool locations, ubicar el compilador Ccsc.exe; tal como se indica en la gura 10.

Figura 10: Selecci on Ccsc Seleccionar la versi on del microcontrolador (gura 11).

Figura 11: Selecci on del dispositivo

57

Para crear un proyecto nuevo, en el men u P roject seleccionar new; indicar el nombre y la ubicaci on del proyecto (gura 12).

Figura 12: Creaci on de un proyecto Se debe abrir el entorno para escribir el programa fuente, seleccionar F ile y posteriormente N ew; se abrir a la ventana de captura sin nombre, una v ez terminado indicar el nombre y ubicaci on donde se almacenar a el programa, debe tener extenci an *.C (gura 13).

Figura 13: Creaci on de un archivo nuevo

58

El programa reci en creado se deber a agregar al proyecto, siguiendo el procedimiento de la gura 14.

Figura 14: Agregar archivo al proyecto Es necesario congurar el proyecto; por lo que se debe posicionar en el archivo agregado, presionar el boton izquierdo del mouse y seleccionar Build Option (gura 15).

Figura 15: Opciones de conguraci on del proyecto

59

Deshabilitar la opci on Symbol F ile en Others F iles y habilitar N one en debug (gura 16).

Figura 16: Conguraci on del proyecto Una v ez realizado todo el procedimiento anterior, se iniciar a la compilaci on; accediendo a P roject del men u principal y seleccionar build all; o en su caso usar el cono de compilaci on (gura 17).

Figura 17: Compilar

60

En caso de no existir error, mostrar a la pantalla de la gura 18. Se tendr a entonces el c odigo de m aquina requerido para programar al microcontrolador.

Figura 18: Resultado de la compilaci on

61

PICDOWNLOADER
Una v ez generado el c odigo *.HEX, se programar a en el PIC, este proceso se podr a hacer utilizando un programador externo (hardware) o un peque no c odigo que se programa previamente al microcontrolador llamado Bootloader y que permitir a por software la programaci on del mismo. Al jecutar el programa P ICDOW N LOADER, mostrar a la gura 19; se deber a seleccionar el programa deseado, congurar la velocidad a la cu al transmitir a los datos, (informacin del bootloader dependiente de la versi on del microcontrolador y del valor del cristal usado), as mismo indicar el puerto serie (COM) donde se ha conectado.

Figura 19: Entorno PICDOWNLOADER Una v ez seleccionado el programa, presionar W rite, el ambiente solicitar a se presione el bot on de reset del sistema; una vez hecho esto se inicia de programaci on del microcontrolador; la barra de estado representa el avance del proceso. En el momento que se ha conclu do la programaci on, despliega el texto All OK ; en caso contrario se deber a revisar problemas en el sistema de desarrollo o en la conguraci on realizada. El programa reci en cargado iniciar a autom aticamente la ejecuci on (gura 20). 62

Figura 20: Proceso de programaci on

63

Sistema m nimo

Figura 21: Sistema m nimo del microcontrolador PIC

64

Hyperterminal
Para establecer esta terminal debe de acceder a P rogramas, accesorios y comunicaciones para ubicar a la terminal; la primer pantalla que presenta, es para ingresar el nombre de la conexi on (gura 22); posteriormente solicitar a el n umero de COM donde se este conectando.

Figura 22: Terminal para comunicaci on serie Congurar la terminal; esto incluye la velocidad del programa, el protocolo y el tipo de control de los datos; la gura 23 muestra la conguraci on t pica.

65

Figura 23: Conguraci on de la terminal

66

Una v ez que se ha tecleado aplicar y posteriormente aceptar, se tendr a abierta la terminal para la comunicaci on serie as ncrona entre una computadora personal y el microcontrolador. Tal v ez requiera presionar el bot on de reset a procesador para reiniciar el programa; en caso de requerir reprogramar al procesador mediante el bootloader, deber a desconectarse de la hyperterminal para liberar el puerto.

Figura 24: Entorno de la hyperterminal

67

También podría gustarte