proyecto de ingenieria electronica i y ii.148.206.53.84/tesiuami/uami14446.pdf“robot autónomo que...

80
DIVISION DE CIENCIAS BASICAS E INGENIERIA. PROYECTO DE INGENIERIA ELECTRONICA I Y II. “Robot Autónomo que encuentra y aprende el camino para salir de un Laberinto” Alumno: Mata Aguayo Samuel. Matrícula: 201319933. Licenciatura: Ing. Electrónica Asesor: López Villaseñor Mauricio. Clave UAM: 09109 México DF. Enero, 2008.

Upload: dangthuan

Post on 25-Sep-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

DIVISION DE CIENCIAS BASICAS E INGENIERIA.

PROYECTO DE INGENIERIA ELECTRONICA I Y II.

“Robot Autónomo que encuentra y aprende el camino p ara salir de un Laberinto”

Alumno: Mata Aguayo Samuel. Matrícula: 201319933. Licenciatura: Ing. Electrónica Asesor: López Villaseñor Mauricio. Clave UAM: 09109

México DF. Enero, 2008.

2

3

INDICE . ..………………………………………………………………………Pág. INTRODUCCION. .......................................................................................................................5 LEYES DE LA ROBOTICA. .......................................................................................................7 PLANTEAMIENTO Y OBJETIVOS DEL PROYECTO. .......................................................8 ELEMENTOS Y COMPONENTES BASICOS PARA LA CONSTRUCCIO N DEL MINI-ROBOT. .........................................................................................................................................8 MOTOR REDUCTOR. ................................................................................................................8 SENSOR OPTO-REFLECTIVO (QRD1114)............................................................................9 DRIVER L293B. .........................................................................................................................10 REGULADOR L4940V5. ...........................................................................................................11 LABERINTO. ..............................................................................................................................12 DISEÑO FISICO DEL MINI-ROBOT. ....................................................................................13 TARJETA CON SENSORES....................................................................................................14 DIAGRAMA DE CONEXIONES. ............................................................................................16 ALGORITMO DE RECORRIDO Y APRENDIZAJE DEL LABERINTO. ........................19 ALGORITMO DEL PROGRAMA PRINCIPAL. ..................................................................20 MODULO DE CONFIGURACION DEL MICROCONTROLADOR. ................................22 MODULO CONFIGURA INT0. ...............................................................................................25 CONFIGURA_INT1. ..................................................................................................................25 MODULO DE PREGUNTAS: LLEGO A LA META?. .........................................................26 MODULO DE FINALIZACIÓN DEL RECORRIDO (TERMINA_LABER INTO). .........28 SUBRUTINA AVANZA. ............................................................................................................28 RETARDO3.................................................................................................................................29 MODULOS DE ESCRITURA Y LECTURA DE LA EEPROM. ..........................................30 SUBRUTINA ESCRIBE. ...........................................................................................................30 SUBRUTINA LEE_DATO. .......................................................................................................32 MODULO SIGUE_LINEA. .......................................................................................................32 SUBRUTINAS DE CORRECCION DEL CAMINO (RECTIFICA_IZQU IERDO y RECTIFICA_DERECHO). ........................................................................................................34 SUBRUTINA RECTIFICA_IZQUIERDO. .............................................................................34 SUBRUTINA RECTIFICA_DERECHO. ................................................................................35 SUBRUTINA RETARDO1. .......................................................................................................36 SUBRUTINA RETARDO5. .......................................................................................................37 MODULO DE PREGUNTA: SE TERMINO EL CAMINO?. ...............................................37 SUBRUTINAS DE GIRO. .........................................................................................................39 SUBRUTINA VUELTA_IZQUIERDA. ...................................................................................39 SUBRUTINA RETARDO2. .......................................................................................................40 SUBRUTINA GIRA_180............................................................................................................41 SUBRUTINA VUELTA_DERECHA. ......................................................................................42 SUBRUTINA RETARDO4. .......................................................................................................43 ALGORITMO DE INTERRUPCION DE APRENDIZAJE INT0. .......................................44 SUBRUTINAS DE ALMACENAMIENTO DE DATOS EN LA EEPROM. .......................44 SUBRUTINA GUARDA _IZQUIERDA. .................................................................................44 SUBRUTINA GUARDA_ENFRENTE. ....................................................................................45 SUBRUTINA GUARDA_DERECHA. .....................................................................................45 INICIO Y VERIFICACION DE LA INTERRUPCIÓN DE APRENDI ZAJE. ...................46 SUBRUTINA RETARDO6. .......................................................................................................47

4

CHECA_ENFRENTE. ...............................................................................................................48 REFERENCIA2. .........................................................................................................................50 REFERENCIA1 y SALIDA2. ....................................................................................................51 REFERENCIA3. .........................................................................................................................52 REFERENCIA4 y SALIDA3. ....................................................................................................53 SALIDA4. ....................................................................................................................................54 CAMINO_ENFRENTE. .............................................................................................................55 REFERENCIA5. .........................................................................................................................56 REFERENCIA6. .........................................................................................................................57 ALGORITMO DE INTERRUPCION DE CONSULTA INT1. .............................................58 DATO_IZQ. .................................................................................................................................62 DATO_ENF. ................................................................................................................................63 DATO_DER.................................................................................................................................63 SAL_CONSULTA Y SAL_INT1. ..............................................................................................64 CONCLUSIONES: .....................................................................................................................66 BIBLIOGRAFIA: .......................................................................................................................69 APENDICE A: Código completo para el mini-robot..............................................................71

5

INTRODUCCION. El ser humano a lo largo de la historia siempre ha tenido el deseo de generar vida en forma artificial. Hasta la fecha los mejores intentos han sido gracias a la clonación sin embargo, a pesar de los grandes avances dicho objetivo no se ha cumplido al cien por ciento. Por otra parte y debido a éste objetivo hasta ahora vano, la tecnología también ha logrado contribuir con la creación de humanoides electrónicos que es lo que más se asemeja al ser humano. El ser humano también ha inventado máquinas capaces de disminuir y optimizar sus labores y hablando del trabajo físico, el hombre, ha inventado máquinas mecánicas que en la actualidad se utilizan en fábricas de automóviles y embotelladoras de refrescos por mencionar sólo algunas de sus aplicaciones más comunes. Los robots, también desempeñan un papel muy importante en actividades de alto riesgo como por ejemplo la exploración de cráteres de volcanes, manejo de sustancias químicas altamente tóxicas o peligrosas, localización de barcos hundidos, etc; o bien en actividades tales que no debe existir la mano ó acción del hombre por ser procesos altamente delicados y/o precisos como por ejemplo en la fabricación de circuitos integrados, proceso que requiere que los materiales (semiconductores) no presenten grados de impureza mayores al 0.01%. Un robot se define como un dispositivo electrónico que desempeña un trabajo mecánico controlado por el ser humano o bien de forma autónoma a través de un programa que contiene las instrucciones necesarias para la realización de sus tareas. En la actualidad existen cuatro tipos distintos de robots: - ANDROIDES: Estos son robots que tienen forma humana e imitan los movimientos de los mismos. En realidad éstos no tienen ninguna aplicación, son solamente para experimentación y a pesar de que los avances en éste tipo de robots ha sido grande todavía se tienen algunos problemas como por ejemplo en equilibrio en su desplazamiento ya que son bípedos (Figura 1).

Figura 1. Androide.

- MOVILES: Estos robots se desplazan mediante ruedas y generalmente sirven para transportar objetos de un lado a otro (Figura 2).

6

Figura 2. Robot Móvil.

- ZOOMORFICOS: Estos robots tienen forma de animales, generalmente de insectos y regularmente son utilizados para exploración de volcanes, exploración espacial, etc. (Figura 3).

Figura 3. Robot Insecto.

- POLIARTICULADOS: Como su nombre lo dice, tienen articulaciones con diferentes grados de libertad, un ejemplo de éstos son los brazos mecánicos utilizados en la industria para desplazar objetos que requieren ciertos cuidados para su transporte (Figura 4). También pueden ser utilizados en tareas con un alto grado de precisión como en el caso de cirugías médicas.

Figura 4. Brazo Manipulador.

Cabe destacar que el control de robots autónomos generalmente se realiza mediante microcontroladores como son los PIC’s de Microchip, PICAXE también de Microchip, COP’s de la National, AVR’s de Atmel, FPGA’s, ó microcontroladores de Freescale entre muchos otros. Después de la creación de los robots una preocupación natural de los humanos es la competencia humanos vs. robots pero, a pesar de que los robots puedan realizar tareas de forma independiente y con gran precisión, un robot jamás se revelará a su creador.

7

LEYES DE LA ROBOTICA. Isaac Asimov, escritor de ciencia-ficción de la Unión Soviética publica en 1941 una de sus historias llamada “HISTORIA DE ROBOTS” en la cual proporciona sus tres leyes de la robótica las cuales, han sido aceptadas por todo el mundo como las únicas leyes para la fabricación de los mismos. Sus tres leyes con las siguientes: -PRIMERA LEY: Un robot no puede hacer daño a un ser humano o, por inacción, permitir que un ser humano sufra daño. - SEGUNDA LEY: Un robot debe obedecer las órdenes dadas por los seres humanos, excepto si estas órdenes entran en conflicto con la Primera Ley - TERCERA LEY: Un robot debe proteger su propia existencia en la medida en que esta protección no entre en conflicto con la Primera o la Segunda Ley. Sin embargo el mismo Asimov en 1945 presenta una obra en la cual un robot se ve obligado a herir a un humano por el bien de la humanidad misma. Gracias a ésta obra surge una nueva ley denominada como “Ley Cero” la cual dice lo siguiente: “Un robot no puede lastimar a la humanidad o, por falta de acción, permitir que la humanidad sufra daños” Además del surgimiento de ésta ley y, debido a que la Ley cero entra en conflicto con la primera ley se decidió cambiar la primera ley quedando de la siguiente manera: “Un robot no debe dañar a un ser humano, o permitir, por inacción, que un ser humano sufra daño, a menos que tal acción viole la Ley Cero". Este es el verdadero motivo por el cual un robot no debe revelarse en contra de la especie humana. Estas son las cuatro principales leyes conocidas en el mundo sin embargo no está demás mencionar también las tres leyes de la Humánica que también se refieren a los robots y que se dan a continuación: -PRIMERA LEY DE LA HUMANICA: Un ser humano no puede perjudicar a otro ser humano, ni, por omisión, permitir que un ser humano sufra daño alguno. - SEGUNDA LEY DE LA HUMANICA: Un ser humano debe dar a un robot órdenes que preserven la existencia robótica y no pedirle nada que le obligue a enfrentarse innecesariamente a la clase de dilema que podría causar daño o trastorno a los seres humanos. -TERCERA LEY DE LA HUMANICA: Un ser humano no debe perjudicar a un robot o, por omisión, permitir que un robot sufra daños, a menos que tales daños sean necesarios para impedir que sea perjudicado o lesionado un ser humano o para que se cumpla una orden vital.

8

PLANTEAMIENTO Y OBJETIVOS DEL PROYECTO. Se desea realizar un mini-robot móvil que sea capaz de hacer el recorrido sobre un laberinto hecho con líneas de color negro sobre un fondo blanco el cual tendrá las siguientes especificaciones: -Las líneas sin retorno no tendrán marca alguna. -Todas las intersecciones estarán en ángulo recto. -El final del laberinto se define como un círculo negro de 15 cm. de diámetro. Dicho mini-robot además de realizar el recorrido del laberinto y hallar la salida deberá aprender la ruta directa a la salida. El mini-robot deberá contar con la alimentación a bordo (batería) y se podrá utilizar algún microcontrolador para el control del recorrido y aprendizaje. El objetivo principal es que el mini-robot sea AUTONOMO, es decir, que sea capaz de recorrer el laberinto y tomar sus propias decisiones sin la necesidad de darle las instrucciones por medio de telemetría o algo por el estilo. ELEMENTOS Y COMPONENTES BASICOS PARA LA CONSTRUCCIO N DEL MINI-ROBOT. Para realizar la construcción del mini-robot es necesario tener conocimientos básicos acerca del funcionamiento de algunos elementos y dispositivos electrónicos tales como motores y sensores por mencionar algunos, por ello se da una breve descripción sobre éstos. MOTOR REDUCTOR. En mini-robótica es muy común utilizar motor-reductores (también encontrados en la literatura como motor-reductores) para poner en marcha elementos mecánicos necesarios para cumplir con una finalidad determinada. En este caso, la utilización de motor-reductores es esencial ya que se requiere que el diseño pueda desplazarse de un lado a otro.

a) b)

Figura 5. a) Motor-reductor con engranes. b) Motor-reductor con tornillo sin fin y corona.

9

Un motor-reductor es básicamente un motor de corriente directa con un cierto arreglo de engranes (Figura 5. a) o bien, un sin fin y corona (Figura 5. b) cuya función es disminuir su velocidad (de ello se deriva el nombre). Cabe destacar que, a pesar de que existe un decremento en la velocidad, existe un incremento en el torque (fuerza) a la salida de dicho elemento. Estos motor-reductores tienen la ventaja de ser bidireccionales, es decir, dependiendo de la polarización en sus polos es el sentido de giro. En el mercado, existen motor-reductores comerciales con diferentes especificaciones en cuanto a la proporción de la reducción y al consumo de corriente. El motor-reductor que se utiliza en éste proyecto es como el mostrado en la Figura 6 con las siguientes especificaciones: - Torque 2 KgF*cm. - Velocidad 70 RPM. - Consumo de corriente sin carga: 80 mA. - Consumo de corriente atrancado: 600mA. - Caja reductora de 1:120

Figura 6. Motor-reductor modelo B0-2.

Cuenta con una salida con eje de 5mm de diámetro y orificios para facilitar su montaje con tornillos. Medidas: 55mm X 47 mm. X 22mm. Peso: 32gr.

SENSOR OPTO-REFLECTIVO (QRD1114). Para llevar a cabo el seguimiento de la línea negra y los diferentes caminos que puede tomar este prototipo es necesario disponer de un sensor opto-reflectivo como el QRD mostrado en la Figura 7.

Figura 7. Sensor opto-reflectivo QRD1114.

10

Este sensor realmente es un foto transistor que opera con un haz de luz infrarroja del cual se utilizarán las regiones de saturación y corte para determinar si el sensor está sobre color blanco (saturación, 0 lógico) ó sobre la línea negra (corte, 1 lógico). Para ello se propone una conexión como la mostrada en la Figura 8. Los valores de las resistencias que aparecen en la Figura 8 son los valores que se usan en la implementación de este dispositivo ya que, con dichos valores el sensor funciona muy bien. Existen otros modelos de sensores como lo son el CNY-70 y el HOA1397 sin embargo las razones por las cuales no se eligieron estos modelos es porque el CNY-70 es un sensor un poco más grande y el HOA1397 a pesar de que es del mismo tamaño, su haz de luz infrarroja es muy débil, motivo por el cual es más complicada su polarización; sin embargo, para aplicaciones de distancias que estén por el orden de milímetros es un sensor bastante eficiente pero es más costoso. Para ambos sensores su modo de operación y forma de conexión es exactamente igual al QRD1114.

Figura 8. Conexión de los sensores QRD1114. DRIVER L293B. Este circuito integrado es usado comúnmente para proporcionar corrientes de entrada o salida de hasta 1 Ampere por cada uno de sus canales. Este elemento es básico en la construcción de este prototipo debido a que el microcontrolador utilizado no es capaz de proporcionar la corriente necesaria para mover los motor-reductores encargados de realizar el desplazamiento del mini-robot. La Figura 9 muestra la configuración de éste dispositivo. Como se puede observar en la Figura 9, el driver L293B cuenta con cuatro canales cuyas salidas se conectan directamente a los polos de los motores. Las entradas de cada uno de los canales se conectarán con las salidas del microcontrolador.

Figura 9. Driver L293B.

11

El pin 16 marcado como Vss es la alimentación del circuito que debe ir de 5v a 36v al igual que la alimentación para las cargas marcado como Vs. A pesar de ello, las entradas lógicas (pines 2, 6, 10 y 14) no deben sobrepasar la tensión de hasta 7v. Además cada par de canales cuenta con un Enable lo cual quiere decir que, si se polariza el Enable con un 1 lógico el par de canales correspondiente obedecerán a la lógica de sus entradas y por otra parte, si el Enable se encuentra en un 0 lógico, todo aquello que esté conectado a la salida de los canales correspondientes se comportará como si estuviese desconectado. Es importante mencionar que los pines marcados como GND deben conectarse a tierra para el buen funcionamiento de éste circuito.

Tabla 1. Comportamiento del Driver L293B

La Tabla 1 muestra el comportamiento descrito con anterioridad. En ésta Tabla las letras marcadas como H significan el 1 lógico ó nivel alto, la letra L indica el 0 lógico ó nivel bajo y la letra X representa alta impedancia a la salida del Driver. Es importante destacar que la corriente a la salida dependerá de la alimentación de las cargas (Vs), por lo que se requiere un nivel de voltaje constante, de manera que si se utiliza una batería conviene hacer uso de un regulador de voltaje para evitar variaciones conforme ésta se descarga. Es decir, se desea que la potencia a la salida sea constante ya que esto se reflejará en el proyecto como variaciones en la velocidad de los motores. REGULADOR L4940V5. Este regulador de voltaje a 5 v de salida funciona igual que el conocido regulador LM7805. La principal diferencia radica en que el LM7805 es un regulador con una capacidad de corriente de salida hasta de 1 Ampere y el L4940V5 puede soportar hasta 1.5 Amperes lo cual lo hace idóneo para aplicaciones de mini-robótica, ya que frecuentemente los robots requieren de altos consumos de corriente debido a los motores. Entonces, para evitar que el regulador se queme por calentamiento debido al exceso de corriente es mejor utilizar un dispositivo con mayor capacidad, como es el caso del regulador L4940V5; además de incluir un disipador de calor.

Figura 10. L4940V5.

La Figura 10 muestra el regulador L4940V5 así como su configuración. Como se puede observar este dispositivo es muy fácil de conectar. Simplemente tiene una entrada, una tierra y una salida la cual sirve como alimentación del circuito para el mini-robot. La tensión de entrada debe encontrarse

12

en el intervalo de 7v a 30v. En este proyecto se utiliza una batería de 9v con lo cual se garantiza el correcto funcionamiento de éste regulador. LABERINTO. El laberinto ha sido dibujado con cinta de aislar en 6 medios pliegos de papel ilustración. El diseño del laberinto es como el mostrado en la Figura 11.

30 c

m

15 cm

1.8 cm

Figura 11. Diseño del laberinto.

13

El laberinto tiene las siguientes características: - Las líneas tienen un ancho de 1.8 cm. - Ninguna línea está a menos de 15 cm de distancia de cualquier otra línea paralela. - La distancia mínima entre dos intersecciones consecutivas es de 15 cm. (Esta es una medida comúnmente usada en concursos de mini-robótica.). - Las líneas sin retorno no tienen marca alguna. - Todas las intersecciones están dibujadas en ángulo recto. - El inicio del laberinto puede definirse en cualquier parte del mismo. - El final del recorrido es un círculo de 15 cm. de diámetro. DISEÑO FISICO DEL MINI-ROBOT. En realidad el diseño físico del mini-robot no cambia mucho respecto a los robots móviles tradicionales, esto es, una base, que en este caso es de PVC color amarillo parecido al Cintra, sobre el cual van montados la batería y los motor-reductores por la parte inferior. Además pegado en la parte superior una tablilla de experimentación (protoboard) para montar el circuito lo cual permitió realizar las modificaciones y los ajustes necesarios al circuito. Los sensores soldados a una tarjeta para evitar que éstos puedan llegar a moverse de posición. Es necesario que los sensores queden apuntando a la superficie sobre la cual estarán dibujadas las líneas del laberinto. Por éste motivo la tarjeta sobre la cual están soldados los sensores debe ir pegada sobre la base del mini-robot apuntando hacia abajo con una distancia adecuada de entre 3mm y 6mm entre la superficie y los sensores. La típica “llanta loca” se construyó a base de un balero utilizado en las llantas de los patines de línea modernos pegado por un extremo a la base del mini-robot y por el otro extremo a una pequeña palanca hecho también con PVC. Todo esto se observa en las Figuras 12, 13 y 14.

a) b) c)

d)

Figura 12. Diseño del mini-robot. a) Robot visto por la parte inferior. b) y c) Robot visto por la parte superior. d) Dimensiones del mini-robot.

14

a) b) c)

Figura 13. a) Tarjeta con sensores soldados. b) y c) Tarjeta montada sobre la base del robot.

a) b)

Figura 14. Llanta Loca implementada con Valero. a) Vista por debajo. b) Vista en funcionamiento. TARJETA CON SENSORES. La distribución de los sensores es fundamental, por lo que a continuación se describe con detalle su ubicación.

Figura 15. Posicionamiento de sensores.

15

La posición de los sensores en la tarjeta se muestra en la Figura 13 a. Cabe destacar que cada uno de los sensores ya se encuentra polarizado, como se mostró en la Figura 8; por lo tanto, solo salen de esta tarjeta dos cables que sirven única y exclusivamente para la alimentación (Vcc y GND), como se muestra en la Figura 15. En la Figura 15 además de observar la posición que toma cada uno de los sensores, se puede identificar el respectivo nombre identificador con el cual se hará referencia a cada uno de ellos a lo largo del proyecto. Es de gran importancia aclarar que, en la Figura 15 los sensores ya están apuntando a la superficie, es decir, la tarjeta está siendo vista desde su parte superior. La función de los sensores SL_IZQ y SL_DER es la de ir siguiendo la línea del laberinto; por lo que éstos irán dentro de la línea a seguir, de manera que estos sensores mandarán un 1 lógico al microcontrolador y en cualquier desvío de la trayectoria cambiarán de estado a un 0 lógico, lo cual hará que el microcontrolador verifique las ligeras desviaciones de la trayectoria así como cuál lado debe ser rectificado ó corregido (Rectificación izquierda ó Rectificación derecha). La función del sensor ENMEDIO será de gran ayuda ya que gracias a éste es posible que el microcontrolador se de cuenta de que el camino se ha terminado y así, en caso de haber entrado con anterioridad en algún proceso de rectificación (corrección) del camino éste pueda salir inmediatamente de dicho proceso para buscar algún cambio de dirección de la trayectoria como en los casos mostrados en la Figura 16 a), b) y e) o bien dar vuelta y continuar con la búsqueda del final del laberinto. Este sensor también debe ir censando dentro de la línea color negro. La función de los sensores N_IZQ y N_DER es la de detectar los diferentes caminos posibles; es decir, se encargan de verificar si existe un camino a la izquierda, a la derecha o si se debe regresar (girar 180º) por haber llegado al final de una línea del laberinto, donde no existe ningún camino al frente, a la izquierda o a la derecha. Por comodidad, a cualquier camino que tenga un posible cambio de dirección o bien que sea un cruce de dos o más caminos se le llamará NODO (Figura 16), De aquí el nombre que se le ha dado a éstos sensores (N_IZQ y N_DER). La función de los sensores FIN_IZQ y FIN_DER es la de reconocer la diferencia entre un NODO y la meta, ya que si el mini-robot se encuentra en un NODO, éstos sensores tendrán un estado lógico bajo y en caso contrario estarán en un estado lógico alto.

a) b) c) d) e) f)

Figura 16. Posibles Nodos durante el recorrido. La toma de decisión, que realiza el mini-robot, durante la búsqueda del fin del laberinto, es considerar como primera opción el dar la vuelta a la izquierda o ir pegado a la “pared” izquierda del laberinto, como se observa en los casos planteados en la Figura 16. Es decir, siempre que exista un

16

camino a la izquierda éste se tomara, al no existir camino a la izquierda se tomara el camino hacia el frente, en caso contrario se tomara el camino a la derecha y si no existe ninguno de los casos anteriores implica que se encuentra en una línea que ha terminado y debe proceder a regresar, como se ilustra en la Figura 17.

Figura 17. Inevitable regreso del robot. Cabe mencionar que esta estrategia no permite encontrar el camino más corto pero si se asegura encontrar el camino a la salida del laberinto. También es posible establecer como estrategia el dar vuelta siempre a la derecha; sin embargo, en este proyecto se eligió dar vuelta a la izquierda. Para la programación se utiliza un microcontrolador AVR de Atmel. La matrícula de dicho microcontrolador es ATTINY2313, el cual tiene las siguientes características: - Set de 120 Instrucciones. - 32 registros de propósito general de 8 bits cada uno. - 2 KBytes de memoria flash reprogramable hasta 100000 veces. - 128 Bytes de memoria SRAM. - 128 Bytes de memoria EEPROM. - 18 Líneas de entrada y salida. - Encapsulado de 20 pines. - Oscilador interno de 1 MHz. Además, este microcontrolador incluye internamente un archivo con 32 registros de propósito general de 8 bits cada uno los cuales se dividen en registros bajos (R0 – R15) y registros altos (R16 – R32). Estas son las características de mayor interés para este proyecto. Para mayor información consulte la hoja de especificaciones de este dispositivo en la página web de su distribuidor. DIAGRAMA DE CONEXIONES. El diagrama de conexiones del robot móvil es como el mostrado en la Figura 18. En ésta se observa que los pines PD0 (FIN_IZQ), PD1 (SL_IZQ), PA1 (N_IZQ), PB4 (N_DER), PB5 (SL_DER), PB6 (FIN_DER), PB7 (ENMEDIO), PB3 (Switch), PD2 (INT0) y PD3 (INT1) del AVR deben declararse como terminales de entrada ya que son los pines por los cuales se toman las lecturas de los sensores y se realizan las interrupciones externas para la toma de decisiones, mientras que los pines PA0 (EN_IZQ), PD4 (AD_IZQ), PD5 (AT_IZQ), PD6 (AT_DER), PB0 (AD_DER), PB1 (EN_DER) y PB2 (LED) deben declararse como terminales de salida.

17

Los pines PD2 (INT0) y PD3 (INT1) del AVR se usan para la detección de interrupciones externas por lo tanto también se deben declarar como terminales de entrada. Puesto que en el AVR los pines de entrada se declaran como “ceros” y los pines de salida como “unos” en los registros DDRX, la configuración de los puertos queda de la siguiente forma: DDRA = H’01’ DDRB = H’07’ DDRD = H’70’ La configuración de los puertos de entrada/salida traducidos en código es de la siguiente manera: LDI TEMP, 0X01 ;Carga al registro TEMP con el valor 0x01

OUT DDRA, TEMP ;Copia el contenido de TEMP a DDRA LDI TEMP, 0X07 ;Carga al registro TEMP con el valor 0x07 OUT DDRB, TEMP ;Copia el contenido de TEMP a DDRB

LDI TEMP, 0X70 ;Carga al registro TEMP con el valor 0x70 OUT DDRD, TEMP ;Copia el contenido de TEMP a DDRD

En cualquier línea del código de programa, todo aquello que esté después de un punto y coma (;) el compilador (AVR Studio 4) lo reconoce como un comentario. Para facilitar el control de las terminales se definen nombres para cada una de las entradas y salidas. En el software AVR Studio 4 (proporcionado por Atmel) se declara con la directiva .EQU que es la encargada de definir nombres a valores de constantes, esto es: .EQU FIN_DER =6

.EQU ENMEDIO =7

.EQU FIN_IZQ =0

.EQU SL_IZQ =1

.EQU N_IZQ =1

.EQU N_DER =4

.EQU SL_DER =5

.EQU EN_IZQ =0

.EQU AD_IZQ =4

.EQU AT_IZQ =5

.EQU AT_DER =6

.EQU AD_DER =0

.EQU EN_DER =1

.EQU LED =2

La nomenclatura que se utiliza en el AVR Studio 4 para las instrucciones que realizan alguna verificación u operación por bit es: COMANDO PORTX/PINX, asignación de pin

(PORTX sólo se utiliza para reflejar al exterior del microcontrolador algún dato mientras que PINX sólo se utiliza para verificar ó leer algún dato del exterior). Ejemplo 1: SBI PORTB, 2 ; Pone a “uno” el bit 2 del registro de salida PORTB para encender el LED

18

Con el uso de la directiva .EQU no es necesario recordar la asignación del pin, lo cual en programas con un gran número de variables es idóneo. Por lo tanto, haciendo uso de ésta directiva, la instrucción del Ejemplo 1 en este proyecto se escribió como: SBI PORTB, LED ; Enciende el LED

El uso de ésta directiva debe ir antes de la configuración de los puertos mencionada.

Figura 18. Diagrama de conexiones del mini-robot móvil.

19

Siguiendo con la Figura 18, también se observa que los pines PA0 (EN_IZQ) y PB1 (EN_DER) están conectados directamente a las terminales del dispositivo L293B a los pines 1,2EN y a 3,4EN respectivamente, los cuales permiten habilitar ó deshabilitar cada uno de los motor-reductores, en particular PA0 (EN_IZQ) habilita la acción del motor izquierdo (Enable izquierdo) mientras que PB1 (EN_DER) habilita la acción del motor derecho (Enable derecho). El control del motor izquierdo se da por los pines PD4 (AD_IZQ) y PD5 (AT_IZQ). Este motor izquierdo está conectado de tal forma que cuando AD_IZQ está a un 1 lógico y AT_IZQ a un 0 lógico, éste girará de manera que mueva la llanta izquierda hacia enfrente. Mientras que, cuando AD_IZQ esté a un 0 lógico y AT_IZQ a un 1 lógico el motor-reductor mueve la llanta izquierda hacia atrás; así AD_IZQ significa “Adelante” al motor Izquierdo y AT_IZQ “Atrás” al motor Izquierdo. De manera similar trabaja el motor conectado a la parte derecha pero con sus respectivos pines de control AD_DER y AT_DER. Refiriéndose al oscilador, este sirve para generar una señal cuadrada (en este proyecto se selecciona de 1 MHz) que el microcontrolador usa como señal de reloj, la cual proporciona la velocidad con la que se ejecutan los ciclos de instrucción. Como el microcontrolador ATTINY2313 cuenta con un oscilador interno al valor seleccionado no es necesario conectar un oscilador externo. También, debe mencionarse que, este microcontrolador (como todos) debe llevar una alimentación de 5 v (en el pin 20) y su referencia a tierra (GND; conectada en el pin 10); además, hay que recordar que el RESET (pin 1) se activa en estado bajo por lo tanto bien puede colocarse una resistencia de pull-up como se muestra en la Figura 18. Con éstas últimas consideraciones no se deberá tener ningún problema para la puesta en marcha del dispositivo. ALGORITMO DE RECORRIDO Y APRENDIZAJE DEL LABERINTO. Para comprender con claridad el algoritmo que permite al mini-robot realizar el recorrido y aprendizaje del laberinto, primero se proporciona el algoritmo que esquematiza la idea general y posteriormente se explica con detalle cada uno de los bloques utilizados en el planteamiento. Como ya se ha mencionado el microcontrolador AVR ATTINY2313 es el dispositivo usado para albergar este algoritmo de recorrido y aprendizaje del laberinto, que cuenta con oscilador interno para la generación de los ciclos de instrucción, y que utiliza dos terminales como interrupciones externas INT1 e INT0 (PD3 y PD2 respectivamente) para la realización de este recorrido y aprendizaje. De manera que el algoritmo de recorrido y aprendizaje del laberinto se divide en tres partes: el programa principal, interrupción de recorrido (INT1) e interrupción de aprendizaje (INT0). La interrupción INT0 se utiliza para el aprendizaje. La interrupción INT1 se utiliza exclusivamente para el recorrido del laberinto, es decir, esta interrupción será la encargada de tomar las decisiones en el recorrido en base a los datos leídos de la memoria EEPROM que debieron haber sido guardados previamente en la ejecución del modo de operación de aprendizaje. La operación lógica OR entre las señales de entrada de los sensores N_IZQ y N_DER, activará la interrupción correspondiente al modo de operación seleccionado (la que se encuentre habilitada) por medio de la conexión que se muestra en el diagrama de la Figura 18. Es decir, cuando el mini-robot cruza por algún camino hacia la izquierda y/o hacia la derecha, se genera un pulso que acciona una de las interrupciones (INT0 ó INT1).

20

ALGORITMO DEL PROGRAMA PRINCIPAL. El algoritmo general del programa principal se ilustra en la Figura 19. Como en todo programa para microcontroladores, al inicio del programa principal se tiene un módulo de configuración con el propósito de configurar los puertos de entrada/salida, configurar la habilitación de interrupciones externas por flanco (es este caso de subida), etc. Una vez configurado el microcontrolador se pregunta si está al estado lógico cero el pin de entrada PB3 el cual será controlado por la resistencia de pull-up y el switch conectado en esta misma terminal como se muestra en la Figura 18. En éste pin se selecciona el modo de operación del programa es decir, si el switch está abierto significa que se debe configurar la interrupción INT1 para realizar el recorrido del laberinto (PINB3 = 1) que para este momento ya debió de haber aprendido, en caso contrario (switch cerrado, PINB3 = 0), se deberá configurar la interrupción INT0 para hallar y aprender la ruta de salida del laberinto. Una vez configurada la interrupción asociada al correspondiente modo de operación se continua en la parte del programa donde se encuentra la etiqueta HA_TERMINADO que corresponde al inicio de la ejecución de las instrucciones del módulo de pregunta de finalización del recorrido “Llegó a la meta?”, ésta se explicará más adelante. En caso de haber localizado el final del recorrido del laberinto se deshabilitan las interrupciones externas, se guarda el valor H’FF’ en la memoria EEPROM (en la cual se guarda la ruta), que sirve como fin de captura de datos, se avanza un poco para ubicar los sensores al centro del círculo negro, se apagan los motores y el programa queda “atrapado” en un bucle infinito. Si el final del laberinto no se ha detectado, el programa entra al módulo SIGUE_LINEA y al salir de éste módulo se preguntará de nuevo por el modo de operación, si el modo de operación seleccionado es de recorrido y no de aprendizaje (PINB3 = 1) el programa regresará nuevamente a la etiqueta HA_TERMINADO para efectuar de nueva cuenta el procedimiento descrito hasta este momento. En caso de haber seleccionado el modo de operación de aprendizaje (PINB3 = 0) el programa pasa a la etiqueta PREGUNTA_CAMINO para verificar que todavía exista camino enfrente (que no se esté en el final de una línea) entrando así al módulo de pregunta “Se terminó el camino?” que también será explicado más adelante. Si la línea no ha terminado el programa regresará a la etiqueta HA_TERMINADO (Figura 19) para repetir el procedimiento. Se define el nombre DIRECCION a un registro alto que tiene como función el de fungir como apuntador de las direcciones de memoria de la EEPROM en las cuales se escriben o se leen (depende del modo de operación seleccionado) los datos en ésta. Por lo tanto, al detectar el final de una línea (si el modo de operación seleccionado ha sido de aprendizaje) se deshabilitan las interrupciones para evitar que se activen, debido al cruce del sensor N_DER por la línea al momento de dar el giro de 180º ya que dicho giro se realiza por el lado derecho, esto se hace con el llamado a la subrutina con nombre GIRA_180 , se “enciende” (se carga con H’FF’) un registro definido como BANDERA mediante el cual se reconoce que el mini-robot regresa de un camino, se habilita nuevamente la interrupción de aprendizaje INT0 y finalmente se regresa a la etiqueta HA_TERMINADO.

21

INICIO

CONFIGURACION DELMICROCONTROLADOR

PINB3 = 0 ?SI

NO

CONFIGURAINT1

CONFIGURAINT0

HA_TERMINADO:

LLEGO A LAMETA?

SI

NO

DESHABILITAINTERRUPCIONES

GUARDA0XFF

AVANZA

APAGAMOTORES

MODULOSIGUE_LINEA

PINB3 = 0 ?

SI

NO

SE TEMINOEL CAMINO?

SI

NO

DESHABILITAINT0

GIRA_180

ENCIENDEBANDERA

DIRECCION <- DIRECCION - 1

HABILITAINT0

FIN:

TERMINALABERINTO

PREGUNTA_CAMINO

Figura 19. Algoritmo General del Programa Principal.

22

Es posible utilizar solamente un bit del registro BANDERA para indicar que el mini-robot se encuentra de regreso de un camino, sin embargo, ya que no es necesario utilizar otros bits de éste registro para otro tipo de propósitos ó aplicaciones, se decidió utilizar todo el registro como bandera es decir, si éste registro contiene el valor H’FF’ significará que el mini-robot regresa de un camino. Si contiene H’00’ significa que no va de regreso de ningún camino es decir, el camino en el cual se encuentra el mini-robot no ha sido explorado con anterioridad. MODULO DE CONFIGURACION DEL MICROCONTROLADOR. En esta sección de configuración inicialmente se incluye las definiciones del microcontrolador ATTINY2313 para que el compilador reconozca correctamente los registros y demás funciones que éste dispositivo contiene. Esto se realiza mediante la directiva include mediante la siguiente declaración: .include "tn2313def.inc" ;Se incluyen las definiciones de los registros especiales y ;sus bits

Después de incluir las definiciones se debe asegurar que, al leer la primera localidad de memoria de programa se inicie la configuración del microcontrolador: .ORG $0000 ;Escribe en la localidad 0 de la memoria de ;programa la instrucción RJMP RESET RJMP RESET ;Declaracion del vector RESET ó INICIO

El módulo de configuración también debe incluir la declaración de los vectores de interrupción y RESET, además de la asignación de nombres a los pines utilizados, como se muestra en el siguiente fragmento del código:

.ORG INT0addr ;Declaracion del vector de interrupcion externa INT0

RJMP INT_APRENDIZAJE .ORG INT1addr ;Declaracion del vector de interrupcion externa INT1 RJMP INT_CONSULTA

Ahora se nombran las constantes como se explicó anteriormente: ;Comienzo de la asignacion de nombres a constantes y registros

.EQU FIN_DER =6

.EQU ENMEDIO =7

.EQU FIN_IZQ =0

.EQU SL_IZQ =1

.EQU N_IZQ =1

.EQU N_DER =4

.EQU SL_DER =5

.EQU EN_IZQ =0

.EQU AD_IZQ =4

.EQU AT_IZQ =5

.EQU AT_DER =6

.EQU AD_DER =0

.EQU EN_DER =1

.EQU LED =2

23

INICIO

INICIO:

LDI TEMP, low(RAMEND) OUT SPL, TEMPLDI TEMP, 0X01

OUT DDRA, TEMPLDI TEMP, 0X07

OUT DDRB, TEMPLDI TEMP, 0X70

OUT DDRD, TEMPSBI PORTB, LED

CBI PORTD, AT_IZQ CBI PORTD, AT_DER SBI PORTD, AD_IZQ

SBI PORTB, AD_DER LDI DIRECCION, 0X00

LDI TEMP, 0X00 OUT EECR, TEMP

LDI BANDERA,0X00 LDI AUX, 0X0F

OUT MCUCR, AUX

SBIC PINB, 3 RJMP CONFIGURA_INT1

SPL <-- LOW(RAMEND)

DDRB <-- 0X07

DDRD <-- 0X70

LED <-- ON

AT_IZQ <-- 0

AT_DER <-- 0

AD_IZQ <-- 1

AD_DER <-- 1Pue

sta

en m

arch

a de

los

mot

ores

DDRA <-- 0X01

EECR <- H'00'

BANDERA<- H'00'

DIRECCION<- H'00'

MCUCR <- H'0F'

PINB3 = 0 ?NO

SI

CONFIGURA INT1

CONFIGURA INT0

Figura 20. Diagrama de Flujo: Módulo de configuración del programa de aprendizaje.

Se continúa con la declaración de los registros altos que se utilizarán mediante la directiva .DEF: .DEF AUX =R16 .DEF CONT1 =R17

.DEF CONT2 =R18

.DEF DIRECCION =R19

.DEF DATO =R20

.DEF BANDERA =R21

.DEF TEMP =R22

;Inicio de la inicialización del Stack Pointer y configuración de puertos

24

El programa que a continuación se explica, usa subrutinas, motivo por el cual inicialmente se debe configurar el apuntador de pila al precargar al Stack Pointer con la dirección de la localidad baja de la memoria RAM ya que es allí donde comenzará la implementación de la pila. Esto se hace con el siguiente par de instrucciones:

INICIO: ;Etiqueta INICIO LDI TEMP, low(RAMEND) ;Carga al reg. TEMP con la dirección de la

;localidad baja de la memoria RAM OUT SPL, AUX ;Carga al Stack Pointer con el contenido del ;registro TEMP

Ahora se configuran los puertos de entrada/salida tal como se indicó anteriormente, también se activa el LED indicador de encendido ubicado en el pin 14 mostrado en la Figura 18: LDI TEMP, 0X01 ;Carga el reg. TEMP con el valor 0x01 OUT DDRA, TEMP ;Copia el contenido de TEMP a DDRA

LDI TEMP, 0X07 ;Carga el reg. TEMP con el valor 0x07 OUT DDRB, TEMP ;Copia el contenido de TEMP a DDRB LDI TEMP, 0X70 ;Carga el reg. TEMP con el valor 0x70 OUT DDRD, TEMP ;Copia el contenido de TEMP a DDRD

SBI PORTB, LED ;Enciende el LED

Con estas asignaciones, los pines de interrupción quedan configurados como terminales de entrada.

CBI PORTD, AT_IZQ ;Apaga el pin AT_IZQ CBI PORTD, AT_DER ;Apaga el pin AT_DER SBI PORTD, AD_IZQ ;Enciende el pin AD_IZQ SBI PORTB, AD_DER ;Enciende el pin AD_DER

Estas últimas cuatro instrucciones polarizan los motores para comenzar a avanzar hacia enfrente

LDI DIRECCION, 0X00 ;Inicio de apuntador a la EEPROM

LDI TEMP, 0X00 ;Carga el reg. TEMP con el valor 0x00 OUT EECR, TEMP ;Configuración para operación atomica LDI BANDERA,0X00 ;Bandera apagada LDI AUX, 0X0F ;Carga el reg. AUX con el valor 0x0F

OUT MCUCR, AUX ;Configuración de interrupciones por flanco de subida SBIC PINB, 3 ;Pregunta Modo de operación RJMP CONFIGURA_INT1 ;Salta a la etiqueta CONFIGURA_INT1 en caso de PINB3 = 1

La Figura 20 ilustra el diagrama de flujo del módulo de configuración. En ésta se aprecia claramente la inicialización del Stack Pointer, la configuración de los puertos de entrada/salida, la activación del led de encendido y la polarización de los motor-reductores para que el mini-robot móvil avance hacia enfrente. Además, se asigna el valor H’00’ al registro apuntador de la memoria EEPROM (DIRECCION), se configura el borrado y escritura en una operación (operación atómica) en el proceso de escritura de la EEPROM, se garantiza que al inicio del programa el registro BANDERA esté “apagado” cargándole el valor H’00’, se configuran las interrupciones de manera que sean activadas por flanco de subida al cargar el valor H’0F’ al registro MCUCR y finalmente se pregunta por el estado lógico del pin asignado para la elección del modo de operación (PB3) ya que si está a un 1 lógico se configurará la interrupción designada para el recorrido del laberinto (INT1), en caso contrario se configurará la interrupción externa designada para el aprendizaje (INT0).

25

MODULO CONFIGURA_INT0. Este procedimiento es simple, solamente se debe poner a uno el bit colocado en la posición INT0 del registro TEMP y cargar al registro GIMSK con el contenido de dicho registro ya que el registro GIMSK es el encargado de habilitar y deshabilitar las interrupciones. Después de habilitada la interrupción externa INT0 el programa continúa en la parte del código donde se encuentra la etiqueta nombrada HA_TERMINADO.

CONFIGURA_INT0:

LDI TEMP,(1<<INT0)OUT GIMSK, TEMP

RJMP HA_TERMINADO

CONFIGURA INT0

TEMP, INT0 <- 1

GIMSK <- TEMP

HA_TERMINADO

Figura 21. Diagrama de Flujo: CONFIGURA_INT0.

CONFIGURA_INT1. Este módulo es similar al anterior con la diferencia de que en éste se pone a un 1 lógico el bit colocado en la posición INT1 del registro TEMP cuyo valor se copiará en el registro de habilitación de interrupciones GIMSK. Finalmente se continúa en la parte del código donde se encuentra la etiqueta HA_TERMINADO. La Figura 22 ilustra este diagrama de flujo.

CONFIGURA_INT1:

LDI TEMP,(1<<INT1)OUT GIMSK, TEMP

CONFIGURA INT1

TEMP, INT1 <- 1

GIMSK <- TEMP

HA_TERMINADO

Figura 22. Diagrama de Flujo: CONFIGURA_INT1.

26

MODULO DE PREGUNTAS: LLEGO A LA META?. Este módulo comienza en la etiqueta asignada como HA_TERMINADO (Ver Figura 19). Éste es el encargado de verificar si ha terminado el recorrido (si se llegó a la meta final) ó el mini-robot debe continuar con la búsqueda del círculo negro.

HATERMINADO

EN _IZQ <-- 1EN_DER <-- 1

FIN_IZQ = 0?

FIN_DER = 1?

N_IZQ = 0?

N_DER = 1?

SL_IZQ = 0?

SL_DER = 1?

ENMEDIO = 1?

SI

NO

SI

NO

SI

NO

SI

NO

SI

NO

SI

NO

SI

NO

SIGUELINEA

TERMINALABERINTO

HA_TERMINADO:

SEI SBI PORTD, EN_IZQ

SBI PORTB, EN_DER SBIC PIND, FIN_IZQ

SBIS PINB, FIN_DERRJMP SIGUE_LINEA

SBIC PINA, N_IZQ SBIS PINB, N_DER

RJMP SIGUE_LINEA SBIC PIND, SL_IZQ

SBIS PINB, SL_DERRJMP SIGUE_LINEA

SBIS PINB, ENMEDIORJMP SIGUE_LINEA

HABILITACIONGLOBAL DE

INTERRUPCIONES

Figura 23. Diagrama de Flujo: Algoritmo del módulo de pregunta: LLEGO A LA META?

27

Básicamente este módulo se encarga de verificar que todos los sensores estén en un nivel lógico alto, si es así, entonces: pasa a la etiqueta TERMINA_LABERINTO para deshabilitar las interrupciones, guardar en la memoria EEPROM el dato 0xFF (marca de fin de recorrido), entrar al círculo y apagar los motores para quedar dentro del bucle infinito; en caso contrario salta al módulo SIGUE LINEA para continuar con el recorrido. La Figura 23 también muestra, a su lado derecho, la codificación en ensamblador de las diferentes acciones (asignaciones o preguntas) de este módulo, facilitando la identificación con la ayuda de flechas. Al inicio se agrega la instrucción SEI para la habilitación global de interrupciones. Como éste es el primer módulo después de la configuración de puertos y polarización de los motor-reductores, es importante habilitar éstos últimos estableciendo las salidas EN_IZQ (habilitador izquierdo) y EN_DER (habilitador derecho) a “unos” (observe la Figura 23). Después de habilitar los motor-reductores, el algoritmo verifica si el mini-robot se encuentra en la meta, para ello inicialmente se pregunta si el estado del sensor FIN_IZQ es cero, si lo es el mini-robot no está ubicado en la meta y el programa debe ir al módulo de seguimiento de línea (SIGUE_LINEA) en caso contrario se deberá preguntar por el siguiente sensor, FIN_DER. Ahora se verifica que tal sensor esté a un nivel alto, de ser así, se pregunta por el siguiente sensor (N_IZQ), en caso contrario se ejecuta un salto a la etiqueta SIGUE_LINEA para salir de este módulo. Si los dos sensores anteriores, FIN_IZQ y FIN_DER, están en “unos”, posiblemente el mini-robot se ubique en la meta y debe seguir verificando el estado de los demás sensores para asegurar la detección del final del laberinto; ahora se pregunta por el estado del sensor N_IZQ, si éste se encuentra en un 0 lógico se salta al módulo SIGUE_LINEA, en caso contrario procederá a verificar el estado del sensor, N_DER. Al preguntar por el estado del sensor N_DER, implicará que los sensores anteriores se encuentran a nivel alto, por lo que si el sensor N_DER también lo está preguntará por el siguiente sensor, SL_IZQ, de lo contrario se deberá pasar al módulo SIGUE_LINEA para salir de este módulo de preguntas. Una vez más, si todos los sensores anteriores están a nivel lógico alto la probabilidad de que se ha terminado con el recorrido del laberinto es muy alta, sin embargo para asegurar esto, por último se verifican los sensores restantes, SL_IZQ, SL_DER y ENMEDIO. Es decir, se pregunta si los sensores encargados de seguir la línea (SL_IZQ y SL_DER) también se encuentran en estado alto con lo cual se procede a preguntar por el estado del sensor ENMEDIO, de lo contrario se debe salir del módulo de preguntas para ir al módulo SIGUE_LINEA. Para finalizar este módulo se pregunta si el sensor ENMEDIO se encuentra a un 1 lógico, si este sensor no se encuentra a un 1 lógico al igual que en los casos anteriores saldrá del módulo de pregunta para dirigirse al módulo SIGUE_LINEA, en caso contrario se continúa con el módulo que terminará con el recorrido del laberinto (TERMINA_LABERINTO). En resumen, si todos lo sensores se encuentran a un nivel lógico alto significa que el mini-robot ya ha entrado en el círculo negro (final del laberinto) que tanto se ha buscado y el programa entra al módulo etiquetado como TERMINA_LABERINTO para finalizar el recorrido del mismo.

28

MODULO DE FINALIZACIÓN DEL RECORRIDO (TERMINA_LABER INTO). En este módulo, al detectarse el final del laberinto, se deben deshabilitar las interrupciones externas poniendo en el registro TEMP los bits colocados en las posiciones INT0 e INT1 a cero para copiar el valor de dicho registro al registro de habilitación y deshabilitación de interrupciones GIMSK.

TERMINALABERINTO

TERMINA_LABERINTO:

LDI TEMP,(0<<INT0)+(0<<INT1)OUT GIMSK, TEMP

LDI DATO, 0XFF RCALL ESCRIBE RCALL AVANZA

CBI PORTA, EN_IZQ CBI PORTB, EN_DER

FIN:RJMP FIN

AVANZA

EN_IZQ <-- 0EN_DER <-- 0

FIN:

DESHABILITARINTERRUPCIONES

DATO <- H'FF'

ESCRIBE

Figura 24. Diagrama de Flujo: TERMINA_LABERINTO.

Una vez deshabilitadas las interrupciones externas se procede a cargar el valor H’FF’ (marca de fin de recorrido) al registro definido con el nombre DATO, este registro será usado en la subrutina ESCRIBE para transferir su contenido en la memoria EEPROM en la dirección apuntada por el registro definido con el nombre DIRECCION, para así guardar el dato correctamente en la EEPROM. Una vez almacenada la marca de fin del laberinto se llama a la subrutina con nombre AVANZA para ubicar los sensores al centro del círculo negro y se deshabilitan los canales del dispositivo L293B para evitar que las llantas sigan girando y el mini-robot se detenga. Finalmente el programa queda “atrapado” en un bucle infinito en la etiqueta FIN. Todo esto se ilustra en la Figura 24. SUBRUTINA AVANZA. La única finalidad de la subrutina AVANZA, es polarizar adecuadamente los motor-reductores para que el mini-robot móvil avance hacia enfrente durante un corto periodo. Como se observa en la Figura 25 se pone a nivel lógico alto el pin del AVR nombrado como EN_IZQ el cual (ver la Figura 18), está directamente conectado a la habilitación del canal del Driver al que se conectó el motor izquierdo. Así mismo, también se pone a “uno” el pin del AVR nombrado como EN_DER.

29

Para que el mini-robot móvil se desplace hacia el frente es necesario polarizar adecuadamente cada uno de los motor-reductores (como ya se mencionó), por ésto, después de habilitar los canales del Driver se ponen en un estado lógico bajo los pines AT_IZQ (Atrás Izquierdo) y AT_DER (Atrás Derecho) así como a un estado lógico alto los pines etiquetados como AD_IZQ (Adelante Izquierdo) y AD_DER (Adelante Derecho; ver Figura 25).

EN_IZQ <-- 1

EN_DER <-- 1

AT_IZQ <-- 0

AT_DER <-- 0

AD_IZQ <-- 1

AD_DER <-- 1

RETARDO3

AVANZA:

SBI PORTD, EN_IZQ SBI PORTB, EN_DER CBI PORTD, AT_IZQ

CBI PORTD, AT_DER SBI PORTD, AD_IZQ

SBI PORTB, AD_DER RCALL RETARDO3

RET

REGRESA

AVANZA

Figura 25. Diagrama de Flujo: Subrutina AVANZA.

Después de polarizar adecuadamente los motor-reductores para el correcto avance del mini-robot móvil, se llama a un retardo (RETARDO3) para dejar transcurrir un corto periodo de tiempo durante el cual el mini-robot avance. Una vez finalizado el retardo de avance (RETARDO3) la subrutina AVANZA termina y regresa a la parte del programa en la que ésta se ha llamado.

RETARDO3. El RETARDO3 realmente no tiene nada especial. La Figura 26 muestra el diagrama de flujo del RETARDO3. Al inicio de este retardo se carga con el valor H’29’ el registro definido como CONT1, después en la etiqueta LOOOP2 el registro definido como CONT2 se carga con el valor H’F7’. En LOOP3 se decrementa al valor del registro CONT2, se pregunta si el valor de este contador ha llegado a cero ya que de no ser así el código regresará a la etiqueta LOOOP3 generando así un bucle que termina cuando el valor de CONT2 es cero, en caso contrario se decrementa el valor del registro CONT1 y se pregunta si el valor de dicho registro ha llegado a cero, de no ser así el programa regresará a la etiqueta LOOOP2, en caso contrario se procederá a salir del retardo.

30

RETARDO3:

LDI CONT1, 0XA8

LOOOP2:

LDI CONT2, 0XF8

LOOOP3:

DEC CONT2BRNE LOOOP3DEC CONT1BRNE LOOOP2RET

CONT1 <- 0XA8

CONT2 <- 0XF8

CONT2 <- CONT2 - 1

CONT2 = 0 ?

SI

NO

LOOOP3:

LOOOP2:

CONT1 <- CONT1 - 1

CONT1 = 0 ?

SI

NO

REGRESA

RETARDO3

Figura 26. Diagrama de Flujo: RETARDO3.

Todo lo descrito en el párrafo anterior se ilustra claramente el la Figura 26. Este retardo dura aproximadamente 30.508 milisegundos desde su llamado hasta su retorno. MODULOS DE ESCRITURA Y LECTURA DE LA EEPROM. Es momento de realizar una pausa para explicar detalladamente el funcionamiento de las subrutinas de escritura y lectura en la memoria EEPROM. Recuerde que se tiene un registro apuntador a las direcciones de memoria de la EEPROM definido con el nombre DIRECCION, además se tiene un registro de propósito general definido con el nombre DATO el cual contiene el valor (dato) a escribirse en el caso de la escritura y contendrá el valor extraído de la memoria EEPROM en el caso de la lectura. SUBRUTINA ESCRIBE. Como su nombre lo dice ésta subrutina es la encargada de escribir (almacenar) datos en la memoria EEPROM, usando los registros DIRECCION y DATO.

31

ESCRIBE:

SBIC EECR,EEPE RJMP ESCRIBE

OUT EEAR,DIRECCION OUT EEDR, DATO

CLI SBI EECR,EEMPE

SBI EECR, EEPE SEI

RET

EECR, EEPE= 0?

NO

SI

EEAR <- DIRECCION

EEDR <- DATO

DESHABILITACIONDE

INTERRUPCIONESGLOBALES

EECR, EEMPE <- 1

EECR, EEPE <- 1

HABILITACION DEINTERRUPCIONES

GLOBALES

REGRESA

ESCRIBE

Figura 27. Diagrama de Flujo: Subrutina ESCRIBE.

Al inicio esta subrutina espera a que el bit EEPE del registro EECR se ponga a cero para que la EEPROM pueda ser programada. Después de ésto se debe copiar el contenido del registro apuntador DIRECCION al registro EEAR (EEPROM Address Register) para definir la localidad de memoria en la cual se escribirá el valor. De igual forma se copia el contenido del registro DATO al registro EEDR (EEPROM Data Register) cuyo valor es el dato a escribir. Se deshabilitan las interrupciones mediante el comando CLI para evitar cualquier tipo de interrupción que pueda alterar el proceso de escritura. Después, se coloca a “uno” el bit de habilitación maestra de escritura (bit EEMPE del registro de control EECR) para habilitar la misma. Cabe mencionar que si el bit EEMPE del registro EECR no está activado, la escritura de la EEPROM no tendrá ningún efecto, es decir no se escribirá ningún dato en la memoria EEPROM. Una vez activada la habilitación de la escritura, se procede a poner a “uno” el bit EEPE del registro de control EECR para que el dato se guarde en la dirección de memoria apuntado.

32

Una vez terminado el proceso de escritura se procede a habilitar de nuevo las interrupciones globales mediante la instrucción SEI y termina la subrutina regresando a la parte de la memoria de programa de donde fue llamada. Lo descrito anteriormente se muestra en la Figura 27. SUBRUTINA LEE_DATO. Esta subrutina es la encargada de leer los datos contenidos en la memoria EEPROM en la dirección apuntada por el registro DIRECCION. Este dato será copiado en el registro DATO. La figura 28 muestra la forma en que esto se realiza.

LEE_DATO:

SBIC EECR,EEPE RJMP LEE_DATO

OUT EEAR,DIRECCION SBI EECR,EERE

IN DATO,EEDR RET

EECR, EEPE= 0?

NO

SI

EEAR <- DIRECCION

DATO <- EEDR

EECR, EERE <- 1

REGRESA

LEE_DATO

Figura 28. Diagrama de Flujo: Subrutina LEE_DATO.

Esta subrutina espera a que el bit EEPE del registro EECR se ponga a cero para poder tener el acceso sin problemas a la memoria EEPROM. Una vez que el bit EEPE se ha puesto a cero se direcciona la memoria copiando en contenido del registro apuntador DIRECCION al registro EEAR. Se coloca a “uno” en bit EERE del registro de control EECR para habilitar la lectura de la localidad de memoria apuntada. Ya que se ha habilitado la lectura el dato de interés se encuentra en el registro EEDR. Es por ésto que es importante copiar el contenido del registro EEDR al registro DATO para que al salir de esta subrutina el dato leído se localice en el registro de propósito general DATO. MODULO SIGUE_LINEA. Este es uno de los módulos con mayor importancia en el proyecto ya que éste es el encargado de realizar el seguimiento de las líneas del laberinto. Sin embargo, a pesar de que es uno de los más importantes también es uno de los más sencillos.

33

La característica principal de este módulo es permitir la corrección de los ligeros desvíos de la trayectoria del mini-robot al seguir las líneas del laberinto. Si no se deben realizar correcciones en la trayectoria o se reconoce el final de alguna línea, este módulo no tendrá efecto en el movimiento del mini-robot.

SL_IZQ = 1?

SI

SL_DER = 1?

SI

NO

NO

SIGUE_LINEA:

SBIS PIND, SL_IZQ RCALL RECTIFICA_IZQUIERDO

SBIS PINB, SL_DER RCALL RECTIFICA_DERECHO

SBIC PINB, 3 RJMP HA_TERMINADO

SIGUELINEA

RECTIFICA_IZQUIERDO

RECTIFICA_DERECHO

PINB, 3 = 0 ?

SI

NO

PREGUNTACAMINO

HATERMINADO

Figura 29. Diagrama de Flujo: Módulo SIGUE_LINEA.

Particularizando, este módulo inicia preguntando por el estado del sensor SL_IZQ (Seguidor de Línea Izquierdo), si dicho sensor está a un 1 lógico simplemente pasará a preguntar por el siguiente sensor, en caso contrario hará un llamado a la subrutina RECTIFICA_IZQUIERDO para así corregir el ligero desvío que ha tenido del lado izquierdo como se muestra en la Figura 29. Cuando se pregunta por el estado del sensor SL_DER (Seguidor de Línea Derecho) el programa hace básicamente lo mismo. Es decir, si éste está a un nivel lógico alto, el programa continua con el siguiente módulo (PREGUNTA_CAMINO) pero si no es así el programa llamará una subrutina llamada RECTIFICA_DERECHO el cual, se encarga de rectificar el camino, pero ahora por el lado derecho. Una vez corregidas las desviaciones del camino se pregunta por el pin PB3, si éste se encuentra a un cero lógico (modo de operación de aprendizaje) procederá a pasar a la etiqueta PREGUNTA_CAMINO para verificar que el camino enfrente no se haya terminado. Si PB3 está a un estado lógico alto (modo de operación de recorrido) regresará a la etiqueta HA_TERMINADO

34

(sección que verifica el fin del laberinto) para realizar de nueva cuenta los procedimientos explicados hasta ahora. A continuación se explica con detalle el funcionamiento de las subrutinas con nombre RECTIFICA_IZQUIERDO y RECTIFICA_DERECHO para comprender claramente cómo se realiza la rectificación del camino. SUBRUTINAS DE CORRECCION DEL CAMINO (RECTIFICA_IZQU IERDO y RECTIFICA_DERECHO). Tomando en cuenta que los dos sensores que siguen la línea van dentro de la misma, si el sensor SL_IZQ (Seguidor de Línea Izquierdo) sale del camino, por el diseño del robot la llanta derecha debe de ir haciendo pequeñas pausas hasta corregir el camino, de igual forma, si el sensor SL_DER (Seguidor de Línea Derecho) sale del camino, la llanta izquierda debe hacer las pequeñas pausas para efectuar la corrección. SUBRUTINA RECTIFICA_IZQUIERDO. En la Figura 30 se observa el diagrama de flujo del procedimiento de rectificación del camino del lado izquierdo. En ésta se visualiza que al inicio de la subrutina se pregunta por el estado del sensor SL_DER. Si éste se encuentra a un nivel lógico bajo significa que es posible que no se tenga camino enfrente a seguir, como consecuencia no debe realizar la rectificación del camino y debe salir de esta subrutina que le permita tomar decisiones.

SL_IZQ = 1 ?SI

NO

RECTIFICA_IZQUIERDO:

RECTIFICA_IZQUIERDO:

SBIS PINB, SL_DER RET

CBI PORTB, EN_DER RCALL RETARDO1

SBI PORTB, EN_DER RCALL RETARDO1 SBIS PIND, SL_IZQ

RJMP RECTIFICA_IZQUIERDO RET

EN_DER <-- 0

RETARDO1

EN_DER <-- 1

RETARDO1

REGRESA

SL_DER = 1 ?

SI

NO

RECTIFICA_IZQUIERDO

Figura 30. Diagrama de Flujo: Subrutina RECTIFICA_IZQUIERDO.

35

Si el sensor SL_DER está a un 1 lógico significa que no ha encontrado el final de una línea es decir, el mini-robot solamente ha tenido un ligero desvío en su trayectoria de seguimiento de línea que debe corregirse. Para ello primero se deshabilita el pin EN_DER (habilitador del motor-reductor derecho). Cabe destacar que se deshabilita éste y no AD_DER (Adelante Derecho) de manera que la trayectoria del mini-robot pueda verse con un movimiento continuo ya que, al desactivar la señal AD_DER se frena súbitamente el motor-reductor derecho, situación no deseable porque en el avance del robot se observarían pausas bruscas. En seguida, se manda llamar un retardo (RETARDO1) para dejar desactivada la señal EN_DER durante un corto tiempo. Inmediatamente después, se habilita de nuevo la señal EN_DER y se manda llamar una vez más a este mismo retardo, esto con el fin de controlar la velocidad del motor con una especie de PWM aplicada a la habilitación del motor (EN_DER). Ahora, se pregunta si el sensor SL_IZQ (seguidor de línea izquierdo) está a un 1 lógico, o dicho de otra manera si ya se ha corregido el camino por el lado izquierdo, ya que de ser así saldrá de la subrutina de corrección de camino del lado izquierdo, en caso contrario se repetirá el proceso hasta que se logre corregir el camino del lado izquierdo. SUBRUTINA RECTIFICA_DERECHO. Esta subrutina es similar a la anterior con la diferencia de que ahora se debe controlar la velocidad del motor izquierdo de manera que el motor-reductor posicionado en el lado izquierdo disminuirá su velocidad utilizando pulsos PWM, mediante la señal de salida EN_IZQ (habilitador izquierdo) como se observa en la Figura 31.

SL_IZQ = 1 ?NO

SI

SL_DER = 1 ?SI

NO

RECTIFICA_DERECHO:

RETARDO5

RETARDO5

EN_IZQ <-- 1

EN_IZQ <-- 0

REGRESA

RECTIFICA_DERECHO:

SBIS PIND, SL_IZQ RET

CBI PORTA, EN_IZQRCALL RETARDO5

SBI PORTA, EN_IZQRCALL RETARDO5

SBIS PINB, SL_DER RJMP RECTIFICA_DERECHO

RET

RECTIFICA_DERECHO

Figura 31. Diagrama de Flujo: Subrutina RECTIFICA_DERECHO.

36

En éste caso se verifica el estado del sensor SL_IZQ para que, al igual que en la subrutina anterior, salir si se detecta el final de la línea. Una vez verificado ésto se aplican pulsos PWM en EN_IZQ para disminuir la velocidad del motor-reductor izquierdo hasta lograr la corrección del camino por el lado derecho solamente que en este caso se mandar llamar a la subrutina RETARDO5 en lugar de RETARDO1. Ambos retardos tardan lo mismo pero en uno de ellos se pregunta por el estado del sensor SL_IZQ y en el otro por SL_DER. SUBRUTINA RETARDO1. Este es el retardo mencionado en el módulo RECTIFICA_IZQUIERDO utilizado para la rectificación del camino por el lado izquierdo. Como en todo retardo, primeramente se debe almacenar un valor a un registro de conteo, en este caso el registro definido con el nombre CONT2 se carga con el valor H’25’. Es importante que esta subrutina sea capaz de salir lo antes posible si el sensor SL_DER está a un 0 lógico ya que ésto significa que el mini-robot se halla en el final de una línea. Por tal motivo al inicio de esta subrutina, después de haber cargado al registro CONT2 con el valor mencionado, se procede a preguntar por el estado del sensor SL_DER. Una vez verificado que el estado del sensor SL_DER es un 1 lógico, se decrementa el valor del registro CONT2 y en seguida se verifica si el valor de dicho contador ha llegado a cero, de no ser así, regresará a ejecutar nuevamente el bucle marcado con la etiqueta LOP3, en caso de haber llegado a cero saldrá de esta subrutina. La duración de este retardo al no encontrar el final de alguna línea es de aproximadamente 189 microsegundos desde su llamado hasta su retorno.

RETARDO1:

LDI CONT2, 0X25LOP3:

SBIS PINB, SL_DER RET DEC CONT2

BRNE LOP3RET

CONT2 <- 0x25

LOP3:

SL_DER = 1 ?

SI

NO

CONT2 <- CONT2 - 1

CONT2 = 0 ?

NO

SI

REGRESA

RETARDO1

Figura 32. Diagrama de Flujo: RETARDO1.

37

SUBRUTINA RETARDO5. Este es el retardo utilizado en el módulo RECTIFICA_DERECHO para la rectificación del camino por el lado derecho.

RETARDO5:

LDI CONT2, 0X25 LOOOOOP3:

SBIS PIND, SL_IZQ RET DEC CONT2

BRNE LOOOOOP3RET

CONT2 <- 0x25

LOOOOOP3:

SL_IZQ = 1 ?

SI

NO

CONT2 <- CONT2 - 1

CONT2 = 0 ?

NO

SI

REGRESA

RETARDO5

Figura 33. Diagrama de Flujo: RETARDO5.

Este retardo funciona igual que el retardo anterior (RETARDO1) con la diferencia que en este retardo se pregunta por el estado del sensor SL_IZQ como se muestra en la Figura 33. Este retardo tiene una duración de 189 microsegundos desde que se hace el llamado hasta el regreso de esta subrutina. Su diagrama de flujo se muestra en la Figura 33. MODULO DE PREGUNTA: SE TERMINO EL CAMINO?. Al salir del módulo SIGUE_LINEA el programa entra a este módulo de pregunta para descartar que la salida del módulo SIGUE_LINEA sea por la detección del final de alguna línea. Este módulo de pregunta SE TERMINO EL CAMINO? está etiquetado en el programa y algoritmo general (Figura 19) como PREGUNTA_CAMINO. Este algoritmo se muestra en la Figura 34. Cabe destacar que cuando el programa ha llegado a ésta parte es porque se ha seleccionado el modo de operación de aprendizaje ya que de otra forma el programa jamás llegará a esta sección del código debido a la pregunta hecha al final del módulo SIGUE_LINEA. Antes de dar un giro de 180º es necesario asegurar que realmente se está en el final de alguna línea. Por ésto es necesario preguntar por el estado de los sensores SL_IZQ (seguidor de línea izquierdo), SL_DER (seguidor de línea derecho) y ENMEDIO. El módulo inicia preguntando por el estado del sensor SL_IZQ, si éste se encuentra en estado lógico alto significa que no se ha llegado al final de alguna línea y por lo tanto deberá ir al módulo HA_TERMINADO sin dar el giro de 180º, de lo contrario continuará preguntando por los siguientes sensores (SL_DER y ENMEDIO).

38

PREGUNTACAMINO

SL_IZQ = 1 ?

NO

SI

SL_DER = 0 ?NO

SI

ENMEDIO = 0?

SI

NO

TEMP. INT0 <- 0

GIMSK <- TEMP

GIRA_180

BANDERA <- H'FF'

DIRECCION <- DIRECCION - 1

TEMP. INT0 <- 1

GIMSK <- TEMP

HATERMINADO

PREGUNTA_CAMINO:

SBIS PIND, SL_IZQ SBIC PINB, SL_DER

RJMP HA_TERMINADO SBIC PINB, ENMEDIO

RJMP HA_TERMINADOLDI TEMP,(0<<INT0)

OUT GIMSK, TEMP RCALL GIRA_180

LDI BANDERA,0XFF DEC DIRECCION

LDI TEMP,(1<<INT0) OUT GIMSK, TEMP

RJMP HA_TERMINADO

Figura 34. Diagrama de Flujo: Módulo de pregunta SE TERMINO EL CAMINO?. Una vez confirmado que el sensor SL_IZQ está a un nivel lógico bajo, se pregunta por el estado lógico del sensor SL_DER, si éste se encuentra en un nivel lógico alto significa que no se ha llegado al final de una línea, por lo tanto procederá a salir de ésta parte del programa realizando un salto al módulo HA_TERMINADO, de lo contrario se preguntará si el sensor ENMEDIO también se encuentra en un estado lógico bajo. Si los tres sensores (SL_IZQ, SL_DER y ENMEDIO) se han encontrado en un estado lógico bajo significa que indudablemente se ha llegado al final de alguna línea, es por ésto que primeramente se deshabilita la interrupción de aprendizaje (INT0) para que cuando el sensor

39

N_DER (Nodo Derecho) cruce la línea al dar el giro de 180º la interrupción no sea activada. Esto se hace al colocar a “cero” el bit INT0 del registro definido con el nombre TEMP (ver Figura 34) y después copiando el valor de dicho registro al registro de habilitación de interrupciones GIMSK. Una vez deshabilitada la interrupción de aprendizaje (INT0) se procede a llamar a la subrutina GIRA_180º encargada de efectuar el giro de 180º por el lado derecho. Se decrementa el registro apuntador a la memoria EEPROM, de manera que el nuevo valor correcto se escribirá aquí y así eliminará el dato incorrecto escrito con anterioridad. Es importante “encender” (se carga con el valor H’FF’) el registro definido como BANDERA, indicadora de que el mini-robot va de regreso ya que, esta bandera será utilizara para tomar la decisión del nuevo valor a escribir (que depende del tipo de NODO que se encuentre) cuando se active la siguiente interrupción de aprendizaje. Después de ésto, se habilita de nuevo la interrupción de aprendizaje INT0 poniendo a “uno” el bit INT0 del registro TEMP para copiar su contenido al registro de habilitación de interrupciones GIMSK como se muestra en la Figura 34. Finalmente el programa salta a la etiqueta HA_TERMINADO, permitiendo iniciar el ciclo de instrucciones explicado hasta este momento, como lo muestra la figura 19, esperando en su ejecución alguna interrupción externa ya sea para guardar los caminos que deben seguirse o consultar el camino que se debe tomar (según el modo de operación seleccionado). SUBRUTINAS DE GIRO. Estas subrutinas son utilizadas para realizar los giros a la izquierda, a la derecha y giro de 180º que permiten al mini-robot seguir las líneas del laberinto. SUBRUTINA VUELTA_IZQUIERDA. Esta subrutina polariza los motor-reductores para que el mini-robot móvil de un giro de 90º a la izquierda. Su diagrama de flujo se muestra en la Figura 35. Al iniciar la subrutina se ponen a “unos” las señales EN_IZQ (habilitador izquierdo) y EN_DER (habilitador derecho) para asegurar que la polarización de los motor-reductores tenga efecto en el movimiento del mini-robot. Mientras que los pines del AVR conectados al Driver AD_IZQ (Adelante Izquierdo) y AT_DER (Atrás derecho) se ponen a un estado lógico bajo y AT_IZQ (Atrás Izquierdo) y AD_DER (Adelante derecho) a “unos”, con esto se han polarizado los motor-reductores de tal forma que, la llanta izquierda girará hacia atrás y la llanta derecha girará hacia enfrente produciendo así que el mini-robot gire sobre su eje a la izquierda. Finalmente se llama un retardo (RETARDO2) para que el móvil gire el tiempo necesario hasta llegar a los 90º a la izquierda, se manda llamar tres veces a la subrutina AVANZA para asegurar la salida del mini-robot del NODO, concluyendo así esta subrutina.

40

VUELTA_IZQUIERDA:

SBI PORTA, EN_IZQ SBI PORTB, EN_DERCBI PORTD, AD_IZQ

CBI PORTD, AT_DERSBI PORTD, AT_IZQ

SBI PORTB, AD_DER RCALL RETARDO2

RCALL AVANZA RCALL AVANZA RCALL AVANZA

RET

AD_IZQ <-- 0

AT_DER <-- 0

AT_IZQ <--1

AD_DER <-- 1

RETARDO2

REGRESA

EN_IZQ <- 1

EN_DER <- 1

AVANZA X 3

VUELTA_IZQUIERDA

Figura 35. Diagrama de Flujo: VUELTA_IZQUIERDA.

SUBRUTINA RETARDO2. Este retardo, como ya se explicó en la subrutina anterior, sirve para darle al mini-robot móvil el tiempo necesario para dar el giro de 90º al lado izquierdo. En esta subrutina se tienen tres bucles anidados para generar un retardo con una duración de 946.474 mili segundos desde su llamada hasta su retorno, como se explica a continuación. Su diagrama de flujo se muestra en la Figura 36. Se comienza asignando el valor H’07’ al registro definido con el nombre AUX. En la etiqueta LOOP1 se asigna el valor H’B5’ al registro definido como CONT1. En LOOP2 se asigna el valor H’F8’ al registro definido como CONT2. En LOOP3 comienza el bucle interior del retardo, en éste se decrementa el valor del registro contador CONT2. Se pregunta si el valor de este registro ha llegado a cero, de no ser así el programa regresa a la etiqueta LOOP3, en otro caso se decrementa el valor del registro CONT1 e inmediatamente se pregunta si dicho valor ha llegado a cero, de no ser así el programa regresará a la etiqueta LOOP2 para cargar nuevamente el valor del registro CONT2 e iniciar nuevamente el bucle interior de éste retardo, en otro caso se decrementa el valor del registro AUX y se pregunta si éste ha llegado a cero, si no es así el programa saltará a la etiqueta LOOP1 para cargar nuevamente el valor del registro CONT1 (H’B5’) y continuar así ejecutando los dos bucles que se encuentran al interior del retardo; de haber llegado el valor del registro AUX a cero significa que el retardo se ha ejecutado por completo y termina el retardo.

41

RETARDO2:

LDI AUX, 0X07LOOP1:

LDI CONT1, 0XB5

LOOP2:LDI CONT2, 0XF8

LOOP3:DEC CONT2BRNE LOOP3DEC CONT1BRNE LOOP2

DECAUX

BRNE LOOP1 RET

AUX <- 0X07

CONT1 <- 0XB5

LOOP1:

CONT2 <- 0XF8

LOOP2:

CONT2 <- CONT2 - 1

CONT2 = 0?

NO

SI

CONT1 <- CONT1 - 1

CONT1 = 0?

NO

SI

AUX <- AUX -1

AUX = 0?

NO

SI

LOOP3:

REGRESA

RETARDO2

Figura 36. Diagrama de Flujo: RETARDO2.

SUBRUTINA GIRA_180. Esta subrutina es la encargada de realizar el giro de 180º del mini-robot móvil. Básicamente esta subrutina manda llamar a otras subrutinas para realizar su función. Como lo muestra la Figura 37 se invoca dos veces a la subrutina llamada VUELTA_DERECHA ya que al dar 2 giros a la derecha de 90º en realidad el robot dará un giro total de 180º. A continuación se llama a la subrutina VUELTA_DERECHA se hace un llamado a la subrutina

42

AVANZA (anteriormente explicada) para que el mini-robot avance una pequeña distancia en caso de haberse alejado del camino al dar el giro de 90º a la derecha, finalizando esta subrutina

GIRA_180:

RCALL VUELTA_DERECHA RCALL VUELTA_DERECHA

RCALL AVANZARET

VUELTA_DERECHA

VUELTA_DERECHA

AVANZA

REGRESA

GIRA_180

Figura 37. Diagrama de Flujo: Subrutina GIRA_180.

SUBRUTINA VUELTA_DERECHA. Esta subrutina como su nombre lo dice es la encargada de hacer que el mini-robot móvil dé un giro de 90º a la derecha.

AD_DER <-- 0

AT_IZQ <-- 0

AT_DER <-- 1

AD_IZQ <-- 1

RETARDO4

VUELTA_DERECHA:

CBI PORTB, AD_DER CBI PORTD, AT_IZQ

SBI PORTD, AT_DER SBI PORTD, AD_IZQ

RCALL RETARDO4RET

REGRESA

VUELTA_DERECHA

Figura 38. Diagrama de Flujo: Subrutina VUELTA_DERECHA.

Para ésto se despliegan “ceros” en los pines del AVR nombrados como AD_DER (Adelante Derecho) y AT_IZQ (Atrás Izquierdo) y “unos” en los pines AT_DER (Atrás Derecho) y AD_IZQ (Adelante Izquierdo) recordando que estos cuatro sensores van conectados directamente al Driver L293B para el control del sentido de giro de las llantas (Figura 18). Con esto se polariza el motor-reductor izquierdo de tal forma que la llanta izquierda gira hacia enfrente y el motor-reductor derecho de forma que la llanta derecha gira hacia atrás. Al igual que en el giro a la izquierda, también se invoca a un retardo (RETARDO4) el cual tiene una duración adecuada para que el móvil dé el giro de 90º a la derecha.

43

Es importante mencionar que el retardo llamado en ésta subrutina (RETARDO4) es distinto al retardo de la subrutina VUELTA_IZQUIERDA (RETARDO2) ya que en la práctica ambos motor-reductores tienen una pequeña diferencia en la velocidad del giro, es decir, si en ambas subrutinas se utilizara el mismo retardo se observaría que uno de los giros (a la derecha o a la izquierda) alcanzaría un mayor número de grados en un sentido respecto al otro. El motivo por el cual se utilizan diferentes retardos en estas dos subrutinas es para tener “calibrados” los giros de forma independiente. La calibración de cada uno de los giros se realiza mediante la práctica. SUBRUTINA RETARDO4. Este retardo (RETARDO4) realiza la misma función que el RETARDO2 con la única diferencia de que este retardo (RETARDO4) es utilizado para dar la vuelta a la derecha y el RETARDO2 se utiliza para dar la vuelta a la Izquierda. Su diagrama de flujo se muestra en la Figura 39.

RETARDO4:

LDI AUX, 0X08 LOOOOP1:

LDI CONT1, 0X9B

LOOOOP2:LDI CONT2, 0XF8

LOOOOP3:DEC CONT2BRNE LOOOOP3DEC CONT1BRNE LOOOOP2DEC AUXBRNE LOOOOP1

RET

CONT1 <- 0X9B

RETARDO4

AUX <- 0X08

LOOOOP1:

CONT2 <- 0XF8

LOOOOP2:

CONT2 <- CONT2 - 1

CONT2 = 0 ?NO

SI

CONT1 <- CONT1 - 1

CONT1 = 0 ?NO

SI

AUX <- AUX - 1

AUX = 0 ?NO

SI

LOOOOP3:

REGRESA

Figura 39. Diagrama de Flujo: RETARDO4.

44

El funcionamiento de RETARDO4 es exactamente igual que el RETARDO2 motivo por el cual no se realiza la explicación detallada de esta subrutina. A diferencia de RETARDO2, al inicio de esta subrutina el registro definido como AUX es cargado con el valor H’08’. En la etiqueta LOOOOP1 el registro definido como CONT1 es cargado con el valor H’9B’, en la etiqueta LOOOOP2 el registro definido como CONT2 es cargado con el valor H’F8’. La duración aproximada de este retardo es de 926.308 mili segundos, que es un valor muy parecido al valor de la duración del RETARDO2 (946.474 mili segundos). ALGORITMO DE INTERRUPCION DE APRENDIZAJE INT0. La interrupción INT0 es posiblemente la más importante en este proyecto ya que cuando ésta está habilitada almacena los datos y corregir los mismos en caso de haberse almacenado un dato erróneo debido a la elección no adecuada de algún camino. Esta interrupción es la que se configura cuando el modo de operación seleccionado es de aprendizaje, esto con el switch cerrado que se encuentra conectado al pin PB3 del AVR mostrado en la Figura 18. El mini-robot en su recorrido encontrará diferentes configuraciones de NODO, como los mostrados en la figura 16. Para identificar a cada uno de ellos en el algoritmo se ha seleccionado de forma arbitraria la siguiente clasificación: Para el camino a la izquierda como un H’01’, al camino enfrente como un H’02’ y al camino a la derecha como un H’03’, de manera que éstos valores serán los que se almacenen a medida que aprende el mini-robot. Cuando ésta interrupción se active, el algoritmo de interrupción de aprendizaje determinará el valor a guardarse dependiendo del tipo de NODO en el cual se encuentre el mini-robot o bien de las condiciones del recorrido. Inicialmente se da una explicación de las subrutinas encargadas de almacenar los datos en la EEPROM, esto permitirá al lector entender con facilidad el algoritmo de aprendizaje. SUBRUTINAS DE ALMACENAMIENTO DE DATOS EN LA EEPROM. Como ya se ha mencionado, al camino a la izquierda se le ha asignado el valor numérico H’01’, al camino hacia enfrente el valor H’02’ y al camino a la derecha el valor H’03’. Para la escritura de dichos datos en la memoria EEPROM se hace uso de la subrutina de escritura ESCRIBE explicada anteriormente, como se muestra en las Figuras 40, 41 y 42. SUBRUTINA GUARDA _IZQUIERDA. Para guardar el dato IZQUIERDA de forma adecuada primero se carga el valor H’01’ al registro definido como DATO y una vez hecho ésto se manda llamar a la subrutina de escritura en la EEPROM (ESCRIBE), como se muestra en la Figura 40, para finalmente salir de esta subrutina.

45

DATO <- 0X01

ESCRIBE

REGRESA

GUARDA_IZQUIERDA:

LDI DATO, 0X01 RCALL ESCRIBE

RET

GUARDA_IZQUIERDA

Figura 40. Diagrama de Flujo: Subrutina GUARDA_IZQUIERDA.

SUBRUTINA GUARDA_ENFRENTE. A diferencia de la subrutina GUARDA_IZQUIERDA, para guardar el dato enfrente se debe cargar al registro DATO el valor H’02’, llamar a la subrutina ESCRIBE y salir de la subrutina para regresar a la parte del programa de la cual fue llamada. La Figura 41 muestra esta clara diferencia.

DATO <- 0X02

ESCRIBE

REGRESA

GUARDA_ENFRENTE:

LDI DATO, 0X02 RCALL ESCRIBE

RET

GUARDA_ENFRENTE

Figura 41. Diagrama de Flujo: Subrutina GUARDA ENFRENTE.

SUBRUTINA GUARDA_DERECHA. En la Figura 42 se muestra el diagrama de flujo de esta subrutina. En dicha figura se observa claramente que en este caso el valor cargado al registro DATO es H’03’. Las instrucciones siguientes son las mismas que las de las subrutinas GUARDA_IZQUIERDA y GUARDA_ENFRENTE.

DATO <- 0X03

ESCRIBE

REGRESA

GUARDA_DERECHA:

LDI DATO, 0X03 RCALL ESCRIBE

RET

GUARDA_DERECHA

Figura 42. Diagrama de Flujo: Subrutina GUARDA_DERECHA.

46

INICIO Y VERIFICACION DE LA INTERRUPCIÓN DE APRENDI ZAJE. Como se muestra en la Figura 43, cuando se entra a esta rutina de interrupción INT0 inicialmente se deshabilita la misma para evitar que se genere otra interrupción que pueda ejecutarse al terminar la misma debido a algún tipo de activación debida al ruido. Seguido de ésto se manda llamar al RETARDO6 y al terminar éste se pregunta por el estado del pin PD2 (que es el pin por el cual se activa la interrupción de aprendizaje: ver figura 18) ya que al encontrarse en un estado lógico bajo significa que la interrupción se ha activado debido al ruido y de ser así se procede a saltar a la etiqueta SAL_IN_INT0 (Sal Inmediatamente de la Interrupción 0) en la cual nuevamente se habilita la interrupción y se procede a salir de la misma. En caso contrario significa que la interrupción ha sido habilitada correctamente debido al cruce de los sensores con un camino a la izquierda, a la derecha o ambos.

Figura 43. Diagrama de Flujo: Inicio y verificación de la Interrupción de Aprendizaje.

47

Antes de considerar alguna decisión en el cambio de trayectoria del mini-robot, éste debe detenerse para evitar que siga avanzando mientras se determina el camino y no provocar que el móvil pierda el camino que se desea tomar. Es por esto que se ponen a un nivel lógico bajo los pines del AVR AT_IZQ, AT_DER, AD_IZQ, AD_DER los cuales se encuentran conectados directamente a los canales del Driver L293B que controla el sentido de giro de los motor-reductores como se mostró en la Figura 18. Esta pausa es probable que no se aprecie a simple vista debido a la alta frecuencia de operación del microcontrolador que es de 1 MHz. Posteriormente se pregunta por el estado del sensor FIN_DER ya que si éste se encuentra en un estado lógico alto significa que la interrupción ha sido generada debido al cruce de los sensores N_IZQ y/o N_DER con el círculo del final de recorrido, es decir, el mini-robot ya está en la meta. Al llamar a la subrutina RETARDO6 se permite dar tiempo a que ambos sensores (N_IZQ y N_DER) entren completamente al círculo final. Por último se habilita la interrupción y se procede a terminar con la rutina de interrupción. En caso de no haberse detectado la entrada del mini-robot al círculo del final de recorrido por medio del sensor FIN_DER el programa da un salto a la etiqueta CHECA_ENFRENTE para reconocer en cual de los casos mostrados en la Figura 16 se encuentra. SUBRUTINA RETARDO6. Al iniciar las rutinas de interrupción de Aprendizaje y Consulta/Recorrido (INT0 e INT1), es importante llamar un retardo para esperar la estabilización de las señales lógicas, procedentes de los sensores dedicados a activar dichas interrupciones (N_IZQ y N_DER).

RETARDO6:

LDI CONT1, 0X45

RLOP:

LDI CONT2, 0XF7

RLOP2:

DEC CONT2BRNE RLOP2DEC CONT1BRNE RLOPRET

CONT1 <- 0X45

CONT2 <- 0XF7

CONT2 <- CONT2 - 1

CONT2 = 0 ?

SI

NO

RLOP2:

RLOP:

CONT1 <- CONT1 - 1

CONT1 = 0 ?

SI

NO

REGRESA

RETARDO6

Figura 44. Diagrama de Flujo: RETARDO6

48

La subrutina RETARDO6, es la encargada de generar este tiempo de estabilización (51.34 mili segundos) requerido por los sensores N_IZQ y/o N_DER, para posteriormente verificar que las interrupciones no han sido generadas debido al ruido. El diagrama de flujo de la subrutina RETARDO6 se ilustra en la figura 44. La lógica de funcionamiento de esta subrutina (RETARDO6), es la misma que en la subrutina RETARDO3 (anteriormente explicada), motivo por el cual se omite su explicación. La diferencia respecto a RETARDO3, radica en los valores que son cargados a los registros CONT1 y CONT2, que en este caso son H’45’ y H’F7’ respectivamente, ésto, para modificar la duración del retardo. CHECA_ENFRENTE. Una vez que se ha descartado que la interrupción de aprendizaje (INT0) ha sido generada debido al ruido (como se explicó en la sección de Inicio y Verificación de la Interrupción de Aprendizaje), el programa realiza un salto a la etiqueta CHECA_ENFRENTE, en la cual, se inicia la identificación de la forma del NODO en el que se encuentra el mini-robot. Para ello, primeramente se debe conocer si todavía existe camino hacia enfrente. En ésta etiqueta, se inicia preguntando por el estado lógico de los sensores SL_IZQ y SL_DER (Seguidores de Línea), ya que si ambos se encuentran en estado lógico bajo, significa que no hay camino hacia enfrente, es decir, quedan descartados los casos de la Figura 16 c, d y f. En otro caso (observe la figura 45), significa que aún existe el camino hacia enfrente, motivo por el cual el programa realiza un salto a la etiqueta CAMINO_ENFRENTE (que se explicará más adelante). En caso de no detectarse un camino hacia enfrente, se pregunta si el estado lógico del sensor N_IZQ es bajo (para continuar con la estrategia planteada), ya que de no ser así el programa dará un salto a la etiqueta REFERENCIA1 (que se explicará más adelante) debido a la detección de un camino hacia la izquierda. En caso de que el sensor N_IZQ esté a un “0” lógico, significa que el mini-robot podría encontrarse en el caso mostrado en la Figura 16 b. Sin embargo, es necesario conocer si el mini-robot ya ha pasado por allí, es decir, si el mini-robot va regresando de un camino recorrido con anterioridad (tal y como se muestra en la Figura 46 b). Esta situación se puede conocer mediante el registro BANDERA. Si este registro contiene el valor H’FF’ entonces el mini-robot se encuentra en el caso mostrado en la Figura 46 b, en caso contrario, el mini-robot se encuentra en el caso ilustrado por la Figura 46 a. Si el registro BANDERA contiene el valor H’FF’, el programa hará un salto a la etiqueta REFERENCIA2 (que será explicada más adelante). En caso contrario (caso de la Figura 46 a), se procede a llamar a la subrutina AVANZA, ésto, para que los sensores SL_IZQ y SL_DER se ubiquen en mejor posición al terminar el giro a la derecha. Posteriormente, se llama a la subrutina VUELTA_DERECHA (encargada de hacer girar al mini-robot 90º hacia la derecha como ya se ha explicado). Se debe llamar nuevamente a la subrutina AVANZA para salir del NODO. En seguida, se manda llamar a la subrutina GUARDA_DERECHA (ya explicada) para almacenar el dato correspondiente debido al giro al lado derecho. El registro BANDERA se “apaga” (se carga con el valor H’00’) para asegurar que éste sea actualizado (ya que por medio del mismo se reconoce la trayectoria que ha recorrido el mini-robot).

49

Es necesario incrementar el registro DIRECCION para apuntar a la localidad de memoria de la EEPROM en la cual se escribirá el siguiente dato.

CHECA_ENFRENTE:

SBIS PIND, SL_IZQ SBIC PINB, SL_DER

RJMP CAMINO_ENFRENTE SBIC PINA, N_IZQ

RJMP REFERENCIA1 CPI BANDERA, 0XFF

BREQ REFERENCIA2 RCALL AVANZA

RCALL VUELTA_DERECHA RCALL AVANZA

SALIDA1:

RCALL GUARDA_DERECHA LDI BANDERA, 0X00

INC DIRECCION RJMP SAL_INT0

CHECAENFRENTE

SALIDA1:

SL_IZQ = 1 ?SI

CAMINOENFRENTESL_DER = 0 ?

NO

NO

SI

N_IZQ = 0 ?NO

SI

REFERENCIA1

BANDERA =H'FF' ?

SI

NO

REFERENCIA2

AVANZA

VUELTA_DERECHA

AVANZA

GUARDA_DERECHA

BANDERA <-- H'00'

DIRECCION <-- DIRECCION + 1

SAL_INT0

Figura 45. Diagramas de Flujo: Etiquetas CHECA_ENFRENTE y SALIDA1.

50

a) b)

Figura 46. Nodo a la derecha. a) De ida, b) De regreso.

Esta sección del programa, finaliza con un salto a la etiqueta SAL_INT0 (mostrada en la Figura 43) para salir de la interrupción de aprendizaje. REFERENCIA2. Cuando el programa realiza un salto a la etiqueta REFERENCIA2, es debido a que se ha determinado que el mini-robot se encuentra en el caso mostrado en la Figura 46 b. En éste caso, se debe dar vuelta a la derecha. Por ello, se manda a llamar a la subrutina AVANZA, se manda llamar a la subrutina VUELTA_DERECHA, se llama de nueva cuenta a la subrutina AVANZA (para salir del NODO) y se decrementa el valor del registro DIRECCION ya que, si el mini-robot va de regreso, significa que en la localidad de memoria anterior, se guardó un valor incorrecto sobre la cual se escribirá un nuevo dato. Posteriormente, el programa realiza un salto a la etiqueta SAL_INT0 (ver figura 43) para salir de la interrupción como ya se ha explicado. En éste caso, no se “apaga” el registro BANDERA debido a que el mini-robot continuará de regreso sobre el camino que ya se recorrió.

REFERENCIA2:

RCALL AVANZA RCALL VUELTA_DERECHA

RCALL AVANZA DEC DIRECCION RJMP SAL_INT0

REFERENCIA2

AVANZA

VUELTA_DERECHA

AVANZA

DIRECCION <-- DIRECCION - 1

SAL_INT0

Figura 47. Diagrama de Flujo: REFERENCIA2.

51

REFERENCIA1 y SALIDA2. Cuando la rutina de interrupción de aprendizaje llega a la etiqueta REFERENCIA1, es debido a que el mini-robot se encuentra en uno de los casos mostrados en la Figura 16 a ó 16 e. Sin embargo, no es necesario conocer exactamente en cual de los 2 casos mencionados se encuentra el mini-robot (Figura 16 a ó 16 e), ya que, en ambos casos se deberá dar vuelta a la izquierda para respetar la estrategia planteada. Pero, es necesario conocer si el mini-robot va regresando de algún camino que no lo guíe a la meta. Por este motivo, en el diagrama de flujo mostrado en la Figura 48, inicialmente se pregunta si el registro BANDERA contiene el valor H’FF’, es decir, se pregunta si el mini-robot se encuentra de regreso sobre un camino. En caso de que el registro BANDERA contenga el valor H’FF’, el programa realiza un salto a la etiqueta REFERENCIA3 (que se explicará más adelante) para tomar la decisión adecuada ya que, el mini-robot regresa de un camino anteriormente recorrido. En caso contrario, se manda llamar a la subrutina VUELTA_IZQUIERDA (para que el mini-robot gire 90º a la izquierda) y se llama a la subrutina GUARDA_IZQUIERDA (que inicia en la etiqueta SALIDA2).

REFERENCIA1:

CPI BANDERA, 0XFF BREQ REFERENCIA3

RCALL VUELTA_IZQUIERDA

SALIDA2:

RCALL GUARDA_IZQUIERDA INC DIRECCION RJMP SAL_INT0

REFERENCIA1

BANDERA =H'FF' ?

SI

NO

REFERENCIA3

VUELTA_IZQUIERDA

GUARDA_IZQUIERDA

DIRECCION <-- DIRECCION + 1

SAL_INT0

SALIDA2

Figura 48. Diagrama de Flujo: REFERENCIA1 y SALIDA2.

Al llamar a la subrutina GUARDA_IZQUIERDA (como ya se ha explicado), se almacena el dato “IZQUIERDA” (H’01’) en la localidad de la memoria EEPROM apuntada por el registro DIRECCION. Después de haber guardado el dato correspondiente, se debe incrementar el valor del registro DIRECCION para apuntar a la localidad de memoria en la cual se guardará el próximo dato. Se debe realizar el salto a la etiqueta SAL_INT0 para salir de la interrupción de aprendizaje.

52

REFERENCIA3. Cuando la rutina de interrupción de aprendizaje realiza un salto a la etiqueta REFERENCIA3, es debido a que ya se ha descartado que el mini-robot se encuentra en alguno de los casos mostrados en la Figura 16 b, c, d y f, es decir, el mini-robot se encuentra en alguno de los casos ilustrados en la Figura 16 a ó 16 e, además, se conoce que el mini-robot va de regreso sobre un camino ya que, el valor del registro BANDERA es H’FF’. Para conocer en cual de los dos casos mencionados se encuentra (casos de la Figura 16 a ó 16 e), es necesario preguntar si existe un camino hacia la derecha tal como se muestra en la Figura 50.

Figura 49. Posible NODO para la etiqueta REFERENCIA3.

REFERENCIA3:

SBIC PINB, N_DER RJMP REFERENCIA4

RCALL VUELTA_IZQUIERDA DEC DIRECCION RJMP SAL_INT0

REFERENCIA3

N_DER = 0 ?

SI

NO REFERENCIA4

VUELTA_IZQUIERDA

DIRECCION <-- DIRECCION - 1

SAL_INT0

Figura 50. Diagrama de Flujo: REFERENCIA3.

Al preguntar por el estado lógico del sensor N_DER se conoce en cual de los posibles NODOS aún sin descartar (casos de la Figura 16 a ó 16 e) se encuentra el mini-robot. Si el estado del sensor N_DER es alto, el mini-robot se encuentra en un NODO como el mostrado en la Figura 16 e y, el programa realiza un salto a la etiqueta REFERENCIA4 (la cual se explicará más adelante) para tomar la decisión correspondiente. En caso contrario, significa que el mini-robot ha recorrido la trayectoria mostrada en la Figura 49 y se procede a llamar a la subrutina VUELTA_IZQUIERDA para que el mini-robot realice el giro de 90º hacia la izquierda. Posteriormente, se decrementa el

53

valor del registro DIRECION ya que en la localidad de la memoria EEPROM anterior, se ha guardado un valor incorrecto. Después de ésto, el programa salta a la etiqueta SAL_INT0 para salir de la interrupción de aprendizaje. El registro BANDERA en este caso no se debe “apagar” debido a que el mini-robot continuará de regreso. REFERENCIA4 y SALIDA3. La rutina de interrupción de aprendizaje realiza un salto a la etiqueta REFERENCIA4 una vez que se ha detectado que el NODO (en el cual se encuentra el mini-robot) es como el mostrado en la Figura 16 e ó f y además, el mini-robot va de regreso sobre un camino. Para seguir con la estrategia, se debe llamar a la subrutina VUELTA_IZQUIERDA (como se muestra en la Figura 52) y posteriormente llamar a la subrutina LEE_DATO para asegurar que la trayectoria que se ha recorrido es como la mostrada el la Figura 51. Si el registro DATO no contiene la dirección a la izquierda, el programa saltará a la etiqueta SALIDA4 (que se explicará más adelante), en caso contrario, continuará en la etiqueta SALIDA3 en la cual se manda llamar a la subrutina GUARDA_ENFRENTE debido a que el dato que se debe almacenar en la localidad de memoria correspondiente a ese NODO debe ser enfrente, ésto, para que en el modo de operación de recorrido (al encontrarse con ese NODO), el mini-robot no dé vuelta a la izquierda y continúe su trayectoria hacia enfrente. Posteriormente, se “apaga” el registro BANDERA y se incrementa el registro DIRECCION (para apuntar a la siguiente dirección de memoria de la EEPROM) para guardar en esa localidad de memoria el dato asociado con el siguiente NODO. Después del procedimiento descrito, el programa realizará un salto a la etiqueta SAL_INT0 (explicada anteriormente) para salir de la interrupción de aprendizaje.

Figura 51. Descripción de la trayectoria para REFERENCIA4.

En el caso mostrado en la Figura 51, es claro que, debido a la trayectoria que realiza el mini-robot, el dato leído siempre será “izquierda” (H’01’), sin embargo, la lectura del registro DATO y la verificación de su contenido, se realiza con la finalidad de realizar un salto a la etiqueta REFERENCIA4 cuando: el mini-robot se encuentre en un NODO como el mostrado en la Figura 16 f. Esto se explicará posteriormente.

54

REFERENCIA4:

RCALL VUELTA_IZQUIERDA RCALL LEE_DATO

CPI DATO, 0X01BRNE SALIDA4

SALIDA3:

RCALLGUARDA_ENFRENTE

LDI BANDERA,0X00 INC DIRECCION RJMP SAL_INT0

REFERENCIA4

SI

NO

VUELTA_IZQUIERDA

LEE_DATO

DATO = IZQ ? SALIDA4

GUARDA_ENFRENTE

BANDERA <-- H'00'

DIRECCION <-- DIRECCION + 1

SAL_INT0

SALIDA3

Figura 52. Diagrama de Flujo: REFERENCIA4 y SALIDA3.

SALIDA4. El algoritmo de aprendizaje, da un salto a esta etiqueta (SALIDA4) cada que el algoritmo de aprendizaje determine: que se debe guardar el dato “DERECHA” y además, se deba “apagar” el registro BANDERA debido a la toma de un camino que no se ha recorrido. Por ejemplo, las trayectorias ilustradas por las figuras 54 b, 57 y 59 b.

SALIDA4:

RCALL GUARDA_DERECHA LDI BANDERA, 0X00

INC DIRECCIONRJMP SAL_INT0

SALIDA4

GUARDA_DERECHA

BANDERA <-- H'00'

DIRECCION <-- DIRECCION + 1

SAL_INT0

Figura 53. Diagrama de Flujo: SALIDA4.

55

Por ello: se manda llamar a la subrutina GUARDA_DERECHA, se “apaga” el registro BANDERA, se incrementa el registro DIRECCION para apuntar a la siguiente localidad de memoria de la EEPROM y se realiza un salto a la etiqueta SAL_INT0 para salir de la interrupción de aprendizaje (INT0). Este procedimiento se muestra en la Figura 53. CAMINO_ENFRENTE. Cuando la rutina de interrupción realiza un salto a la etiqueta CAMINO_ENFRENTE, es debido a que el mini-robot se encuentra en alguno de los casos ilustrados en la Figura 16 c, d ó f.

a) b)

Figura 54. Posibles Trayectorias para CAMINO_ENFRENTE.

CAMINO_ENFRENTE:

SBIC PINA, N_IZQ RJMP REFERENCIA5

RCALL AVANZARCALL AVANZARCALL AVANZARCALL AVANZA

CPI BANDERA, 0XFF BREQ SALIDA4 RJMP SALIDA3

CAMINOENFRENTE

N_IZQ = 0

SI

NOREFERENCIA

5

AVANZA X 4

BANDERA =H'FF?

SI

NOSALIDA3

SALIDA4

Figura 55. Diagrama de Flujo: CAMINO_ENFRENTE.

56

Como la toma del camino a la izquierda es prioridad debido a la estrategia planteada en este proyecto desde su inicio, se pregunta si existe dicho camino, es decir, se pregunta si el estado del sensor N_IZQ se encuentra en estado lógico bajo (ver Figura 55), de no ser así (existe camino a la izquierda), el programa realiza un salto a la etiqueta REFERENCIA5 (que se explicará más adelante), esto, para tomar la decisión más adecuada. En caso contrario, significa que el mini-robot se encuentra en el caso mostrado en la Figura 16 d (no hay camino a la izquierda pero si enfrente). Por tal motivo, se manda llamar a la subrutina AVANZA cuatro veces para que el mini-robot continúe con su trayectoria “pegado a la pared izquierda”. En este momento es importante conocer la trayectoria que ha recorrido el mini-robot, es decir, cual de las trayectorias mostradas en la Figura 54 ha recorrido el mismo. Para conocer esto, basta con preguntar si el registro BANDERA se encuentra “encendido” ya que al no estarlo significará que la trayectoria recorrida es como la mostrada en la Figura 54 a, y el programa realizará un salto a la etiqueta SALIDA3, en la cual: se guarda el valor “ENFRENTE”, se “apaga” el registro BANDERA y se incrementa el registro DIRECCION (como se explicó anteriormente). En caso contrario, significa que la trayectoria recorrida es como la mostrada en la Figura 54 b, por lo tanto, es necesario realizar un salto a la etiqueta SALIDA4, en la cual: se guarda el valor “DERECHA”, para que el mini-robot dé vuelta a la derecha al encontrarse en ese NODO en el modo de operación de recorrido, evitando así, tomar el camino a la izquierda (que no lo llevará a la meta). Posteriormente (también en la etiqueta SALIDA4), se “apaga” el registro BANDERA ya que se tomará un camino que no se ha recorrido, se incrementa el registro “DIRECCION” y finalmente, se procede a salir de la interrupción de aprendizaje (Consulte la etiqueta SALIDA4).

REFERENCIA5. Una vez que la rutina de interrupción de aprendizaje ha determinado que el mini-robot móvil se encuentra en alguno de los casos ilustrados en la Figura 16 c ó f, el programa realiza un salto a la etiqueta REFERENCIA5.

REFERENCIA5:

CPI BANDERA, 0XFF BREQ REFERENCIA6

RCALL VUELTA_IZQUIERDA RJMP SALIDA2

REFERENCIA5

SI

NO

BANDERA =H'FF' ?

REFERENCIA6

VUELTA_IZQUIERDA

SALIDA2

Figura 56. Diagrama de Flujo: REFERENCIA5.

57

Como se muestra en la Figura 56, para conocer la trayectoria, se pregunta si el registro BANDERA está “encendido”. Al estarlo, se realiza un salto a la etiqueta REFERENCIA6 (que se explicará más adelante) para tomar otra decisión. En caso contrario, no es indispensable saber exactamente en cual de los dos casos mencionados se encuentra el mini-robot para respetar la estrategia. Es por ésto que: se manda llamar a la subrutina VUELTA_IZQUIERDA, se realiza un salto a la etiqueta SALIDA2 (ya explicada). Recuerde que, en la etiqueta SALIDA2: se guarda el dato “IZQUIERDA” en la memoria EEPROM, se incrementa el registro DIRECCION para apuntar a la siguiente localidad de memoria de la EEPROM y se realiza un salto a la etiqueta SAL_INT0 para salir de la interrupción de aprendizaje. REFERENCIA6. La rutina de interrupción de aprendizaje realiza un salto a la etiqueta REFERENCIA6 cuando se ha determinado que el mini-robot se encuentra en alguno de los casos mostrados en la Figura 16 c ó f pero, en este caso, el mini-robot va de regreso sobre un camino que ya se recorrió. Esto se conoce ya que, el registro BANDERA se encuentra “encendido”. Por éste motivo, se debe determinar en cual de los dos casos mencionados (casos de la Figura 16 c ó f) se encuentra el mini-robot. Para esto, se pregunta si el estado del sensor N_DER es bajo. De ser así, significa que el mini-robot se encuentra en el caso mostrado en la Figura 16 c y por ello: se llama a la subrutina VUELTA_IZQUIERDA y se realiza un salto a la etiqueta SALIDA4 (ya que la trayectoria realizada por el mini-robot es como la mostrada en la Figura 57). Recuerde que, en la localidad de memoria apuntada por el registro DIRECCION, se había escrito un dato que debe ser corregido debido al regreso del mini-robot.

Figura 57. Posible Trayectoria del mini-robot para REFERENCIA6.

También debe recordar que, en la etiqueta SALIDA4: se guarda el dato “DERECHA”, se “apaga” el registro BANDERA, se incrementa el registro DIRECCION y se procede a salir de la interrupción de aprendizaje. En caso de que el estado lógico del sensor N_DER sea alto, significa que el mini-robot se encuentra en un NODO como el mostrado en la Figura 16 f, por esto, el programa realiza un salto a la etiqueta REFERENCIA4 (ya explicada) en la cual se manda llamar a la subrutina VUELTA_IZQUIERDA. También en la etiqueta REFERENCIA4, se reconoce cual de las trayectorias mostradas en la Figura 59 ha recorrido el mini-robot. Para ésto se manda llamar a la subrutina LEE_DATO, ya que, si el dato contenido en esa localidad de memoria es “IZQUIERDA”, significa que la trayectoria del recorrido es como el mostrado en la Figura 59 a, por éste motivo, se guarda el dato “ENFRENTE” (ver Figura 52). En caso contrario significa que el mini-robot ha recorrido la trayectoria mostrada en la Figura 59 b y por lo tanto se guarda el dato “DERECHA” (como ya se explicó en la etiqueta REFERENCIA4).

58

REFERENCIA6:

SBIC PINB, N_DER RJMP REFERENCIA4

RCALL VUELTA_IZQUIERDA RJMP SALIDA4

REFERENCIA6

SI

NON_DER = 0 ? REFERENCIA

4

VUELTA_IZQUIERDA

SALIDA4

Figura 58. Diagrama de Flujo: REFERENCIA6.

a) b)

Figura 59. Posibles trayectorias para el salto a REFERENCIA4.

ALGORITMO DE INTERRUPCION DE CONSULTA INT1. La activación de la interrupción INT1 sólo se permite cuando se ha seleccionado el modo de operación de recorrido y no de aprendizaje, como se ha hecho referencia con anterioridad. Esta interrupción es accionada gracias a la operación lógica OR entre las señales de los sensores N_IZQ y N_DER (ver Figura 18), es decir, cuando se encuentra un camino a la izquierda o a la derecha. Cuando se selecciona el modo de operación de recorrido mediante el switch (abierto) conectado en el pin PB3 del microcontrolador (ver Figura 18), la trayectoria del recorrido del laberinto ya debe estar almacenada en la memoria EEPROM a partir de su localidad 0. Esto, mediante el algoritmo de interrupción de aprendizaje INT0. Recuerde que: al camino a la izquierda se le ha asignado el valor numérico H’01’, al camino enfrente el valor H’02’ y al camino a la derecha el valor H’03’.

59

Cuando esta interrupción se acciona, básicamente se leerá de la memoria EEPROM el dato guardado, de tal forma que: si la lectura del dato es un H’01’ el mini-robot tomará el camino a la izquierda, si el dato obtenido es un H’02’ el mini-robot tomará el camino hacia enfrente, si el dato leído es H’03’ el mini-robot dará vuelta a la derecha y continuará su camino, pero, si el dato es H’FF’ la interrupción no tendrá ningún efecto sobre la trayectoria del mini-robot. Cabe destacar que el valor H’FF’ puede encontrarse debido a que el algoritmo del programa principal, al encontrar el final del laberinto, guardará dicho valor en la memoria EEPROM (como ya se ha explicado). La Figura 60 muestra el esquema general (sin código) de la interrupción INT1. En ésta se puede observar que, al inicio se deshabilita a si misma para evitar que se genere otra interrupción que pueda ejecutarse posteriormente debido a la activación por ruido. Seguidamente, se manda llamar un retardo (RETARDO6) e inmediatamente después se pregunta si el estado del pin, por la cual se generan las interrupciones (PINB3 ó PB3), está a un “uno” lógico. Básicamente el llamado del RETARDO6 y la verificación del estado de la terminal PINB3, es para asegurar que la interrupción ha sido generada por el cruce de alguno de los sensores N_IZQ (Nodo Izquierdo) y/o N_DER (Nodo derecho) con algún camino a la izquierda o a la derecha y no por ruido (al igual que en la interrupción de aprendizaje INT0). Si la interrupción ha sido generada por ruido, es decir, que si el estado de PINB3 no es alto (después del llamado a la subrutina RETARDO6), se procederá a salir de la interrupción sin haber realizado alguna acción. Para ello, el programa salta a la etiqueta SAL_INT1 para habilitar de nueva cuenta la interrupción y salir inmediatamente de la interrupción de recorrido INT1. Si se ha detectado que la interrupción ha sido generada por el cruce con alguna línea, entonces se manda llamar a la subrutina LEE_DATO (explicada anteriormente) la cual, copia el dato obtenido de la localidad de la memoria EEPROM en el registro DATO. Una vez obtenido el dato de interés, se pregunta si el valor contenido en el registro DATO es igual a H’01’ (IZQUIERDA), en caso afirmativo, el programa salta a la etiqueta DATO_IZQ en la cual se pregunta si hay camino a la izquierda, de no haber camino a la izquierda, el programa regresará a la etiqueta DATO_IZQ para seguir preguntando hasta que se encuentre el camino a la izquierda, ésto con la finalidad de esperar a que el mini-robot detecte el camino que seguirá. Una vez detectado el camino hacia la izquierda, se manda llamar a la subrutina VUELTA_IZQUIERDA (encargada de hacer girar al mini-robot 90º a la izquierda) y, seguido de esto, se realiza un salto a la etiqueta SAL_CONSULTA, en la cual se mandará llamar de nueva cuenta al RETARDO6 y al RETARDO3 para asegurar que el mini-robot salga por completo del NODO. Posteriormente se incrementa el valor del registro DIRECCION (registro apuntador a la memoria EEPROM) para que al generarse la siguiente interrupción, el dato de interés (en el siguiende NODO) sea apuntado correctamente, después se habilita de nuevo la interrupción de recorrido y finaliza la rutina de interrupción de consulta. En caso de que el dato obtenido no sea “IZQUIERDA” (H’01’), se procede a preguntar si dicho dato contiene el valor definido como camino hacia enfrente (H’02’), en caso de ser así, se procede a llamar a la subrutina AVANZA 8 veces, con la finalidad de avanzar hacia enfrente para cruzar el NODO, y seguido de esto, se realiza un salto a la etiqueta SAL_CONSULTA para salir de esta interrupción de consulta ó de recorrido (como se explicará más adelante).

60

INT1

DESHABILITACIONDE INT1

RETARDO6

PB3 = 1 ?NO

SI

SAL_INT1

LEE_DATO

DATO = IZQ ?SI

NO

DATO = ENF ?SI

NO

DATO = DER ?SI

NO

REGRESA

HAY CAMINO A LAIZQUIERDA ?

NO

SI

VUELTA_IZQUIERDAAVANZA X 8

HAY CAMINO A LADERECHA ?

NO

SI

VUELTA_DERECHA

RETARDO6

RETARDO3

DIRECCION <- DIRECCION + 1

HABILITACION DEINT1

REGRESA

DATO_IZQ:

DATO_ENF:

DATO_DER:

SAL_INT1:

SAL_CONSULTA:

HABILITACION DEINT1

Figura 60. Diagrama da Flujo General de la interrupción INT1.

61

Figura 61. Interrupción de consulta INT1.

Si el valor obtenido mediante el registro DATO tampoco es ENFRENTE, entonces, se pregunta si el valor que contiene el registro DATO es H’03’ (DERECHA), ya que de ser así, el programa salta de a la etiqueta DATO_DER para esperar la detección del camino a la derecha de forma similar que cuando el dato obtenido es IZQUIERDA. Una vez detectado el camino a la derecha, se manda llamar a la subrutina VUELTA_DERECHA para que el mini-robot dé un giro de 90º a la derecha. Al

62

terminar de realizar el giro, el programa continúa en la etiqueta SAL_CONSULTA, en la cual, se procederá a salir de esta interrupción (como se explicará más adelante). En caso de que el dato obtenido no sea IZQUIERDA, ENFRENTE ó DERECHA, simplemente se procederá a salir de la interrupción sin efectuar ninguna acción, ya que, el valor obtenido es H’FF’, esto significa que el final del laberinto está enfrente y el mini-robot está entrando al círculo final. Antes de salir de la interrupción se habilita de nueva cuenta INT1. A la interrupción INT1 se le ha dado el nombre de interrupción de consulta ó de recorrido ya que, como se ha mencionado, esta interrupción consultará los datos almacenados previamente en la memoria EEPROM para tomar el camino que lo guiará al final del laberinto. El diagrama de flujo de esta interrupción se muestra en las figuras 60 y 61. La figura 61 incluye la señalización del código correspondiente a cada una de las preguntas y procedimientos anteriormente explicados. DATO_IZQ. Una vez que se ha determinado que la trayectoria del mini-robot es a la izquierda (el valor obtenido de la memoria EEPROM es H’01’), el programa salta hasta esta etiqueta (DATO_IZQ) para tomar el camino a la izquierda.

DATO_IZQ:

SBIS PINA, N_IZQRJMP DATO_IZQ

RCALL VUELTA_IZQUIERDA RJMP SAL_CONSULTA

DATO_IZQ

N_IZQ = 1 ?NO

SI

VUELTA_IZQUIERDA

SALCONSULTA

Figura 62. Diagrama de Flujo: DATO_IZQ.

En la Figura 62 se observa que al inicio de esta etiqueta, se pregunta si el estado del sensor N_IZQ (Nodo Izquierdo) está en un nivel lógico alto, ya que al no estarlo, se procede a realizar esta misma pregunta hasta que el sensor N_IZQ se encuentre en nivel lógico alto, ésto, con la finalidad de esperar que el camino que seguirá el mini-robot sea previamente detectado. Una vez detectado el camino a la izquierda, se manda llamar a la subrutina VUELTA_IZQUIERDA (encargada de hacer

63

girar al mini-robot 90º a la izquierda), posteriormente, se realiza un salto a la etiqueta SAL_CONSULTA para salir de la interrupción de consulta (como se explicará más adelante). DATO_ENF. Cuando el valor obtenido de la memoria EEPROM es H’02’, la rutina de interrupción realiza un salto a esta etiqueta (DATO_ENF). Como el valor leído de la memoria EEPROM es “ENFRENTE”, se manda llamar 8 veces a la subrutina AVANZA para que el mini-robot sea capaz de salir del NODO cruzándolo hacia enfrente. Después de esto, el programa salta a la etiqueta SAL_CONSULTA para salir de la rutina de interrupción de consulta INT1 (como se explicará más adelante).

DATO_ENF

AVANZA X 8

SALCONSULTA

DATO_ENF:

RCALL AVANZARCALL AVANZARCALL AVANZARCALL AVANZARCALL AVANZARCALL AVANZARCALL AVANZARCALL AVANZA

RJMP SAL_CONSULTA

Figura 63. Diagrama de Flujo: DATO_ENF.

DATO_DER. Cuando el dato obtenido de la memoria EEPROM es H’03’ (“DERECHA”), el programa espera la detección del camino a la derecha mediante la primera pregunta realizada en esta etiqueta (ver Figura 64). Si el estado lógico del sensor N_DER (Nodo Derecho) es bajo, el programa regresará de nueva cuenta a esta pregunta hasta que el estado lógico del sensor N_DER cambie. Una vez que se ha detectado el camino a la derecha, se manda llamar a la subrutina AVANZA para que al terminar de dar el giro a la derecha los sensores SL_IZQ (seguidor de línea izquierdo) y SL_DER (seguidor de línea derecho) se posicionen sobre la línea que seguirá. Después de esto, se manda llamar a la subrutina VUELTA_DERECHA (para que el móvil gire 90º a la derecha como ya se ha explicado). Después de haber realizado el giro de 90º a la derecha, el programa continúa en la etiqueta SAL_CONSULTA para salir de la interrupción de consulta INT1 (como se explicará a continuación).

64

DATO_DER

N_DER = 1 ?NO

SI

VUELTA_DERECHA

SALCONSULTA

AVANZA

AVANZA

DATO_DER:

SBIS PINB, N_DERRJMP DATO_DER

RCALL AVANZARCALL VUELTA_DERECHA

RCALL AVANZA

Figura 64. Diagrama de Flujo: DATO_DER.

SAL_CONSULTA Y SAL_INT1. Esta es la sección del código que se ejecuta una vez que se ha leído un dato y se ha efectuado la acción correspondiente para el seguimiento de la línea que conduce al final del laberinto. Acciones tales como vuelta a la izquierda, a la derecha, cruzado al frente en la ubicación de algún NODO ó leído de la memoria EEPROM la marca de fin de recorrido (valor H’FF’). En la Figura 65 se muestra que: para salir de la rutina de interrupción de consulta INT1, se manda llamar al RETARDO6 y al RETARDO3 para asegurar la salida del mini-robot del NODO. Seguido de esto, se incrementa el registro DIRECCION utilizado como apuntador a la memoria EEPROM, para que, cuando entre en acción la siguiente interrupción de consulta, el dato de interés, sea apuntado correctamente. Posteriormente, comienza la etiqueta SAL_INT1 en la cual, se pone a “uno” el bit INT1 del registro definido como TEMP. El valor de dicho registro es copiado en el registro GIMSK para habilitar de nueva cuenta la interrupción de consulta y finalizando así la interrupción de consulta INT1.

65

SALCONSULTA

RETARDO6

RETARDO3

DIRECCION <- DIRECCION + 1

TEMP, INT1 <- 1

GIMSK <- TEMP

REGRESA DE LAINTERRUPCION

SAL_INT1:

SAL_CONSULTA:

RCALL RETARDO6 RCALL RETARDO3

INC DIRECCIONSAL_INT1:

LDI TEMP,(1<<INT1) OUT GIMSK, TEMP

RETI

Figura 65. Finalización de la Rutina de Interrupción de Consulta INT1.

En el Apéndice A se proporciona el código completo en lenguaje ensamblador del programa utilizado para este mini-robot.

66

CONCLUSIONES: Cuando se utilizan sensores como el QRD1114, es importante tomar en cuenta que son dispositivos que no están libres del ruido del ambiente, por ésto, es necesario tomar las medidas necesarias, sobre todo si se utilizan para habilitar interrupciones como en este proyecto. Este problema fue solucionado mediante retardos y verificación al inicio de ambas interrupciones (de aprendizaje y de consulta). Este mini-robot es un poco lento debido a la reducción (1:120) de los motor-reductores utilizados. Es posible aumentar su velocidad al cambiar los motor-reductores por unos con mayor velocidad, es decir, con menor reducción, sin embargo, al realizar el cambio de motor-reductores, será necesario modificar los retardos implicados, por ejemplo los retardos de los giros y validación de las interrupciones. Al final de este trabajo, se ha dejado el circuito montado sobre la tablilla de experimentación (protoboard), sin embargo, el circuito puede ser montado en una placa de circuito impreso como el propuesto en las Figuras 66, 67 y 68. Esto, ayudaría a que el mini-robot sea más ligero, además de evitar que las conexiones se modifiquen accidentalmente por cualquier motivo como: transporte, caídas, etc. Sería interesante realizar un algoritmo para que el mini-robot utilice la técnica de “rompimiento de muros”, en la cual, en la búsqueda de la meta, se deben contar los pasos hasta la meta final, una vez aprendida la ubicación de la meta, el mini-robot debe ir directamente a la salida del laberinto sin respetar las líneas. Resultaría también interesante realizar un algoritmo con alguna especie de barrido con láser, para que desde el inicio del camino el mini-robot sea capaz de saber en donde se encuentra la meta. Cabe destacar que puede utilizarse como control cualquier tipo de microcontrolador, sin embargo, se decidió trabajar con los microcontroladores AVR’s por tener una mayor experiencia en su manejo. Es recomendable utilizar un regulador de voltaje como el L4940V5 para alimentar el Driver L293B ya que, la corriente de salida del mismo dependerá del voltaje de alimentación, por lo tanto, si el voltaje de alimentación varía debido a la descarga de baterías, también será variable la velocidad con que giren los motor-reductores y se verán afectados los giros, ya que están implementados mediante retardos que han sido “calibrados” previamente (en la práctica: ensayo/error) para un voltaje de alimentación específico, que en este caso, es el proporcionado por el regulador de voltaje L4940V5.

67

Figura 66. Diseño del circuito impreso para el mini-robot móvil. Cara de los componentes.

Figura 67. Diseño del circuito impreso para el mini-robot móvil.

Cara de soldadura y pistas listo para imprimirse.

68

c)

Figura 68. Diseño del circuito impreso para el mini-robot móvil. Contraste.

69

BIBLIOGRAFIA: - Palacios, Enrique; Remiro; López. “Microcontrolador PIC16F84. Desarrollo de Proyectos.” Segunda Edición. Editorial Alfa omega-RaMa. - Barco; Imbacuan; Ordoñez. “Construcción de un robot seguidor de línea”. Universidad de Nariño Páginas Web. - http://www.architecthum.edu.mx/Architecthumtemp/colaboradores/letralaberinto.htm - http://www.monografias.com/trabajos31/robotica/robotica.shtml#concept - http://es.wikipedia.org/wiki/Laberinto#Clasificaci.C3.B3n_o_tipos_de_laberintos - http://www.robodacta.com - http://www.solaris-digital.com - http://www.yorobot.com/in.php?doc=334 - http://perso.wanadoo.es/luis_ju/ebasica2/mcc_03.html - http://mx.geocities.com/migsantiagov/avr/index.htm#iniciopag - http://www.avrfreaks.net - http://www.crya.com - http://www.agelectronica.com - http://www.atmel.com Hojas de especificaciones y otros documentos. - Datasheet. QRD1114. - Datasheet. L293B. - Datasheet. SN74LS32. - Datasheet. L4940V5. - Datasheet. ATMEGA8535. - Datasheet. AT90S2313. - Datasheet. ATTINY2313. - INSTRUCTION SET MANUAL. ATMEGA8535. - AVR100 (atmel.com) - Novice. (atmel.com) - Basic Interrupts and I/O. (atmel.com) - Accessing the EEPROM (atmel.com)

70

71

APENDICE A: Código completo para el mini-robot. ;****************************************************************

; PROGRAMA PARA QUE UN MINI-ROBOT

; LOCALIZE Y APRENDA LA RUTA DE SALIDA

; DE UN LABERINTO HECHO CON LINEAS NEGRAS

; SOBRE UN FONDO BLANCO.

; EL MICROCONTROLADOR A UTILIZAR ES EL ATTINY2313

;****************************************************************

.include "tn2313def.inc"

.ORG $0000

RJMP INICIO

.ORG INT0addr

RJMP INT_APRENDIZAJE

.ORG INT1addr

RJMP INT_CONSULTA

.EQU FIN_DER =6

.EQU ENMEDIO =7

.EQU FIN_IZQ =0

.EQU SL_IZQ =1

.EQU N_IZQ =1

.EQU N_DER =4

.EQU SL_DER =5

.EQU EN_IZQ =0

.EQU AD_IZQ =4

.EQU AT_IZQ =5

.EQU AT_DER =6

.EQU AD_DER =0

.EQU EN_DER =1

.EQU LED =2

.DEF AUX =R16

.DEF CONT1 =R17

.DEF CONT2 =R18

.DEF DIRECCION =R19

.DEF DATO =R20

.DEF BANDERA =R21

.DEF TEMP =R22

;********************************************

; SUBRUTINA DE INTERRUPCION

; DE CONSULTA DEL CAMINO

;********************************************

INT_CONSULTA:

LDI TEMP, (0<<INT1)

OUT GIMSK, TEMP

RCALL RETARDO6

SBIS PIND, 3

RJMP SAL_INT1

72

RCALL LEE_DATO

CPI DATO, 0X01

BREQ DATO_IZQ

CPI DATO, 0X02

BREQ DATO_ENF

CPI DATO, 0X03

BREQ DATO_DER

LDI TEMP, (1<<INT1)

OUT GIMSK, TEMP

RETI

DATO_IZQ:

SBIS PINA, N_IZQ

RJMP DATO_IZQ

RCALL VUELTA_IZQUIERDA

RJMP SAL_CONSULTA

DATO_ENF:

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RJMP SAL_CONSULTA

DATO_DER:

SBIS PINB, N_DER

RJMP DATO_DER

RCALL AVANZA

RCALL VUELTA_DERECHA

RCALL AVANZA

SAL_CONSULTA:

RCALL RETARDO6

RCALL RETARDO3

INC DIRECCION

SAL_INT1:

LDI TEMP, (1<<INT1)

OUT GIMSK, TEMP

RETI

;********************************************

; SUBRUTINA DE INTERRUPCION

; DE APRENDIZAJE

73

;********************************************

INT_APRENDIZAJE:

LDI TEMP, (0<<INT0)

OUT GIMSK, TEMP

RCALL RETARDO6

SBIS PIND, 2

RJMP SAL_IN_INT0

CBI PORTD, AT_IZQ

CBI PORTD, AT_DER

CBI PORTD, AD_IZQ

CBI PORTB, AD_DER

SBIS PINB, FIN_DER

RJMP CHECA_ENFRENTE

SAL_INT0:

RCALL RETARDO6

SAL_IN_INT0:

LDI TEMP, (1<<INT0)

OUT GIMSK, TEMP

RETI

CHECA_ENFRENTE:

SBIS PIND, SL_IZQ

SBIC PINB, SL_DER

RJMP CAMINO_ENFRENTE

SBIC PINA, N_IZQ

RJMP REFERENCIA1

CPI BANDERA, 0XFF

BREQ REFERENCIA2

RCALL AVANZA

RCALL VUELTA_DERECHA

RCALL AVANZA

SALIDA1:

RCALL GUARDA_DERECHA

LDI BANDERA, 0X00

INC DIRECCION

RJMP SAL_INT0

REFERENCIA1:

CPI BANDERA, 0XFF

BREQ REFERENCIA3

RCALL VUELTA_IZQUIERDA

SALIDA2:

RCALL GUARDA_IZQUIERDA

INC DIRECCION

74

RJMP SAL_INT0

REFERENCIA2:

RCALL AVANZA

RCALL VUELTA_DERECHA

RCALL AVANZA

DEC DIRECCION

RJMP SAL_INT0

REFERENCIA3:

SBIC PINB, N_DER

RJMP REFERENCIA4

RCALL VUELTA_IZQUIERDA

DEC DIRECCION

RJMP SAL_INT0

REFERENCIA4:

RCALL VUELTA_IZQUIERDA

RCALL LEE_DATO

CPI DATO, 0X01

BRNE SALIDA4

SALIDA3:

RCALL GUARDA_ENFRENTE

LDI BANDERA,0X00

INC DIRECCION

RJMP SAL_INT0

SALIDA4:

RCALL GUARDA_DERECHA

LDI BANDERA, 0X00

INC DIRECCION

RJMP SAL_INT0

CAMINO_ENFRENTE:

SBIC PINA, N_IZQ

RJMP REFERENCIA5

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

CPI BANDERA, 0XFF

BREQ SALIDA4

RJMP SALIDA3

REFERENCIA5:

CPI BANDERA, 0XFF

BREQ REFERENCIA6

RCALL VUELTA_IZQUIERDA

RJMP SALIDA2

REFERENCIA6:

75

SBIC PINB, N_DER

RJMP REFERENCIA4

RCALL VUELTA_IZQUIERDA

RJMP SALIDA4

;********************************************

; SUBRUTINAS PARA ESCRITURA Y

; LECTURA DE LA MEMORIA EEPROM

;********************************************

ESCRIBE:

SBIC EECR, EEPE

RJMP ESCRIBE

OUT EEAR,DIRECCION

OUT EEDR, DATO

CLI

SBI EECR, EEMPE

SBI EECR, EEPE

SEI

RET

LEE_DATO:

SBIC EECR,EEPE

RJMP LEE_DATO

OUT EEAR,DIRECCION

SBI EECR,EERE

IN DATO,EEDR

RET

;********************************************

; INICIO DEL PROGRAMA PRINCIPAL

;********************************************

INICIO:

LDI TEMP, low(RAMEND)

OUT SPL, TEMP

LDI TEMP, 0X01

OUT DDRA, TEMP

LDI TEMP, 0X07

OUT DDRB, TEMP

LDI TEMP, 0X70

OUT DDRD, TEMP

SBI PORTB, LED

CBI PORTD, AT_IZQ

CBI PORTD, AT_DER

SBI PORTD, AD_IZQ

SBI PORTB, AD_DER

LDI DIRECCION, 0X00

LDI TEMP, 0X00

OUT EECR, TEMP

LDI BANDERA, 0X00

76

LDI AUX, 0X0F

OUT MCUCR, AUX

SBIC PINB, 3

RJMP CONFIGURA_INT1

CONFIGURA_INT0:

LDI TEMP, (1<<INT0)

OUT GIMSK, TEMP

RJMP HA_TERMINADO

CONFIGURA_INT1:

LDI TEMP, (1<<INT1)

OUT GIMSK, TEMP

HA_TERMINADO:

SEI

SBI PORTA, EN_IZQ

SBI PORTB, EN_DER

SBIC PIND, FIN_IZQ

SBIS PINB, FIN_DER

RJMP SIGUE_LINEA

SBIC PINA, N_IZQ

SBIS PINB, N_DER

RJMP SIGUE_LINEA

SBIC PIND, SL_IZQ

SBIS PINB, SL_DER

RJMP SIGUE_LINEA

SBIS PINB, ENMEDIO

RJMP SIGUE_LINEA

TERMINA_LABERINTO:

LDI TEMP, (0<<INT0)+(0<<INT1)

OUT GIMSK, TEMP

LDI DATO, 0XFF

RCALL ESCRIBE

RCALL AVANZA

CBI PORTA, EN_IZQ

CBI PORTB, EN_DER

FIN:

RJMP FIN

SIGUE_LINEA:

SBIS PIND, SL_IZQ

RCALL RECTIFICA_IZQUIERDO

SBIS PINB, SL_DER

RCALL RECTIFICA_DERECHO

SBIC PINB, 3

RJMP HA_TERMINADO

PREGUNTA_CAMINO:

77

SBIS PIND, SL_IZQ

SBIC PINB, SL_DER

RJMP HA_TERMINADO

SBIC PINB, ENMEDIO

RJMP HA_TERMINADO

LDI TEMP, (0<<INT0)

OUT GIMSK, TEMP

RCALL GIRA_180

LDI BANDERA,0XFF

DEC DIRECCION

LDI TEMP, (1<<INT0)

OUT GIMSK, TEMP

RJMP HA_TERMINADO

;************************************************

; Zona de Subrutinas

;************************************************

GUARDA_IZQUIERDA:

LDI DATO, 0X01

RCALL ESCRIBE

RET

GUARDA_ENFRENTE:

LDI DATO, 0X02

RCALL ESCRIBE

RET

GUARDA_DERECHA:

LDI DATO, 0X03

RCALL ESCRIBE

RET

GIRA_180:

RCALL VUELTA_DERECHA

RCALL VUELTA_DERECHA

RCALL AVANZA

RET

RECTIFICA_IZQUIERDO:

SBIS PINB, SL_DER

RET

CBI PORTB, EN_DER

RCALL RETARDO1

SBI PORTB, EN_DER

RCALL RETARDO1

SBIS PIND, SL_IZQ

RJMP RECTIFICA_IZQUIERDO

RET

78

RECTIFICA_DERECHO:

SBIS PIND, SL_IZQ

RET

CBI PORTA, EN_IZQ

RCALL RETARDO5

SBI PORTA, EN_IZQ

RCALL RETARDO5

SBIS PINB, SL_DER

RJMP RECTIFICA_DERECHO

RET

RETARDO1:

LDI CONT2, 0X25

LOP3:

SBIS PINB, SL_DER

RET

DEC CONT2

BRNE LOP3

RET

VUELTA_IZQUIERDA:

SBI PORTA, EN_IZQ

SBI PORTB, EN_DER

CBI PORTD, AD_IZQ

CBI PORTD, AT_DER

SBI PORTD, AT_IZQ

SBI PORTB, AD_DER

RCALL RETARDO2

RCALL AVANZA

RCALL AVANZA

RCALL AVANZA

RET

VUELTA_DERECHA:

SBI PORTA, EN_IZQ

SBI PORTB, EN_DER

CBI PORTB, AD_DER

CBI PORTD, AT_IZQ

SBI PORTD, AT_DER

SBI PORTD, AD_IZQ

RCALL RETARDO4

RET

RETARDO2:

LDI AUX, 0X07

LOOP1:

LDI CONT1, 0XB5

LOOP2:

LDI CONT2, 0XF8

LOOP3:

79

DEC CONT2

BRNE LOOP3

DEC CONT1

BRNE LOOP2

DEC AUX

BRNE LOOP1

RET

AVANZA:

SBI PORTA, EN_IZQ

SBI PORTB, EN_DER

CBI PORTD, AT_IZQ

CBI PORTD, AT_DER

SBI PORTD, AD_IZQ

SBI PORTB, AD_DER

RCALL RETARDO3

RET

RETARDO3:

LDI CONT1, 0X29

LOOOP2:

LDI CONT2, 0XF7

LOOOP3:

DEC CONT2

BRNE LOOOP3

DEC CONT1

BRNE LOOOP2

RET

RETARDO4:

LDI AUX, 0X08

LOOOOP1:

LDI CONT1, 0X9B

LOOOOP2:

LDI CONT2, 0XF8

LOOOOP3:

DEC CONT2

BRNE LOOOOP3

DEC CONT1

BRNE LOOOOP2

DEC AUX

BRNE LOOOOP1

RET

RETARDO5:

LDI CONT2, 0X25

LOOOOOP3:

80

SBIS PIND, SL_IZQ

RET

DEC CONT2

BRNE LOOOOOP3

RET

RETARDO6:

LDI CONT1, 0X45

RLOP:

LDI CONT2, 0XF7

RLOP2:

DEC CONT2

BRNE RLOP2

DEC CONT1

BRNE RLOP

RET