urriellu.net => Proyectos => Mecatrónica => Tustra
Tustra es un robot construido con las piezas prefabricadas por ifara en su producto skybot que incluye estructura de metacrilato, rueda loca, ruedas de plástico, dos servos Futaba S3003, placa de potencia (PCB para controlar los motores) y placa de control (PCB con el microcontrolador y resto de circuitería para utilizar los sensores). El robot fue desarrollado para un curso de microbótica (+ campeonato) organizado por la Universidad de Oviedo, el cual se explica a continuación, para el cual tuvimos que montar las piezas del skybot y programar el microcontrolador en lenguaje C para el compilador de CCS.
Reglas del campeonato
Todos los robots fueron construidos usando el kit skybot y programados en lenguaje C para el compilador CCS.
- Objetivo: escapar el primero de un recinto por una salida determinada
- Terreno de juego: tabla redonda pintada en negro de 80cm de diámetro, delimitada por una franja blanca de 5cm de ancho
- La salida principal está delimitada por dos franjas negras de 3cm de ancho, y mide 25cm. Sendos cilindros de parada a los lados de la salida servirán para hacer que el robot se detenga
- La salida por los dos laterales de la salida principal se considerará válida, pero de menor valor que la salida principal
- Modalidad Principal -> eliminatoria a dos:
- Dos concursantes pondrán sus robots en una posición aleatoria. El concurso acaba cuando uno de ellos salga por la salida principal
- Si a los 3 minutos ninguno de los robots ha conseguido escapar se declarará combate nulo
- Si un robot sale por una salida lateral, el otro robot dispondrá del tiempo completo (3 minutos) para salir por la entrada principal, siendo entonces declarado vencedor
- Si un robot sale por la salida principal pero falla al detectar los cilindros de parada, el otro robot mantiene la opción de vencer dentro del plazo de los tres minutos
- Por este procedimiento se irán eliminando robots hasta llegar a un vencedor final
Videos
Todos los demás videos del campeonato están disponibles en la página sobre el campeonato.
Programa/firmware
Programa para el microcontrolador PIC16F876A escrito en C orientado al compilador CCS PICC. Aunque está bastante bien, hay algoritmos que podrían mejorarse bastante pero las reglas definitivas solo nos las dieron unas 4 horas antes del campeonato y antes de eso sabíamos muy poco acerca de ellas. Unas 230 líneas de las 270 que son en total tuvieron que escribirse en estas últimas horas, al mismo tiempo que se hacían pruebas, así que dado el poco tiempo que tuvimos y que nunca antes había programado un microcontrolador en C, me parece un buen trabajo.
Las primeras instrucciones configuran los periféricos intergrados y las entradas y salidas del microcontrolador. Después se espera sin hacer nada hasta que se pulse uno de los bumpers. Al pulsar un bumper se empieza a ejecutar el bucle infinito que hay en ModoBuscaSalida() en el cual se procesan los 2 sensores CNY70 usados para detectar si el suelo es blanco o negro y se configura el estado y sentido de giro de los motores para avanzar, retroceder o girar, de manera que el robot avance en línea recta hasta que encuentre uno de los bordes blancos, el cual va siguiendo hasta que encuentra una puerta o se pulsa uno de los bumpers. Al pulsar un bumper se llama a la función Apartarse() y automáticamente el robot se aparta: si el robot iba en línea recta el robot se apartará hacia el lado donde no haya obstáculos, pero si Tustra iba siguiendo uno de los bordes blancos entonces el robot se apartará en dirección contraria al borde (de lo contrario entraría en un bucle infinito en el cual se intenta a la vez apartarse del objeto y evitar salirse de la pista). Cuando esté siguiendo uno de los bordes no se desplaza en línea recta, sino que va girando poco a poco hacia el lado donde está el borde. Esto es un problema necesario: al girar hacia el lado donde está el borde continuamente está intentando salirse de la pista y rectificando su trayectoria, lo que hace que se desplace muy lentamente; pero este comportamiento es necesario puesto que no hubo tiempo suficiente para añadirle más sensores CNY70 y tuvo que implementarse un algoritmo muy arcaico para poder detectar la "puerta". Este método consiste en que al ir siguiendo uno de los bordes de la pista sabemos por cual de los lados lo estamos rozando y gracias a que no se desplaza en línea recta en el momento en que llegue a una de las marcas negras que indican dónde está la puerta el robot detectará el color blanco en el sensor opuesto al borde que íbamos siguiendo, y es cuando "sabe" que acaba de llegar a la puerta. En este momento se llama a la función ModoSaliendo() que hace retroceder un poco al robot, gira en sentido contrario al borde de la pista (para apartarse de la puerta), avanza en línea recta durante el tiempo suficiente para colocarse justo en frente del centro de la puerta, gira en dirección hacia ella y avanza recto para salir de frente por la puerta hasta que uno de los bumpers detecte los cilindros de parada.
Otro problema con este algoritmo usado para detectar la salida es que ningún otro robot implementó el algoritmo que le hiciese apartarse al chocar contra otros, por lo que si otro robot empujaba a Tustra podía arrastrarlo hasta el otro lado de la pista y al detectar el color blanco en el lado equivocado el robot creería que acababa de encontrar la puerta y saldría por un lugar equivocado.
Cabe destacar que de todos los robots presentados sólamente dos de ellos conseguían detectar perfectamente la salida (Tustra y Punky) y de ellos sólo Tustra era capaz de salir de frente por la puerta como indicaban las reglas. Durante la final entre Tustra y Punky ningún árbitro se dio cuenta de que Punky salió por un lateral y no fue penalizado por ello, y al haber sido más rápido fue proclamado vencedor.
tustra.c, 269 líneas [descargar]
- #include "tustra.h"
- //registros
- #byte PORTB=0x06
- #byte TRISB=0x86
- //pulsador
- #bit PULSADOR=PORTB.0
- #define Pulsado 0
- #define NoPulsado 1
- //LED
- #bit LED=PORTB.1
- #define LedActiv 1
- #define LedApag 0
- [...]
tustra.h, 5 líneas [descargar]
- #include <16F876A.h>
- #device *=16
- #device adc=8
- #use delay(clock=20000000)
- #fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
ProyectosElectrónicaCLK³pic³progMecatrónicaSoftwarePigmeoOtrosmabxArtículosElectrónicaSoftwareOtrosVentajas C#EventosII Concurso Universitario de Software LibreCampeonato de microbótica en la Universidad de Oviedo. Verano 2007Sobre urriellu.netEste sitio webSobre míLicencias de publicaciónContacto
idiomaespañolrot13código morsebrailleenglishrot13código morsebraille