Está en la página 1de 76

Prcticas de Diseo de Robots Mviles a n o

Dr. Jess Savage Carmona u Ing. Rubn Anaya Garc e a

Contenido

1 Introduccin general o 1.1 1.2 1.3 Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 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 Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 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

Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 o Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 o Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.3.1 3.3.2 3.3.3 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Actividad 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4 Operacin de un robot mvil usando el microcontrolador PIC16F877 17 o o 4.1 4.2 Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 o 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 Generacin de Modulacin de Ancho de Pulso PWM o o 5.1 5.2 5.3

Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 o Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 o Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 5.3.1 5.3.2 Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 33

6 Temporizadores 6.1 6.2

Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 o Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 o 6.2.1 6.2.2 Encoders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Interrupcin (TIMER2) . . . . . . . . . . . . . . . . . . . . . 34 o 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

Duracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 o 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 mvil que evade obstculos . . . . . . . . . . . . . . . . . . . . o a Algoritmo de un robot mvil evasor de obstculos . . . . . . . . . . . o a

5 6 7

Robot mvil que evade obstculos . . . . . . . . . . . . . . . . . . . . 24 o a Algoritmo de un robot mvil evasor de obstculos . . . . . . . . . . . 25 o a Modulacin de ancho de pulso . . . . . . . . . . . . . . . . . . . . . . 28 o Captura de pulsos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Encoders usando sensores reectivos . . . . . . . . . . . . . . . . . . . 38 Terminales L293 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Control con tres seales . . . . . . . . . . . . . . . . . . . . . . . . . 51 n Control con dos seales . . . . . . . . . . . . . . . . . . . . . . . . . . 51 n Uso de optoacopladores . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Entorno PIC C Compiler . . . . . . . . . . . . . . . . . . . . . . . . . 53 Compilacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 o Ventana de estado . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Entorno MPLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Conguracin Ccsc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 o v

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

LISTA DE FIGURAS Seleccin Ccsc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 o Seleccin del dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . 57 o Creacin de un proyecto . . . . . . . . . . . . . . . . . . . . . . . . . 58 o Creacin de un archivo nuevo . . . . . . . . . . . . . . . . . . . . . . 58 o Agregar archivo al proyecto . . . . . . . . . . . . . . . . . . . . . . . 59 Opciones de conguracin del proyecto . . . . . . . . . . . . . . . . . 59 o Conguracin del proyecto . . . . . . . . . . . . . . . . . . . . . . . . 60 o Compilar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Resultado de la compilacin . . . . . . . . . . . . . . . . . . . . . . . 61 o Entorno PICDOWNLOADER . . . . . . . . . . . . . . . . . . . . . . 62 Proceso de programacin . . . . . . . . . . . . . . . . . . . . . . . . . 63 o Sistema m nimo del microcontrolador PIC . . . . . . . . . . . . . . . 64 Terminal para comunicacin serie . . . . . . . . . . . . . . . . . . . . 65 o Conguracin de la terminal . . . . . . . . . . . . . . . . . . . . . . . 66 o Entorno de la hyperterminal . . . . . . . . . . . . . . . . . . . . . . . 67

Lista de Tablas

3.1 3.2 3.3 4.1 1

Puertos paralelos PIC16F877

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

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

vii

viii

LISTA DE TABLAS

Introduccin o

El manual de prcticas para el laboratorio de Diseo de robots mviles servir como a n o a apoyo y gu a los alumnos que cursen la materia del mismo nombre, as como de a materias anes, los objetivos se centran en encaminar al estudiante a comprender con mayor profundidad el marco prctico que involucra el uso de los robots mviles. a o Construir el robot mvil que ser utilizado durante el semestre, as mismo a o a aprender a programar en lenguaje de alto nivel usando el compilador CCS para la familia de microcontroladores PIC; conocer y programar los perifricos ms utia a e a lizados en el control de robots mviles. o

Practica 1

Introduccin general o

Objetivo: Familiarizar al alumno en los comportamientos de los robots empleando mquinas de estados. Diseo de la estructura bsica del robot mvil que se usar a n a o a durante el semestre.

1.1

Duracin o

Dos semanas

1.2

Introduccin o

Un robot mvil es un dispositivo que permite realizar tareas de manera autnoma, o o que pueden variar su complejidad dependiendo de la aplicacin que se quiera dar; o en general, un robot est compuesto bsicamente de tres etapas: a a 1. Etapa mecnica a Distribucin diferencial o Distribucin tipo omnidireccional o Distribucin tipo bicicleta o Distribucin tipo triciclo o 2. Etapa electrnica o Microcontrolador 3

Sensores Driver de potncia e Pilas Reguladores de voltaje 3. Software Agoritmos de control implantados Es necesario adaptar a los motores un sistema de transmisin que proporcione o la potncia con la que nalmente se desplazarn en el piso; pudiendo ser atravs de e a e engranes, poleas o bandas. Existen sistemas que tienen integrado un mecanismo de reduccin; en estos se o encuentran los motoreductores y los llamados servomotores; los ultimos 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 potncia externos que proporcionen esta corriente; para efectos del curso se ree comienda el uso de los circuitos integrados L293 (B/D) o el L298. En el apndice de esta prctica se encontrar la informacin requerida para el e a a o correcto desarrollo de la misma.

1.3

Desarrollo

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

1.3.1

Actividad 1

Leer detalladamente la informacin del apndice A; construir el diagrama electrnico o e o 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 porcin de la memoo ria que indica el estado siguiente es llamada la liga, mientras que la porcin que o 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 direccin de memoria que contiene la direccin del estado siguiente. Esta direccin se o o o guarda en un registro que est concatenando a las l a neas de direccin de la memoria, o como se muestra en la gura 1.1. La seal de reloj conectada a los registros es la que indica la velocidad de la mquina de estados. a Usando un direccionamiento por trayectoria, construya una mquina de esa tados que ejecute el algoritmo de un robot mvil que evada obstculos, como se o a muestra en la gura 1.2.

Figura 1.2: Robot mvil que evade obstculos o a

En la gura 1.3 se muestra el algoritmo de un robot mvil que evade obstculos, o a cuando los sensores Si y Sd sensan un obstculo son iguales a cero, en caso contrario a es uno.

Figura 1.3: Algoritmo de un robot mvil evasor de obstculos o a

1.3.3

Actividad 3

Usando dos sensores de contacto pruebe la mquina de estados, observando la sea cuencia de los estados y las salidas con leds. 7

1.3.4

Actividad 4

Conecte la etapa de potncia con las salidas de la mquina de estados. e a

1.3.5

Actividad 5

Pruebe el algoritmo que evade los obstculos con el robot constru a do.

Practica 2

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 programacin en lenguaje C, programacin o o del microcontrolador y la ejecucin en tiempo real. o

2.1

Duracin o

Una semanas

2.2

Introduccin o

El sistema de desarrollo del microcontrolador PIC se representa en el gura 21 del apndice B; se distingue el circuito del sistema m e nimo (fuente de reloj, sistema de reset y el microcontrolador). Este se comunica al circuito convertidor RS232-TTL (MAX232) a travs de la USART interna, lo que permite enviar y recibir informacin e o 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 eleccin (MPLAB o el PIC C Compiler), escribir el siguiente o 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 emulacin de una terminal (hyperterminal) vea el texto que o env el programa por el puerto serie e introduzca los datos que se piden. a

2.3.5

Actividad 5

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

11

12

Practica 3

Control de puertos paralelos

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

3.1

Duracin o

Dos semanas

3.2

Introduccin o

El microcontrolador PIC16F877 tiene 5 puertos paralelos, la tabla 3.1 indica la disposicin de ellos. o Puerto A B C D E Tamao en bits n 6 8 8 8 3 Funcin o 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 travs de una e terminal externa hyperterminal. Valor x 0 1 Accin puerto B o 00000000 11111111

Tabla 3.2: Control a travs del puerto serie e

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, adems de ser mostrado en el puerto B. a #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 asignacin reservada para las seales de control de la etapa de o n potncia de los motores; realizar un programa que permita controlar el funcionamiento e y sentido de giro de estos por separado. La seal que indica el sentido de giro de n 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 Atrs a Adelante Atrs a Motor derecho Parado Adelante Atrs a Atrs a Adelante Operacin del robot o Parado Adelante Atrs a Gira a la derecha Gira a la izquierda

Tabla 3.3: Control de motores de CD

15

16

Practica 4

Operacin de un robot mvil o o usando el microcontrolador PIC16F877

Objetivo: Controlar la operacin del robot mvil constru o o do en las prcticas a anteriores empleando mquinas de estados en un microcontrolador. a

4.1

Duracin o

Tres semanas

4.2

Desarrollo

Para cada uno de los siguientes apartados, realizar los diseos electrnicos y progran o mas 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 ste. Muestre el valor le de los sensores en una hyperterminal cada e do 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 funcin en C que controle los movimientos de un robot mvil, en el se o o indicar el ngulo en radianes que el robot primero girar y la distancia que despus a a a e avanzar. La funcin deber tener el siguiente formato: a o a

move_robot(float distancia, float angulo) { }

4.2.3

Actividad 3

Escriba una funcin en C que regrese el valor del sensor indicado. La funcin deber o o 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 mvil o que evade obstculos, como el que se muestra en la gura 4.1, en su robot. En la a gura 4.2 se muestra el algoritmo de un robot mvil que evade obstculos, cuando o a 18

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

19

Programa en C para un robot mvil que evade obstculos. o a

#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 funcin lee el sensor indicado o 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); } // Funcin que evade obstculos o a 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 mvil que evade obstculos o a

24

Figura 4.2: Algoritmo de un robot mvil evasor de obstculos o a

25

26

Practica 5

Generacin de Modulacin de o o Ancho de Pulso PWM

Objetivo: Utilizar el mdulo de PWM de un microcontrolador para controlar la o operacin de los motores de un robot. o

5.1

Duracin o

Dos semanas

5.2

Introduccin o

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

(5.1)

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

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

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

Para ser programado usando el compilador CCS se usa la funcin: a 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 PR2 y el nmero a u 28

10 es usado para generar peticiones de interrupcin. o El tiempo de la seal en alto, es calculado con la ecuacin 5.2 cuando sea n o empleado una resolucin de 8 bits. o

(5.2)

TON = (V ALOR)(

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

Para una resolucin de 10 bits se usar 4.8. o a

(5.3)

TON = (V ALOR)(

1 )(P REDIV ISOR) XT AL

5.3

Desarrollo

Para cada uno de los siguientes apartados, realizar los diseos electrnicos y progran o mas que se piden.

5.3.1

Actividad 1

Busque en la ayuda del compilador CCS C informacin sobre las siguientes funciones o 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 continuacin, controle o la velocidad de los motores del robot mvil que se ha construido en las prcticas o a anteriores. Conecte las l neas de la etapa de potncia que controlan los motores e izquierdo y derecho a los pines 1 y 2 del puerto C los cules generan las salidas a 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

Practica 6

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 mvil. o

6.1

Duracin o

Dos semanas

6.2
6.2.1

Introduccin o
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 estaltima modalidad, la u informacin que generan los encoders permitirn conocer la velocidad de rotacin o a o de los motores. Con el valor de los encoders y el radio de la llanta servirn para a 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 adecuacin o de los encoders al microcontrolador. 33

Figura 6.1: Captura de pulsos La funcin de conguracin empleada para la deteccin de ancos de subida o o o 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 deteccin del mismo tipo de pulsos en el motor derecho o 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 adquirida con: a CntLef t = get timer0(); y para el derecho: CntRight = get timer1();

6.2.2

Interrupcin (TIMER2) o

El per odo de interrupcin es controlado por el TIMER2, este ser usado para o a generar el tiempo de muestreo para la actualizacin de la lectura de los encoders; o adems de las conguraciones descritas en el PWM se utiliza un POSTESCALa ADOR, el cul indicar el perido de la peticin de interrupcin del TIMER2; la a o o o expresin quedar ahora como: o a

(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 comparacin exitosa; cuando se han cumplido la cantidad de comparaciones indio cadas en el POSTESCALADOR, entonces se genera una solicitud de interrupcin. o Para congurar el per odo de interrupcin se usa la funcin: o o SET U P T IM ER 2(T 2 DIV BY 1, 255, 10);

Con estos datos se especica que se usar un predivisor de uno, el valor de a 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 diseos electrnicos y progran o mas que se piden.

6.3.1

Actividad 1

1. Busque en la ayuda del compilador CCS C informacin sobre las siguientes o 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 los e 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

Practica 7

Controlador PID

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

7.1

Duracin o

Dos semanas

7.2

Desarrollo

Realizar la actividad indicada.

7.2.1

Actividad 1

1. 1. Tomando como base el siguiente programa, vari las constantes Kp, Ki y e Kd del controlador PID y modique el cdigo, si es necesario, para controlar las o 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 diseado para manejar motores hasta de 1 A. n 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 seales de nivel bajo. n 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 seales de control independientes n Dos puentes H independientes Dos seales de habilitador para cada puente H n Alimentacin independiente al motor (0 a 32 volts) o Alimentacin al circuito de 5 volts o La distribucin de pines se muestra en la gura 1 y la asignacin de ellos en o o la tabla 4. Terminal 16 8 3, 4, 12, 13 2, 7, 10, 15 3, 6, 11, 14 2, 9 Funcin o Alimentacin al circuito 5 volts o Alimentacin independiente al motor (0V a 32 V) o 0 Volts Control de direccin de los motores o 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 continuacin: o 1. Control directo usando tres seales de para cada motor (gura 2) n 2. Control directo usando dos seales para cada motor (gura 3) n 3. Control usando optoacopladores en cada seal (gura 4) n

50

Figura 2: Control con tres seales n

Figura 3: Control con dos seales n 51

Figura 4: Uso de optoacopladores Es recomendable contar con una fuente de alimentacin para el circuito cono trolador 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 con independencia total a en la alimentacin de ambos sistemas. o

52

Apendice B Compilador CCS


El compilador CCS permite programar los algoritmos empleando programacin en o lenguaje C, es posible la implantacin de estos usando el entorno de desarrollo o 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 fcil de usar, permite editar los programas, compilar y cuenta con una a terminal que es util en la comunicacin serie as o ncrona; una vz que se ha compilado e un programa y se desea trabajar con otro, es necesario cerrar este, para continuar trabajando con el nuevo; en caso contrario seguir compilado el cdigo original. a o Al ejecutar el PIC C Compiler, presenta su entorno, como se muestra en la gura 5.

Figura 5: Entorno PIC C Compiler

53

Una vz terminado el programa, se debe seleccionar la opcin Microchip 14 e o 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: Compilacin o En caso de no existir error en el programa, presenta los mensajes que se indican en la gura 7; generando el cdigo de mquina *.HEX y se proceder a programar o a el dispositivo mediante las opciones que se describen ms adelante. En caso de tener error en el programa, indicar el tipo de este y la l a nea donde se encuentra.

54

Figura 7: Ventana de estado

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

55

Figura 8: Entorno MPLAB

Figura 9: Conguracin Ccsc o

56

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

Figura 10: Seleccin Ccsc o Seleccionar la versin del microcontrolador (gura 11). o

Figura 11: Seleccin del dispositivo o

57

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

Figura 12: Creacin de un proyecto o Se debe abrir el entorno para escribir el programa fuente, seleccionar F ile y posteriormente N ew; se abrir la ventana de captura sin nombre, una vz terminado a e indicar el nombre y ubicacin donde se almacenar el programa, debe tener extencin o a a *.C (gura 13).

Figura 13: Creacin de un archivo nuevo o

58

El programa recin creado se deber agregar al proyecto, siguiendo el proe a cedimiento 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 conguracin del proyecto o

59

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

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

Figura 17: Compilar

60

En caso de no existir error, mostrar la pantalla de la gura 18. Se tendr a a entonces el cdigo de mquina requerido para programar al microcontrolador. o a

Figura 18: Resultado de la compilacin o

61

PICDOWNLOADER
Una vz generado el cdigo *.HEX, se programar en el PIC, este proceso se podr e o a a hacer utilizando un programador externo (hardware) o un pequeo cdigo que se n o programa previamente al microcontrolador llamado Bootloader y que permitir por a software la programacin del mismo. o Al jecutar el programa P ICDOW N LOADER, mostrar la gura 19; se dea ber seleccionar el programa deseado, congurar la velocidad a la cul transmitir a a a los datos, (informacin del bootloader dependiente de la versin del microcontrolador o y del valor del cristal usado), as mismo indicar el puerto serie (COM) donde se ha conectado.

Figura 19: Entorno PICDOWNLOADER Una vz seleccionado el programa, presionar W rite, el ambiente solicitar se e a presione el botn de reset del sistema; una vez hecho esto se inicia de programacin o o del microcontrolador; la barra de estado representa el avance del proceso. En el momento que se ha conclu la programacin, despliega el texto All do o OK; en caso contrario se deber revisar problemas en el sistema de desarrollo o en a la conguracin realizada. El programa recin cargado iniciar automticamente la o e a a ejecucin (gura 20). o 62

Figura 20: Proceso de programacin o

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 conexin (gura 22); posteriormente solicitar el nmero de COM donde se o a u este conectando.

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

65

Figura 23: Conguracin de la terminal o

66

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

Figura 24: Entorno de la hyperterminal

67

También podría gustarte