O ESP32 não resolve o cubo
Ele recebe um plano mecânico pronto e apenas executa a parte física com segurança.
Guia de arquitetura do firmware
Esta página explica, de forma visual e prática, como organizar o código embarcado para executar o plano mecânico vindo do sistema web.
Se você entrou agora no projeto, estes três pontos resumem o papel do firmware e evitam confundir responsabilidade de backend com controle físico.
Ele recebe um plano mecânico pronto e apenas executa a parte física com segurança.
jobId, actions e status started/finished/error já estão preparados no Next.js.
Comece por comunicação, machine state e homing antes de controlar todas as ações físicas.
Responsável por: Scanner guiado, revisão manual, visualização e animação.
Não deve fazer: Não controla hardware diretamente.
Responsável por: Valida CubeState, gera logicalMoves e mechanicalPlan.
Não deve fazer: Não pilota motores em tempo real.
Responsável por: Executa mechanicalPlan com segurança e precisão mecânica.
Não deve fazer: Não resolve cubo, não faz scanner, não recalcula solução.
A separação por módulos evita acoplamento entre comunicação, execução, controle físico e segurança.
Recebe comandos, parseia payload e publica status.
Isola protocolo de comunicação do controle físico.Executa a lista de ações em ordem e controla índice atual.
Mantém execução determinística e auditável por job.Abstrai direção, velocidade, aceleração e precisão de motores.
Evita espalhar detalhes de driver por todo firmware.Abre/fecha garras com sequência segura.
Garante fixação estável do cubo antes de girar eixos.Leva eixos à referência conhecida no boot e quando necessário.
Sem homing, o estado mecânico fica ambíguo.Timeout, falha de sensor, inconsistência e parada segura.
Protege máquina, usuário e cubo contra erro de execução.Estado global da máquina e transições permitidas.
Facilita debug, telemetria e integração com o backend.Pinos, limites, perfis de velocidade e parâmetros físicos.
Centraliza calibração sem alterar regras de negócio.Boot do ESP32
Load de config + init de drivers
Homing inicial
Estado ready
Recebe mechanicalPlan
Valida estrutura + entra em queued
Publica started
Executa ação por ação
Publica finished ou error
Estado explícito aumenta previsibilidade operacional, facilita debug e define transições seguras.
Firmware ligado, sem plano carregado.
Ajustando referência mecânica inicial.
Pronto para receber e validar plano.
Plano aceito, aguardando início de execução.
Execução iniciada; frontend pode disparar animação.
Ações sendo executadas em sequência.
Plano finalizado com sucesso.
Falha detectada; exige tratamento e recuperação.
{
"jobId": "cube-001",
"actions": [
{ "type": "home", "target": "all" },
{ "type": "clamp", "name": "A", "state": "close" },
{ "type": "rotate_cube", "axis": "x", "degrees": 90 },
{ "type": "turn_face", "actuator": "right", "degrees": 90 },
{ "type": "wait", "durationMs": 120 }
]
}{
"jobId": "cube-001",
"status": "started",
"updatedAt": "2026-04-08T18:00:00.000Z"
}O frontend já está preparado para iniciar animação ao receber started. Também espera finished e error.
Recebe comandos, parseia payload e publica status.
Isola protocolo de comunicação do controle físico.
Executa a lista de ações em ordem e controla índice atual.
Mantém execução determinística e auditável por job.
Abstrai direção, velocidade, aceleração e precisão de motores.
Evita espalhar detalhes de driver por todo firmware.
Abre/fecha garras com sequência segura.
Garante fixação estável do cubo antes de girar eixos.
Leva eixos à referência conhecida no boot e quando necessário.
Sem homing, o estado mecânico fica ambíguo.
Timeout, falha de sensor, inconsistência e parada segura.
Protege máquina, usuário e cubo contra erro de execução.
Estado global da máquina e transições permitidas.
Facilita debug, telemetria e integração com o backend.
Pinos, limites, perfis de velocidade e parâmetros físicos.
Centraliza calibração sem alterar regras de negócio.
firmware/
src/
main.cpp
comm/
comm_manager.cpp
executor/
plan_executor.cpp
motors/
motor_controller.cpp
clamps/
clamp_controller.cpp
homing/
homing_controller.cpp
safety/
safety_controller.cpp
state/
machine_state.cpp
config/
machine_config.henum class ActionType {
Home,
Clamp,
RotateCube,
TurnFace,
Wait
};
struct MechanicalAction {
ActionType type;
// campos específicos por tipo
};Representação lógica de solução do cubo.
["R", "U", "R'", "U'", "F2"]Ações físicas executáveis por atuadores.
turn_face / clamp / home / wait