Bueno, pues yo empecé a preparar el concurso en verano, en Agosto de 2007. Puede pareceros mucho tiempo, pero realmente lo único que hice desde entonces hasta Diciembre de ese mismo año fue idear sistemas y mecanismos, mirar componentes, sensores, motores etc. Aprendí muchísimo y posiblemente sólo por eso haya merecido la pena presentarse al concurso. En ese tiempo, hice bocetos, diseños y plasmé todas mis ideas. De todo este trabajo sólo el 10 % habrá sido de utilidad para el proyecto. Pero merece la pena. Hasta Diciembre no empecé en serio.
En Diciembre, mis compañeros y yo teníamos ya pensado todo lo que necesitábamos comprar, así que lo pedimos (de varias tiendas, una de ellas en el extranjero). Por tanto, no dispusimos de todos los materiales hasta finales de enero. Fue entonces cuando empecé el montaje. Mientras lo montaba iba probando todos los sensores.
Hasta la semana anterior al concurso no tuve todo montado. Una vez ya montado, ese fin de semana, comencé a programarlo. Pero el martes cuando lo probé, no funcionaba bien. Había hecho algo muy complejo, con 3 microcontroladores y 2 de ellos interconectados. Por tanto decidí desmontar todo. Desmonté toda la electrónica y la volví a montar, todo esto el martes y parte del miércoles. El miércoles, una vez ya montado lo programé y entonces si funcionaba. Por la tarde y hasta las tantas de la noche estuve mejorando el programa y asegurando todo. Y por fin el jueves, día del concurso. Como veis casi volví a hacer todo 2 días antes del concurso.
El día del concurso pasamos la prueba (yo y otros 3 compañeros míos del Colegio Vizcaya) de clasificación (no tuvimos que pasar una el martes, ya que éramos pocos, pero si tuvieron que pasarla los universitarios) para comprobar que todo funcionaba. Estuvimos charlando con universitarios y profesores de la uni y visitando algunos laboratorios. Si que hicimos alguna modificación, pero cosa de poco (yo por lo menos, mis compañeros alguna más).
Para diseñarlo tuve en cuenta todas las claves que menciono en el manual “Cómo construir un robot de sumo”. Tuve muy en cuenta las reglas, es más, mi robot pesaba 2 kg 850 gr. y medía 20x20 cm., justo. Tras el Brainstorm, comencé a diseñarlo. Muchos bocetos, de los cuales apenas utilicé ninguno. Pero puede que sean útiles en un futuro. Pensé en crear yo mi propia estructura, pero debido a que tenía poco tiempo empleé una comercial. Así evitas fallos de que no encajen piezas o que estén sueltas.
Además, puse un sistema de amplificación de superficie. Dos servos, con una placa de madera, giraban 90 grados (ya que al empezar tienen que estar replegados) y de ellos colgaba una superficie de papel, que sirve para que el contrario detecte más robot del que hay, así, quizá ataque a uno de los papeles y mi robot puede echarle fuera ya que le cogería de lado.
Todos los sensores, además, están colocados en unas cajitas, para impedir que se puedan mover. Estas cajitas se sujetan a la estructura mediante velcro, un material muy usado en este robot (es muy útil y, en mi opinión, muy recomendable).
Los bumpers tienen una prolongación hecha con piezas de mecano, cola termofusible y cinta aislante (otro material imprescindible). Los portapilas están sujetos a la estructura mediante velcro, con un sistema que permite cambiar todas las pilas sin desmontar nada.
2. Componentes:
Yo usé un Basic Stamp 2, principalmente por lo fácil que es programarlo. Aunque he de reconocer que tiene 2 pegas: es un poco caro (48 € + IVA) y que no permite usar entradas analógicas de manera sencilla. Pero para iniciados es magnífico, así como para aquellos que no quieran tener que soldar, ya que dispone de una protoboard. Se programa con el puerto serie (necesitamos un cable, pero viene acompañado con la placa al comprarla) y sería mejor si fuese USB.
Yo, para sumo, he dividido en 4 aspectos las funciones del robot: detección del contrario, situación, empuje/resistencia (para sacar tú al otro de la pista sin que te saque el a ti) y engaño (para que el otro no te detecte). Además de la lógica (Basic Stamp 2).
Para la detección del contrario usé: Un sensor de ultrasonidos SRF05 (18 €, comprado en MSE Bilbao), 2 sensores infrarrojos GP2D15 (10 € cada uno) y 4 bumpers (2.2 € cada uno, comprados en MSE Bilbao). El ultrasonido es un sensor ideal para detectar a largas distancias, pero tiene algún problema: es irregular. Sin embargo, no necesitan ninguna circuitería externa. Tienen 4 puntos, uno a +5 V (vdd) otra a GND (Vss) y 2 a unas patitas (entradas). Una controlará la emisión y otra la recepción. Hay opción de usarlos con una sola patita, pero para ello hay que seleccionar otro modo.
Los sensores infrarrojos Sharp son muy interesantes. Ofrecen una gama de distancia muy interesante. Los que yo usé son digitales (0 y 1) y detectan cualquier cosa situada entre 2 y 25 cm. Pueden llegar hasta 80, pero es difícil manipularlos, ya que hay que modificar la distancia de las ópticas (soltando un tornillo). Estos necesitan una resistencia de 12 K. Una a +5 V, otra a GND y la otra a +5 v con una resistencia de 12 K y a una patita (entrada). Para estos sensores es interesante tener un conector JST, para que sea más fácil conectarlos.
Los bumpers requieren una resistencia de 10 K (cada uno). Una de las clavijas conectada con GND y la otra con una resistencia de 10 K a Vdd y a una patita (entrada).
En el apartado de situación pensé en emplear unos cny70, sin circuitería y construirla yo mismo. Para ello compré 4 cny70 (1,10 € cada uno) y además necesitaba un inversor trigger-Schmidt 74HC14, y una resistencia de 220 y otra de 10 K (esto para cada bumper, menos el inversor). Conseguí montarlo y funcionaba, pero los resultados eran bastante peores que con el sensor MSE- S110.1 (8 € cada uno). Usé 2 prestados por mi profesor Iker.
Estos no necesitan nada adicional, uno va a +5 v, otro a GND y otro a una entrada (patita).
En el apartado engaño use pintura negra para todo el robot (así si el contrario usa un sensor infrarrojo insensible al negro, no me detectará) y el sistema de amplificación de superficie del que ya he hablado, para el cual necesité 2 servos parallax de rotación continua de 15 € cada uno, que también me presto Iker, así como un Basic Stamp 1 (también prestado) para controlarlos. Estos tienen 3 cables: negro a GND, blanco a patita (salida) y rojo a +5 v. No necesitan nada adicional.
Por tanto usé el driver MD22 (MSE Bilbao, 65 €). Este driver controla 2 motores (lo que yo necesito, ya que 2 se controlan igual) y permite 5 amperios por canal. Necesita +5v y Gnd, así como 2 salidas (patitas), una para controlar cada motor (se controla mediante PULSOUT), en vez de las 4 que usaba el otro. Este driver lo que hace es que cuando le mandas una orden la repite constantemente hasta que le mandes otra. En los motores, entre el polo positivo y el negativo puse un supresor de ruido que sirve para eliminar interferencias entre los motores y el driver.
Además de esto compré madera, una plancha de aluminio y pilas de tipo D y de 9 voltios (y portapilas para ambas).
3. Montaje:
En cuanto tuve todas las piezas, comencé a montarlas. Empecé con la estructura y los motores, después el driver, los sensores y por último el microcontrolador. He de admitir que era complicado hacerlo, ya que este se encontraba tapado y oculto. Cuando conectaba algo al Basic Stamp apuntaba la patita a la cual lo había conectado. Usé una protoboard adicional cerca de los sensores, y de allí les proporcionaba GND y +5 v (para reducir el cableado).
Antes de montar todo, fui probando cada sensor por separado, para comprobar que todos funcionaban.
4. Programación y funcionamiento:
Yo teniendo en cuenta los sensores que tenía, realicé un algoritmo. Básicamente, lo que el robot hacia era mirar continuamente los sensores. Si cualquiera de los CNY70 detectaba blanco (la línea) retrocedía y giraba algo menos de 180 grados. Si detectaban algo los bumpers delantero o trasero avanzaba o retrocedía continuamente, ya que el contario estaba delante o detrás. Si detectaba algo por un bumper lateral, avanzaba un poco y giraba (para cogerle al otro). Si detectaba algo por alguno de los dos GP2D15 giraba hacia ese, ya que significaba que le detectaba por un lado pero no por el otro. Cuando le detectaba con los 2 avanzaban. Y si no detectaba nada por ningún sensor, pues giraba mientras miraba el ultrasonido, si este detectaba algo inferior a 100 cm avanzaba. Cada vez que se movía o hacía cualquier cosa, miraba los demás sensores, para que no hubiese una confusión y se saliese del ring sin querer.
-Programa de la placa que controlaba los 2 servos:
' {$STAMP BS1}
PAUSE 5000
SYMBOL MotorIzq = 0
SYMBOL MotorDer = 2
OUTPUT MotorIzq
OUTPUT MotorDer
FOR B0 = 1 TO 12
PULSOUT MotorIzq,1
PAUSE 20
NEXT
FOR B0 = 1 TO 11
PULSOUT MotorDer , 300
PAUSE 20
NEXT
END
- Programa de la placa principal:
' {$STAMP BS2}
' {$PBASIC 2.5}
OUTPUT 0
OUTPUT 2
INPUT 15
INPUT 14
INPUT 13
INPUT 12
INPUT 5
INPUT 4
INPUT 10
INPUT 9
Trigger PIN 7
Echo PIN 8
DISTANCIA VAR Word
samples VAR Nib
pWidth VAR Word
rawDist VAR Word
infra VAR Byte
ultra VAR Byte
posicioncontrario:
IF IN12 = 1 THEN delante
IF IN13 = 1 THEN detras
IF IN14 = 1 THEN derecha
IF IN15 = 1 THEN izquierda
GOTO posicioncontrario
delante:
PAUSE 4800
GOTO deteccion
detras:
PAUSE 4800
PULSOUT 0, 500
PULSOUT 2, 500
PAUSE 2100
PULSOUT 0, 750
PULSOUT 2, 750
GOTO deteccion
derecha:
PAUSE 4800
PULSOUT 0, 500
PULSOUT 2, 500
PAUSE 1100
PULSOUT 0, 750
PULSOUT 2, 750
GOTO deteccion
izquierda:
PAUSE 4800
PULSOUT 0, 1000
PULSOUT 2, 1000
PAUSE 1100
PULSOUT 0, 750
PULSOUT 2, 750
GOTO deteccion
deteccion:
PULSOUT 0, 1000
PULSOUT 2, 500
GOTO bumperscny70infrarrojos
bumperscny70infrarrojos:
IF IN15 = 1 THEN bumperizq
IF IN14 = 1 THEN bumperder
IF IN13 = 1 THEN bumperdet
IF IN12 = 1 THEN bumperdel
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
IF IN10 = 1 AND IN9 = 1 THEN infraambos
IF IN10 = 1 THEN infraizq
IF IN9 = 1 THEN infrader
IF IN15 = 0 AND IN14 = 0 AND IN13 = 0 AND IN12 = 0 AND IN4 = 1 AND IN5 = 1 AND IN10 = 0 AND IN9 = 0 THEN ultrasonidos
GOTO deteccion
bumperizq:
PULSOUT 0, 1000
PULSOUT 2, 500
PAUSE 300
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
PULSOUT 0, 1000
PULSOUT 2, 1000
PAUSE 1100
PULSOUT 0, 1000
PULSOUT 2, 500
PAUSE 300
GOTO deteccion
bumperder:
PULSOUT 0, 1000
PULSOUT 2, 500
PAUSE 300
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
PULSOUT 0, 500
PULSOUT 2, 500
PAUSE 1100
PULSOUT 0, 1000
PULSOUT 2, 500
PAUSE 300
GOTO deteccion
bumperdet:
PULSOUT 0, 500
PULSOUT 2, 1000
IF IN13 = 0 THEN deteccion
GOTO bumperdet
bumperdel:
PULSOUT 0, 1000
PULSOUT 2, 500
IF IN12 = 0 THEN deteccion
GOTO bumperdel
infrader:
PULSOUT 0, 500
PULSOUT 2, 500
PAUSE 300
PULSOUT 0, 750
PULSOUT 2, 750
GOTO bumperscny70infrarrojos
infraizq:
PULSOUT 0, 1000
PULSOUT 2, 1000
PAUSE 300
PULSOUT 0, 750
PULSOUT 2, 750
GOTO bumperscny70infrarrojos
infraambos:
PULSOUT 0, 1000
PULSOUT 2, 500
PAUSE 300
PULSOUT 0, 750
PULSOUT 2, 750
GOTO bumperscny70infrarrojos
amboscny:
PULSOUT 0, 500
PULSOUT 2, 1000
PAUSE 500
PULSOUT 0, 500
PULSOUT 2, 500
PAUSE 1000
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
PAUSE 1000
PULSOUT 0, 750
PULSOUT 2, 750
GOTO bumperscny70infrarrojos
ultrasonidos:
PULSOUT 0, 1000
PULSOUT 2, 500
LOW Trigger
rawDist = 0
FOR samples = 1 TO 10
PULSOUT Trigger, 5 ' 10
RCTIME Echo, 1, pWidth
rawDist = rawDist + (pWidth / 10)
PAUSE 10
NEXT
DISTANCIA = rawDist / 30
IF IN15 = 1 THEN bumperizq
IF IN14 = 1 THEN bumperder
IF IN13 = 1 THEN bumperdet
IF IN12 = 1 THEN bumperdel
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
IF IN10 = 1 AND IN9 = 1 THEN infraambos
IF IN10 = 1 THEN infraizq
IF IN9 = 1 THEN infrader
IF DISTANCIA <= 100 THEN ultradet IF DISTANCIA >= 100 THEN girosult
GOTO ultrasonidos
ultradet:
PULSOUT 0, 1000
PULSOUT 2, 500
GOTO ultrasonidos
girosult:
PULSOUT 0, 500
PULSOUT 2, 500
PAUSE 200
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
PAUSE 200
IF IN4 = 0 AND IN5 = 0 THEN amboscny
IF IN4 = 0 THEN amboscny
IF IN5 = 0 THEN amboscny
PAUSE 200
GOTO ultrasonidos
Agradecer a Iker Etxebarría su ayuda en este proyecto, tanto en conocimientos como en materiales. A pesar de que yo hice todo el robot, el me prestó varios materiales y me resolvió varias dudas.
Aclarar que el nombre del robot “Stealthbot” (traducción en castellano “Robot invisible”) se debe a que mi idea original era la de un robot que fuese muy difícil de detectar, algo que al final rechacé, pero mantuve el nombre.
En el concurso, tuve un problema, ya que en la final, el otro robot me golpeó un bumper y este se quedo enganchado. El otro tiro de él y se desenganchó GND, por tanto el bumper leía continuamente 1 (que el otro estaba empujándole lateralmente) y por ello avanzaba y giraba todo el rato, estando en un bucle.
Autor: Sergio Porres González
http://roboticamaselectronica.blogspot.com/
Este documento ha sido realizado para orientar a posibles personas interesadas en la construcción de un robot de sumo o que estén interesados en la robótica en general. Si alguien quiere publicarlo, que contacte con su autor: sergioporres@telefonica.net
---------------------------------------------------------------------------------