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

Objetivo da aula

  • Entender as diferenças entre movimento por tempo e movimento por rotação.
  • Aprender a usar run_time(), run_angle(), run() e stop() no PyBricks.
  • Conhecer os modos de parada: HOLD, BRAKE e COAST.
  • Aplicar esses comandos para obter movimentos precisos e repetíveis.

Preparação

Conecte um motor à porta A do hub SPIKE Prime.

Dica: Considere prender o motor na estrutura do robô para evitar vibrações e leituras inconsistentes.

1) Movimento por tempo — run_time()

Quando usar: para acionar por um intervalo fixo (em milissegundos), quando não é necessária precisão de ângulo.

  • velocidade: graus por segundo (°/s)
  • tempo_ms: milissegundos
  • then: como parar (Stop.HOLD, Stop.BRAKE, Stop.COAST)
  • wait: True espera terminar; False segue adiante
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop

motorA = Motor(Port.A)

motorA.run_time(400, 1000, then=Stop.HOLD, wait=True)  # 400°/s por 1s, segura posição

Quando é útil?

  • Abrir/fechar uma garra por um curto período.
  • Ajustes rápidos que não exigem ângulo exato.

2) Movimento por rotação — run_angle()

Quando usar: para movimentos precisos de posição (em graus).

  • velocidade: graus por segundo (°/s)
  • angulo: graus (360° = 1 volta)
  • then: modo de parada
  • wait: aguarda ou não o término
motorA.run_angle(300, 360, then=Stop.HOLD, wait=True)   # 1 volta
motorA.run_angle(300, -180, then=Stop.BRAKE, wait=True) # meia volta para trás

Quando é útil?

  • Levantar um braço até um ângulo específico.
  • Movimentos de garras com posicionamento repetível.

3) Movimento contínuo — run() e stop()

Quando usar: para manter velocidade até que uma condição aconteça (sensor, tempo externo, etc.).

from pybricks.tools import wait

motorA.run(350)  # gira indefinidamente
wait(1200)       # 1,2s se passando...
motorA.stop()    # para usando o modo padrão (BRAKE)

Você pode combinar run() com sensores (parar ao detectar um valor), veremos mais nos módulos de sensores.

4) Modos de parada — Stop

  • HOLD: segura a posição final com força (bom para precisão).
  • BRAKE: aplica freio, mas não mantém posição ativamente.
  • COAST: roda livre; o motor desacelera sem freio.
Escolha prática: HOLD para ângulos críticos (garra, braço); BRAKE para paradas firmes; COAST para suavidade quando não precisa de precisão.

5) Comparando por tempo × por rotação

Critério Por tempo (run_time) Por rotação (run_angle)
Precisão Baixa a média Alta (define graus exatos)
Repetibilidade Varia com carga/bateria Muito boa
Uso típico Ações rápidas e simples Braços/garra e posições fixas

6) Exemplos práticos

A) Abrir e fechar garra (ângulo preciso)

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

garra = Motor(Port.A)

garra.run_angle(300, 120, then=Stop.HOLD, wait=True)   # abre
garra.run_angle(300, -120, then=Stop.HOLD, wait=True)  # fecha

B) Alimentar uma esteira por tempo

esteira = Motor(Port.A)

esteira.run_time(500, 800, then=Stop.BRAKE, wait=True)   # 0,8s de alimentação

C) Movimento contínuo até uma condição (parada manual)

motorA.run(450)
# ... ler sensor/tempo em outro trecho e então:
motorA.stop()

7) Ajustes finos: limites de controle

Para suavidade e consistência, ajuste limites de controle antes dos comandos:

from pybricks.hubs import PrimeHub
hub = PrimeHub()

motorA.control.limits(speed=700, acceleration=500, torque=100)
Boas práticas: teste diferentes acceleration/deceleration para evitar trancos e garantir repetibilidade.

Erros comuns

  • Confundir unidades: velocidade em °/s, tempo em ms, ângulo em °.
  • Não aguardar término: se usar wait=False, o programa segue adiante e pode sobrepor comandos.
  • Parada inadequada: usar COAST quando precisa de precisão; prefira HOLD para posições críticas.

Atividade prática

  1. Faça o motor girar por 1,5s a 450°/s usando run_time() com Stop.BRAKE.
  2. Faça o motor girar 2 voltas (720°) a 300°/s usando run_angle() com Stop.HOLD.
  3. Crie uma função abrir_e_fechar_garra() que use dois comandos run_angle() com pausas curtas.
  4. Compare resultados: qual método foi mais repetível no seu robô?