RobóticaIngeniero

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.

NivelIngeniero
Tiempo4 h
Costo est.~$113
Pasos5

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.

⚠ SEGURIDAD
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

  1. 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.

  2. 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).

  3. 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.

  4. 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.

  5. 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)        # search

Code 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.