Robot de mini-sumo con Raspberry Pi Pico
Construye un robot pequeño, bajo y empujador que encuentra al rival con ultrasonido y se queda dentro del ring con sensores de borde.
El sumo de robots es una competencia clásica de escuelas y clubes: dos robots autónomos intentan sacarse de un ring negro con borde blanco. Los robots de mini-sumo suelen limitarse a unos 10 × 10 cm y 500 g; revisa las reglas de tu evento.
Mantén los dedos lejos de las ruedas durante las pruebas y usa celdas con protección. Las baterías LiPo pueden incendiarse si se perforan, se sobrecargan o hacen cortocircuito. Cárgalas en una bolsa LiPo, nunca sin supervisión, y quita siempre las hélices mientras trabajas en la mesa.
Pasos de la misión
Diseña una cuña baja
Imprime un cuerpo con una placa frontal inclinada que se meta debajo del rival, con el peso bajo y sobre las ruedas.
Monta motores y sensores
Dos motores N20 en el TB6612, un sensor de línea en cada esquina delantera mirando al piso y el sensor ultrasónico mirando al frente (echo por un divisor de voltaje).
Programa el inicio de 5 segundos
Los robots de competencia deben esperar cinco segundos después de presionar el botón de inicio antes de moverse.
Escribe la estrategia
Los sensores de borde tienen prioridad: retrocede y gira. Si no, gira para buscar y embiste a toda potencia cuando el rival esté a menos de 40 cm.
Practica
Pinta un ring con borde blanco sobre madera y ajusta tiempos de giro y velocidades contra el robot de un amigo.
Código
from machine import Pin, PWM, time_pulse_us
import time
def motor(pwm, a, b):
p = PWM(Pin(pwm)); p.freq(1000)
return p, Pin(a, Pin.OUT), Pin(b, Pin.OUT)
ML, MR = motor(10, 11, 12), motor(15, 14, 13)
Pin(9, Pin.OUT).value(1) # TB6612 STBY
def drive(m, s):
p, a, b = m
a.value(s > 0); b.value(s < 0); p.duty_u16(int(abs(s) * 65535))
edgeL, edgeR = Pin(6, Pin.IN), Pin(7, Pin.IN) # 0 = white edge (check your sensor)
trig, echo, start = Pin(16, Pin.OUT), Pin(17, Pin.IN), Pin(20, Pin.IN, Pin.PULL_UP)
def dist():
trig.value(1); time.sleep_us(10); trig.value(0)
t = time_pulse_us(echo, 1, 6000)
return t / 58 if t > 0 else 999
while start.value(): pass
time.sleep(5) # rule: wait 5 s
while True:
if not edgeL.value() or not edgeR.value():
drive(ML, -1); drive(MR, -1); time.sleep_ms(250)
drive(ML, 1); drive(MR, -1); time.sleep_ms(300)
elif dist() < 40:
drive(ML, 1); drive(MR, 1) # charge!
else:
drive(ML, 0.5); drive(MR, -0.5) # searchCode comments are in English, like most libraries and docs — a good habit for makers.
Preguntas
¿Cómo gano más empujones?
La tracción y una cuña baja importan más que la velocidad. Usa llantas de goma suave, mantenlas limpias y pon el peso sobre las ruedas motrices.