Pular para conteúdo

Circuito — seguir linha preta

1. Conceito

Tarefa clássica de robótica: um robô com sensor de cor apontando pro chão precisa seguir uma linha preta (ou branca) desenhada no chão.

A ideia central: o sensor de cor em modo refletância devolve um número de 0 a 100 — quanto mais escuro embaixo dele, menor o número. O robô fica "testando" se tá em cima do claro ou do escuro, e corrige a direção a cada leitura. Isso é chamado de controle bang-bang (só duas ações possíveis: vira pra um lado ou pro outro — sem meio termo).

2. Peças que você precisa

  • 1 sensor de cor, apontando pro chão, uns 1-2cm de altura
  • 2 motores (esquerda e direita) — o robô precisa conseguir girar no lugar variando a velocidade de cada roda
  • Uma pista com linha preta em fundo claro (ou o contrário — só inverte a lógica)

3. Construindo passo a passo

Passo 1 — Ver o que o sensor enxerga

Antes de programar qualquer lógica, você precisa saber que números o seu sensor devolve no seu chão específico (varia com iluminação, cor do piso, etc):

from jacarev3 import RoboEV3, protocolo as p
import time

robo = RoboEV3('00:16:53:64:F8:B8')

for _ in range(50):
    leitura = robo.ler_sensor(porta=1, modo=p.MODO_COR_REFLETIDA)
    print(leitura)
    time.sleep(0.2)

Passa o sensor por cima do fundo claro, anota o número. Passa por cima da linha preta, anota o número. A média dos dois é o seu limiar.

Passo 2 — Decisão simples (sem motor ainda)

limiar = 50  # troca pelo que você mediu no passo 1

while True:
    leitura = robo.ler_sensor(porta=1, modo=p.MODO_COR_REFLETIDA)
    if leitura > limiar:
        print("CLARO")
    else:
        print("ESCURO")
    time.sleep(0.1)

Passa o robô na mão em cima da linha e confirma que o print muda certo na hora certa. Só depois disso faz sentido ligar motor.

Passo 3 — Junta com o motor

velocidade = 25

while True:
    leitura = robo.ler_sensor(porta=1, modo=p.MODO_COR_REFLETIDA)

    if leitura > limiar:
        # claro -> queremos voltar pra linha, então gira nessa direção
        robo.mover_continuo('B', velocidade)
        robo.mover_continuo('C', velocidade // 3)
    else:
        # escuro -> gira pro outro lado
        robo.mover_continuo('B', velocidade // 3)
        robo.mover_continuo('C', velocidade)

    time.sleep(0.05)

Se o robô girar pro lado errado (sair da linha em vez de voltar pra ela), inverte qual bloco (if/else) faz qual motor acelerar.

Passo 4 — Para direito

Sem isso, o motor fica ligado depois que você aperta Ctrl+C:

try:
    while True:
        ...  # o loop do passo 3
except KeyboardInterrupt:
    robo.parar_motor('B')
    robo.parar_motor('C')

4. Função pronta da lib

Tudo isso (mais calibração automática) já tá em jacarev3.topicos.circuito:

from jacarev3 import RoboEV3
from jacarev3.topicos import circuito

with RoboEV3('00:16:53:64:F8:B8') as robo:
    circuito.seguir_linha(robo, porta_sensor=1, verboso=True)

verboso=True imprime leitura + decisão a cada iteração — usa isso enquanto ainda tá calibrando/entendendo, desliga quando já confia na lógica (fica mais rápido sem o print).

5. Pra ir além

  • Troca o bang-bang por um controle proporcional: quanto mais longe do limiar a leitura tá, mais forte a correção (em vez de sempre a mesma velocidade fixa)
  • Faz o robô detectar quando perdeu a linha de vez (leitura não muda por muito tempo) e parar/apitar avisando
  • Ajusta a velocidade de acordo com uma curva mais fechada vs. reta

Tem uma lista de exercícios em 4 níveis de dificuldade, desse módulo e dos outros, em Atividades.