Este artigo foi contribuído por @Erez Zukerman
Gosto bastante de usar o meu plotter iDraw 2.0, mas prefiro utilizá-lo lentamente — por isso, os meus desenhos podem demorar algum tempo. Durante bastante tempo, usei a configuração predefinida do Inkscape, mas tinha de manter o meu computador principal ligado e conectado ao plotter enquanto este trabalhava. Não era o ideal — por isso, decidi ver se conseguia configurar um sistema “sem monitor” utilizando um Raspberry Pi.
Acabou por ser bastante mais fácil do que eu pensava, e também divertido. Eis o que vamos fazer:
●Configurar o próprio Pi.
●Instalar o CNCjs e as respetivas dependências. É isto que vamos utilizar para controlar efetivamente o plotter, enviando GCode através da rede.
●Também vamos dedicar algum tempo a configurar o CNCjs para que arranque automaticamente sempre que o Pi for iniciado, sem que tenha de iniciar sessão ou fazer qualquer outra coisa.
●Descobrir como converter os nossos SVG em GCode (com controlo da velocidade da caneta).
Tenha em atenção que este tutorial pressupõe que se sente à vontade com a linha de comandos do Linux. Se estiver a seguir estas instruções meses ou anos depois da publicação original, poderá encontrar todo o tipo de erros ao longo do caminho — essa é a natureza da coisa. Na altura em que escrevi, o sistema descrito funcionava bem para mim.
Vamos começar!
Configurar o Pi
O ideal é poder dedicar um Pi exclusivamente a este projeto, para que seja o seu “controlador do plotter”. Se não for possível, não há problema — continuará a funcionar, mas poderá ser menos conveniente com o tempo.
Outra boa razão para dedicar um Pi exclusivamente a este projeto é poder configurá-lo de raiz com predefinições adequadas. Foi exatamente isso que fiz: peguei num cartão SD de 32 GB e usei a ferramenta oficial Raspberry Pi Imager para instalar nele o Raspberry Pi OS.
Uma das coisas que a ferramenta permite fazer, e que recomendo, é configurar alguns valores predefinidos logo à partida. Usei o instalador para configurar o seguinte:
●O meu nome de utilizador e palavra-passe
●Um nome de anfitrião local para o controlador do plotter (plotter.local, no meu caso)
●A minha chave SSH pública, para poder aceder imediatamente à máquina por SSH
●O SSID e a palavra-passe da minha WLAN, para que o Pi se ligasse à minha rede ao arrancar
Configurei tudo isto e deixei o Imager fazer o seu trabalho. Quando terminou, ejetei o cartão microSD e inseri-o no Pi. Apenas no primeiro arranque, liguei o Pi a um teclado e a um monitor — mas isso não era estritamente necessário. O nome de anfitrião plotter.local que escolhi demorou alguns momentos a ser registado na minha rede, por isso usei o teclado e o monitor para obter o IP atual (executando ifconfig no terminal).
Liguei-me à máquina por SSH e estava na altura de avançar para o passo seguinte: instalar o CNCjs
Instalar o CNCjs
Como pode deduzir pelo nome, o CNCjs é baseado em Node. Por isso, primeiro precisamos de instalar o Node.
●Ligue-se ao Pi por SSH
●Vamos instalar o NVM:
○curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
●Saia do terminal e volte a iniciar sessão por SSH. Isto carrega o NVM.
●Agora vamos instalar o node:
○nvm install node
●Ótimo! Está na altura de instalar o CNCjs:
○npm install -g cncjs
●Partindo do princípio de que tudo funcionou bem até aqui, vamos executar o CNCjs apenas uma vez. Isto criará o nosso ficheiro de configuração, ~/.cncrc:
○Na linha de comandos, na sua pasta pessoal, execute cncjs
○Saia dele com Ctrl+C
●É agora o orgulhoso proprietário de um ~/.cncrc novinho em folha; parabéns. Vamos editá-lo, principalmente para permitir o acesso remoto:
○vi .cncrc
{
"allowRemoteAccess": true,
"state": {
"allowAnonymousUsageDataCollection": false,
"checkForUpdates": true,
"controller": {
"exception": {
"ignoreErrors": false
}
}
},
"secret": YOUR_SECRET HERE
}
A linha crucial a adicionar aqui é a primeira, allowRemoteAccess.
●Execute novamente o cncjs no Pi.
●Utilizando o navegador no seu computador principal, aceda a plotter.local:8000. Deverá abrir o CNCjs.

Em seguida, é altura de ligar o plotter e ver se o CNCjs consegue comunicar com ele.
●Ligue o plotter iDraw 2.0 à porta USB do Pi.
●Ligue o plotter.
●No CNCjs, localize o widget Connection (por predefinição, no canto superior esquerdo).
○Prima o botão Refresh por baixo de Port.
○Abra o menu pendente e escolha a porta.

●Clique em Open. Se tudo tiver funcionado, a consola Gcode deverá apresentar agora algum texto.

Vamos mover os motores!
●Utilizando o widget Axes, prima + e - nos vários eixos para mover os motores. Também pode ativar o «keypad jogging» e usar as teclas de setas para mover o plotter. Se colocar uma caneta e baixar o eixo Z, é como um Etch-a-Sketch dispendioso.

Uma nota: a posição 0 no eixo Y é o oposto do que poderia esperar: vai para o fundo da área de desenho. Voltaremos a isto mais tarde.
Fazer o CNCjs arrancar durante o arranque
Prosseguindo, agora queremos voltar a este ponto ideal sempre que o Pi reiniciar, sem que tenha de fazer nada. Portanto:
●De volta à sessão SSH no Pi, termine o CNCjs premindo Ctrl-C.
●Certifique-se de que está mesmo parado atualizando o navegador (plotter.local:8000, partindo do princípio de que esse é o nome de anfitrião que configurou acima). Isto deverá agora falhar.
●No Pi, instale o pm2: npm install -g pm2
●Inicie o CNCjs com o pm2: pm2 start cncjs --name cncjs
●Certifique-se de que arrancou realmente e funciona como esperado: aguarde alguns instantes e, depois, aceda a plotter.local:8000 para confirmar que carrega.
●Crie um script de arranque: pm2 startup. Isto irá apresentar um comando que precisa de executar com sudo; faça-o.
●Guarde a lista de processos: pm2 save
●Reinicie o Pi para ver se funcionou: sudo reboot
●Aguarde que volte a arrancar, talvez 3–5 minutos, e depois aceda a http://plotter.local:8000/ para ver se consegue voltar a utilizar o CNCjs. Se tiver feito tudo corretamente, deverá voltar a funcionar normalmente.
Vitória! Estamos quase lá – o CNCjs está agora totalmente configurado. Mas, para desenhar algo, precisamos de lhe fornecer um ficheiro GCode – este não suporta SVG nativamente.
Crie um pipeline para converter SVGs em Gcode
Para converter o nosso SVG em Gcode, vamos utilizar o Juicy-Gcode, que é um pequeno utilitário de linha de comandos.
Uma grande alteração aqui é que estamos a definir a origem relativamente ao canto inferior esquerdo do papel, e não ao canto superior direito! Esta alteração pode exigir algum tempo para se habituar. Voltarei a lembrar-lho mais tarde.
●Na sua máquina principal, descarregue o binário da versão do Juicy-Gcode para o seu sistema operativo: https://github.com/domoszlai/juicy-gcode/releases
●A configuração do Juicy-Gcode é guardada num ficheiro que se chama “ficheiro de configuração”. É apenas um ficheiro YAML. Eis um bom ficheiro de configuração inicial; pode copiar/colar isto em flavor.yaml na sua máquina:
begin: |
G21 ; Definir as unidades para milímetros
G17 ; Definir a seleção do plano para XY
G90 ; Definir o posicionamento absoluto
F600 ; Definir a velocidade para 600 mm/min -- isto é realmente lento, talvez queira editar
G00 Z0 ; caneta levantada
G92 X0 Y0 ; considerar a posição atual como 0,0 -- este é o canto INFERIOR ESQUERDO
end: |
G0Z0 ; caneta levantada
G00 X0 Y0 Z0
toolon: |
G0Z6 ; caneta baixada sobre o papel
tooloff: |
G0Z0 ; caneta levantada
Alguns aspetos importantes a ter em conta sobre este ficheiro de configuração:
●Eu utilizo o plotter a 600 mm/min, o que é muito lento. Talvez queira aumentar esta velocidade, dependendo das suas canetas e preferências.
●A outra linha digna de nota é a que começa por G92. Nesta linha, estamos a dizer ao plotter: «onde quer que esteja neste momento, essa é a origem». Por isso, para calibrar um desenho, esperamos que mova manualmente (e suavemente) a cabeça do plotter para o canto inferior esquerdo do papel.
É importante configurar corretamente o tamanho do papel no SVG.
Para executar o Juicy-Gcode, o comando é semelhante a este:
juicy-gcode -f flavor.yaml image.svg -o image.gcode
É um pouco trabalhoso escrever tudo isto de cada vez, por isso criei este pequeno script para tornar as coisas um pouco mais práticas:
#!/bin/bash
# Utilização: ./run-juicy.sh input.svg [speed]
# Se a velocidade não for fornecida, o valor predefinido é 600
# Verificar se foi fornecido pelo menos um argumento
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
echo "Utilização: $0 <input-svg> [speed]"
echo " Se a velocidade não for fornecida, o valor predefinido é 600"
exit 1
fi
inputfile="$1"
# Definir a velocidade predefinida como 600, caso não seja fornecida
speed="${2:-600}"
# Criar o nome do ficheiro da variante
flavor_file="flavor-${speed}mm-speed.yaml"
# Gerar o nome do ficheiro de saída substituindo a extensão .svg por .gcode
outputfile="${inputfile%.*}.gcode"
# Executar o comando juicy-gcode
juicy-gcode -f "$flavor_file" "$inputfile" -o "$outputfile"
Pode agora ter vários ficheiros de variantes diferentes, cada um com uma velocidade de execução diferente, e especificar facilmente a velocidade passando o número correspondente ao nome do ficheiro da variante.
Agora que tem um ficheiro GCode, está na altura de o carregar e desenhar!
Carregar o GCode e desenhar
O CNCjs dá-nos duas formas de fornecer um ficheiro GCode: podemos carregá-lo através do navegador, clicando em «Carregar G-code», ou podemos configurar um diretório monitorizado (para que, sempre que um ficheiro GCode apareça nele, o plotter comece a funcionar).
A segunda opção parece interessante em teoria, mas não faz muito sentido: qualquer desenho requer alguma preparação manual. Temos de colocar o papel, instalar a caneta, etc. Por isso, para mim, faz muito mais sentido carregar manualmente o ficheiro através do navegador.
Depois de fazer isso, reduza o zoom para ver a pré-visualização.

Isto dá-nos algumas verificações importantes de coerência:
●Somos relembrados mais uma vez (…) de que o desenho começará no canto inferior esquerdo do nosso papel.
●Podemos ver as medidas nos eixos X e Y. Vale a pena parar um momento para as ler e verificar se não ultrapassam a sua área de desenho. Se ultrapassarem, há um problema com o seu SVG – não comece a desenhá-lo, ou os seus servomotores não ficarão nada contentes.
Partindo do princípio de que a sua caneta está no canto inferior esquerdo do papel e de que as medidas fazem sentido, está na altura de desenhar! Prima o botão Reproduzir e observe o seu plotter. Pode agora desligar o computador ou levá-lo para outra divisão enquanto o Pi e o plotter trabalham. Vitória!