Está en la página 1de 84

Practicas de Laboratorio de la Materia Robots Mviles

Jess Savage Rubn Anaya Francisco Dorantes Alejandra Sanchez

Estas practicas fueron apoyadas por el proyecto PAPIME-DGAPA UNAM PE101107

Practica No. 1 Circuitos Secuenciales Objetivo: Conocer la estructura y caractersticas de la tarjeta de los dispositivos lgicos programables que se dispone en el laboratorio, tarjeta TerAsic, el software de operacin de esta, Quartus, y su programacin en lenguaje VHDL y grfico. Repasar el diseo de circuitos secuenciales bsicos y algoritmos de mquinas de estados. Duracin: Dos semanas Desarrollo: Realizar los siguientes apartados:

1.- Siga los pasos siguientes para configurar un contador de 4 bits usando el ambiente de desarrollo Quartus. En la computadora seleccionar el simbolo de Quartus y ejecutar el programa. Para crear un proyecto nuevo seleccione la pestaa FILE -> New Project Wizard En el recuadro What is the working directory for this project indique el directorio en donde quedara el proyecto, ejemplo c:\estudiante\materia\practicas\practica1. En el recuadro What is the name of the project escribir practica1, ver figura 1.

Figura 1. New Project Wizard

Despus seleccione next, as como para la siguiente ventana, ahora selecione el dispositivo que se ulilizara, ver figura 2: Device Family Family MAXII Devices all Target device X Specified device selected in 'Available list'

Seleccionar: EPM2210F324C3

Figura 2. Seleccin del dispositivo. Despus seleccionar next, lo mismo que para la siguiente ventana, por ltimo seleccionat finish

1.2 Introduccin de los componentes en un diagrama esquematico. Para crear el diagrama esquematico seleccionar en File -> new -> Block Diagram/ Schematic, como se muestra en la figura 3.

Figura 3. Creacin del diagrama esquematico Aqu aparecera una nueva ventana en donde se iran colocando los componentes del sistema. Para ingresar un nuevo elemento en esa ventana posicionarse primero en Block1.bdf y con el botn derecho del mouse seleccionar: insert -> symbol, expandir h:/quartus/libraries y despues seleccionar others -> maxplus2, ahi escoger el contador 74193, dar ok, ver figura 4.

Figura 4. Seleccin de componentes

Coloque el dispositivo en el diagrama esquematico. Almacene lo que se ha hecho seleccionando el icono de disco y dar guardar. Inserte ahora un pin de entrada, en la ventana practica1.bdf oprima el botn derecho, seleccione insert -> symbol -> primitives -> pin -> input, ver figura 6.

Figura 6. Seleccin de un pin de entrada. Coloquelo en el esquematico y conectelo a la entrada UP del contador, seleccionando con el botn del mouse izquierdo el final del conector y llevando una lnea hasta esa entrada. Seleccione de nuevo el conector de entrada con el mouse usando el botn izquierdo, despues oprimiendo el botn derecho selecione properties y cambie el PIN name a clk. Repita el procedimiento para colocar otro pin de entrada conectandolo al CLR del contador y con el nombre reset. Coloque pines de salida en QA, QB, QC y QD del contador, nombrandolos A,B,C y D respectivamente, ver figura 7. Guarde su diseo

Figura 7. Contador Para compilar el diseo hecho hasta ahora, seleccione en la pestaa de Processing -> Start

Compilation. Si todo esta bien no debi haber marcado ningun error, en caso contrario, trate de resolver el problema o consulte al instructor. 1.3 Simulacin Para ver si el diseo es correcto, antes de grabarlo en el tarjeta que lo contendra, se utiliza el simulador. Para invocar el simulador seleccione en File -> New -> Vector Waveform File. Aqu aparecera una nueva ventana, colocar el mouse en el lado izquierdo (abajo de Name) y usando el botn derecho seleccionar Insert -> Insert Node or Bus. Despus seleccionar Node Finder y en su ventana seleccionar List escogiendose las variables que se desean ver simuladas. En este caso escojanse todas las variables, ver figura 7.

Figura 7. Seleccin de variables de simulacin En la ventana de las formas de onda de simulacin, seleccione la variable clk con el botn izquierdo y despus con el botn derecho del mouse, value -> clock, seleccionar OK. Guarde el archivo de simulacin seleccionando el icono de guardar archivos. Despues active la simulacin con Processing -> Start Simulation. Mas adelante aparecera una ventana, figura 8., la cual tiene el resultado de la simulacin, vea que los resultados concuerdan con un contador de 4 bits. Modifique los valores del reloj, clk, y de la variable reset. Comente sus resultados.

Figura 8. Simulacin

1.4 Divisor del reloj Para poder ver funcionando este diseo en la tarjeta en donde se programar, es necesario hacer un divisor del reloj. El siguiente cdigo en VHDL hace esta funcin:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity divider is Port ( reloj : in std_logic; div_clk : out std_logic); end divider; architecture Behavioral of divider is begin process (reloj) variable cuenta: std_logic_vector (27 downto 0):=X"0000000"; begin if rising_edge (reloj) then if cuenta=X"4000000" then cuenta:=X"0000000"; else cuenta:= cuenta+1; end if; end if; div_clk <= cuenta (25); end process; end Behavioral;

Introduzca este cdigo seleccionando File -> New -> VHDL. Guarde su diseo como divider.vhd. Una vez introducido compruebe que este cdigo no tiene errores de sintaxis con Processing ->Analize Current File. Para crear un simbolo de este divisor haga lo siguiente, seleccione de nuevo la ventana de divider.vhd y despues seleccione la pestaa File -> Create/ Update -> Create Symbol files for current file

Figura 9. Creacin del simbolo del divisor Para insertar este nuevo simbolo en el esquematico seleccione la ventana practica1.bdf, despus con el botn derecho del mouse Insert -> Symbol -> Project -> divider, ver figura 10.

Figura 10. Insertando el simbolo de divider.

Coloque el simbolo y conecte su entrada a la linea clk y su salida al reloj UP del contador, como se observa en la figura 11.

Figura 11. En la tarjeta en donde se programara este diseo las salidas del contador, ABCD, se observaran usando LEDS, pero estas necesitan ser negadas para ver encendidos los LEDS cuando sus valores sean 1. Lo mismo sucede con la linea de entrada reset. Inserte NOTs en esos pines, como se muestra en la figura 12 y vuelva a compilar su diseo.

Figura 12. Colocacin de NOTS a la entrada y salidas

1.4 Programacin fsica del diseo Primero se tienen que asignar los pines de entrada, salidas y del reloj, para hacer esto seleccionar la pestaa Assigments -> Pin Planner En la ventana en donde aparecen los nombres de las variables seleccionar en Node Name clk y en la columna location teclear j6, el cual conecta el reloj al dispositivo. Seleccionar ahora A asignandole el pin U13, repetir para B con V13, C con U12, D con V12 y reset con U15.

Figura 13. Asignacin de pines Cerrar esta ventana y despus seleccionar la ventana practica1.bdf en donde apareceran estas asignaciones que se acaban de hacer. Compilar de nuevo. Finalmente para programar el dispositivo conecte la tarjeta TerAsic a uno de los puertos USB de la computadora. Seleccionar ahora la pestaa Tool-> Programmer, despues en Hardware Setup seleccionar USB-Blaster, active el cuadro Program/Configure y despues seleccione Start. Una vez programado se debera ver en los LEDs la cuenta del contador, oprima el botn 1 de la tarjeta y deber observar como la cuenta regresa a cero.

Practica No. 2 Introduccin a las Mquinas de Estados Objetivo: Familiarizar al alumno en el conocimiento de los algoritmos de las mquinas de estados. Desarrollo: Para cada uno de los siguientes apartados, realizar los diseos electrnicos que se piden. Duracin: Dos semanas 1. En la figura 1 se muestra el comportamiento de un robot que evade obstculos.

Figura 1. Robot Mvil que evade obstculos

En la figura 2 se muestra el algoritmo o carta ASM de este robot, en este cuando los sensores de tacto Si y Sd sensan un obstculo sus valores son igual a uno, en caso contrario son cero.

Figura 2. Algoritmo de un robot mvil que evade obstculos

A continuacin se presenta este algoritmo usando el lenguaje de programacin VHDL:

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity carta_asm_2 is Port ( RELOJ : in STD_LOGIC; RESET : in STD_LOGIC; S : in std_logic_vector (1 downto 0); --DONDE EL BIT MAS SIGNIFICATIVO ES SI Y EL MENOS EL SD atras : out STD_LOGIC; adelante : out STD_LOGIC; giro_der : out STD_LOGIC; giro_izq : out STD_LOGIC; out_epresente :out std_logic_vector (3 downto 0)); end carta_asm_2; architecture Behavioral of carta_asm_2 is signal esiguiente : std_logic_vector (3 downto 0) := B"0000"; constant s0 : constant s1 : constant s2 : std_logic_vector(3 downto 0) := X"0"; std_logic_vector(3 downto 0) := X"1"; std_logic_vector(3 downto 0) := X"2";

constant s3 : constant s4 : constant s5 : constant s6 : constant s7 : constant s8 : constant s9 : constant s10 : constant s11 : begin

std_logic_vector(3 downto 0) := X"3"; std_logic_vector(3 downto 0) := X"4"; std_logic_vector(3 downto 0) := X"5"; std_logic_vector(3 downto 0) := X"6"; std_logic_vector(3 downto 0) := X"7"; std_logic_vector(3 downto 0) := X"8"; std_logic_vector(3 downto 0) := X"9"; std_logic_vector(3 downto 0) := X"A"; std_logic_vector(3 downto 0) := X"B";

process (RELOJ,reset,esiguiente, S) begin if reset='0' then esiguiente <=s0; elsif rising_edge (RELOJ) then case esiguiente is when s0 => atras <= '0'; giro_izq <= '0'; giro_der <= '0'; if S =X"0" then

adelante <= '1'; esiguiente<= s0; elsif S =X"1" then

esiguiente<= s1; adelante <= '0'; elsif S =X"2" then

esiguiente<= s3;

adelante <= '0'; elsif S =X"3" then

esiguiente<= s5; adelante <= '0'; end if; when s1 => adelante <= '0'; atras <= '1'; giro_izq <= '0'; giro_der <= '0'; esiguiente<= s2; when s2 => adelante <= '0'; atras <= '0'; giro_izq <= '1'; giro_der <= '0'; esiguiente<= s0; when s3 => adelante <= '0'; atras <= '1'; giro_izq <= '0'; giro_der <= '0'; esiguiente<= s4; when s4 => adelante <= '0'; atras <= '0'; giro_izq <= '0'; giro_der <= '1'; esiguiente<= s0; when s5 =>

adelante <= '0'; atras <= '1'; giro_izq <= '0'; giro_der <= '0'; esiguiente<= s6; when s6 => adelante <= '0'; atras <= '0'; giro_izq <= '1'; giro_der <= '0'; esiguiente<= s7; when s7 => adelante <= '0'; atras <= '0'; giro_izq <= '1'; giro_der <= '0'; esiguiente<= s8; when s8 => adelante <= '1'; atras <= '0'; giro_izq <= '0'; giro_der <= '0'; esiguiente<= s9; when s9 => adelante <= '1'; atras <= '0'; giro_izq <= '0'; giro_der <= '0'; esiguiente<= s10; when s10 => adelante <= '0';

atras <= '0'; giro_izq <= '0'; giro_der <= '1'; esiguiente<= s11; when s11 => adelante <= '0'; atras <= '0'; giro_izq <= '0'; giro_der <= '1'; esiguiente<= s0; when others => null; end case; out_epresente <= esiguiente; end if; end process; end Behavioral;

Haga un proyecto nuevo en el sistema de desarrollo Quartus en el cual se compile el cdigo anterior. En Quartus haga un smbolo de esta mquina de estados. Programe la tarjeta para que muestre, usando cuatro leds, el estado presente, as mismo muestre tambin las salidas: adelante, atras, giro_izq y giro_der. Las entradas SI, SD y reset introduzcalas usando los botones de la tarjeta. Conecte al reloj maestro al divisor que diseo en la practica anterior para poder visualizar mejor la operacin de la mquina de estados, como se muestra en la figura 3.

Figura 3. Diagrama de bloques de la mquina de estados Usando la misma tarjeta de desarrollo que en la practica 1 asigne los pines U13 a la variable adelante; V13 a atras; U12 a giro_der; V12 a giro_izq; RESET a V15; reloj a J6; S[0] a V14; S[1] a U14; out_state[3] a U4; out_state[2] a V4; out_state[1] a U5 y out_state[0] a V5. El siguiente cdigo en VHDL es el de una mquina de estados, que a partir de una seal de reloj externa de alta frecuencia y la de un botn de entrada sirve para sensar cuando este es oprimido y liberado, enviando una seal que permite ver el desempeo de otra mquina de estados conectado a el paso a paso.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity sensa_boton is Port ( boton : in STD_LOGIC; clk : in STD_LOGIC; reloj : out STD_LOGIC; epresente: buffer STD_LOGIC); end sensa_boton; architecture Behavioral of sensa_boton is

signal esiguiente: STD_LOGIC; begin process (esiguiente,boton) begin if rising_edge (clk) then case esiguiente is when '0' => reloj <= '0'; if boton ='0' then esiguiente <= '0'; else esiguiente <= '1'; end if; when '1' => if boton ='1' then esiguiente <= '1'; reloj <= '0'; else esiguiente <= '0'; reloj <= '1'; end if; when others => null; end case; end if; epresente <= esiguiente; end process; end Behavioral;

Compile este cdigo e incluyalo en el diseo como se muestra en la figura 4, asignando boton al pin U15.

Figura 4. Incorporacin del mdulo que sensa cuando un botn es oprimido

Practica No. 3 Construccin de Mquinas de Estados Usando Direccionamiento de Memorias Objetivo: Familiarizar al alumno en el conocimiento construccin de mquinas de estados usando direccionamiento de memorias. Desarrollo: Para cada uno de los siguientes apartados, realizar los diseos electrnicos que se piden. Duracin: Dos semanas

1.- 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 memoria que indica el estado siguiente es llamada la liga, mientras que la porcin que indica las salidas es llamada la parte de las salidas, como se muestra en la figura 1.

Figura 1. Direccionamiento 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 guarda en un registro que est conectado a las lneas de direccin de la memoria, como se muestra en la figura 1. La seal de reloj conectada a los registros es la que indica la velocidad de la mquina de estados. Usando un direccionamiento por trayectoria, construya una mquina de estados que ejecute el algoritmo de un robot mvil que evada obstculos, como el que se vio en la practica

anterior. En el apndice A se muestra el la versin en VHDL del contenido de la memoria del algoritmo de la mquina de estados de un robot que evade obstculos. En el apndice B se muestran los cdigos de los registros de 6 bits, un conector de 4x2 a 6 bits y un conector de 8a4x4 bits. Haga un proyecto nuevo en el sistema de desarrollo Quartus en el cual se haga el diseo mostrado en la figura 2 del direccionamiento por trayectoria. Programe la tarjeta para que muestre, usando cuatro leds, el estado presente, as mismo muestre tambin las salidas: adelante, atrs, giro_izq y giro_der. Las entradas SI, SD y reset introduzcalas usando los botones de la tarjeta como se hizo en la practica anterior.

Fig 2. Direccionamiento por Trayectoria

APENDICE A Instrumentacin de la memoria usando VHDL


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity memoria is Port ( direccion : in STD_LOGIC_VECTOR (5 downto 0); output : out STD_LOGIC_VECTOR (7 downto 0)); end memoria;

architecture Behavioral of memoria is begin process(direccion) begin -- La direccin se forma con la concatenacin de la Liga y las entradas Si y Sd. -- El contenido de la memoria esta formado por los 4 bits mas significativos que son la LIGA y los 4 menos las salidas: adelante, atras, giro_der y giro_izq. --- Localidades de memoria que representan el estado 0 if(direccion="000000") then output <= "00001000"; elsif(direccion="000001") then output <= "00010000"; elsif(direccion="000010") then output <= "00110000"; elsif(direccion="000011") then output <= "01010000"; --- Localidades de memoria que representan el estado 1

elsif(direccion="000100") then output <= "00100100"; elsif(direccion="000101") then output <= "00100100"; elsif(direccion="000110") then output <= "00100100"; elsif(direccion="000111") then output <= "00100100"; --- Localidades de memoria que representan el estado 2 elsif(direccion="001000") then output <= "00000001"; elsif(direccion="001001") then output <= "00000001"; elsif(direccion="001010") then output <= "00000001"; elsif(direccion="001011") then output <= "00000001"; --- Localidades de memoria que representan el estado 3 elsif(direccion="001100") then output <= "01000100"; elsif(direccion="001101") then output <= "01000100"; elsif(direccion="001110") then output <= "01000100"; elsif(direccion="001111") then output <= "01000100"; --- Localidades de memoria que representan el estado 4 elsif(direccion="010000") then output <= "00000010"; elsif(direccion="010001") then output <= "00000010"; elsif(direccion="010010") then output <= "00000010"; elsif(direccion="010011") then output <= "00000010"; --- Localidades de memoria que representan el estado 5 elsif(direccion="010100") then output <= "01100100"; elsif(direccion="010101") then output <= "01100100"; elsif(direccion="010110") then output <= "01100100"; elsif(direccion="010111") then output <= "01100100"; --- Localidades de memoria que representan el estado 6 elsif(direccion="011000") then output <= "01110001";

elsif(direccion="011001") then output <= "01110001"; elsif(direccion="011010") then output <= "01110001"; elsif(direccion="011011") then output <= "01110001"; --- Localidades de memoria que representan el estado 7 elsif(direccion="011100") then output <= "10000001"; elsif(direccion="011101") then output <= "10000001"; elsif(direccion="011110") then output <= "10000001"; elsif(direccion="011111") then output <= "10000001"; --- Localidades de memoria que representan el estado 8 elsif(direccion="100000") then output <= "10011000"; elsif(direccion="100001") then output <= "10011000"; elsif(direccion="100010") then output <= "10011000"; elsif(direccion="100011") then output <= "10011000"; --- Localidades de memoria que representan el estado 9 elsif(direccion="100100") then output <= "10101000"; elsif(direccion="100101") then output <= "10101000"; elsif(direccion="100110") then output <= "10101000"; elsif(direccion="100111") then output <= "10101000"; --- Localidades de memoria que representan el estado 10 elsif(direccion="101000") then output <= "10110010"; elsif(direccion="101001") then output <= "10110010"; elsif(direccion="101010") then output <= "10110010"; elsif(direccion="101011") then output <= "10110010"; --- Localidades de memoria que representan el estado 11 elsif(direccion="101100") then output <= "00000010"; elsif(direccion="101101") then output <= "00000010";

elsif(direccion="101110") then output <= "00000010"; elsif(direccion="101111") then output <= "00000010";

end if; end process; end Behavioral;

APENDICE B Registro de 6 bits en VHDL


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity register6 is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; D : in std_logic_vector (5 downto 0); Q : out std_logic_vector (5 downto 0)); end register6;

architecture Behavioral of register6 is constant s0 : begin process (clk,reset) begin if reset='0' then Q <=s0; elsif rising_edge (clk) then Q <= D; end if; end process; end Behavioral; std_logic_vector(5 downto 0) := B"000000";

Conector de 4x2 a 6 bits en VHDL


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity conector4x2a6 is Port ( liga : in STD_LOGIC_VECTOR (3 downto 0); s : in STD_LOGIC_VECTOR (1 downto 0); output : out STD_LOGIC_VECTOR (5 downto 0)); end conector4x2a6; architecture Behavioral of conector4x2a6 is begin process(liga,s) begin output <= liga&s; end process; end Behavioral;

Conector de 8 a 4x4 bits en VHDL


library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity conector8a4x4 is Port ( valor8 : in STD_LOGIC_VECTOR (7 downto 0); liga : out STD_LOGIC_VECTOR (3 downto 0); salidas : out STD_LOGIC_VECTOR (3 downto 0)); end conector8a4x4; architecture Behavioral of conector8a4x4 is begin process(valor8) begin liga <= valor8(7 downto 4); salidas <= valor8(3 downto 0); end process; end Behavioral;

Practica No. 4 Diseo de una etapa de potencia conectada a un sistema digital Objetivo: Configurar la etapa de potencia que controlara dos motores de corriente directa. Conexin de la tarjeta de los dispositivos lgicos programables con esta etapa de potencia. Desarrollo: Para cada uno de los siguientes apartados, realizar los diseos electrnicos que se piden. Duracin: Dos semanas 1.- Leer las notas anexas, que describen el circuito integrado L293D para la etapa de potencia, el cual entrega una corriente de hasta 600 mA. En el circuito D-1 se observa el diagrama elctrico de la etapa de potencia para dos motores de cd. Construya este diagrama elctrico en un protoboard. 2.- Haga un proyecto nuevo en el sistema de desarrollo Quartus con el diseo mostrado en la figura 1.

Figura 1. Sistema que prende, apaga y determina la direccin de giro de un motor de DC.

Conecte las salidas de ste diseo, en1, dir1 y dir2, utilizando un conector proporcionado por el instructor y usando los pines indicados en la figura 1 a un protoboard, colocando leds para ver su funcionamiento. Las entradas estn conectadas a los botones de la tarjeta de Altera. Conecte despus las salidas a la etapa de potencia. Pruebe que el motor conectado a sta funcione apropiadamente. Note que la not de la etapa de potencia ya esta incluida en este diseo. En el apendice B se muestran los pines de la tarjeta de Altera, especficamente el rea PROTO_A, en donde se conectara la etapa de potencia. La fuente de alimentacin Vss del L293D proviene del PIN con 3.3 volts de esta rea, recuerde conectar tambin la tierra de su protoboard a la tierra de la tarjeta.

3.- Conecte la etapa de potencia con las salidas de la mquina de estados de la practica 2 como se muestra en la figura 2 y pruebe el algoritmo que evade los obstculos. En la figura 2 se muestra que las salidas de la mquina de estado, atrs, adelante, giro_der y giro_iz, se conectan a un mdulo el cual genera las lineas que controlan la etapa de potencia, disee este mdulo.

Figura 2. Mquina de estados para evadir obstculos para ser conectado a la etapa de potencia. Despus cambie los pines de entrada de S[0..1], PIN_U15 y PINV15, por los pines PIN_A8 y PIN_A9 y conectelos a dos interruptores de contacto, con los cuales se detectaran los obstculos que un robot mvil deber evitar.

Coloque la etapa de potencia, la tarjeta de Altera y los motores en la base que contendr el mini-robot mvil. Pruebe que el robot funciona apropiadamente evitando obstculos.

APENDICE A LM18293/L293B/L293D MANEJADOR DE POTENCIA

Descripcin general
El LM18293 es un circuito integrado diseado para manejar motores hasta de 1 A. Entre las aplicaciones tpicas, 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 buffer para seales de nivel bajo. En el circuito de aplicacin, se presenta el patigrama de este dispositivo, el cul contiene cuatro entradas para ingresar seales de control a los motores, acepta niveles estndares de lgica TTL y DTL, para realizar su interfaz; dos seales de habilitacin para controlar la velocidad, que tambin acepta la misma lgica. Cada habilitador controla dos canales; cuando el pin de habilitacin est desactivado (cero lgico), las salidas correspondientes se encuentran con lgica de tres estados; si el pin no est conectado(flotando), el circuito funcionar como si estuviera habilitado. Se cuenta con dos pines para suministrar el voltaje; el pin 8 entrega la potencia del motor y el pin 16 proporciona un voltaje independiente al anterior, el cul polariza los circuitos internos. El chip est incluido en un diseo DIP de 16 pines, el dispositivo es capaz de operar con voltajes mximos de 36 volts en el Vmotor. La figura muestra la forma de conectar los motores y controlar al mismo tiempo el sentido de giro, ya sea horario o anti-horario.

Caractersticas
Salida por canal de 1 amper Reemplazo directo por el circuito integrado L293B y L293D Empaquetado DIP de 16 pines Proteccin trmica contra sobrecargas Cero lgico hasta 1.5 volts Alta inmunidad al ruido

Mximos rangos de voltaje


Voltaje para las cargas Voltaje de entrada (Vs) (Vi) 36 volts 7 volts

Voltaje de la fuente lgica Habilitacin de voltaje Corriente de salida

(Vss) 36 volts (Ve) 7 volts 2 amperes

Caractersticas elctricas Vs=24 V, Vss = 5V, T=25oC , L = 0.4 V, H = 3.5 V.

1 2 3 4 5 6 7 8

ENABLE INPUT1 OUTPUT1 GND GND

Vss INPUT4 OUTPUT4

16 15 14 13 12 11 10 9

L M 1 8 2 9 3G N D L 2 9 3 B / DG N D
OUTPUT3 INPUT3 ENABLE2

OUTPUT2 INPUT2 VMOTOR

Figura No. 1 Asignacin de pines

Control de motores corriente directa

de

Para controlar motores se utiliza el circuito integrado L293, que como se describi anteriormente, tiene la capacidad de controlar dos motores de corriente directa en ambos sentidos y al mismo tiempo. Como se muestra en al figura D-1, se requieren de cuando menos dos seales de control, las cuales sern otorgadas por el microcontrolador. Para controlar un motor se requiere: Una seal que habilite la seal ENABLE1 y que servir para controlar la velocidad del motor; Otra seal que entregar la seal de direccin del motor INPUT1/INPUT2 (derecha o izquierda), estas seales deben ser contrarias de ah la presencia del inversor.

Vss = 5 V Vel. 1 Dir. 1/2 ENABLE INPUT1 OUTPUT1 M1 GND GND OUTPUT2
1 2 74 0 4

Vss INPUT4 OUTPUT4 Dir. 1/2

LM18293 L293B/D

GND GND OUTPUT3 INPUT3 ENABLE2


4 74 0 4

M2

INPUT2 VMOTOR

Vmotor (0.2 - 32 V)

Vel. 2

Circuito D-1

Para el control del otro motor, se necesita la misma cantidad de seales con un funcionamiento equivalente. APENDICE B Configuracin de PINES de la Tarjeta de Altera

Practica No. 5 Sistema mnimo del microcontrolador PIC18F4550 Objetivo: Conocer la estructura y caractersticas de la tarjeta con un microcontrolador PIC que se dispone en el laboratorio, el software de comunicacin con esta y la ejecucin de un programa en lenguaje C. Duracin: Dos semanas Desarrollo: Realizar los siguientes apartados. 1.- Leer las notas anexas, que describen el uso ambiente de desarrollo integrado IDE MPLAB. 2.- .- En el ambiente MPLAB, crear un proyecto nuevo, escribir el siguiente programa en C y compilarlo.
#include <18F4550.h> #fuses HS,NOWDT,NOPROTECT,NOUSBDIV,CPUDIV1,VREGEN #use delay(clock=48000000) ////////////////////bootloader code////////////////////// #build(reset=0x800) #build(interrupt=0x808) #org 0x0000, 0x07ff void bootloader() {} //////////////////////////////////////////////////////////// void programa_puertos() { set_tris_d(0xf0); } void main() { programa_puertos(); while(true) { output_high(pin_d0); output_low(pin_d1); output_high(pin_d2); output_low(pin_d3); delay_ms(500); output_low(pin_d0); output_high(pin_d1); output_low(pin_d2); output_high(pin_d3); delay_ms(500); } }

3.- Cargue este programa en la tarjeta de desarrollo del PIC usando el PICDEM(TM) FS USBDEMOTOOL, como se indica en el anexo.

4.- En el ambiente MPLAB, crear un proyecto nuevo, escribir el siguiente programa en C, compilarlo y cargarlo en la tarjeta de desarrollo.
#include <18F4550.h> #fuses HS,NOWDT,NOPROTECT,NOUSBDIV,CPUDIV1,VREGEN #use delay(clock=48000000)

////////////////////bootloader code////////////////////// #build(reset=0x800) #build(interrupt=0x808) #org 0x0000, 0x07ff void bootloader() {} ////////////////////////////////////////////////////////////

void programa_puertos() {

set_tris_d(0x00);

void main() { int i;

programa_puertos();

while(true) {

delay_ms(1000);

for(i=0;i<255;i++) { output_d(i); delay_ms(250);

} }

5.- Usando un programa de emulacin de una terminal vea el texto que enva el siguiente programa por el puerto serie e introduzca los datos que se piden.
#include <18F4550.h> #device ADC=8 #fuses HS,NOWDT,NOPROTECT,NOUSBDIV,CPUDIV1,VREGEN #use delay(clock=48000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)

#include<stdlib.h>

///reserva de memoria para el bootloader usb (PICDEM(TM) FS USBDEMOTOOL)/// #build(reset=0x800) #build(interrupt=0x808)

#org 0x0000, 0x07ff void bootloader() {}

void main(){

int i,j; char buffer[20]; float x;

i=0;

while(1){ printf("\n\r Escribe un numero entero -> "); gets(buffer); j=atoi(buffer);

printf("\n\r Escribe un numero real -> "); gets(buffer); x=atof(buffer);

printf("\n\r Escribe una cadena de caracteres -> "); gets(buffer); printf("\n %d %d %f %s \n\r", i,j,x,buffer);

i++;

6.- Escriba un programa en C que instrumente un contador; en el cul se ingrese el valor inicial, final y el incremento deseado; este ltimo puede ser positivo o negativo. Mostrar los valores del contador en una terminal y en los leds de la tarjeta de desarrollo.

ANEXO MPLAB Uso del MPLAB para compilar programas escritos en C Para compilar programas escritos en C, se necesita crear un proyecto nuevo, agregar el programa fuente a este y compilarlo, as se generar un archivo *.HEX el cual se cargara a la tarjeta que contiene el microcontrolador PIC. El entorno de trabajo MPLAB se muestra en la figura 1. El primer paso es configurar la herramienta empleada para compilar los programas; seleccionar Project y despus select languaje toolsuite; deber seleccionar CCS C Compiler PIC12/14/16/18 (figura 2).

Figura 1: Entorno MPLAB

Figura 2: Configuracin compilador C Comprobar la ubicacin del compilador; nuevamente seleccionar project, set languaje Tool locations, ubicar el compilador Ccsc:exe; tal como se indica en la figura 3.

Figura 3. Seleccionar la versin del microcontrolador (figura 4), hay que seleccionar la barra de herramientas configure-select device.

Figura 4. Seleccin del dispositivo Para crear un proyecto nuevo, en el men Project seleccionar new; indicar el nombre y la ubicacin del proyecto (figura 5).

Figura 5. Creacin de un proyecto

Se debe abrir el entorno para escribir el programa fuente, seleccionar File y posteriormente New; se abrir la ventana de captura sin nombre, una vez terminado indicar el nombre y ubicacin donde se almacenar el programa, debe tener extencin *.C (figura 6).

Figura 6. El programa recin creado se deber agregar al proyecto, siguiendo el procedimiento de la figura 7.

Figura 7. Agregar archivo al proyecto Es necesario configurar el proyecto; por lo que se debe posicionar en el archivo agregado, presionar el botn izquierdo del mouse y seleccionar Build Option (figura 8).

Figura 8: Opciones de configuracin del proyecto Deshabilitar la opcin Symbol File en Others Files y habilitar None en debug (Figura 9).

Figura 9. Configuracin del proyecto Una vez realizado todo el procedimiento anterior, se iniciar la compilacin; accediendo a Project del men principal y seleccionar build all; o en su caso usar el icono de compilacin (figura 10).

Figura 10. Compilar En caso de no existir error, mostrar la pantalla de la figura 11. Se tendr entonces el cdigo de mquina requerido para programar al microcontrolador.

Figura 11. Resultado de la compilacin

ANEXO PICDEM(TM) FS USBDEMOTOOL Una vez generado el cdigo *.HEX, se programar en el PIC, este proceso se podr hacer utilizando un programador externo (hardware) o un pequeo cdigo que se programa previamente al microcontrolador llamado Bootloader y que permitir por software la programacin del mismo. Para ver la instalacin de la herramienta PICDEM(TM) FS USBDEMOTOOL, ver el manual de la tarjeta kitpic4550. Para programar el PIC conectar la tarjeta del microcontrolador al USB de la computadora, en la tarjeta debern estar flasheando los leds (d0 y d1), que indican que est en modo bootloader. Para poner la tarjeta en modo bootloader oprimir el boton B4 y el reset al mismo tiempo (ver manual kitpic4550). Al ejecutar el programa PICDEM(TM) FS USBDEMOTOOL, mostrar la figura 1; se deber seleccionar el PICDEM FS USB 0( BOOT), el programa deseado en Load hex file, y parecer una ventana de advertencia a la cual se seleccionara cancelar.

Figura 1.- Entorno PICDEM(TM) FS USBDEMOTOOL Despus seleccionar Program Device, una vez hecho esto se inicia de programacin del microcontrolador. En el momento que se ha concluido la programacin. En caso contrario se deber revisar problemas en el sistema de desarrollo o en la configuracin realizada. Para ejecutar el programa recin cargado se tendr que dar click en execute o dar un reset el tarjeta del pic.

Figura 2: Proceso de programacin

ANEXO HYPERTERMINAL Para establecer esta terminal debe de acceder a Programas, accesorios y comunicaciones para ubicar a la terminal; la primer pantalla que presenta, es para ingresar el nombre de la conexin (figura 1); posteriormente solicitar el nmero de COM donde se est conectando.

Figura 1. Terminal para comunicacin serie Configurar la terminal; esto incluye la velocidad de transmisin, el protocolo y el tipo de control de los datos; la figura 2 muestra la configuracin tpica.

Figura 2.- Configuracin de la terminal Una vez que se ha tecleado aplicar y posteriormente aceptar, se tendr abierta la terminal

para la comunicacin serie asncrona entre una computadora personal y el microcontrolador. Tal vez requiera presionar el botn de reset a procesador para reiniciar el programa.

Practica No. 6 Uso de los puertos paralelos del microcontrolador PIC18F4550 Objetivo: Emplear los puertos paralelos que tiene el microcontrolador PIC para obtener datos de dispositivos externos y controlar la operacin de dos motores de corriente directa. Duracin: Dos semanas Desarrollo: Realizar los siguientes apartados. 1.- Leer la nota anexa, que describe los puertos paralelos del PIC18F4550 2.- .- En el ambiente MPLAB, crear un proyecto nuevo, escribir el siguiente programa en C y compilarlo. Este programa enva datos a los puertos A, D y serial dependiendo del valor de los bits B5 y B4 del puerto B, conectados a los botones con esos mismos nombres de la tarjeta de desarrollo. Usando leds conecte estos al puerto A en los pines del A1 a A4, denominados en el conector como AN1, AN2, AN3 y A4. Vea la salida del puerto serial RS232 usando una hiperterminal. Explique el funcionamiento de este programa.
#include <18F4550.h> #fuses HS,NOWDT,NOPROTECT,NOUSBDIV,CPUDIV1,VREGEN #use delay(clock=48000000) #use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) ////////////////////bootloader code////////////////////// #build(reset=0x800) #build(interrupt=0x808) #org 0x0000, 0x07ff void bootloader() {} /////////////////////////////////////////////////////////// void programa_puertos() { set_tris_d(0x00); set_tris_b(0xff); set_tris_a(0x00); } void main() { int i; int j; int var1; int init_value,final_value; programa_puertos(); init_value=0x0; final_value=0xf; while(true) { for(i=init_value;i<=final_value;i++) { output_d(i);

j=i+1; output_a(j); printf("%x %x ",i,j); delay_ms(550); var1=input_b(); printf("b: %x\n\r",var1); } var1=input_b(); printf("b: %x\n\r",var1); if(var1 == 0xEF){ init_value=0x40; final_value=0x5f; } else if(var1 == 0xDF){ init_value=0x60; final_value=0x7f; } else if(var1 == 0xFF){ init_value=0x0; final_value=0xf; } } }

3.- De acuerdo a la asignacin reservada para las seales de control de la etapa de potencia de los motores; realizar un programa que permita controlar el funcionamiento y sentido de giro de estos por separado. La seal que indica el sentido de giro de los motores se realiza por medio del puerto B, b5 y b4 y las seales de control al driver por el puerto A; la siguiente tabla presenta los requerimientos.

Entrada puerto b5 b4 0 0 0 1 1 0 1 1

Motor izquierdo Adelante Atrs Adelante Atrs

Motor derecho Adelante Atrs Atrs Adelante

Operacin del robot Adelante Atrs Gira a la derecha Gira a la izquierda

ANEXO PUERTOS El microcontrolador PIC18f4550 tiene 5 puertos paralelos, la siguiente tabla ndica la disposicin de ellos.

Puerto A B C D E

Tamao en bits 7 8 7 8 4

Funcin BIDIRECCIONAL BIDIRECCIONAL BIDIRECCIONAL BIDIRECCIONAL BIDIRECCIONAL

CONECTOR PLANO
1 Vdd (ver nota *) 2 Gnd 3 B7 4 B6 5 B5 6 B4 7 B3 8 B2 9 B1 10 B0 11 AN6 12 AN1 13 AN2 14 AN3 15 AN5 16 E0 17 E1 18 E2 19 VDD 20 GND 21 C0

22 A4 23 C2 24 C1 25 VDD 26 GND

Nota: En el cable plano que se usara en esta practica esta lnea no esta conectada.

Practica No. 7 Operacin de un robot mvil usando un microcontrolador PIC Objetivo: Controlar la operacin del robot mvil construido en las practicas anteriores usando mquinas de estados. Desarrollo: Para cada uno de los siguientes apartados, realizar los diseos electrnicos y programas que se piden. Duracin: Tres semanas. 1. Configurando el puerto B del PIC como entrada, conecte dos sensores de contacto a dos pines de est. Muestre el valor ledo de los sensores en una hyperterminal. 2. Escriba una funcin en C que controle los movimientos de un robot mvil, en est se indicar el ngulo, en radianes, que el robot primero girar y la distancia que despus avanzara, utilice pines del puerto A del PIC para hacer estas operaciones. La funcin deber tener el siguiente formato:
move_robot(float distancia, float angulo) { }

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

return(x); }

3. Cargue el programa en C que se encuentra en el apndice, que ejecuta el algoritmo de un robot mvil que evade obstculos, como el que se muestra en la figura 1, en su robot. En la figura 2 se muestra el algoritmo de un robot mvil que evade obstculos, cuando los sensores de tacto Si y Sd sensan un obstculo sus valores son igual a cero, en caso contrario es uno.

Figura 1. Robot Mvil que evade obstculos

Figura 3. Algoritmo de un robot mvil que evade obstculos

Apndice

Programa en C para un robot mvil que evade obstculos.


// Headers, etc ...

// Definicion de constantes #define ADELANTE move_robot(AVANCE, 0.0f); #define ATRAS move_robot(-AVANCE, 0.0f) #define GIRO_IZQ move_robot(0.0f, 0.7854f) #define GIRO_DER move_robot(0.0f, -0.7854f) #define SENSOR_IZQ 1 #define SENSOR_DER 2 #define SECURE 5.0f

// Incializa puertos, etc inicializa() {

move_robot(float distancia, float angulo) {

float show_sensor(char *sensor, int num_sensor) { float x;

return(x); }

// Esta funcion lee el sensor indicado int lee_sensor(int num_sensor){ float sensor; int valor_sensor; char buffer[20]; char nombre_sensor[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); }

// Funcion que evade obstaculos 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; 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; 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(){ // Inicializa puertos, etc inicializa(); // Ejecuta el algoritmo de evasion de obstaculos evade(); }

Practica No. 8 Generacin de PWM

el sistema de PWM de un microcontrolador para controlar la operacin de los motores de un robot.


Objetivo: Utilizar Desarrollo: Para cada uno de los siguientes apartados, realizar los diseos electrnicos y programas que se piden. Duracin: Dos semanas. 1. Busque en la ayuda del compilador CCS C informacin sobre las siguientes funciones las cuales configuran 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)

2. Tomando como base el programa en C que se encuentra en el apndice 1 controle la velocidad de los motores del robot mvil que se ha construido en las prcticas anteriores. Conecte las lneas de la etapa de potencia que controlan los motores izquierdo y derecho a los pines 1 y 2 del puerto C los cuales generan las salidas PWM.

Apndice 1
#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){}

// 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 tamao del periodo positivo del pwm mv(long duty){ // 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 tamao del periodo positivo printf("\n\r-> "); gets(linea); duty=atol(linea); // Se indica el tamao del periodo positivo del pwm mv(duty); } }

Practica No. 9 Temporizadores


Objetivo: Utilizar el sistema de temporizadores de un microcontrolador, para capturar las formas de onda generadas por los encodificadores de los motores de un robot mvil. Desarrollo: Para cada uno de los siguientes apartados, realizar los diseos electrnicos y programas que se piden. Duracin: 2 semanas. 1. Busque en la ayuda del compilador CCS C informacin sobre las siguientes funciones de los temporizadores:

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

2.

Tomando como base el programa en C que se encuentra en el apndice 1 vare los tiempos en los cuales ocurren las interrupciones de los temporizadores.

3.

Coloque a un lado de las llantas un fondo negro y blanco para detectar cuanto han girado estas usando sensores infrarrojos, como se muestran en la figura 1. Conecte estos encodificadores a las pines C0 y A4 del PIC. Programe los temporizadores T0 y T1 con relojes externos dados por las lneas de los encodificadores, como se muestra en el apndice 2, el cual muestra cuando se detecta una transicin del fondo negro y blanco.

Figura 1. Generacin de una seal digital con sensores reflectivos

4.

Utilice el temporizador T2 para mostrar los contadores de los temporizadores T0 y T1, como se muestra en el apndice 3.

Apndice 1

#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){}

// 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; }

// Esta interrupcion es llamada en forma automatica 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); // setup interrupt 0 enable_interrupts(INT_TIMER0);

setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // setup interrupt 1 enable_interrupts(INT_TIMER1);

setup_timer_2( T2_DIV_BY_1, 128, 10); enable_interrupts(INT_TIMER2);

// setup interrupts 2

enable_interrupts(GLOBAL);

void main() {

incializa_interrupciones();

while(TRUE);

Apndice 2

#include <16f877.h> #device ADC=8 //#include <stdio.h> #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_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); 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);

Apndice 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

// 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);

// Programa Principal void main(){

char linea[20]; long duty;

incializa_interrupciones();

while(TRUE); }

Practica No. 10 Control PID


Objetivo: Controlar la velocidad de los dos motores del robot construido en las practicas anteriores usando un controlador PID Desarrollo: Para cada uno de los siguientes apartados, realizar los programas que se piden. Duracin: 2 semanas.

1.

Tomando como base el programa en C que se encuentra en el apndice 1 vare las constantes Kp, Ki y Kd del controlador PID y modifique el cdigo, si es necesario, para controlar las velocidades de los motores de su robot.

Apndice 1
/********************************************* * * * * * * * * * * Este programa controla la velocidad de dos motores usando un control PID v. 1.0 robot_pid.c * * * * * * * * * *

*********************************************/

// 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 #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; 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;

// 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(){

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; } }

Practica No. 11 Arquitecturas Tradicionales Objetivo: Familiarizar al alumno en el conocimiento de la configuracin y representacin del medio ambiente en donde el robot navegara. Desarrollo: Para cada uno de los siguientes apartados, realizar los programas que se piden. Duracin: Dos semanas 1.- Escriba un programa que, dado un mapa simblico, encuentre los puntos de interseccin entre las lneas, que forman los polgonos que representan los obstculos, y la linea que une la posicin del robot con el punto destino. Pruebe su programa con el mapa simblico que se encuentra en el anexo I. 2.- Encuentre un mapa simblico de un lugar conocido de su preferencia, como la sala, comedor, habitacin, etc. de su casa. 3.- Cargue este mapa simblico en el simulador RoC2, el cual puede ser descargado en biorobotics.fi-p.unam.mx

APENDICE Mapa Simblico ( limit_area practica1 0.00 0.00 0.00 80.00 80.0 80.00 80.0 0.00 ) ( dimensions practica1 80.00 80.00 ) ( polygon object practica1 caja1 0.0 10.0 0.0 15.0 30.0 15.0 30.0 10.0 ) ( polygon object practica1 caja2 40.0 0.0 40.0 50.0 45.0 50.0 45.0 0.0 ) ( polygon object practica1 caja3 10.0 30.0 10.0 35.0 40.0 35.0 40.0 30.0 ) ( polygon object practica1 caja4 10.0 50.0 10.0 55.0 30.0 55.0 30.0 50.0 ) ( polygon object practica1 caja5 25.0 55.0 25.0 80.0 30.0 80.0 30.0 55.0 ) ( polygon object practica1 caja6 55.0 40.0 55.0 80.0 60.0 80.0 60.0 40.0 ) ( polygon object practica1 caja7 55.0 10.0 55.0 30.0 60.0 30.0 60.0 10.0 ) ( polygon object practica1 caja8 60.0 10.0 60.0 15.0 70.0 15.0 70.0 10.0 ) ( polygon object practica1 caja9 70.0 40.0 70.0 45.0 80.0 45.0 80.0 40.0 ) ( polygon object practica1 caja10 70.0 45.0 70.0 65.0 71.0 65.0 71.0 45.0 ) ( polygon wall practica1 pared1 0.00 0.00 0.00 1.50 80.0 1.50 80.0 0.00 ) ( polygon wall practica1 pared2 0.00 0.00 0.00 80.00 1.50 80.00 1.50 0.00 ) ( polygon wall practica1 pared3 0.00 78.0 0.00 79.00 80.0 79.00 80.0 78.0 ) ( polygon wall practica1 pared4 79.0 0.00 79.00 80.00 80.00 80.00 80.0 0.00 )

Practica No. 12 Busqueda de Caminos Usando Mapas Simblicos Objetivo: Familiarizar al alumno en el conocimiento de la busqueda de caminos usando mapas simbolicos. Desarrollo: Para cada uno de los siguientes apartados, realizar los programas que se piden. Duracin: Dos semanas 1.- Dada la posicin origen de un robot mvil x 0, y0, su orientacin 0 , la posicin final xd, yd y un mapa simblico MS, en donde se representan los objetos en el medio ambiente usando polgonos, encuentre lo siguiente: A) Un grupo de nodos, tomados de los polgonos expandidos, los cuales unen el origen y el destino. B) Una serie de directivas al robot para que este visite los nodos a travs de comandos del tipo: mv di En donde i es el ngulo que girara primero el robot y di la distancia que avanzar para alcanzar el nodoi a partir del nodoi-1 C) Usando los comandos anteriores ejecute un guin del ROC2 para observar los movimientos del robot usando el simulador. En la ayuda del ROC2 se encuentran las |nstrucciones que pueden ser colocadas en los guiones, a continuacion se presentan unas cuantas:

Instrucciones para colocar al robot en una posicin inicial: putbot x y Ejemplo putbot 10 10 0 @0

Instrucciones de movimiento: mv distancia angulo velocidad @id mv 5 3.1416 10 @1 Velocidad 0 significa uso de velocidad estandard mv 10 1.2 0 @2

Practica No. 13 Busqueda de Caminos Usando Mapas Topolgicos

Objetivo: Familiarizar al alumno en el conocimiento de la busqueda de caminos usando mapas topolgicos Desarrollo: Para cada uno de los siguientes apartados, realizar los programas que se piden. Duracin: Dos semanas 1.-Usando el mapa simblico usado en la prctica 2, genere un mapa topolgico el cual cubra todo el espacio libre de navegacin. La descripcin del mapa topolgico se har con dos archivos, uno el cual contenga los nodos con sus conexiones y costos asociados, el otro archivo contendr la posicin fsica x,y de los nodos. 2.- Dada una posicin inicial del robot Xi , Yi y su orientacin i, una posicin final Xf Yf y un mapa topolgico encuentre, usando un algoritmo de bsqueda, tales como, bsqueda en profundidad, bsqueda a lo ancho, A*, algoritmo de Dijkstra, etc, un grupo de nodos que lleven al robot del origen al destino. 3.- Usando el grupo de nodos encontrado en el punto anterior, encuentre los movimientos del robot para alcanzar estos utilizando la funcin de movimiento del simulador: mv distancia ngulo. Muestre en el simulador estos movimientos.

Practica No. 14 Planeacin de Acciones Usando un Sistema Basado en Reglas Objetivo: Familiarizar al alumno con la planeacion de acciones usando sistemas basados en reglas. Desarrollo: Para cada uno de los siguientes apartados, realizar los programas que se piden. Duracin: Tres semanas

1.- El apndice A contiene el cdigo de un sistema que controla la colocacin de cubos en diferentes configuraciones, usando el lenguaje basado en reglas CLIPS que fue desarrollado por la NASA. Pruebe este cdigo en CLIPS y entienda su funcionamiento. 2.- En el apndice B, figura 1, en el cuarto denominado Depsito se encuentran colocados objetos los cuales sern relocalizados de acuerdo a la figura 2. Configure un sistema de movimiento de objetos de un lugar a otro, con planeacin de acciones, usando CLIPS y planeacin de movimientos usando una red topolgica. Este sistema deber ser flexible con respecto a solucionar cualquier configuracin inicial y final. Muestre este sistema utilizando el simulador ROC2.

APENDICE A Mundo de los Bloques ;;;====================================================== ;;; Programa del Mundo de los Bloques ;;; Para ejecutarlo solamente carguelo, de reset y ejecutelo ;;;====================================================== (deftemplate goal (slot move) (slot on-top-of)) (deffacts initial-state (stack A B C) (stack D E F) (goal (move C) (on-top-of E)) (stack)) (defrule move-directly ?goal <- (goal (move ?block1) (on-top-of ?block2)) ?stack-1 <- (stack ?block1 $?rest1) ?stack-2 <- (stack ?block2 $?rest2) => (retract ?goal ?stack-1 ?stack-2) (assert (stack $?rest1)) (assert (stack ?block1 ?block2 $?rest2)) (printout t ?block1 " moved on top of " ?block2 "." crlf)) (defrule move-to-floor ?goal <- (goal (move ?block1) (on-top-of floor)) ?stack-1 <- (stack ?block1 $?rest) => (retract ?goal ?stack-1) (assert (stack ?block1)) (assert (stack $?rest)) (printout t ?block1 " moved on top of floor." crlf)) (defrule clear-upper-block (goal (move ?block1)) (stack ?top $? ?block1 $?) => (assert (goal (move ?top) (on-top-of floor)))) (defrule clear-lower-block (goal (on-top-of ?block1)) (stack ?top $? ?block1 $?) => (assert (goal (move ?top) (on-top-of floor)))) APENDICE B Mundo de los Bloques

Figura 1.

Figura 2.

;********************************************************************** ;*File:cubicle.wrl * ;* * ;********************************************************************** (limit_areacubicle0.000.000.00130.0085.00130.0085.000.00) (dimensionscubicle85.00130.00) (polygonwallcubiclewall10.000.000.0045.005.0045.005.000.00) (polygonwallcubiclewall20.0045.000.0049.0026.5049.0026.5045.00) (polygonwallcubiclewall321.5045.0026.5045.0026.500.0021.500.00) (polygonwallcubiclewall40.0000.000.005.0026.505.0026.5000.00) (polygonwallcubiclewall626.5045.0026.5049.0041.0049.0041.0045.00) (polygonwallcubiclewall751.5045.0056.5045.0056.500.0051.500.00) (polygonwallcubiclewall826.5000.0026.505.0056.505.0056.5000.00) (polygonwallcubiclewall951.5045.0051.5049.0081.0049.0081.0045.00) (polygonwallcubiclewall100.0067.000.0072.0041.0072.0041.0067.00) (polygonwallcubiclewall1154.0067.0054.0072.0081.0072.0081.0067.00) (polygonwallcubiclewall120.0072.000.00128.005.00128.005.0072.00) (polygonwallcubiclewall130.00125.000.00130.0054.00130.0054.00125.00) (polygonwallcubiclewall1454.00130.0059.0130.0059.0067.0054.0067.00) (polygonobjectcubicletable10.0072.000.0078.0035.0078.0035.0072.00) (polygonobjectcubicletable20.0086.500.0094.0016.0094.0016.0086.50) (polygonobjectcubicletable327.0086.5027.0094.0047.0094.0047.0086.50) (polygonobjectcubicledrawer47.0077.0047.0094.0054.0094.0054.0077.00)

Practica No. 15 Comportamientos Reactivos Objetivo: Familiarizar al alumno con los comportamientos reactivos Desarrollo: Para cada uno de los siguientes apartados, realizar los programas que se piden. Duracin: Tres semanas

1.- Tomando como referencia el medio ambiente de la practica 4 coloque obstculos desconocidos en este. Distribuya los cubos como se indica en la practica 4 evitando los obstculos desconocidos.

Usando cualquiera de las siguientes tcnicas: campos potenciales o redes neuronales.

Estas funciones debern ser desarrolladas como funciones de usuario dentro del simulador o en Matlab.

También podría gustarte