How to Set Up an iDraw 2.0 Plotter and a Raspberry Pi for Headless Operation

iDraw 2.0 플로터와 라즈베리 파이를 헤드리스 모드로 설정하는 방법

이 글은 @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와 플로터가 계속 작동합니다. 승리입니다!

블로그로 돌아가기

댓글 남기기

댓글은 게시되기 전에 승인되어야 합니다.