Skip to content

feat(firmware): Uno v3.0 com supervisão por marcos e robustez - #43

Merged
MatheusNespolo merged 21 commits into
mainfrom
feat/firmware-uno-v3
Oct 4, 2026
Merged

MatheusNespolo merged 21 commits into
mainfrom
feat/firmware-uno-v3

Conversation

@MatheusNespolo

@MatheusNespolo MatheusNespolo commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

O que muda

Firmware do Arduino Uno v3.0: reestruturação modular com supervisão da entrega por marcos e robustez de produto, resolvendo os problemas vistos em bancada em 02–03/10 (entrega da B sem débito, esteira C que mal move e dá timeout, Uno reiniciando, LCD apagado).

  • Arquitetura: src/logica/ (C++ puro: protocolo, filtro, supervisor, FSM, telas, causa do reset) testado no PC em test/firmware_uno (43 testes, job novo firmware-logica no CI) e src/hw/ (motores, sensores, serial, LCD, diagnóstico). O .ino só orquestra.
  • Entrega por marcos: checagem prévia sem ligar o motor (estoque → peça no topo → junção livre); M1 topo livre em 3 s (motor_sem_avanco); M2 junção em 12,5 s desde a partida (timeout); débito na confirmação; M3 3 s de saída com a junção liberando (peca_presa_saida). Junções capturadas por interrupção, pulso mínimo de 20 ms, só valem passagens que começaram depois da partida.
  • Robustez: kick-start dos motores, watchdog de 2 s (que também desliga os motores), causa do reset no evento inicio, LCD procurado em 0x27/0x3F e opcional (I²C travado desliga o LCD em vez de travar), limitador de rajadas de interrupção, textos na flash (RAM global de 55% para 46%), sem ArduinoJson no Uno.
  • Compatibilidade: mensagens JSON idênticas byte a byte às da v2.x (testes *_igual_v2); comandos, pinos, ESP32, servidor, frontend e simulador não mudaram. Campos opcionais novos (reset, lcd, ram_livre, fase, t_ms, bordas_juncao) e novos erros (sem_peca_topo, juncao_obstruida, motor_sem_avanco, peca_presa_saida).
  • CI: limite de 65% de RAM global na compilação do Uno; LiquidCrystal I2C@1.1.2 fixada.
  • Docs: docs/ARCHITECTURE.md §3 (marcos, erros, campos, diagrama), README.md, docs/CHANGELOG.md, docs/CI-CD.md e o roteiro docs/testes/roteiros/firmware_uno_v3_validacao.md.

Rollback: firmware v2.x no commit fddde08.

Como validar

  • Lógica (PC): docker run --rm -v "<repo>:/w" -w /w gcc:14 make -C test/firmware_uno test → 43 testes, 0 falhas.
  • Compilação: arduino-cli compile --fqbn arduino:avr:uno arduino/data_flow_inventory → 44% da flash, 46% da RAM, sem avisos no código do projeto.
  • Suítes existentes (frontend e test/server_metrics) passam.
  • Bancada: seguir docs/testes/roteiros/firmware_uno_v3_validacao.md — começar pela calibração dos sensores de junção (passo 2); com a J2 sempre ocupada, a v3 recusa pedidos de B com juncao_obstruida.

Checklist

  • Rodei as validações do Guia de Contribuição (scripts/precommit-checks) — não executado; as validações acima (testes, compilação, suítes) foram executadas
  • Não há senhas, tokens, .env ou secrets.h na mudança
  • Atualizei a documentação afetada e o docs/CHANGELOG.md (seção [Não publicado])
  • Mensagens de commit seguem o padrão tipo: descrição (feat, fix, docs, refactor, test, chore)
  • Informei o que não consegui validar: comportamento em bancada (sensores, motores, alimentação, causa do reset com o Optiboot, ruído real nos comparadores). Pendências raras aceitas: janela de R1 de ~5 ms após uma rajada de ruído durante a checagem prévia; um kick extra após travamento ≥ 2 s; limitador não pega pulsos > 100 kHz; falta o teste "12499 ms sem passagem".

🤖 Generated with Claude Code

MatheusNespolo and others added 21 commits October 3, 2026 17:57
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…to v2.x

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…saida)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… passagem

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… confirmacao

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tes da partida nao confirma

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…res, saida segura a cada ciclo

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e bancada da v3.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…de versao

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…igar o motor

Um pulso que comecava antes da partida e terminava depois confirmava a
entrega pelo maiorPulsoMs. O ACIONANDO_ESTEIRA repete a checagem da
juncao antes de zerar a captura e iniciar o supervisor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(19/20 ms)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…limita rajada de PCINT

- sensorJuncaoZerar marca o pulso em curso; ao liberar, a largura dele
  nao entra em maiorPulsoMs (R1).
- Mais de 8 bordas de uma juncao no mesmo millis() desligam a PCINT dela;
  sensoresAmostrar ressincroniza o nivel e religa. Uma rajada do LM393
  no limiar nao deixa mais o loop e a WDT_vect sem CPU.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… serial e static_assert dos prazos

- setup alimenta o watchdog antes e depois de lcdIniciar; lcdIniciar limpa
  a flag de timeout do I2C antes do init (sondagem de 0x27 sem resposta
  desligava a toa um LCD em 0x3F).
- motoresAplicar roda de novo depois da serial e do LCD.
- static_assert: prazoPartidaMs <= timeoutMs nas tres esteiras.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s checks obrigatorios

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…a do reset

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MatheusNespolo
MatheusNespolo merged commit a0d129c into main Oct 4, 2026
7 checks passed
@MatheusNespolo
MatheusNespolo deleted the feat/firmware-uno-v3 branch October 4, 2026 15:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant