← BH RAMPS CoreXY · Basement Hacks

Otimização Marlin

Marlin 2.1.2.7 · Arduino Mega 2560 + RAMPS · CoreXY + host ESP32

Antes = firmware base configurado (jul/2026) · Depois = build otimizado (28-29/ago/2026) · números de build real (avr-size / avr-nm)

Velocidade XY
100 → 200 mm/s
2×
FLASH
110,4 → 100,3 KB
−9,1%
Lookahead
16 → 32 blocos
2×
Emergency stop
na fila → prioritário
M112 fura a fila

Menos código não foi o objetivo. Tiramos o que não servia para abrir espaço para o que melhora a máquina — por isso a FLASH caiu e a RAM subiu.

2 · Tiramos e reinvestimos

FLASH, decisão por decisão

Cada barra é uma etapa medida por build (bytes de programa)

110k105k100k 95k90k Base: 110.440 B (43,5% do chip) 110.440 Base Emergency parser ON, debug OFF: +844 B — M112 passa a furar a fila +844 M112 real SDSUPPORT OFF: −14.440 B — o host ESP32 faz o streaming do G-code −14.440 SD → ESP32 ARC_SUPPORT + EEPROM_CHITCHAT OFF: −5.116 B — fatiadores não emitem G2/G3; a UI lê M503 −5.116 arcos+eco 1/16 + velocidades novas + S-curve + hybrid + home: +5.244 B +5.244 movimento LIN_ADVANCE (K=0) + buffer 16→32: +3.364 B — planner 2×, LA pronto p/ calibrar +3.364 planner 2× Final: 100.336 B (39,5% do chip) — 60% da flash livre 100.336 Depois
Removido (liberou espaço) Reinvestido (qualidade/segurança) Marco medido
Ver como tabela
EtapaΔ FLASHΔ RAMTotal
Base——110.440
Emergency parser ON / debug OFF+844+13111.284
SDSUPPORT OFF−14.440−1.18196.844
ARC + EEPROM_CHITCHAT OFF−5.116091.728
1/16 + vel. + S-curve + hybrid+5.244+24196.972
LIN_ADVANCE + buffer 32+3.364+1.724100.336
−19.556 B
removidos — redundantes com o host ESP32 ou nunca usados
+9.452 B
reinvestidos — movimento, segurança e controle
60%
da FLASH segue livre depois de tudo

3 · O que mudou na impressora

Movimento

 

  • 1/32 → 1/16metade da taxa de STEP para o mesmo deslocamento; o TMC2209 mantém interpolação interna até 1/256
  • 100 → 200 mm/so orçamento recuperado virou velocidade
  • 16 → 32 blocoso planner ganhou mais horizonte
  • S-curve ONrampas mais suaves
  • JD 0,013 → 0,05menos conservador nas junções
flags reais X/Y_MICROSTEPS 16 · DEFAULT_AXIS_STEPS_PER_UNIT {80,80,800,110} · DEFAULT_MAX_FEEDRATE {200,200,12,50} · DEFAULT_MAX_ACCELERATION {3000,3000,150,3000} · DEFAULT_ACCELERATION 1500 · DEFAULT_TRAVEL_ACCELERATION 2500 · JUNCTION_DEVIATION_MM 0.05 · S_CURVE_ACCELERATION · BLOCK_BUFFER_SIZE 32 · LIN_ADVANCE (K=0)

Segurança

 

  • Emergency parser ONo STOP da interface web não espera a fila de G-code
  • SD do Marlin OFFo ESP32 guarda os arquivos e envia linha a linha — um leitor a menos para falhar
  • Eco de EEPROM OFFa UI lê valores do M503, não das confirmações
flags reais EMERGENCY_PARSER · //SDSUPPORT · //EEPROM_CHITCHAT · EEPROM_SETTINGS

Homing

 

  • 2 chaves removidasX/Y agora usam o StallGuard dos TMC2209 (fio DIAG)
  • Backoff de 2 mmafasta antes do home — nunca começa encostado no batente
  • Y primeiro, depois Xos dois sensores ficam no mesmo canto; X ainda afasta 5 mm após o Y
flags reais SENSORLESS_HOMING · X/Y_STALL_SENSITIVITY 50 · X/Y_CURRENT_HOME 600 · SENSORLESS_BACKOFF_MM {2,2,0} · HOMING_BUMP_MM {0,0,2} · HOME_Y_BEFORE_X · XY_COUNTERPART_BACKOFF_MM 5 · ENDSTOPPULLUPS · IMPROVE_HOMING_RELIABILITY

Drivers

 

  • Hybrid threshold ONsilêncio em baixa velocidade, torque em alta
  • Pulso 2 → 5 µso optoacoplador do TB6600 (eixo Z) exige
  • 800 mA por UARTcorrente e micropasso ajustáveis por firmware
flags reais HYBRID_THRESHOLD (X/Y 100, Z 3, E 30 mm/s) · MINIMUM_STEPPER_PULSE 5 · X/Y/E0_CURRENT 800 · UART X=D63 Y=D64 E0=D66

4 · A RAM aumentou — de propósito

56% da RAM usada hoje é o buffer do planner.

O espaço liberado pelo SD permitiu dobrar o lookahead de 16 para 32 blocos. RAM livre não é necessariamente RAM bem utilizada.

Planner 3.072 Fila de G-code 601 Serial 260 · TMC 253 Outros ~1.321 Livre 2.685 — total usado 5.507 / 8.192 B (67,2%)

5 · Até onde dá para empurrar o ATmega2560?

Demanda × capacidade da ISR

Eventos de passo por segundo (CoreXY, config atual) — escala até 16 kHz

Demanda @ 100 mm/s
8,0 kHz
Teto do Mega hoje
11,5 kHz
Demanda @ 200 mm/s
16,0 kHz
Teto com input shaping
9,5 kHz
demanda da máquina capacidade da ISR marca do teto atual

A 200 mm/s a demanda já passa o teto — o Marlin agrupa pulsos (multistepping) para dar conta. Ligar shaping derruba o teto. Chegamos ao ponto em que a próxima otimização não é apagar outra feature: é trocar o orçamento computacional.

A conclusão do experimento

A BHX 401 não nasce de troca arbitrária de eletrônica — é o que o teto pede

Mega atualBHX 401 (nova)
RAM livre2,7 KB54,7 KB
Teto calculado da ISR~11,5 kHz~78 kHz
Input shapingcompromete margemcabe com folga
Limite encontradonão faltam mais configurações — falta orçamento de CPU e RAM
Próximo capítuloa BHX 401, com o mesmo método: medir → alterar → medir
Antesfirmware genérico configurado para a máquina
Otimizaçãotiramos os recursos redundantes (−19,6 KB)
Reinvestimentoplanner, segurança, drivers e movimento (+9,4 KB)
Resultado2× velocidade, 2× lookahead, sensorless, STOP real, menos FLASH
Limitenão faltam configs — falta CPU/RAM
Próximo capítuloBHX 401

Fontes: otimizacao-firmware-v2.md (etapas A→G, medido por build) · estudos/firmware/18-dados-otimizacao-mega.md · tools/baseline.sh — Basement Hacks, ago/2026