Atividades por módulo¶
Um jeito de praticar cada tutorial em 4 níveis — do "só roda e vê o que acontece" até um projeto aberto. Não tem gabarito publicado de propósito: o objetivo é você (ou seu aluno) chegar lá mexendo, comparando com quem tá do lado, discutindo por que uma solução funcionou melhor que outra.
Cada nível pressupõe que você já leu o tutorial do módulo. Se ainda não leu, começa por ele — as atividades usam a API que ele explica.
Travou?
Tem respostas — pelo menos 2 jeitos diferentes de resolver cada atividade. Mas tenta sozinho primeiro; comparar sua solução com outra depois de já ter pensado ensina mais do que ler a resposta de cara.
-
Nível 1 — Roda e observa
Chama a função pronta com parâmetros diferentes. Nenhuma linha de código nova — só entender o que cada parâmetro muda.
-
Nível 2 — Mede e calibra
Cria uma tabela/registro do que o sensor devolve no seu robô específico. Sem isso, os níveis seguintes viram chute.
-
Nível 3 — Muda a lógica
Escreve seu próprio loop (não a função de
jacarev3.topicos) pra fazer o robô reagir diferente do padrão. -
Nível 4 — Projeto aberto
Combina dois módulos, ou resolve um problema que a lib não resolveu pronto. É onde a maioria das ideias de verdade aparece.
Básico — som, LED, motor, sensor¶
Tutorial: básico.md.
Nível 1. Chama robo.apitar() variando frequencia (ex: 220, 440,
880, 1760) e volume (1, 25, 100). Anota qual combinação seu alto-falante
realmente deixa mais alta — o parâmetro nem sempre corresponde ao que
você ouve.
Nível 2. Encosta o sensor ultrassônico em 5 distâncias diferentes
(5cm, 10cm, 20cm, 40cm, 80cm — mede com régua) e registra o que
robo.ler_sensor(porta, p.MODO_ULTRASSONICO_CM) devolve em cada uma.
Faz o mesmo pro sensor de cor: chão claro, chão escuro, uma folha de
papel colorida.
Nível 3. Escreve um loop que lê o sensor de toque a cada 0.1s e conta quantas vezes ele foi apertado (não "está apertado", quantas vezes — cuidado pra não contar o mesmo aperto várias vezes seguidas).
Nível 4. "Termômetro de proximidade": quanto mais perto um objeto
chega do ultrassônico, mais agudo o bipe (apitar(frequencia=...)) e
mais vermelho o LED (intercala led('VERMELHO')/led('VERDE')
proporcional à distância). Sem time.sleep fixo — a resposta tem que
ficar mais rápida quanto mais perto o objeto estiver.
Dica pro nível 4
frequencia e o intervalo entre leituras podem ser os dois uma
função da distância lida — não precisa de nada além de aritmética
simples (tipo 1000 / distancia).
Seguir linha (circuito)¶
Tutorial: circuito.md.
Nível 1. Roda circuito.seguir_linha(robo, porta_sensor=1,
velocidade=25, duracao_s=15) com velocidade em 15, 25, 40. Em qual o
robô perde a linha nas curvas? Em qual ele anda visivelmente devagar
demais?
Nível 2. Roda circuito.calibrar(robo, porta_sensor=1) no seu
tapete específico e usa o limiar que ele devolve, explícito, em vez de
deixar seguir_linha adivinhar. Compara a suavidade do seguimento antes
e depois.
Nível 3. Copia o loop bang-bang do tutorial (passo 3) e adiciona: se a leitura não mudar por mais de 2 segundos, para os motores e apita 3 vezes ("perdi a linha"), em vez de continuar girando pro mesmo lado pra sempre.
Nível 4. Troca o bang-bang por controle proporcional: em vez de
velocidade fixa pra cada lado, calcula o quanto a leitura atual está
longe do limiar e usa isso pra escalar a diferença de velocidade entre
as rodas continuamente (sem if/else, uma fórmula só). Mede o tempo
de volta na pista e compara com o bang-bang do nível 1.
Dica pro nível 4
erro = leitura - limiar. Motor de um lado fica em
velocidade_base + erro * ganho, do outro
velocidade_base - erro * ganho. Comece com um ganho pequeno e
vai aumentando até o robô oscilar — aí volta um pouco.
Desviar de obstáculo (desvio)¶
Tutorial: desvio.md.
Nível 1. Roda desvio.desviar_obstaculo(robo, porta_sensor=4,
distancia_minima_cm=15) variando distancia_minima_cm (5, 15, 30).
Com qual valor o robô bate antes de reagir? Com qual ele desvia de
coisas que nem estavam no caminho?
Nível 2. Anda com um objeto na mão se aproximando devagar do sensor, imprimindo a leitura a cada 0.2s (igual ao nível 2 do básico, mas documentando especificamente o seu sensor ultrassônico montado no robô — a posição de montagem muda a leitura).
Nível 3. Adiciona uma contagem: quantos obstáculos o robô desviou numa volta completa da pista, impressa no final (não durante — só o total).
Nível 4. Combina com seguir linha: o robô segue a linha normalmente, mas se o ultrassônico detectar algo mais perto que um limite, para de seguir a linha, desvia, e volta a procurar a linha depois (não simplesmente continua reto). É o primeiro módulo que pede os dois sensores rodando no mesmo loop.
Dica pro nível 4
Depois de desviar, gira devagar num sentido só, lendo o sensor de cor a cada leitura, até ele voltar a ver "escuro" — é assim que o robô "acha" a linha de novo sem saber onde ela ficou.
Controle remoto (controle)¶
Tutorial: controle.md.
Nível 1. Roda controle.controle_remoto(robo, verboso=True) com o
teclado (sem precisar de controle físico) e depois com FontePygame()
se tiver um Xbox. Ajusta velocidade= e giro= até o robô responder do
jeito que você gosta.
Nível 2. Muda zona_morta_giro e taxa_suavizacao do
FontePygame pros extremos (zona_morta_giro=0, depois =0.3;
taxa_suavizacao=1, depois =0.05) e descreve em uma frase cada, o
que mudou na sensação de dirigir.
Nível 3. Faz um botão do controle (que ainda não faz nada) acionar
o LED verde ou apitar — sem mexer em controle_remoto(): lê o botão
direto no joystick dentro do seu próprio script, fora do loop da lib.
Nível 4. Escreve sua própria Fonte (a lib já ensina o contrato:
ler() + with) pra um jeito diferente de comandar o robô — outro
controle, um segundo eixo controlando um motor de garra, ou até um
FonteMouse que lê a posição do mouse na tela. Não existe resposta
certa aqui, só o contrato pra respeitar.
Dica pro nível 4
Reveja o passo 4 do tutorial de controle — o exemplo FonteMinhaIdeia
já é o esqueleto inteiro que falta preencher.