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를 전용으로 사용하는 또 다른 좋은 이유는 합리적인 기본값으로 처음부터 설정할 수 있기 때문입니다. 그래서 그대로 진행했습니다. 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에서 연결 위젯(기본적으로 왼쪽 위 모서리)을 찾습니다.
○포트 아래의 새로 고침 버튼을 누릅니다.
○드롭다운을 열고 포트를 선택합니다.

●열기를 클릭합니다. 모든 것이 제대로 작동했다면 이제 Gcode 콘솔에 텍스트가 표시됩니다.

모터를 움직여 봅시다!


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


한 가지 참고할 점은 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
●다시 실행될 때까지 3~5분 정도 기다린 다음 http://plotter.local:8000/에 접속해 CNCjs가 다시 표시되는지 확인합니다. 제대로 했다면 곧바로 다시 실행될 것입니다.
성공입니다! 이제 거의 다 왔습니다. CNCjs 설정이 모두 끝났습니다. 하지만 무언가를 플로팅하려면 GCode 파일을 제공해야 합니다. CNCjs는 SVG를 기본적으로 처리하지 못합니다.

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

SVG를 Gcode로 변환하려면 Juicy-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 "Usage: $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와 플로터가 작업하는 동안 컴퓨터를 종료하거나 다른 방으로 가져갈 수 있습니다. 성공입니다!

블로그로 돌아가기

댓글 남기기

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