3

Pitch: Reescrevi a interface do LaserWeb para cortar MDF no Linux (e testei sem ligar o laser)

Brasa Livre: tela principal com camadas, área de trabalho e painel do laser (tema escuro)

Além de programador e professor, sou "artesão digital": faço artes que viram cortes e gravações a laser. A dor desse meio é a ferramenta que conversa com a máquina. O software pago mais usado deixou de ativar aqui, e as opções open source são poucas e, em geral, hostis para quem não é especialista.

Então peguei um projeto open source, o LaserWeb (AGPL-3.0), e o adaptei ao jeito que eu trabalho. Chamei o resultado de Brasa Livre.

O problema

O LaserWeb funciona, mas foi pensado para cobrir o máximo de G-code e de hardware possível: câmera, sensor térmico, ventilação, simulações avançadas. Isso é ótimo, mas a interface expõe tudo com nomes técnicos e, no dia a dia, eu acabava mexendo em campos de texto que viram G-code. Não é difícil, mas não é humano de interpretar. Eu só queria usar o laser como um programa de imagem: camadas, manipulação livre de objetos, desfazer, e pronto.

O que eu fiz

Mantive o motor (geração de G-code/raster e o servidor de comunicação) e reescrevi a interface do zero, em português, numa janela única, para Linux.

  • Front-end React/Redux; servidor Node (socket.io + serialport) falando com GRBL 1.1h (Grbl_ESP32, placa MKS DLC32).
  • Camadas por arquivo + cor: cada cor de traço vira uma camada de linha/corte, cada cor de preenchimento vira gravação. A ordem dos cards é a ordem real de execução, e o programa avisa se um corte vier antes de uma gravação.
  • Presets de material (MDF 3 mm) a partir dos meus testes reais.
  • Texto, formas e edição de nós (opentype.js, Clipper para booleanas e offset), com Ctrl+Z/refazer.
  • Vetorização (Potrace, com limiar automático) e pontilhado de imagens: Floyd-Steinberg, Atkinson, Jarvis, Stucki, Bayer e limiar.
  • Matriz de teste de material: grade com velocidade nas colunas e potência nas linhas, com os valores gravados ao lado de cada quadrado.
  • Abre projetos .lbrn2 e .lbrn (só os meus, formato XML), convertendo camadas e formas.
  • Temas claro e escuro, com auditoria automática de contraste (WCAG AA).

Prévia do G-code gerado, com os trajetos e o tempo estimado:

Prévia do G-code com trajetos e tempo estimado

Imagem em pontilhado Floyd-Steinberg, com prévia no card da camada:

Pontilhado Floyd-Steinberg com prévia

Matriz de teste de material (velocidade × potência):

Matriz de teste de material

Ferramenta Texto, com prévia ao vivo:

Ferramenta de texto

Mesma interface no tema claro (Brasa claro):

Tema claro

Segurança como parte do design

Laser queima. Então:

  • Moldura com laser apagado antes de iniciar, na área real do trabalho.
  • Confirmação com checklist (foco, material preso, óculos, ventilação) antes de enviar qualquer G-code.
  • PARAR faz feed hold + reset + M5.
  • O Iniciar é bloqueado se o G-code liga o laser sem M3/M4 ou se a potência máxima configurada está errada (isso me pegou: configurações antigas no navegador fizeram um corte "não acender").
  • Mover a cabeça pelo teclado usa homem morto: sem sinal do cliente por 500 ms, o servidor cancela o movimento.
  • O servidor só escuta em 127.0.0.1 e confere o cabeçalho Origin dos WebSockets.

Como testei sem ligar o laser

Montei um GRBL simulado em um pseudo-terminal (pty) e testes ponta a ponta com Chrome headless (puppeteer). Eles abrem arquivos, mexem em camadas, iniciam o job e conferem o que o "GRBL" recebeu, linha a linha. Isso achou bugs que eu nunca veria olhando a tela, por exemplo:

  • comandos em tempo real acima de 0x7F (como o cancelamento de jog 0x85) saíam como UTF-8, em 2 bytes, e corrompiam o comando seguinte. Agora o servidor escreve bytes (latin1);
  • mover/redimensionar um objeto não marcava o G-code como desatualizado, então a moldura e o início usariam a posição antiga.

Onde estou

Os testes de gravação em MDF já deram resultados (preto sólido, gradiente de tons, contorno fino) e o corte está quase lá: pontes finas que sobram, sem relação clara com velocidade. O próximo passo é o segundo teste de corte, com o material preso e, se der, ar assistido. Só vou publicar o código depois de confiar no resultado gerado na máquina, porque não quero soltar algo que corta errado. Quando sair, vai com crédito ao LaserWeb original e sob AGPL-3.0.

Para onde quero ir

Um gerador paramétrico de caixas e encaixes (finger joint, tab-and-slot, living hinge) com compensação de kerf, nesting para aproveitar a chapa e, quem sabe, um simulador de montagem.

Se você trabalha com laser diodo ou quer ver algum detalhe técnico (o simulador de GRBL, a geração de camadas, o importador .lbrn2), comenta aí.

Carregando publicação patrocinada...