Robot Sumo

27
INGENIERIA EN ELECTRONICA ROBOTICA “DISEÑO Y CONSTRUCCION DE UN ROBOT SUMO" Alumno: Elfrich González Arévalo Profesor: F. Hugo Ramírez Leyva Huajuapan de León, Oaxaca a 14 de Julio de 2009

Transcript of Robot Sumo

Page 1: Robot Sumo

INGENIERIA EN ELECTRONICA ROBOTICA

“DISEÑO Y CONSTRUCCION DE UN ROBOT SUMO"

Alumno: Elfrich González Arévalo

Profesor:

F. Hugo Ramírez Leyva

Huajuapan de León, Oaxaca a 14 de Julio de 2009

Page 2: Robot Sumo

2

2

RESUMEN La presente propuesta es una solución económica y simple para construir un robot sumo. También es un buen comienzo en el diseño de un robot para competencias formales. Aunque la mayor parte del diseño fue determinada por las características físicas del chasis empleado (estructura mecánica), las ideas de la parte electrónica como usos de puentes H, reguladores de voltaje, ATMEGA8 (la parte de control, uso de ADC’s, implementación de rutinas, etc.) pueden ser aplicadas a cualquier robot sumo con ligeras modificaciones. Este diseño es sencillo y funcional, y con esto se cumplen los objetivos generales y específicos planteados para este proyecto.

INTRODUCCIÓN Las competiciones de robots sumo son las más viejas en el mundo, estas empezaron en el año de 1970 en Japón. 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 competición circular con dos líneas de salida llamadas líneas 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 categorías 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 autónomos. Para todas las otras categorías son autónomos, 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 diámetro en 3 minutos. Para esto se vale de sensores que lo comuniquen con el exterior, principalmente se usan los de presión, sonar, detectores de movimiento y detectores de colisión 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” expandiéndose una vez que el encuentro inicie. Antes del encuentro, primero deben caber dentro de un cubo en relación a su categoría. Los robots de las categorías de 25 g y 100 g no pueden expandirse.

• Los robots Mini (500 g), Micro (100 g) y nano (25 g) deben ser autónomos. Cualquier método de control puede ser usado. Tan largo como este completamente dentro del robot. La operación del robot no debe ser menor de cinco segundos después de iniciado por el usuario. La categoría de 3 Kg (sumo y antropomorfo) pueden ser controlados remotamente.

• Los robots autónomos no deben iniciar su funcionamiento por un mínimo de cinco segundos después de ser iniciados por el usuario.

• El dohyo para robots de 3 Kg es de 154 cm de diámetro. El ring para 500 g y 1 kg (LEGO) es de 77 cm de diámetro, para 100 g es de 38.5 cm de diámetro y para 25 g el dohyo es de 19.25 cm de diámetro.

• Dispositivos Jamming (como IR leds que intenten saturar los sensores IR de los oponentes) no están permitidos.

• Partes que puedan dañar o romper el ring no están permitidas. Tampoco las partes que intenten dañar al robot del oponente o al operador. Los empujones normales y golpes fuertes no son considerados intentos de daño.

Page 3: Robot Sumo

3

3

• Dispositivos que puedan almacenar líquidos, gas, fuego o cualquier otra sustancia para lanzar al oponente no están permitidas.

• Dispositivos que lancen cosas al oponente no están permitidas. • Sustancias pegajosas para mejorar la tracción no están permitidas. Llantas y otros

componentes del robot en contacto con el ring no deben ser capaz de levantar y sujetar un estándar de 3” x 5” de index card por más de 2segundos.

• Los dispositivos para aumentar la fuerza hacia abajo como bombas de vacío o magnetos, están permitidos únicamente en la categoría de 3 Kg.

• Todos los bordes (incluyendo, pero no limitando a la pala frontal) no deben sostener lo suficiente como para arañar o dañar 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 después del inicio anunciado.

SENSORES En el mercado están disponibles sensores como los usados en el sonar o para detectar objetos, los siguientes son algunos de estos.

MaxSonar-EZ1 • Buscador de rango ultrasónico de alto desempeño. • Bajo consumo de energía (2mA). • Voltaje analógico 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

Page 4: Robot Sumo

4

4

OBJETIVOS GENERALES Los objetivos generales son el diseño y construcción de un modelo de robot sumo y una implementación de un prototipo móvil de bajo costo, que sea autónomo, con la capacidad de reconocer a su adversario y capaz de ejecutar un algoritmo para la búsqueda y competencia dentro del ring.

OBJETIVOS ESPECÍFICOS

• Prueba por separado de los integrados L298, 7805, MCP6549, sensores IR, 74LS04. • Armado de la parte física del robot. • Ubicación de los sensores IR y del detector de colisión sobre el chasis del robot. • Conexión y prueba entre los circuitos L298, 74LS04, MCP6549 y 7805. • Asignación 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. • Diseño del algoritmo de movimiento y respuesta para el ATMEGA8. • Prueba del circuito completo (primera y segunda versión para del robot sumo).

DESCRIPCIÓN DEL SISTEMA Esta parte del documento explica cuales fueron los pasos para la realización del proyecto. Para la parte electrónica se implementaron dos sistemas de adquisición y lectura del estado de los sensores, una primera versión usando comparadores de voltaje mediante el circuito integrado MCP6549 y una segunda versión donde se implementó la parte de comparación usando los canales analógico-digital (ADC’s) del ATMEGA8. La razón de esto fue porque en la primera versión 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 específicas 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 línea blanca que indica los límites del Dohyo. Pero haciendo uso de los canales ADC del ATMEGA8 es posible tener rangos para la detección de la intensidad de luz variable del entorno. PARTE MECÁNICA Para empezar la construcción del robot sumo se pensaron en las siguientes cosas: Chasis:

• Uno que ya este fabricado como una caja de plástico o acrílico. Fácil y rápido de construir. • Conseguirlo de un juguete existente. Generalmente fácil y bastante más rápido, 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 mínimo, ya que necesitamos tracción y agarre sobre la superficie a la hora de empujar al contrincante.

• La dirección de las ruedas podría ser delantera o trasera. • Dirección (tracción) por el método del tanque (dos direcciones de ruedas independientes,

dos motores). • Dirección por el método del automóvil, un motor, con engranaje diferencial (complicado).

Page 5: Robot Sumo

5

5

Motores: • Voltaje de operación 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 más fácil y rápido el cumplimiento de los objetivos. Este carro de juguete ya contaba con la dirección por el método 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 adaptación 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 fácil y rápido 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. Presentación final del chasis, ruedas y sensores IR.

Page 6: Robot Sumo

6

6

En la figura 3 las bases de los sensores IR numero uno y dos señalan la parte delantera del robot sumo y las bases tres y cuatro están en la parte trasera del robot. La posición o distancia de las bases para los sensores tanto para la parte delantera o trasera fue asignada arbitrariamente, es decir, solo se considero donde podrían quedar las mismas sin que estorbaran al usuario para el mantenimiento y estuvieran cerca de las ruedas. Finalmente la asignación (numeración) de los sensores quedo de la siguiente forma: De la figura 3 la base número 1 es para el sensor 1, la base número 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 ELECTRÓNICA 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 según la salida del PWM, ya que para Ven = L, se detiene el motor.

Figura 4. Control bidireccional del motor de CD.

Tabla 1. Relación de los valores C, D, Ven y función (adelante/atrás).

En el circuito de la figura 4 se encontró un error, ya que al probar exactamente ese circuito en el Proteus y físicamente en el protoboard, este no hacía nada. El problema fue que en el diagrama de la figura se omite la conexión de 2 pines del L298, que son necesarios para el funcionamiento del mismo. La solución 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.

Page 7: Robot Sumo

7

7

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 conclusión, 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 protección. Ya que tienen la finalidad de servir de desahogo para que la corriente residual (manifestada como un chispazo) que aparece después de que se apaga el motor no dañe el circuito L298. Según el tamaño del motor y según 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 protección. Se utiliza una compuerta NOT (figura 9) para la activación 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 continuación: 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 negación (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 negación (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 asignación dada se manejaron ambas versiones (I y II) de implementación. 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 región en color blanco.

Figura 6. Circuito para probar los sensores IR

Page 8: Robot Sumo

8

8

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 baterías de 6V a 600mAh para la alimentación del robot y además no es necesario el LED pues su fin era probar los sensores. COMPUERTA NOT (74LS04) Esta compuerta lógica viene con seis entradas NOT como se observa en la figura 7. El voltaje de alimentación típico 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 alimentación, con esta consideración 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 básicamente a todos los otros circuitos integrados. La figura 8 muestra la configuración para la aplicación del circuito estándar.

Figura 8. Configuración típica del 7805.

Page 9: Robot Sumo

9

9

PRIMERA VERSION PARA LA PROPUESTA DEL ROBOT SUMO A continuación se describe la primera versión del Robot SUMO que se implemento usando comparadores de voltaje externos. Los voltajes entregados por los sensores deben ser acondicionados para que el ATMEGA8 pueda procesarlos, estos valores son: para la región negra los sensores entregan un voltaje de salida arriba de 4V aproximadamente, para la región 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 relación 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.

Figura 9. Circuito implementado para la primera versión del robot sumo.

Page 10: Robot Sumo

10

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 límites del voltaje inferior 1.3V (salida de los sensores) suben hasta 2 V, en caso contrario si la luminosidad disminuye el límite inferior se mueve hasta 1V aproximadamente o menos, y con esto hay que modificar los valores del potenciómetro 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 podría haber mucha luz y el sensor siempre estaría arrojando un valor de voltaje sobre la línea blanca de aproximadamente 3 V (tabla 4) así la compuerta NOT (figura 10) siempre estaría entregando 5V a la salida. Por lo tanto no se podría detectar el cambio de negro a blanco (y viceversa). Para solucionar este problema se implemento la versión 2 que se explica adelante. La figura 11 muestra como quedo el robot sumo usando esta primera versión como solución.

Figura 11. Imagen de la primera versión para el robot sumo.

Page 11: Robot Sumo

11

11

SEGÚNDA VERSION PARA LA PROPUESTA DEL ROBOT SUMO Para esta segunda versión del robot, fue necesario llevar a cabo los siguientes objetivos:

• Caracterización de los sensores IR. • Generación de los rangos de operación para abarcar los diferentes grados de intensidad

luminosa. • Implementación del código para el uso de los ADC´s.

La idea de usar los canales ADC’s del ATMEGA8 es tener una exactitud mayor en la medición sobre en qué región están los sensores (blanco o negro) . Para esto se considero que el ADC a usar del ATMEGA8 es de 8 bits con lo que la resolución del micro seria de 5V/256 (5V es el voltaje de alimentación de los sensores IR), esto nos da 256 niveles para representar las intensidades de luz que reciben los sensores IR. Con esto el límite superior para indicar la región negra es: 5V equivale a 255, la relación 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 caracterización 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 posición o el ángulo de incidencia de la luz sobre la superficie del dohyo), o también cuando la sombra proyectada del robot protegía a los sensores de este reflejo. La tabla 2 muestra los resultados de los voltajes medidos sobre la región negra del dohyo. No se especifican las condiciones (con sombra o sin sombra) puesto que de estos resultados se tomó el voltaje más pequeño medido como referencia para el límite inferior sobre la región negra. El límite superior siempre es tomado como 5V, puesto que es el voltaje máximo que los sensores podrían arrojar sobre la superficie negra.

Figura 11. Circuito general de la segunda propuesta para el robot SUMO.

Page 12: Robot Sumo

12

12

REGION EN NEGRO [en V]

SENSOR 1 SENSOR 2 SENSOR 3 SENSOR 4

4.66 4.22 4.51 4.72

4.04 4.18 4.5 4.76

4.47 4.49 4.52 4.66

4.58 4.39 4.49 4.65

4.5 4.4 4.55 4.75

4.23 4.47 4.63 4.65

4.61 4.21 4.65 4.74

4.07 4.37 4.57 4.71

4.35 4.39 4.6 4.7

4.3 4.41 4.62 4.6

4.26 4.5 4.56 4.62

4.27 4.4 4.52 4.7

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

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

REGION EN BLANCO [en V]

SENSOR 1 SENSOR 2 SENSOR 3 SENSOR 4

1.366 0.829 0.058 0.785

1.4 0.884 0.254 2.12

1.43 0.743 0.156 2.6

1.44 0.875 0.258 0.749

1.7 0.673 0.235 0.75

0.9 0.38 0.148 0.377

1.8 0.532 0.25 0.351

1.9 1.824 0.152 0.36

2 1.52 0.245 0.531

1.98 0.484 0.256 2.56

1.2 0.988 0.062 2.51

2.3 0.973 0.251 0.412

Tabla 4. Valores de voltajes obtenidos para las salidas de los sensores IR para la región blanca del dohyo.

La tabla 4 muestra los resultados de los voltajes medidos sobre la región blanca del dohyo, esta región es una línea 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 más pequeño medido como referencia para el límite inferior sobre la región blanca. El límite superior está muy cercano a los 3V. Puesto que el valor mínimo para el voltaje sobre la región blanca está muy cercano a los 0V

Page 13: Robot Sumo

13

13

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

Figura 12. Imagen de la ubicación del detector de colisión del robot sumo.

RESULTADOS La mejor respuesta obtenida a la detección de la línea blanca fue obtenida con la segunda versión del robot sumo, la primera versión a veces detectaba esta línea pero por lo general presentaba problemas y complicaciones al momento del ajuste. La segunda versión para el robot sumo es más rápida y fácil de modificar, puesto que los canales del ADC para su ajuste, solo se deben modificar unas cuantas líneas. El consumo de energía es mucho menor en la segunda versión pues se dejo de usar completamente el circuito comparador y la compuerta lógica NOT (figura 9).

CONCLUSIONES La segunda versión como propuesta fue la mejor, pues consume menos energía, es más fácil de conectar ya que la salida del sensor se pone directamente en la entrada de los canales del ADC del ATMEGA8. También es más fácil de modificar los rangos de detección, pues esto se hace mediante software. Se implementaron varios circuitos para el modulo de detección de colisiones, se probó con un sonar y un IR. El sonar presento el problema de que no se disponía de los transductores adecuados para la frecuencia de 40 Khz que se necesitaban para este circuito. El circuito IR en un inicio tenía un exceso de alcance, aproximadamente 8 metros, pero con esto no se podía trabajar pues era mucha la distancia de detección, y cualquier objeto a esa distancia podría ser considerado como si estuviera dentro del dohyo. Se probaron otros circuitos, pero generalmente presentaban el problema que ahora el objeto tenía que estar demasiado cerca para que se pudiera detectar (aproximadamente 2 cm). Finalmente se opto por usar un microswitch pues la conexión era más sencilla y no se requería de varios elementos para su funcionamiento, únicamente de un capacitor.

BIBLIOGRAFÍA [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 edición, 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.

Page 14: Robot Sumo

14

14

Configuración 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

Inicialización de los PWM.

Habilitación 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

Inicio

aux = 0x00F0 & inb(PINB);

aux == 0x0000 || aux ==

0x00C0)

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

Adelante

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

Atrás

aux == 0x00A0

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

Izquierda

aux == 0x0050

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

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;

}

SI

NO

DIAGRAMA DE FLUJO PARA LA PRIMERA VERSION DE LA IMPLEMENTACIÓN

ANEXO

Page 15: Robot Sumo

15

15

Configuración 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

Inicialización de los PWM.

Habilitación 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);

Inicio

aux = 0x0010 & inb(PINB);

(S1=S2=S3=S4=ALTO)

(S1=S2=ALTO

S3=S4=BAJO)

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

Adelante

S1=S2=BAJO

S3=S4=ALTO 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);

Atrás

(S1=S3=S4=ALTO

S2=BAJO)

(S1=S3=ALTO

S2=S4=BAJO)

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

Izquierda

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

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

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

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;

}

SI

NO

sensor1= a2dConvert8bit(0); //sensor 1

sensor2= a2dConvert8bit(1); //sensor 2

sensor3= a2dConvert8bit(2); //sensor 3

sensor4= a2dConvert8bit(3); //sensor 4

ALTO=204 a 255 (4 a 5V)

BAJO= 0 a 153 (0 a 3V)

VALORES DE LA CONVERSION QUE

ENTREGA EL ADC

DIAGRAMA DE FLUJO PARA LA SEGUNDA VERSION DE LA IMPLEMENTACIÓN

Page 16: Robot Sumo

16

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

//Interrupciones

// cbi(DDRD, 2); // sets PC0 to be an input INT0

// cbi(DDRD, 3); // sets PC0 to be an input INT1

//outb(PORTD, 0x0C); // sets Pull-up to INT0 and INT1

cbi(DDRD, 3);

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

Page 17: Robot Sumo

17

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

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;

Page 18: Robot Sumo

18

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

Page 19: Robot Sumo

19

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

Page 20: Robot Sumo

20

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 I/O definitions (port names, pin names, etc)

#include <avr/interrupt.h> // include interrupt support

#include "global.h" // include our global settings

#include "uart.h" // include uart function library

#include "timer.h" // include timer function library (timing, PWM, etc)

#include "a2d.h" // include A/D converter function library

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

Page 21: Robot Sumo

21

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); // sets PB0 to be an output

sbi(PORTD,6); // sets PB0 to output a HIGH

sbi(DDRD, 7); // sets PB0 to be an output

sbi(PORTD,7); // sets PB0 to output a HIGH

i=0;

Page 22: Robot Sumo

22

22

}

}

if (aux == 0x0000) //para

{

sbi(DDRD, 6); // sets PB0 to be an output

cbi(PORTD,6); // sets PB0 to output a LOW

sbi(DDRD, 7); // sets PB0 to be an output

cbi(PORTD,7); // 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); // 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);

}

if( ((sensor1>204) && (sensor1<255))&&

((sensor2>204) && (sensor2<255))&&

((sensor3>0) && (sensor3<153))&&

((sensor4>0) && (sensor4<153)))//para 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

Page 23: Robot Sumo

23

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)

// {

Page 24: Robot Sumo

24

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

}

if( ((sensor1>0) && (sensor1<153))&&

((sensor2>204) && (sensor2<255))&&

((sensor3>204) && (sensor3<255))&&

((sensor4>204) && (sensor4<255)))//giro para la derecha

{

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

Page 25: Robot Sumo

25

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); // sets PB0 to be an output

cbi(PORTB,0); // sets PB0 to output a LOW

sbi(DDRB, 3); // sets PB3 to be an output

sbi(PORTB,3); // 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))&&

Page 26: Robot Sumo

26

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

Page 27: Robot Sumo

27

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

_delay_ms(120);

//_delay_ms(120);

//timerPause(1);

timer1PWMASet(0);

timer1PWMBSet(0);

PIND=PD3<<0;

}