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

헤드리스 작동을 위해 iDraw 2.0 플로터와 Raspberry Pi를 설정하는 방법

이 글은 @Erez Zukerman이 기고했습니다.

저는 iDraw 2.0 플로터를 사용하는 것을 꽤 좋아하지만, 느린 속도로 작동시키는 편이라 플로팅에 시간이 걸릴 수 있습니다. 한동안 Inkscape의 기본 설정을 그대로 사용했지만, 작업 중에는 주 컴퓨터를 켜 둔 채 플로터에 연결해 두어야 했습니다. 이 방식은 이상적이지 않았기 때문에 Raspberry Pi를 사용해 “헤드리스” 설정을 할 수 있는지 알아보기로 했습니다.
생각보다 훨씬 쉬웠고 재미있기도 했습니다. 다음과 같은 작업을 진행할 것입니다.
●Pi 자체를 설정합니다.
●CNCjs와 종속 항목을 설치합니다. 이를 사용해 GCode를 네트워크로 전송하여 실제로 플로터를 제어합니다.
●또한 Pi가 부팅할 때마다 로그인하거나 다른 작업을 하지 않아도 CNCjs가 자동으로 시작하도록 설정하는 데 잠시 시간을 들일 것입니다.
●펜 속도 제어 기능을 사용해 SVG를 GCode로 변환하는 방법을 알아봅니다.
이 튜토리얼은 Linux 명령줄 사용에 익숙하다는 것을 전제로 합니다. 이 글이 처음 게시된 후 몇 달 또는 몇 년이 지나서 따라 하는 경우, 진행하면서 온갖 오류를 마주칠 수 있습니다. 그것이 바로 이 작업의 특성입니다. 작성 당시에는 여기 설명한 시스템이 제게 잘 작동했습니다.
시작해 보겠습니다!

Pi 설정

이 프로젝트만을 위해 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에서 Connection 위젯을 찾습니다(기본적으로 왼쪽 상단에 있습니다).
○Port 아래의 새로 고침 버튼을 누릅니다.
○드롭다운을 열고 포트를 선택합니다.

●Open을 클릭합니다. 모든 것이 제대로 작동했다면 이제 G코드 콘솔에 텍스트가 표시됩니다.

모터를 움직여 봅시다!


●Axes 위젯을 사용해 각 축의 +와 -를 눌러 모터를 움직여 보세요. “키패드 조그”를 활성화한 다음 화살표 키를 사용해 플로터를 움직일 수도 있습니다. 펜을 꽂고 Z축을 내리면 고급 Etch-a-Sketch처럼 사용할 수 있습니다.


한 가지 참고할 점은 Y축의 0 위치가 예상과 반대라는 것입니다. 플롯 영역의 아래쪽으로 이동합니다. 이 내용은 나중에 다시 다루겠습니다.

부팅 시 CNCjs 실행

계속 진행해 보겠습니다. 이제 Pi가 재부팅될 때마다 아무것도 하지 않아도 이 이상적인 상태로 돌아오도록 설정해야 합니다. 따라서:
●Pi의 SSH 세션으로 돌아가 Ctrl-C를 눌러 CNCjs를 종료합니다.
●브라우저를 새로 고쳐 정말로 종료되었는지 확인합니다 (위에서 구성한 호스트 이름이 plotter.local이라고 가정). 이제 접속에 실패해야 합니다.
●Pi에서 pm2를 설치합니다: npm install -g pm2
●pm2로 CNCjs를 시작합니다: pm2 start cncjs --name cncjs
●정말로 시작되었고 예상대로 작동하는지 확인합니다. 잠시 기다린 다음 plotter.local:8000으로 이동하여 로드되는지 확인합니다.
●시작 스크립트를 만듭니다: pm2 startup. 그러면 sudo를 사용해 실행해야 하는 명령이 출력되므로, 그대로 실행합니다.
●프로세스 목록을 저장합니다: pm2 save
●작동했는지 확인하기 위해 Pi를 다시 시작합니다: sudo reboot
●다시 켜질 때까지 3~5분 정도 기다린 다음 http://plotter.local:8000/에 접속하여 CNCjs가 다시 표시되는지 확인합니다. 제대로 했다면 곧바로 다시 작동할 것입니다.
승리입니다! 이제 거의 다 왔습니다 - CNCjs 설정이 완료되었습니다. 하지만 무언가를 플롯하려면 GCode 파일을 입력해야 합니다. CNCjs는 기본적으로 SVG를 처리하지 못합니다.

SVG를 Gcode로 변환하는 파이프라인 만들기

SVG를 Gcode로 변환하려면 Juicy-Gcode를 사용할 예정인데, 이는 간단한 명령줄 유틸리티입니다.
여기서 크게 바뀐 점은 종이의 오른쪽 위 모서리가 아니라 왼쪽 아래 모서리를 기준으로 영점을 설정한다는 것입니다! 이 변경 사항에 익숙해지는 데 시간이 조금 걸릴 수 있습니다. 나중에 다시 알려 드리겠습니다.
●메인 컴퓨터에서 운영 체제에 맞는 Juicy-Gcode 릴리스 바이너리를 다운로드합니다: https://github.com/domoszlai/juicy-gcode/releases
●Juicy-Gcode 구성은 “flavor file”이라고 하는 파일에 저장됩니다. 이는 단순한 yaml 파일입니다. 다음은 좋은 시작점이 되는 flavor 파일이므로, 이 내용을 복사하여 컴퓨터의 flavor.yaml에 붙여 넣을 수 있습니다:
begin: |
  G21 ; 단위를 밀리미터로 설정
  G17 ; 평면 선택을 XY로 설정
  G90 ; 절대 위치 지정 설정
  F600  ; 속도를 600mm/min으로 설정 -- 실제로 매우 느리므로 수정할 수 있습니다
  G00 Z0 ; 펜 올리기
  G92 X0 Y0 ; 현재 위치를 0,0으로 간주 -- 여기가 왼쪽 아래 모서리입니다
end: |
  G0Z0 ; 펜 올리기
  G00 X0 Y0 Z0
toolon: |
  G0Z6 ; 종이에 펜 내리기
tooloff: |
  G0Z0 ; 펜 올리기
  
이 flavor 파일에서 주의해야 할 몇 가지 중요한 사항입니다:
●저는 플로터를 600mm/min으로 작동시키는데, 매우 느린 속도입니다. 사용하는 펜과 선호도에 따라 속도를 높이고 싶을 수도 있습니다.
●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"
이제 서로 다른 실행 속도를 사용하는 여러 종류의 파일을 만들고, 해당 종류 파일의 파일 이름과 일치하는 숫자를 전달하여 속도를 쉽게 지정할 수 있습니다.
이제 GCode 파일이 있으니 업로드하고 플로팅할 차례입니다!

GCode 업로드 및 플로팅

CNCjs에서는 GCode 파일을 입력하는 두 가지 방법을 제공합니다. “Upload G-code”를 클릭하여 브라우저를 통해 업로드하거나, 감시 디렉터리를 설정할 수 있습니다(GCode 파일이 디렉터리에 나타날 때마다 플로터가 실행되도록 하는 방식입니다).
후자가 이론상으로는 멋지게 들리지만, 실제로는 그다지 말이 되지 않습니다. 어차피 모든 플롯에는 어느 정도 수동 설정이 필요하기 때문입니다. 종이를 배치하고 펜을 설치하는 등의 작업을 해야 합니다. 따라서 제게는 브라우저를 통해 파일을 수동으로 업로드하는 것이 훨씬 더 합리적입니다.
그런 다음 축소하여 미리 보기를 확인하세요. 

여기에는 몇 가지 중요한 정상 작동 확인 사항이 있습니다:
●플롯이 종이의 왼쪽 아래 모서리에서 시작된다는 점을 다시 한 번 (…) 상기합니다.
●X축과 Y축 모두의 치수를 확인할 수 있습니다. 잠시 시간을 내어 이 내용을 읽고 치수가 플로팅 영역을 초과하지 않는지 확인할 만합니다. 초과한다면 SVG에 문제가 있는 것이므로 플로팅을 시작하지 마세요. 서보 모터가 상당히 곤란해질 수 있습니다.
펜이 종이의 왼쪽 아래 모서리에 있고 치수가 올바르다고 가정하면, 이제 플로팅할 차례입니다! 재생 버튼을 누르고 플로터가 작동하는 모습을 지켜보세요. 이제 Pi와 플로터가 작업하는 동안 컴퓨터를 종료하거나 다른 방으로 가져가도 됩니다. 성공입니다!

블로그로 돌아가기

댓글 남기기

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