이 글은 @Erez Zukerman이 기고했습니다
나는 iDraw 2.0 플로터를 사용하는 것을 꽤 즐기지만, 느리게 작동시키는 편이라 플로팅 시간이 꽤 걸립니다. 기본 Inkscape 설정을 한동안 사용했지만, 작동할 때 메인 컴퓨터를 켜고 플로터에 연결해 두어야 했습니다. 이상적이지 않아 Raspberry Pi를 이용한 “헤드리스” 설정을 시도해 보기로 했습니다.
생각보다 훨씬 쉽고 재미있었습니다. 우리가 할 일은 다음과 같습니다:
●Pi 자체를 설정하기
●CNCjs와 그 의존성을 설치하기. 이것이 GCode를 전송해 플로터를 실제로 제어하는 데 사용할 도구입니다.
●Pi가 부팅할 때마다 CNCjs가 자동으로 시작되도록 설정하기(로그인이나 추가 작업 없이)
●SVG를 GCode로 변환하는 방법 알아내기(펜 속도 제어 포함)
이 튜토리얼은 Linux 명령줄 사용에 익숙하다고 가정합니다. 처음 게시된 후 몇 달 또는 몇 년이 지나 따라 하다 보면 여러 오류가 발생할 수 있는데, 이것이 바로 현실입니다. 작성 시점에는 설명한 시스템이 잘 작동했습니다.
시작해 봅시다!
Pi 설정하기
이 프로젝트 전용으로 Pi를 할당하는 것이 가장 좋습니다. 그렇게 하면 “플로터 컨트롤러”가 됩니다. 그렇지 않아도 작동은 하지만 시간이 지날수록 덜 편리할 수 있습니다.
이 프로젝트 전용으로 Pi를 할당하는 또 다른 좋은 이유는 처음부터 합리적인 기본값으로 설정할 수 있기 때문입니다. 그래서 32GB SD 카드를 준비해 공식 Raspberry Pi Imager 도구로 Raspberry Pi OS를 플래시했습니다.
이 도구가 제공하는 기능 중 하나는 바로 기본 설정을 처음부터 구성할 수 있다는 점입니다. 나는 설치 프로그램을 사용해 다음을 설정했습니다:
●내 사용자 이름과 비밀번호
●플로터 컨트롤러용 로컬 호스트 이름(내 경우 plotter.local)
●즉시 SSH 접속할 수 있도록 내 공개 SSH 키
●부팅 시 Pi가 내 네트워크에 연결되도록 내 WLAN SSID/비밀번호
이 모든 설정을 마친 후 Imager가 작업을 완료할 때까지 기다렸습니다. 완료되면 microSD 카드를 꺼내서 Pi에 꽂았습니다. 첫 부팅 때만 Pi를 키보드와 디스플레이에 연결했지만, 꼭 필요한 것은 아니었습니다. 제가 선택한 plotter.local 호스트 이름이 네트워크에 등록되는 데 잠시 시간이 걸려서, 터미널에서 ifconfig를 실행해 현재 IP를 확인하기 위해 키보드와 디스플레이를 사용했습니다.
기계에 SSH로 접속했고, 다음 단계인 CNCjs 설치로 넘어갈 시간입니다.
CNCjs 설치하기
이름에서 알 수 있듯이 CNCjs는 Node 기반입니다. 따라서 먼저 Node를 설치해야 합니다.
●Pi에 SSH로 접속하세요
●NVM을 설치합시다:
○curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
●터미널을 종료한 후 다시 ssh로 접속하세요. 이렇게 하면 NVM이 로드됩니다.
●이제 node를 설치합시다:
○nvm install node
●좋습니다! 이제 CNCjs를 설치할 시간입니다:
○npm install -g cncjs
●지금까지 모든 것이 잘 작동했다면, CNCjs를 한 번 실행해 봅시다. 이 작업으로 설정 파일 ~/.cncrc가 생성됩니다:
○홈 디렉터리에서 명령줄로 cncjs를 실행하세요
○Ctrl+C로 빠져나오세요
●이제 새로 생성된 ~/.cncrc 파일의 자랑스러운 소유자가 되셨습니다. 원격 접속을 허용하기 위해 이 파일을 편집해 봅시다:
○vi .cncrc
{
"allowRemoteAccess": true,
"state": {
"allowAnonymousUsageDataCollection": false,
"checkForUpdates": true,
"controller": {
"exception": {
"ignoreErrors": false
}
}
},
"secret": YOUR_SECRET HERE
}
여기에 추가해야 할 중요한 줄은 첫 번째 줄인 allowRemoteAccess입니다.
●Pi에서 다시 cncjs를 실행하세요.
●주요 컴퓨터의 브라우저에서 plotter.local:8000으로 접속하세요. CNCjs가 열릴 것입니다.

다음으로, 플로터를 연결하고 CNCjs가 통신할 수 있는지 확인할 시간입니다.
●iDraw 2.0 플로터를 Pi의 USB 포트에 연결하세요.
●플로터 전원을 켜세요.
●CNCjs에서 연결 위젯(기본적으로 왼쪽 상단)을 찾으세요.
○포트 아래의 새로 고침 버튼을 누르세요.
○드롭다운을 열어 포트를 선택하세요.

●Open을 클릭하세요. 모든 것이 제대로 작동했다면 Gcode 콘솔에 텍스트가 표시될 것입니다.

모터를 움직여 봅시다!
●Axes 위젯을 사용하여 +와 - 버튼을 눌러 모터를 움직이세요. 또한 “키패드 조깅”을 활성화하면 방향키로 플로터를 움직일 수 있습니다. 펜을 꽂고 Z축을 내리면 비싼 에치-어-스케치처럼 됩니다.

한 가지 주의할 점은 Y축의 0 위치가 예상과 반대라는 것입니다: 플롯 영역의 아래쪽으로 갑니다. 이 부분은 나중에 다시 다루겠습니다.
부팅 시 CNCjs가 실행되도록 설정하기
계속해서, Pi가 재부팅될 때마다 아무 것도 하지 않아도 이 최적의 상태로 자동으로 돌아가도록 설정해 보겠습니다. 그래서:
●Pi의 SSH 세션으로 돌아가서 Ctrl-C를 눌러 CNCjs를 종료하세요.
●브라우저를 새로고침하여 정말 종료되었는지 확인하세요 (plotter.local:8000, 위에서 설정한 호스트명 기준). 이제 접속이 실패해야 합니다.
●Pi에서 pm2를 설치하세요: npm install -g pm2
●pm2로 CNCjs를 시작하세요: pm2 start cncjs --name cncjs
●정말로 시작되었고 예상대로 작동하는지 확인하세요: 잠시 기다린 후 plotter.local:8000에 접속해 페이지가 로드되는지 확인하세요.
●시작 스크립트를 만드세요: pm2 startup. 그러면 sudo로 실행해야 하는 명령어가 출력됩니다. 그 명령어를 실행하세요.
●프로세스 목록을 저장하세요: pm2 save
●작동 여부를 확인하려면 Pi를 재부팅하세요: sudo reboot
●CNCjs가 다시 시작될 때까지 3-5분 정도 기다린 후 http://plotter.local:8000/ 에 접속해 CNCjs가 다시 실행되는지 확인하세요. 제대로 했다면 바로 다시 실행될 것입니다.
성공입니다! 거의 다 왔어요 – CNCjs가 이제 모두 설정되었습니다. 하지만 무언가를 플로팅하려면 GCode 파일을 입력해야 합니다 – SVG는 기본적으로 지원하지 않습니다.
SVG를 Gcode로 변환하는 파이프라인을 만드세요
SVG를 Gcode로 변환하기 위해 Juicy-Gcode라는 작은 커맨드라인 유틸리티를 사용할 것입니다.
여기서 큰 변화는 종이의 오른쪽 위가 아니라 왼쪽 아래 모서리를 기준으로 0점을 잡는다는 점입니다! 이 변화에 익숙해지는 데 시간이 좀 걸릴 수 있습니다. 나중에 다시 알려드릴게요.
●주요 컴퓨터에서 운영체제에 맞는 Juicy-Gcode 릴리스 바이너리를 다운로드하세요: https://github.com/domoszlai/juicy-gcode/releases
●Juicy-Gcode 설정은 “flavor 파일”이라고 부르는 yaml 파일에 저장됩니다. 여기 좋은 시작용 flavor 파일이 있으니, 이 내용을 flavor.yaml에 복사/붙여넣기 하세요:
begin: |
G21 ; 단위를 밀리미터로 설정
G17 ; 평면 선택을 XY로 설정
G90 ; 절대 위치 지정 설정
F600 ; 속도를 600 mm/분으로 설정 -- 매우 느리니 필요에 따라 수정하세요
G00 Z0 ; 펜 올리기
G92 X0 Y0 ; 현재 위치를 0,0으로 간주 -- 이것이 왼쪽 아래 모서리입니다
end: |
G0Z0 ; 펜 올리기
G00 X0 Y0 Z0
toolon: |
G0Z6 ; 펜을 종이에 내리기
tooloff: |
G0Z0 ; 펜 올리기
이 flavor 파일에 대해 주의할 몇 가지 중요한 사항:
●플로터 속도를 600mm/분으로 설정했는데, 이는 매우 느린 속도입니다. 펜 종류와 선호도에 따라 이 속도를 높이고 싶을 수 있습니다.
●다른 주목할 만한 명령어는 G92로 시작하는 줄입니다. 이 줄에서는 플로터에게 "지금 네가 있는 위치가 바로 홈이다"라고 알려줍니다. 따라서 플롯을 보정하려면 플로터 헤드를 종이의 왼쪽 아래 모서리로 수동으로(그리고 부드럽게) 이동시키길 기대합니다.
SVG에서 종이 크기를 올바르게 설정하는 것이 중요합니다.
Juicy-Gcode를 실행하는 명령은 대략 이렇게 생겼습니다:
juicy-gcode -f flavor.yaml image.svg -o image.gcode
매번 입력하기 번거로워서 좀 더 편리하게 만든 작은 스크립트입니다:
#!/bin/bash
# 사용법: ./run-juicy.sh input.svg [speed]
# 속도가 제공되지 않으면 기본값 600 사용
# 최소 하나의 인자가 제공되었는지 확인
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
echo "사용법: $0 <input-svg> [speed]"
echo "속도가 제공되지 않으면 기본값은 600입니다"
exit 1
fi
inputfile="$1"
# 속도가 제공되지 않으면 기본값 600 설정
speed="${2:-600}"
# flavor 파일 이름 생성
flavor_file="flavor-${speed}mm-speed.yaml"
# .svg 확장자를 .gcode로 바꿔 출력 파일 이름 생성
outputfile="${inputfile%.*}.gcode"
# juicy-gcode 명령 실행
juicy-gcode -f "$flavor_file" "$inputfile" -o "$outputfile"
이제 서로 다른 실행 속도를 가진 여러 가지 flavor 파일을 가질 수 있으며, flavor 파일 이름과 일치하는 숫자를 전달해 속도를 쉽게 지정할 수 있습니다.
이제 GCode 파일이 준비되었으니 업로드하고 플로팅할 시간입니다!
GCode를 업로드하고 플로팅하세요
CNCjs는 GCode 파일을 입력하는 두 가지 방법을 제공합니다: “Upload G-code”를 클릭해 브라우저를 통해 업로드하거나, 감시 디렉터리를 설정해 GCode 파일이 들어오면 플로터가 자동으로 작동하게 할 수 있습니다.
후자는 이론상 멋지게 들리지만 실제로는 별로 의미가 없습니다: 모든 플롯은 어쨌든 수동 설정이 필요합니다. 종이를 놓고, 펜을 설치하는 등 말이죠. 그래서 저에게는 브라우저를 통해 수동으로 파일을 업로드하는 것이 훨씬 더 합리적입니다.
그렇게 한 후에는 미리보기를 보기 위해 축소하세요.

이것은 몇 가지 중요한 검증 포인트를 제공합니다:
●플롯이 종이의 왼쪽 아래 모서리에서 시작된다는 점을 다시 한 번 상기시켜 줍니다.
●X축과 Y축 모두에서 측정값을 확인할 수 있습니다. 잠시 시간을 내어 이 값을 읽고 플로팅 영역을 초과하지 않는지 확인하는 것이 좋습니다. 만약 초과한다면 SVG에 문제가 있는 것이니 플로팅을 시작하지 마세요. 서보가 매우 불만족스러워할 수 있습니다.
펜이 종이의 왼쪽 아래 모서리에 있다고 가정하고 측정값이 맞다면, 이제 플로팅을 시작할 시간입니다! 재생 버튼을 눌러 플로터가 작동하는 모습을 지켜보세요. 이제 컴퓨터를 끄거나 다른 방으로 옮겨도 Pi와 플로터가 계속 작동합니다. 승리입니다!