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
- Marque 300 mm na mesa e rode
db.straight(300). - Se andou a mais/menos, ajuste
wheel_diameter(aumente se andou menos; diminua se andou mais). - 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)
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°).
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
- Meça suas rodas e eixo; configure o
DriveBasee ande 500 mm. - Implemente a correção por IMU com k inicial 3; ajuste até manter-se reto.
- Crie uma função
ir_reto_mm(dist_mm, vel_base)que use IMU para correção durantedb.straightou laço comrun().