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

Objetivo da aula

  • Compreender como o giroscópio (IMU) do hub funciona.
  • Utilizar o heading() para medir e corrigir o ângulo de giro.
  • Realizar giros precisos com base em ângulos absolutos e correções automáticas.
  • Aplicar correção de trajetória (rumo reto) durante a locomoção.

1) O que é o giroscópio?

O giroscópio (parte da IMU – Unidade de Medição Inercial) detecta variações de orientação do robô.
Ele mede a rotação em graus, normalmente entre -180° e +180°.

  • : direção inicial (rumo padrão).
  • Valores positivos: giro para a direita.
  • Valores negativos: giro para a esquerda.
Dica: use hub.imu.reset_heading(0) no início do programa para redefinir o ângulo inicial.

2) Lendo o ângulo atual

Exemplo simples de leitura contínua da orientação do robô:

from pybricks.hubs import PrimeHub
from pybricks.tools import wait

hub = PrimeHub()
hub.imu.reset_heading(0)

while True:
    angulo = hub.imu.heading()
    hub.display.number(angulo)
    wait(100)

3) Giro até um ângulo desejado

Para girar com precisão até um ângulo alvo (ex.: 90°), o robô pode comparar o valor atual com o alvo
e ajustar as velocidades até se alinhar.

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

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

hub.imu.reset_heading(0)
alvo = 90

while True:
    erro = alvo - hub.imu.heading()
    if abs(erro) < 2:
        break

    vel = erro * 5
    if vel > 200: vel = 200
    if vel < -200: vel = -200

    mE.run(-vel)
    mD.run(vel)

mE.stop(Stop.HOLD)
mD.stop(Stop.HOLD)
Dica: ajuste o ganho (multiplicador do erro) para o seu robô.
Ganho muito alto → oscila; muito baixo → demora a atingir o alvo.

4) Giro usando o DriveBase

Com o DriveBase, é possível combinar giros e correções em comandos simples:

from pybricks.robotics import DriveBase

robot = DriveBase(mE, mD, 56, 120)
hub.imu.reset_heading(0)

alvo = -45
Kp = 4.0

while True:
    erro = alvo - hub.imu.heading()
    if abs(erro) < 1:
        break
    robot.drive(0, erro * Kp)
robot.stop(Stop.HOLD)

5) Manter rumo em linha reta

Mesmo motores sincronizados podem fazer o robô desviar.
O giroscópio pode corrigir automaticamente o rumo, mantendo heading() ≈ 0°.

hub.imu.reset_heading(0)
Kp = 2.5
v = 250

for _ in range(50):      # ~2s de movimento
    erro = 0 - hub.imu.heading()
    correcao = Kp * erro
    robot.drive(v, correcao)
    wait(40)
robot.stop(Stop.BRAKE)
Boas práticas:
Use reset_heading(0) antes de cada reta longa ou nova missão.
Isso evita acumular erros de rotação ao longo da rodada.

6) Curvas controladas com giroscópio

Você pode definir um ângulo alvo e girar de forma controlada, como em uma “curva assistida”:

hub.imu.reset_heading(0)
alvo = 60
Kp = 3.2
v_base = 200

while abs(hub.imu.heading() - alvo) > 1:
    erro = alvo - hub.imu.heading()
    turn = erro * Kp
    if turn > 250: turn = 250
    if turn < -250: turn = -250
    robot.drive(v_base, turn)
    wait(20)

robot.stop(Stop.HOLD)

7) Recalibração e estabilidade

  • Posição inicial: mantenha o robô imóvel durante o início do programa (antes de reset_heading()).
  • Vibrações e impacto: giroscópio é sensível — evite pancadas na base do hub.
  • Drift (deriva): após longas sessões, os valores podem deslocar levemente. Resete o heading a cada missão.
  • Suavidade: evite giros abruptos acima de 500°/s para não gerar leituras inconsistentes.

Erros comuns

  • Não resetar o heading: faz o robô “achar” que está em outro ângulo.
  • Loop sem condição: se o erro nunca fica < 1°, o robô pode girar indefinidamente (use abs()).
  • Ganho alto (Kp): faz o robô “oscilar” perto do alvo.
  • Uso de baterias fracas: pode afetar a resposta do controle.

Atividades práticas

  1. Leia o heading() continuamente e observe o valor ao girar o robô com a mão.
  2. Programe um giro de 90° para a direita e outro de 45° para a esquerda.
  3. Faça o robô andar em linha reta com correção por giroscópio (rumo = 0°).
  4. Combine o giroscópio com o segue-linha: enquanto segue a linha, corrija o rumo se o desvio angular for > 5°.