Está en la página 1de 27

INGENIERIA EN ELECTRONICA

ROBOTICA

DISEO Y CONSTRUCCION DE UN ROBOT SUMO"

Alumno: Elfrich Gonzlez Arvalo Profesor: F. Hugo Ramrez Leyva

Huajuapan de Len, Oaxaca a 14 de Julio de 2009

RESUMEN
La presente propuesta es una solucin econmica y simple para construir un robot sumo. Tambin es un buen comienzo en el diseo de un robot para competencias formales. Aunque la mayor parte del diseo fue determinada por las caractersticas fsicas del chasis empleado (estructura mecnica), las ideas de la parte electrnica como usos de puentes H, reguladores de voltaje, ATMEGA8 (la parte de control, uso de ADCs, implementacin de rutinas, etc.) pueden ser aplicadas a cualquier robot sumo con ligeras modificaciones. Este diseo es sencillo y funcional, y con esto se cumplen los objetivos generales y especficos planteados para este proyecto.

INTRODUCCIN
Las competiciones de robots sumo son las ms viejas en el mundo, estas empezaron en el ao de 1970 en Japn. El concepto es el mismo como en las luchas sumo cuerpo a cuerpo de los seres humanos, dos oponentes cara a cara sobre un Dohyo (un ring de competicin circular con dos lneas de salida llamadas lneas shikiri). Cuando la pelea inicia, los concursantes intentan empujar al contrincante fuera del ring. Cuando uno de los participantes va a dar fuera del ring o toca el piso con cualquier parte de su cuerpo pierde la pelea. Hay seis categoras de peso: 25 g, 100 g, 500g, 1 Kg (LEGO), 3 Kg, 3 Kg (antropomorfo). La de 3 Kg cake-boxes y 3 kg (antropomorfo) pueden ser controladas remotamente o autnomos. Para todas las otras categoras son autnomos, el robot debe pensar por si mismo. Un robot sumo es aquel robot que debe empujar, tirar, voltear, resistir o intentar mover al robot oponente fuera del ring (pintado en color negro) de 1.5 m de dimetro en 3 minutos. Para esto se vale de sensores que lo comuniquen con el exterior, principalmente se usan los de presin, sonar, detectores de movimiento y detectores de colisin infrarrojos. REGLAS DE LA COMPETENCIA Los robots compiten tres veces y el ganador es el que haya ganado 2 encuentros. Los robots de 500 g, 1 kg (LEGO) y 3 Kg pueden tener cualquier altura inicial o ellos pueden crecer expandindose una vez que el encuentro inicie. Antes del encuentro, primero deben caber dentro de un cubo en relacin a su categora. Los robots de las categoras de 25 g y 100 g no pueden expandirse. Los robots Mini (500 g), Micro (100 g) y nano (25 g) deben ser autnomos. Cualquier mtodo de control puede ser usado. Tan largo como este completamente dentro del robot. La operacin del robot no debe ser menor de cinco segundos despus de iniciado por el usuario. La categora de 3 Kg (sumo y antropomorfo) pueden ser controlados remotamente. Los robots autnomos no deben iniciar su funcionamiento por un mnimo de cinco segundos despus de ser iniciados por el usuario. El dohyo para robots de 3 Kg es de 154 cm de dimetro. El ring para 500 g y 1 kg (LEGO) es de 77 cm de dimetro, para 100 g es de 38.5 cm de dimetro y para 25 g el dohyo es de 19.25 cm de dimetro. Dispositivos Jamming (como IR leds que intenten saturar los sensores IR de los oponentes) no estn permitidos. Partes que puedan daar o romper el ring no estn permitidas. Tampoco las partes que intenten daar al robot del oponente o al operador. Los empujones normales y golpes fuertes no son considerados intentos de dao. 2

Dispositivos que puedan almacenar lquidos, gas, fuego o cualquier otra sustancia para lanzar al oponente no estn permitidas. Dispositivos que lancen cosas al oponente no estn permitidas. Sustancias pegajosas para mejorar la traccin no estn permitidas. Llantas y otros componentes del robot en contacto con el ring no deben ser capaz de levantar y sujetar un estndar de 3 x 5 de index card por ms de 2segundos. Los dispositivos para aumentar la fuerza hacia abajo como bombas de vaco o magnetos, estn permitidos nicamente en la categora de 3 Kg. Todos los bordes (incluyendo, pero no limitando a la pala frontal) no deben sostener lo suficiente como para araar o daar el ring, otros robots o jugadores. Un encuentro ser una pelea de un total de tres minutos, iniciando y terminando por encima de las rdenes del jurado. El reloj iniciara cinco segundos despus del inicio anunciado.

SENSORES En el mercado estn disponibles sensores como los usados en el sonar o para detectar objetos, los siguientes son algunos de estos. MaxSonar-EZ1 Buscador de rango ultrasnico de alto desempeo. Bajo consumo de energa (2mA). Voltaje analgico y serial con salida de ancho de pulso. Costo: $29.95 www.maxbotix.com

Sensor de distancia. Basado en el sensor GP2D12. Protocolo I2C. Costo: $ 15.95 www.hvwtech.com

OBJETIVOS GENERALES
Los objetivos generales son el diseo y construccin de un modelo de robot sumo y una implementacin de un prototipo mvil de bajo costo, que sea autnomo, con la capacidad de reconocer a su adversario y capaz de ejecutar un algoritmo para la bsqueda y competencia dentro del ring.

OBJETIVOS ESPECFICOS
Prueba por separado de los integrados L298, 7805, MCP6549, sensores IR, 74LS04. Armado de la parte fsica del robot. Ubicacin de los sensores IR y del detector de colisin sobre el chasis del robot. Conexin y prueba entre los circuitos L298, 74LS04, MCP6549 y 7805. Asignacin de los pines a usar del ATMEGA8 para el control y uso de los L298 y los sensores IR. Pruebas sobre el control del L298 mediante PWM. Diseo del algoritmo de movimiento y respuesta para el ATMEGA8. Prueba del circuito completo (primera y segunda versin para del robot sumo).

DESCRIPCIN DEL SISTEMA


Esta parte del documento explica cuales fueron los pasos para la realizacin del proyecto. Para la parte electrnica se implementaron dos sistemas de adquisicin y lectura del estado de los sensores, una primera versin usando comparadores de voltaje mediante el circuito integrado MCP6549 y una segunda versin donde se implement la parte de comparacin usando los canales analgico-digital (ADCs) del ATMEGA8. La razn de esto fue porque en la primera versin no se considero la intensidad de luz natural y artificial que es reflejada por el ring. Esta intensidad de luz hace que los sensores entreguen un voltaje diferente bajo condiciones especficas de luz natural y artificial, con esto el comparador de voltaje MCP6549 no es capaz de adaptarse a los cambios en la intensidad de luz que se presentan en el entorno. Como resultado a veces no se detecta la lnea blanca que indica los lmites del Dohyo. Pero haciendo uso de los canales ADC del ATMEGA8 es posible tener rangos para la deteccin de la intensidad de luz variable del entorno. PARTE MECNICA Para empezar la construccin del robot sumo se pensaron en las siguientes cosas: Chasis: Uno que ya este fabricado como una caja de plstico o acrlico. Fcil y rpido de construir. Conseguirlo de un juguete existente. Generalmente fcil y bastante ms rpido, pero requiere de algunas adaptaciones. Un chasis de aluminio, como la tapa de una caja lectora de CD. Pero se necesitaba experiencia y herramientas para cortar el metal y darle la forma deseada. Ruedas: Unas 4 ruedas como mnimo, ya que necesitamos traccin y agarre sobre la superficie a la hora de empujar al contrincante. La direccin de las ruedas podra ser delantera o trasera. Direccin (traccin) por el mtodo del tanque (dos direcciones de ruedas independientes, dos motores). Direccin por el mtodo del automvil, un motor, con engranaje diferencial (complicado). 4

Motores: Voltaje de operacin alrededor de 6 a 12 volts. Afortunadamente se consigui de un carro de juguete a control remoto el chasis con ruedas y caja de engranajes, lo que hizo ms fcil y rpido el cumplimiento de los objetivos. Este carro de juguete ya contaba con la direccin por el mtodo del tanque. La figura 1 es un dibujo de este carro de juguete.

Figura 1. Diagrama del chasis y motores. Una vez teniendo el chasis, las ruedas y la caja de engranajes. El segundo paso fue la adaptacin de unas bases para los sensores IR (CNY-70 y HOA MEX 97-001). Estas fueron fabricadas de un cable bus IDE para computadora. La imagen de la figura 2 (a) base, b) sensor) muestra el diagrama de las bases as como la forma en la que encajan cada uno de los sensores. Estas bases se fabricaron con la finalidad de hacer fcil y rpido el proceso de cambio, chequeo y mantenimiento de los sensores IR.

Figura 2. a) Base para los sensores IR, b) Sensor IR. En la figura 3 se puede ver como quedo finalmente el chasis del robot y las ubicaciones de las bases para los sensores IR.

Figura 3. Presentacin final del chasis, ruedas y sensores IR. 5

En la figura 3 las bases de los sensores IR numero uno y dos sealan la parte delantera del robot sumo y las bases tres y cuatro estn en la parte trasera del robot. La posicin o distancia de las bases para los sensores tanto para la parte delantera o trasera fue asignada arbitrariamente, es decir, solo se considero donde podran quedar las mismas sin que estorbaran al usuario para el mantenimiento y estuvieran cerca de las ruedas. Finalmente la asignacin (numeracin) de los sensores quedo de la siguiente forma: De la figura 3 la base nmero 1 es para el sensor 1, la base nmero 2 es para la el sensor 2, y as sucesivamente hasta el sensor 4. El motor 1 es el motor que controla el lado izquierdo del robot, el motor 2 controla el lado derecho. PARTE ELECTRNICA Y SOFTWARE Puente H L298. El circuito de la figura 4 fue tomado de la hoja de datos del fabricante. La tabla 1 muestra los valores correspondientes para el correcto funcionamiento del integrado. El modo usado fue cuando Ven = H para las simulaciones. Pero el verdadero valor de Ven estar oscilando segn la salida del PWM, ya que para Ven = L, se detiene el motor.

Figura 4. Control bidireccional del motor de CD.

Tabla 1. Relacin de los valores C, D, Ven y funcin (adelante/atrs).

En el circuito de la figura 4 se encontr un error, ya que al probar exactamente ese circuito en el Proteus y fsicamente en el protoboard, este no haca nada. El problema fue que en el diagrama de la figura se omite la conexin de 2 pines del L298, que son necesarios para el funcionamiento del mismo. La solucin fue hallada en la misma hoja de datos del fabricante pero en un circuito diferente llamado circuito de prueba para tiempos de switcheo. Este diagrama es el siguiente.

Figura 5. Circuito de prueba de switcheo. Al comparar los circuitos de las figuras 4 y 5 se sabe que al circuito de la figura 4 le falta conectar el pin 1 y 15 a tierra, pero el pin 15 va sin resistencia Rs. En conclusin, el circuito de la figura 5 es el circuito complementario del circuito de la figura 4. Los diodos D1 a D4 del circuito en la figura 4 son diodos de proteccin. Ya que tienen la finalidad de servir de desahogo para que la corriente residual (manifestada como un chispazo) que aparece despus de que se apaga el motor no dae el circuito L298. Segn el tamao del motor y segn la corriente que est utilizando, esta chispa puede o no ser visible, pero siempre existe a menos que se coloque en paralelo con el motor un diodo de proteccin. Se utiliza una compuerta NOT (figura 9) para la activacin de cada sentido de giro del motor. Esta vez solo se usa una sola compuerta ya que con esto es suficiente para el funcionamiento del circuito (pines 10 y 12 del L298). Como se desea controlar dos motores (Figura 3) independientes se necesitan dos L298. Las conexiones entre estos dos integrados y los pines del ATMEGA8 quedaron como se describe a continuacin: PRIMER L298 Para el motor 1 (controla el lado izquierdo del robot, figura 3) tenemos: Pin 17 (PB3 del ATMEGA8) va al pin 10 del L298 y a uno de los pines de entrada de la compuerta NOT, la negacin (salida del NOT) va al pin 12. El pin 16 (PB2 del ATMEGA8) va al pin 11 del L298, este pin del microcontrolador es la salida del PWM (OC1B). SEGUNDO L298 Para el motor 2 (controla el lado derecho del robot, figura 3) tenemos: Pin 14 (PB0 del ATMEGA8) va al pin 10 del L298 y a otro de los pines de entrada de la compuerta NOT, la negacin (salida del NOT) va al pin 12. El pin 15 (PB1 del ATMEGA8) va al pin 11 del L298, este pin del microcontrolador es la salida del PWM (OC1A). Con esta asignacin dada se manejaron ambas versiones (I y II) de implementacin. SENSORES IR CNY-70 y HOA MEX 97-001 Para la prueba de los sensores IR se implemento el circuito de la figura 6. Este circuito tiene en la parte del receptor IR un diodo LED que se apaga cada vez que el transmisor del IR detecta una regin en color blanco.

Figura 6. Circuito para probar los sensores IR 7

Una vez probado el correcto funcionamiento de cada uno de los sensores IR con el circuito de la figura 6, se procedi a alambrar el mismo circuito de la figura pero sin el diodo LED. Este cambio de circuito se hizo porque el diodo LED de la figura 6 consume corriente que para nuestro robot es importante, ya que nicamente se cuenta con bateras de 6V a 600mAh para la alimentacin del robot y adems no es necesario el LED pues su fin era probar los sensores.

COMPUERTA NOT (74LS04) Esta compuerta lgica viene con seis entradas NOT como se observa en la figura 7. El voltaje de alimentacin tpico para este integrado es de 5V. El voltaje de entrada para que se considere en alto debe ser mayor o igual a 2V y menor o igual al voltaje de alimentacin, con esta consideracin la compuerta entregara a la salida un valor de 0V. En cambio, si el voltaje de entrada es menor a 2V entonces la compuerta tomara el voltaje de entrada como en bajo y su salida entregara 5V.

Figura 7. Compuerta 74LS04 (NOT).

REGULADOR DE VOLTAJE 7805 Entrega un voltaje de salida (Vout) de 5V. El voltaje de entrada (Vin) puede ser de hasta 12 volts. Este circuito fue usado para alimentar bsicamente a todos los otros circuitos integrados. La figura 8 muestra la configuracin para la aplicacin del circuito estndar.

Figura 8. Configuracin tpica del 7805.

PRIMERA VERSION PARA LA PROPUESTA DEL ROBOT SUMO A continuacin se describe la primera versin del Robot SUMO que se implemento usando comparadores de voltaje externos.

Figura 9. Circuito implementado para la primera versin del robot sumo. Los voltajes entregados por los sensores deben ser acondicionados para que el ATMEGA8 pueda procesarlos, estos valores son: para la regin negra los sensores entregan un voltaje de salida arriba de 4V aproximadamente, para la regin blanca los sensores dan 1.3V aproximadamente. Para este acondicionamiento se usa un comparador de voltaje (figura 10) que reciba los voltajes de cada uno de los sensores IR. As, a la salida del comparador tenemos 0V para 1.3V y 5V para 4V.

Figura 10. Circuito comparador de voltaje externo. La siguiente tabla muestra los valores de las resistencias (as como la relacin con el voltaje de referencia) para obtener un voltaje de referencia deseado a la salida del divisor de voltaje, este valor de referencia es tomado de acuerdo al voltaje que entregan los sensores IR.

Tabla 2. Valores de las resistencias para el divisor de voltaje. 9

10

La compuerta NOT (figura 9) es usada para que al ATMEGA8 trabaje correctamente, ya que este solo acepta niveles de voltaje de 0V o 5V (Off/On respectivamente). Esta compuerta entrega a su salida 0V cuando en su entrada hay un voltaje menor o igual a 1.5V, en otro caso entrega 5V. El principal problema con este tipo de comparador es que solo se puede detectar un solo rango de luminosidad, es decir que si la intensidad de luz aumenta, los lmites del voltaje inferior 1.3V (salida de los sensores) suben hasta 2 V, en caso contrario si la luminosidad disminuye el lmite inferior se mueve hasta 1V aproximadamente o menos, y con esto hay que modificar los valores del potencimetro o resistencia (divisor de voltaje R=200k, figura 10) que se est usando en el circuito comparador de voltaje. Esto hace tedioso el trabajar con ese circuito (figura 10) y lo deja propenso a errores, ya que podra haber mucha luz y el sensor siempre estara arrojando un valor de voltaje sobre la lnea blanca de aproximadamente 3 V (tabla 4) as la compuerta NOT (figura 10) siempre estara entregando 5V a la salida. Por lo tanto no se podra detectar el cambio de negro a blanco (y viceversa). Para solucionar este problema se implemento la versin 2 que se explica adelante.

La figura 11 muestra como quedo el robot sumo usando esta primera versin como solucin.

Figura 11. Imagen de la primera versin para el robot sumo.

10

11

SEGNDA VERSION PARA LA PROPUESTA DEL ROBOT SUMO

Figura 11. Circuito general de la segunda propuesta para el robot SUMO. Para esta segunda versin del robot, fue necesario llevar a cabo los siguientes objetivos: Caracterizacin de los sensores IR. Generacin de los rangos de operacin para abarcar los diferentes grados de intensidad luminosa. Implementacin del cdigo para el uso de los ADCs. La idea de usar los canales ADCs del ATMEGA8 es tener una exactitud mayor en la medicin sobre en qu regin estn los sensores (blanco o negro) . Para esto se considero que el ADC a usar del ATMEGA8 es de 8 bits con lo que la resolucin del micro seria de 5V/256 (5V es el voltaje de alimentacin de los sensores IR), esto nos da 256 niveles para representar las intensidades de luz que reciben los sensores IR. Con esto el lmite superior para indicar la regin negra es: 5V equivale a 255, la relacin para representar cualquier nivel de voltaje en el rango de 0V a 5V queda de la siguiente forma: X = (Vmedido*255)/5. Donde X es el valor que representa un nivel de voltaje dado.

CARACTERIZACION DE LOS SENSORES IR Para la caracterizacin de los sensores se tomaron intensidades de luz bajo varias condiciones como por ejemplo cuando a los sensores IR les tocaba un reflejo excesivo de luz (por la posicin o el ngulo de incidencia de la luz sobre la superficie del dohyo), o tambin cuando la sombra proyectada del robot protega a los sensores de este reflejo. La tabla 2 muestra los resultados de los voltajes medidos sobre la regin negra del dohyo. No se especifican las condiciones (con sombra o sin sombra) puesto que de estos resultados se tom el voltaje ms pequeo medido como referencia para el lmite inferior sobre la regin negra. El lmite superior siempre es tomado como 5V, puesto que es el voltaje mximo que los sensores podran arrojar sobre la superficie negra.

11

12

SENSOR 1 4.66 4.04 4.47 4.58 4.5 4.23 4.61 4.07 4.35 4.3 4.26 4.27

REGION EN NEGRO [en V] SENSOR 2 SENSOR 3 4.22 4.51 4.18 4.5 4.49 4.52 4.39 4.49 4.4 4.55 4.47 4.63 4.21 4.65 4.37 4.57 4.39 4.6 4.41 4.62 4.5 4.56 4.4 4.52

SENSOR 4 4.72 4.76 4.66 4.65 4.75 4.65 4.74 4.71 4.7 4.6 4.62 4.7

Tabla 3. Valores de voltajes obtenidos para las salidas de los sensores IR en la regin negra del dohyo.

Puesto que el valor mnimo para el voltaje sobre la regin negra est muy cercano a los 4V (tabla 3), este es el valor que se considero como lmite inferior para indicar la regin negra del dohyo. As el nivel inferior sobre la regin negra tiene el valor de 204 (4V). Para la regin blanca tenemos los siguientes valores de voltaje para cada uno de los sensores bajo las mismas condiciones (con sombra y sin sombra).

SENSOR 1 1.366 1.4 1.43 1.44 1.7 0.9 1.8 1.9 2 1.98 1.2 2.3

REGION EN BLANCO [en V] SENSOR 2 SENSOR 3 0.829 0.058 0.884 0.254 0.743 0.156 0.875 0.258 0.673 0.235 0.38 0.148 0.532 0.25 1.824 0.152 1.52 0.245 0.484 0.256 0.988 0.062 0.973 0.251

SENSOR 4 0.785 2.12 2.6 0.749 0.75 0.377 0.351 0.36 0.531 2.56 2.51 0.412

Tabla 4. Valores de voltajes obtenidos para las salidas de los sensores IR para la regin blanca del dohyo. La tabla 4 muestra los resultados de los voltajes medidos sobre la regin blanca del dohyo, esta regin es una lnea blanca con un grosor aproximado de 5cm. No se especifican las condiciones (con sombra o sin sombra) puesto que de estos resultados se tom el voltaje ms pequeo medido como referencia para el lmite inferior sobre la regin blanca. El lmite superior est muy cercano a los 3V. Puesto que el valor mnimo para el voltaje sobre la regin blanca est muy cercano a los 0V 12

13

(tabla 4), este es el valor que se considero como lmite inferior para indicar la regin blanca del dohyo. As el nivel superior sobre la regin blanca tiene el valor de 153 (3V). Para ambas versiones el detector de colisin fue implementado con un microswitch que se coloco en la parte delantera del chasis, la siguiente imagen muestra la ubicacin y el microswitch usado.

Figura 12. Imagen de la ubicacin del detector de colisin del robot sumo.

RESULTADOS
La mejor respuesta obtenida a la deteccin de la lnea blanca fue obtenida con la segunda versin del robot sumo, la primera versin a veces detectaba esta lnea pero por lo general presentaba problemas y complicaciones al momento del ajuste. La segunda versin para el robot sumo es ms rpida y fcil de modificar, puesto que los canales del ADC para su ajuste, solo se deben modificar unas cuantas lneas. El consumo de energa es mucho menor en la segunda versin pues se dejo de usar completamente el circuito comparador y la compuerta lgica NOT (figura 9).

CONCLUSIONES
La segunda versin como propuesta fue la mejor, pues consume menos energa, es ms fcil de conectar ya que la salida del sensor se pone directamente en la entrada de los canales del ADC del ATMEGA8. Tambin es ms fcil de modificar los rangos de deteccin, pues esto se hace mediante software. Se implementaron varios circuitos para el modulo de deteccin de colisiones, se prob con un sonar y un IR. El sonar presento el problema de que no se dispona de los transductores adecuados para la frecuencia de 40 Khz que se necesitaban para este circuito. El circuito IR en un inicio tena un exceso de alcance, aproximadamente 8 metros, pero con esto no se poda trabajar pues era mucha la distancia de deteccin, y cualquier objeto a esa distancia podra ser considerado como si estuviera dentro del dohyo. Se probaron otros circuitos, pero generalmente presentaban el problema que ahora el objeto tena que estar demasiado cerca para que se pudiera detectar (aproximadamente 2 cm). Finalmente se opto por usar un microswitch pues la conexin era ms sencilla y no se requera de varios elementos para su funcionamiento, nicamente de un capacitor.

BIBLIOGRAFA
[1] Dave Calkins, Robogames prep: Sumo robots- the easiest and hardest event there is, Servo Magazine, Mayo 2007 No. 5. [2] Owen Bishop, The Robot Builder's Cookbook, Elsevier Ltd., 2007. [3] John Iovine, Robots, Androids, and Animatrons, McGraw Hill, segunda edicin, 2002. [4] Fred Eady, The universal motor, Servo Magazine, Noviembre 2008, Vol. 6 No. 11. [5] John Blankenship, Samuel Mishal, A practical cuadrature encoder, Servo Magazine, Febrero 2009, Vol. 7 No. 2. [6] Dennis Clark, Ask Mr. Roboto, Servo Magazine, Junio 2008, Vol. 6 No. 6. 13

14

ANEXO
DIAGRAMA DE FLUJO PARA LA PRIMERA VERSION DE LA IMPLEMENTACIN
Inicio

Configuracin del los PWM (A y B) y puerto B del ATMEGA8. outb(DDRB, 0x0F); // set PB4-7 to input and PB0-3 to output outb(PORTB, 0xF0); // set PB4-7 to HIGH and PB0-3 to LOW pull-up Inicializacin de los PWM. Habilitacin de las INT0, INT1, globales. MCUCR=0x0F; //0x0f The rising edge of INT1 and INT0 generates an interrupt request GICR=0xC0;//Enable INT1 and INT0 sei(); //habilitamos las interrupciones globales

Adelante aux = 0x00F0 & inb(PINB); speed=100; sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output sbi(PORTB,3); // sets PB3 to output a HIGH timer1PWMASet(speed); timer1PWMBSet(speed); timerPause(300); //avanza 1200s adelante en total timer1PWMASet(0); timer1PWMBSet(0); Atrs aux == 0x0030 speed=100; sbi(DDRB, 0);// sets PB0 to be an output cbi(PORTB,0);// sets PB0 to output a LOW sbi(DDRB, 3);// sets PB3 to be an output cbi(PORTB,3);// sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(speed);

SI
aux == 0x0000 || aux == 0x00C0)

NO

aux == 0x00A0 Izquierda speed=500; sbi(DDRB, 0);// sets PB0 to be an output sbi(PORTB,0);// sets PB0 to output a HIGH sbi(DDRB, 3);// sets PB3 to be an output cbi(PORTB,3);// sets PB3 to output a LOW timer1PWMASet(100); timer1PWMBSet(speed);

aux == 0x0050

SR(INT1_vect) { sbi(DDRB, 0);// sets PB0 to be an output sbi(PORTB,0);// sets PB0 to output a HIGH sbi(DDRB, 3);// sets PB3 to be an output sbi(PORTB,3);// sets PB3 to output a HIGH timer1PWMASet(500); timer1PWMBSet(500); timer1PWMASet(0); timer1PWMBSet(0); PIND=PD3<<0; }

Derecha sbi(DDRB, 0);// sets PB0 to be an output cbi(PORTB,0);// sets PB0 to output a HIGH sbi(DDRB, 3);// sets PB3 to be an output sbi(PORTB,3);// sets PB3 to output a LOW timer1PWMASet(100); timer1PWMBSet(speed);

14

DIAGRAMA DE FLUJO PARA LA SEGUNDA VERSION DE LA IMPLEMENTACIN


Inicio

15

Configuracin del los PWM (A y B) y puerto B del ATMEGA8. outb(DDRB, 0x0F); // set PB4-7 to input and PB0-3 to output outb(PORTB, 0xF0); // set PB4-7 to HIGH and PB0-3 to LOW pull-up Inicializacin de los PWM. Habilitacin de las INT0, INT1, globales. MCUCR=0x0F; //0x0f The rising edge of INT1 and INT0 generates an interrupt request GICR=0xC0;//Enable INT1 and INT0 sei(); //habilitamos las interrupciones globales a2dSetPrescaler(ADC_PRESCALE_DIV32); a2dSetReference(ADC_REFERENCE_AVCC);

sensor1= sensor2= sensor3= sensor4=

a2dConvert8bit(0); //sensor 1 a2dConvert8bit(1); //sensor 2 a2dConvert8bit(2); //sensor 3 a2dConvert8bit(3); //sensor 4

aux = 0x0010 & inb(PINB);

Adelante speed=100; sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output sbi(PORTB,3); // sets PB3 to output a HIGH timer1PWMASet(speed); timer1PWMBSet(speed); timerPause(300); //avanza 1200s adelante en total timer1PWMASet(0); timer1PWMBSet(0); Atrs speed=100; sbi(DDRB, 0);// sets PB0 to be an output cbi(PORTB,0);// sets PB0 to output a LOW sbi(DDRB, 3);// sets PB3 to be an output cbi(PORTB,3);// sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(speed);

SI
(S1=S2=S3=S4=ALTO) (S1=S2=ALTO S3=S4=BAJO)

NO
S1=S2=BAJO S3=S4=ALTO

(S1=S3=S4=ALTO S2=BAJO) (S1=S3=ALTO S2=S4=BAJO)

Izquierda speed=500; sbi(DDRB, 0);// sets PB0 to be an output sbi(PORTB,0);// sets PB0 to output a HIGH sbi(DDRB, 3);// sets PB3 to be an output cbi(PORTB,3);// sets PB3 to output a LOW timer1PWMASet(100); timer1PWMBSet(speed);

(S1=BAJO S2=S3=S4=ALTO) (S1=S3=BAJO S2=S4=ALTO)

Derecha SR(INT1_vect) { sbi(DDRB, 0);// sets PB0 to be an output sbi(PORTB,0);// sets PB0 to output a HIGH sbi(DDRB, 3);// sets PB3 to be an output sbi(PORTB,3);// sets PB3 to output a HIGH timer1PWMASet(500); timer1PWMBSet(500); timer1PWMASet(0); timer1PWMBSet(0); PIND=PD3<<0; } sbi(DDRB, 0);// sets PB0 to be an output cbi(PORTB,0);// sets PB0 to output a HIGH sbi(DDRB, 3);// sets PB3 to be an output sbi(PORTB,3);// sets PB3 to output a LOW timer1PWMASet(100); timer1PWMBSet(speed);

ALTO=204 a 255 (4 a 5V) BAJO= 0 a 153 (0 a 3V) VALORES DE LA CONVERSION QUE ENTREGA EL ADC

15

16

CODIGO FUENTE PARA LA PRIMERA VERSION

#include <avr/io.h> // include I/O definitions (port names, pin names, etc) #include <avr/interrupt.h> // include interrupt support //#include <math.h> #include <stdlib.h> #include "global.h" // include our global settings #include "uart.h" // include uart function library //#include "rprintf.h" // include printf function library #include "timer.h" // include timer function library (timing, PWM, etc) //#include "vt100.h" // include VT100 terminal support #include <util/delay.h>

//s32 position0; s32 speed; int aux; int i; //ISR_ALIAS(INT1_vect, INT0_vect);

//----- Begin Code -----------------------------------------------------------int main(void) {

// initialize the timer system //int a; timerInit(); //------------ WM timer1PWMInit (8); timer1PWMAOn (); timer1PWMBOn (); //DDRB= 0x0F; outb(DDRB, 0x0F); outb(PORTB, 0xF0); //Interrupciones cbi(DDRD, 2); cbi(DDRD, 3); //outb(PORTD, 0x0C); cbi(DDRD, 3);

// set PB4-7 to input and PB0-3 to output // set PB4-7 to HIGH and PB0-3 to LOW pull-up // sets PC0 to be an input INT0 // sets PC0 to be an input INT1 // sets Pull-up to INT0 and INT1

// //

MCUCR=0x0F; //0x0f The rising edge of INT1 and INT0 generates an interrupt request GICR=0xC0;//Enable INT1 and INT0 //outp((1<<INT0)|(1<<INT1), GIMSK); 16

17

sei(); //habilitamos las interrupciones i=0; timerPause(5000);

while(1) { speed=150; //a = inb(PINB); aux = 0x00F0 & inb(PINB); if (aux == 0x0000 || aux == 0x00C0 ) //para Adelante { if(i<=1) { speed=100; sbi(DDRB, 0); sbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3);

// sets PB0 to be an output // sets PB0 to output a HIGH // sets PB3 to be an output // sets PB3 to output a HIGH

timer1PWMASet(speed); timer1PWMBSet(speed); timerPause(300); //avanza 1200s adelante en total timer1PWMASet(0); timer1PWMBSet(0); i=i+1; } if(i==2) { //para giro a la izq speed=500; sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a LOW sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a HIGH timer1PWMASet(speed-400); timer1PWMBSet(speed); i=0; 17

18

timerPause(1000); } timer1PWMASet(0); //espera evento timer1PWMBSet(0); timerPause(4000); }

if (aux == 0x0030) //para Atras { speed=100; sbi(DDRB, 0); // sets PB0 to be an output cbi(PORTB,0); // sets PB0 to output a LOW sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(speed); }

if (aux == 0x00A0)//||aux == 0x0020||aux == 0x0080) //para giro a la izq { speed=500; sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(100); timer1PWMBSet(speed); }

if (aux == 0x0050)//||aux == 0x0010||aux == 0x0040) //para giro a la der { sbi(DDRB, 0); // sets PB0 to be an output cbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output sbi(PORTB,3); // sets PB3 to output a LOW

18

19

timer1PWMASet(100); timer1PWMBSet(speed); }

} timer1PWMAOff (); timer1PWMBOff (); return 0; } /* ISR(INT0_vect) { //se va para tras,ya que esta en la linea,sino se sale //misma rutina que hacia tras speed=100; sbi(DDRB, 0); // sets PB0 to be an output cbi(PORTB,0); // sets PB0 to output a LOW sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(speed); _delay_ms(120); //timerPause(1); speed=0; timer1PWMASet(0); timer1PWMBSet(0); PIND=PD2<<0; }*/ ISR(INT1_vect) { // se avienta con el cycleduty al 100% hacia delante

sbi(DDRB, 0); sbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3); timer1PWMASet(500); timer1PWMBSet(500);

// sets PB0 to be an output // sets PB0 to output a HIGH // sets PB3 to be an output // sets PB3 to output a HIGH

19

20

_delay_ms(120); _delay_ms(120); //timerPause(1); speed=0; timer1PWMASet(0); timer1PWMBSet(0); PIND=PD3<<0; }

CODIGO FUENTE PARA LA SEGUNDA VERSION #include <avr/io.h> #include <avr/interrupt.h> #include "global.h" #include "uart.h" #include "timer.h" #include "a2d.h" #include <util/delay.h> int i; int main(void) { int aux; s32 speed; unsigned char sensor1; //4 unsigned char sensor2; //5 unsigned char sensor3; //6 unsigned char sensor4; //7 // initialize the timer system //int a; timerInit(); // turn on and initialize A/D converter a2dInit(); //------------ WM timer1PWMInit (8); timer1PWMAOn (); timer1PWMBOn (); a2dSetPrescaler(ADC_PRESCALE_DIV32); 20 // include I/O definitions (port names, pin names, etc) // include interrupt support // include our global settings // include uart function library // include timer function library (timing, PWM, etc) // include A/D converter function library

21

a2dSetReference(ADC_REFERENCE_AVCC); // configure a2d port (PORTC) as input // so we can receive analog signals DDRC = 0x00; // make sure pull-up resistors are turned off PORTC = 0x00; //outb(DDRB, 0x0F); // set PB4-7 to input and PB0-3 to output DDRB=0x0F; cbi(DDRD, 3); MCUCR=0x0F; //0x0f The rising edge of INT1 and INT0 generates an interrupt request GICR=0xC0;//Enable INT1 and INT0 sei(); //habilitamos las interrupciones i=0; timerPause(4000);

while(1) { speed=100; sensor1= a2dConvert8bit(0); //sensor 1 sensor2= a2dConvert8bit(1); //sensor 2 sensor3= a2dConvert8bit(2); //sensor 3 sensor4= a2dConvert8bit(3); //sensor 4 aux = 0x0010 & inb(PIND);

if (aux == 0x0010) //para { if(i==5) { timer1PWMASet(0); timer1PWMBSet(0); sbi(DDRD, 6); sbi(PORTD,6); sbi(DDRD, 7); sbi(PORTD,7); i=0;

// sets PB0 to be an output // sets PB0 to output a HIGH // sets PB0 to be an output // sets PB0 to output a HIGH 21

22

} }

if {

(aux == 0x0000) //para

sbi(DDRD, 6); cbi(PORTD,6); sbi(DDRD, 7); cbi(PORTD,7); }

// sets PB0 to be an output // sets PB0 to output a LOW // sets PB0 to be an output // sets PB0 to output a HIGH

//----------------- ADELANTE if( ((sensor1>204) && (sensor1<255))&& ((sensor2>204) && (sensor2<255))&& ((sensor3>204) && (sensor3<255))&& ((sensor4>204) && (sensor4<255)))//para Adelante { speed=80; sbi(DDRB, 0); sbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3);

// sets PB0 to be an output // sets PB0 to output a HIGH // sets PB3 to be an output // sets PB3 to output a HIGH

timer1PWMASet(speed); timer1PWMBSet(speed); }

if( ((sensor1>204) && (sensor1<255))&& ((sensor2>204) && (sensor2<255))&& ((sensor3>0) && (sensor3<153))&& ((sensor4>0) && (sensor4<153)))//para Adelante { speed=100; sbi(DDRB, 0); sbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3);

// sets PB0 to be an output // sets PB0 to output a HIGH // sets PB3 to be an output // sets PB3 to output a HIGH 22

23

timer1PWMASet(speed); timer1PWMBSet(speed); }

//---------------------------------------------------------

//--------------------------------------------ATRAS if( ((sensor1>0) && (sensor1<153))&& ((sensor2>0) && (sensor2<153))&& ((sensor3>204) && (sensor3<255))&& ((sensor4>204) && (sensor4<255)))//para Atras {

GIFR=0x40; GIFR=0x00;

timer1PWMASet(0); //espera evento timer1PWMBSet(0); //if(i<=1) // { speed=100; sbi(DDRB, 0); // sets PB0 to be an output cbi(PORTB,0); // sets PB0 to output a LOW sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(speed); timerPause(500); timer1PWMASet(0); //espera evento timer1PWMBSet(0); timerPause(500); i=i+1; }

// //

//if(i==2) // { 23

24

//giro a la izq speed=500; sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a LOW sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a HIGH timer1PWMASet(speed); timer1PWMBSet(100); // i=0; timerPause(1000); // } timer1PWMASet(0); //espera evento timer1PWMBSet(0); timerPause(4000); } speed=500; //--------------------------------------------------------------//-------------DERECHA if( ((sensor1>204) && (sensor1<255))&& ((sensor2>204) && (sensor2<255))&& ((sensor3>0) && (sensor3<153))&& ((sensor4>204) && (sensor4<255)))//giro para la derecha { sbi(DDRB, 0); cbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3); // sets PB0 to be an output // sets PB0 to output a HIGH // sets PB3 to be an output // sets PB3 to output a LOW

timer1PWMASet(100); timer1PWMBSet(speed); }

if( ((sensor1>0) && (sensor1<153))&& ((sensor2>204) && (sensor2<255))&& ((sensor3>204) && (sensor3<255))&& ((sensor4>204) && (sensor4<255)))//giro para la derecha { sbi(DDRB, 0); cbi(PORTB,0); sbi(DDRB, 3); // sets PB0 to be an output // sets PB0 to output a LOW // sets PB3 to be an output 24

25

sbi(PORTB,3);

// sets PB3 to output a HIGH

timer1PWMASet(100); timer1PWMBSet(speed);

if( ((sensor1>0) && (sensor1<153))&& ((sensor2>204) && (sensor2<255))&& ((sensor3>0) && (sensor3<153))&& ((sensor4>204) && (sensor4<255)))//giro para la derecha { sbi(DDRB, 0); cbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3); // sets PB0 to be an output // sets PB0 to output a LOW // sets PB3 to be an output // sets PB3 to output a HIGH

timer1PWMASet(100); timer1PWMBSet(speed); }

//----------------------------------------//---------- IZQUIERDA if( ((sensor1>204) && (sensor1<255))&& ((sensor2>0) && (sensor2<153))&& ((sensor3>204) && (sensor3<255))&& ((sensor4>204) && (sensor4<255)))//giro para la izq { sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(100); } if( ((sensor1>204) && (sensor1<255))&& ((sensor2>204) && (sensor2<255))&& ((sensor3>204) && (sensor3<255))&& 25

26

((sensor4>0) && (sensor4<153)))//giro para la izq { sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(100); }

if( ((sensor1>204) && (sensor1<255))&& ((sensor2>0) && (sensor2<153))&& ((sensor3>204) && (sensor3<255))&& ((sensor4>0) && (sensor4<153)))//giro para la izq { sbi(DDRB, 0); // sets PB0 to be an output sbi(PORTB,0); // sets PB0 to output a HIGH sbi(DDRB, 3); // sets PB3 to be an output cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(speed); timer1PWMBSet(100); }

//------------------------------------------------------}

timer1PWMAOff (); timer1PWMBOff (); return 0; }

ISR(INT0_vect) { //se va para tras,ya que esta en la linea,sino se sale //misma rutina que hacia tras sbi(DDRB, 0); // sets PB0 to be an output cbi(PORTB,0); // sets PB0 to output a LOW sbi(DDRB, 3); // sets PB3 to be an output 26

27

cbi(PORTB,3); // sets PB3 to output a LOW timer1PWMASet(200); timer1PWMBSet(200); timerPause(500); //_delay_ms(120); //timerPause(1); timer1PWMASet(0); timer1PWMBSet(0); PIND=PD2<<0; }

ISR(INT1_vect) { // se avienta con el cycleduty al 100% hacia delante i=i+1; sbi(DDRB, 0); sbi(PORTB,0); sbi(DDRB, 3); sbi(PORTB,3); timer1PWMASet(500); timer1PWMBSet(500); _delay_ms(120); //_delay_ms(120); //timerPause(1); timer1PWMASet(0); timer1PWMBSet(0); PIND=PD3<<0; } // sets PB0 to be an output // sets PB0 to output a HIGH // sets PB3 to be an output // sets PB3 to output a HIGH

27

También podría gustarte