Desbravando o PyBricks: Programando o SPIKE Prime em Python do Zero
Aula

Objetivo da aula

  • Aprender três formas de sincronizar dois motores para fazer o robô andar reto.
  • Entender conversões de distância (mm) para rotação (graus).
  • Conhecer o uso do DriveBase para locomoção (PyBricks).
  • Aplicar correção por giroscópio para manter trajetória.

Preparação

  • Conecte o motor esquerdo na porta A e o direito na porta B.
  • Meça o diâmetro da roda (mm) e a distância entre as rodas (mm) (centro a centro).

Método 1 — Ângulos iguais nos dois motores

Se ambos os motores tiverem a mesma redução (engrenagens iguais), mandar o mesmo ângulo e mesma velocidade em cada motor costuma produzir um movimento reto.
Útil para distâncias curtas/médias e testes rápidos.

from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop
from pybricks.tools import wait

mE = Motor(Port.A)   # esquerdo
mD = Motor(Port.B)   # direito

vel = 400            # °/s
angulo = 720         # 2 voltas

mE.run_angle(vel, angulo, then=Stop.HOLD, wait=False)
mD.run_angle(vel, angulo, then=Stop.HOLD, wait=True)

Conversão de mm para graus

Para andar uma distância d (mm) com roda de diâmetro D (mm):

graus = 360 × d / (π × D)

D = 56   # diâmetro de roda 56mm (padrão SPIKE)
d = 300  # queremos andar 300mm

from math import pi
graus = 360 * d / (pi * D)

mE.run_angle(400, graus, then=Stop.HOLD, wait=False)
mD.run_angle(400, graus, then=Stop.HOLD, wait=True)
Dica: se o robô puxar para um lado, reduza levemente a vel de um motor (ex.: direito 390°/s) ou ajuste o ângulo (ex.: direito 718°).

Método 2 — Usando DriveBase (recomendado)

O DriveBase abstrai os dois motores como um “chassi”. Você informa diâmetro da roda e largura do eixo e usa comandos em mm e graus de giro.
É prático, consistente e fácil de calibrar.

from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop
from pybricks.robotics import DriveBase

mE = Motor(Port.A)
mD = Motor(Port.B)

wheel_diameter = 56      # mm (ajuste para sua roda)
axle_track = 120         # mm (distância entre rodas)

db = DriveBase(mE, mD, wheel_diameter, axle_track)

db.straight(300)         # anda 300 mm
db.turn(90)              # gira 90° sobre o eixo
db.stop()                # por padrão BRAKE; use hold=True se precisar

Calibração rápida

  1. Marque 300 mm na mesa e rode db.straight(300).
  2. Se andou a mais/menos, ajuste wheel_diameter (aumente se andou menos; diminua se andou mais).
  3. Se virar em “S”, confira atritos, folgas e o axle_track.
Boas práticas: defina limites suaves para saída consistente:

mE.control.limits(speed=700, acceleration=500, torque=100)
mD.control.limits(speed=700, acceleration=500, torque=100)

Método 3 — Reto com correção de giroscópio (proporcional)

Mesmo com motores sincronizados, pequenas diferenças de atrito, cabo ou piso podem desviar o robô.
Use o IMU (giroscópio) para corrigir continuamente: compare o ângulo medido com o alvo (heading 0) e ajuste a velocidade de cada motor.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

hub = PrimeHub()
mE = Motor(Port.A)
mD = Motor(Port.B)

base = 350         # velocidade base (°/s)
k = 5              # ganho proporcional (ajuste fino)

for _ in range(50):   # ~ 50 iterações × 40ms ≈ 2s
    erro = 0 - hub.imu.heading()     # alvo = 0°
    correcao = k * erro

    mE.run(base - correcao)
    mD.run(base + correcao)

    wait(40)

mE.stop()
mD.stop()
Ajuste fino: se oscilar, diminua k; se não corrigir o suficiente, aumente k.
Certifique-se de iniciar alinhado (heading ~ 0°).

Comparativo rápido

Abordagem Vantagens Quando usar
Ângulos iguais Simples, rápido de configurar Testes curtos, protótipos
DriveBase Comandos em mm/°; fácil calibrar Treinos e missões repetíveis
Correção por IMU Mantém reta mesmo com atrito/declive Percursos longos, precisão

Erros comuns

  • Engrenagens diferentes nos lados: resultam em trajetórias curvas; mantenha simetria.
  • Unidades trocadas: lembre que run_angle usa graus; DriveBase usa mm/°.
  • Calibração ignorada: um wheel_diameter errado distorce toda a locomoção.

Atividade prática

  1. Meça suas rodas e eixo; configure o DriveBase e ande 500 mm.
  2. Implemente a correção por IMU com k inicial 3; ajuste até manter-se reto.
  3. Crie uma função ir_reto_mm(dist_mm, vel_base) que use IMU para correção durante db.straight ou laço com run().