Aula 3 — Seguir linha¶
Duração: 50 minutos · Turma: já fez a Aula 2
Objetivo¶
No fim da aula, todo grupo tem um robô seguindo uma linha preta — usando a lógica bang-bang, construída em pedaços, não copiada pronta.
Pré-requisitos¶
- Aula 2 — sabe ler sensor e calcular limiar
- Robô físico com sensor de cor montado apontando pro chão, 2 motores na base (esquerda/direita)
Material¶
- Uma pista com linha preta em fundo claro por grupo (fita isolante preta numa cartolina branca resolve)
Roteiro¶
0–5 min — O conceito, sem código Desenha no quadro: sensor vê "claro" → robô devia virar pra um lado; sensor vê "escuro" → vira pro outro. Isso é bang-bang: só duas decisões, sem meio-termo.
5–15 min — Decisão sem motor ainda
Segue circuito.md, passo 2 —
só print, sem ligar motor nenhum. Passa o robô na mão em cima da
linha, confirma que o print muda na hora certa.
Não pula essa etapa
É tentador ir direto pro robô andando. Mas debugar "por que ele não segue a linha" é muito mais difícil quando motor e sensor mudam ao mesmo tempo. Confirma a decisão primeiro.
15–35 min — Liga o motor
Junta com motor, passo 3 do tutorial.
Cada grupo ajusta velocidade e qual lado gira mais rápido pro próprio
robô (a lib documenta "se girar errado, inverte o if/else" — deixa
os grupos descobrirem isso testando, não avisa antes).
35–45 min — Roda na pista de verdade
Testa na pista, ajusta o limiar calculado na Aula 2 se não estiver bom
o suficiente. Introduz circuito.seguir_linha() como a versão pronta,
com calibração automática — só depois de já ter rodado a versão manual.
45–50 min — Corrida (opcional) + fechamento Se der tempo, corrida entre grupos na mesma pista. Fechamento: qual grupo teve o robô mais estável, e por quê (velocidade mais baixa? limiar mais preciso?).
Falhas comuns¶
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Robô sai da linha em vez de voltar | Lado invertido no if/else |
Troca qual bloco aciona qual motor |
| Robô trava/oscila muito rápido | velocidade alta demais pro sensor reagir a tempo |
Reduz velocidade, ou aumenta o time.sleep() do loop |
| Motor não para com Ctrl+C | Faltou o try/finally do passo 4 |
Adiciona o finally com parar_motor() nos dois motores |
Rubrica¶
- [ ] Robô segue a linha por pelo menos uma volta completa da pista
- [ ] Grupo sabe explicar por que inverteu (ou não precisou inverter) o
if/else - [ ] Ctrl+C para o robô de verdade (motor não fica girando sozinho)
Pra continuar¶
Nível 3 e 4 de circuito em Atividades — detector de linha perdida, e controle proporcional.