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)를 활용하여 '헤드리스(headless)' 방식으로 플로터를 제어할 수 있는 방법을 찾아보기로 했습니다.
결과적으로 생각했던 것보다 훨씬 더 쉬웠고, 과정 또한 꽤 재미있었습니다. 우리가 진행할 단계는 다음과 같습니다.
● 라즈베리 파이 본체 설정하기
● CNCjs 및 관련 의존성 패키지 설치하기. 이 도구를 사용하여 네트워크를 통해 GCode를 전송하고, 실제로 플로터를 제어하게 됩니다.
● 또한, 사용자가 별도로 로그인하거나 조작할 필요 없이, 라즈베리 파이의 전원이 켜질 때마다 CNCjs가 자동으로 실행되도록 설정하는 작업도 함께 진행합니다.
● SVG 파일을 GCode로 변환하는 방법(펜 속도 제어 포함) 알아보기
참고로 이 튜토리얼은 리눅스(Linux) 명령줄 환경을 다루는 데 어느 정도 익숙한 분들을 대상으로 작성되었습니다. 만약 이 글이 처음 게시된 시점으로부터 수개월 혹은 수년이 지난 뒤에 튜토리얼을 따라 하신다면, 진행 도중 온갖 종류의 오류를 마주하게 될 수도 있습니다. 이는 기술 환경의 변화에 따른 자연스러운 현상입니다. 이 글을 작성하는 시점 기준으로는, 여기서 설명하는 시스템이 저에게 아주 잘 작동했습니다.
자, 그럼 시작해 볼까요!

라즈베리 파이 설정하기

가장 좋은 방법은 이 프로젝트만을 위해 라즈베리 파이 한 대를 전용으로 할당하여 '플로터 제어기'로 사용하는 것입니다. 만약 전용 기기를 마련하기 어렵더라도 걱정할 필요는 없습니다. 여전히 정상적으로 작동하겠지만, 시간이 지남에 따라 사용 편의성이 다소 떨어질 수는 있습니다.
이 프로젝트만을 위해 라즈베리 파이를 전용으로 사용하는 것이 좋은 또 다른 이유는, 처음부터 합리적이고 적절한 기본 설정들을 적용하여 시스템을 구축할 수 있기 때문입니다. 저 또한 바로 그 방법을 택했습니다. 32GB SD 카드를 준비한 뒤, 공식 'Raspberry Pi Imager' 도구를 사용하여 SD 카드에 Raspberry Pi OS를 설치(플래싱)했습니다.
이 도구가 제공하는 기능 중 제가 강력히 추천하고 싶은 한 가지는, 초기 설치 단계에서부터 몇 가지 기본 설정을 미리 지정해 둘 수 있다는 점입니다.

설치 프로그램을 사용하여 다음 항목들을 설정했습니다.
● 사용자 이름 및 비밀번호
● 플로터 컨트롤러를 위한 로컬 호스트 이름(제 경우에는 plotter.local)
● 기기에 즉시 SSH로 접속할 수 있도록 제 공개 SSH 키
● 라즈베리 파이(Pi)가 부팅 시 제 네트워크에 연결될 수 있도록 WLAN SSID 및 비밀번호
이 모든 설정을 마친 후, Imager 프로그램이 작업을 수행하도록 두었습니다. 작업이 완료되자 microSD 카드를 추출하여 라즈베리 파이에 장착했습니다. 첫 부팅 시에만 키보드와 모니터를 라즈베리 파이에 연결했는데, 사실 이는 필수는 아니었습니다. 제가 설정한 plotter.local 호스트 이름이 네트워크에 등록되는 데 잠시 시간이 걸렸기에, 키보드와 모니터를 사용하여 현재 IP 주소를 확인했습니다(터미널에서 ifconfig 명령 실행).
SSH로 기기에 접속했고, 이제 다음 단계인 'CNCjs 설치'로 넘어갈 차례가 되었습니다.

 

CNCjs 설치

이름에서 짐작하실 수 있듯이, CNCjs는 Node 기반으로 작동합니다. 따라서 가장 먼저 Node를 설치해야 합니다.
●라즈베리 파이에 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' 항목 아래에 있는 'Refresh' 버튼을 누르세요.
○ 드롭다운 메뉴를 열어 해당 포트를 선택하세요.

● 'Open' 버튼을 클릭하세요. 모든 과정이 정상적으로 진행되었다면, 이제 G-code 콘솔 창에 메시지 텍스트가 표시될 것입니다.

이제 모터를 움직여 봅시다!


● 'Axes' 위젯을 사용하여 각 축의 '+' 및 '-' 버튼을 누르면 모터가 움직입니다. 또한 'keypad jogging' 기능을 활성화한 뒤, 키보드의 방향키를 사용하여 플로터의 위치를 이동시킬 수도 있습니다. 펜을 꽂은 뒤 Z축을 아래로 내리면, 마치 고급형 '에치 어 스케치(Etch-a-Sketch)' 장난감처럼 작동합니다.


한 가지 유의할 점은 Y축의 0 위치가 여러분이 예상하는 것과는 반대라는 것입니다. 즉, 플롯 영역(작업 영역)의 가장 아래쪽이 Y축의 0 위치가 됩니다. 이 부분에 대해서는 나중에 다시 다루겠습니다.

부팅 시 CNCjs가 자동 실행되도록 설정하기

자, 계속해서 진행해 보겠습니다. 이제 라즈베리 파이(Pi)가 재부팅될 때마다 사용자가 별도의 조작을 하지 않아도 자동으로 CNCjs가 실행되는 상태, 즉 최적의 작업 환경으로 복귀하도록 설정해 보겠습니다. 방법은 다음과 같습니다:
● 라즈베리 파이로 접속한 SSH 세션으로 돌아가, Ctrl-C를 눌러 실행 중인 CNCjs 프로세스를 종료합니다.
● 브라우저를 새로고침하여 CNCjs가 실제로 완전히 종료되었는지 확인합니다(주소는 plotter.local:8000이며, 이는 앞서 설정한 호스트네임을 기준으로 합니다). 이제 접속이 실패해야 정상입니다.
● 라즈베리 파이 터미널에서 pm2를 설치합니다: `npm install -g pm2`
● pm2를 사용하여 CNCjs를 실행합니다: `pm2 start cncjs --name cncjs`
● CNCjs가 실제로 실행되어 예상대로 작동하는지 확인합니다: 잠시 기다린 후 plotter.local:8000에 접속하여 화면이 정상적으로 로드되는지 확인합니다.
● 시작 스크립트를 생성합니다: `pm2 startup`. 이 명령을 실행하면 `sudo` 권한으로 실행해야 할 명령어가 출력되는데, 해당 명령어를 그대로 실행해 줍니다.
● 현재 실행 중인 프로세스 목록을 저장합니다: `pm2 save`
● 설정이 제대로 적용되었는지 확인하기 위해 라즈베리 파이를 재부팅합니다: `sudo reboot`
● 재부팅이 완료될 때까지 3~5분 정도 기다린 후, http://plotter.local:8000/에 접속하여 CNCjs 화면이 다시 뜨는지 확인합니다. 모든 과정을 올바르게 수행했다면, 별다른 문제 없이 바로 접속될 것입니다.
성공입니다! 이제 거의 다 왔습니다. CNCjs의 기본 설정은 모두 완료되었습니다. 하지만 실제로 그림을 그리기(플롯팅) 위해서는 G-Code 파일이 필요합니다. CNCjs는 SVG 파일을 자체적으로 직접 처리하지는 못하기 때문입니다.

SVG를 G-Code로 변환하는 파이프라인 구축하기

SVG 파일을 G-Code로 변환하기 위해, 우리는 'Juicy-Gcode'라는 소형 명령줄 유틸리티를 사용할 것입니다.
여기서 한 가지 중요한 변경 사항이 있습니다. 작업의 기준점(Zeroing)을 용지의 '오른쪽 상단'이 아닌, '왼쪽 하단'을 기준으로 잡는다는 점입니다! 이 변경된 기준점에 익숙해지는 데는 다소 시간이 걸릴 수도 있습니다.

나중에 다시 한번 알려드리겠습니다.
●메인 컴퓨터에서 사용 중인 운영 체제에 맞는 Juicy-Gcode 릴리스 바이너리를 다운로드하세요: https://github.com/domoszlai/juicy-gcode/releases
●Juicy-Gcode의 설정은 소위 "flavor file(플레이버 파일)"이라 불리는 파일에 저장됩니다. 이는 단순히 YAML 형식의 파일일 뿐입니다. 여기 시작용으로 적합한 flavor 파일 예시가 있으니, 내용을 복사하여 컴퓨터의 `flavor.yaml` 파일에 붙여넣으시면 됩니다:
begin: |
  G21 ; 단위를 밀리미터(mm)로 설정
  G17 ; 평면 선택을 XY 평면으로 설정
  G90 ; 절대 좌표 모드로 설정
  F600  ; 속도를 600 mm/min으로 설정 -- 이는 매우 느린 속도이므로, 필요에 따라 수정하는 것이 좋습니다
  G00 Z0 ; 펜 올리기
  G92 X0 Y0 ; 현재 위치를 (0,0)으로 간주 -- 이는 '왼쪽 하단' 모서리에 해당합니다
end: |
  G0Z0 ; 펜 올리기
  G00 X0 Y0 Z0
toolon: |
  G0Z6 ; 펜을 내려 종이에 닿게 하기
tooloff: |
  G0Z0 ; 펜 올리기
  
이 flavor 파일과 관련하여 몇 가지 중요하게 짚고 넘어갈 점이 있습니다:
●저는 플로터를 600mm/min의 속도로 구동하는데, 이는 매우 느린 속도입니다. 사용하는 펜의 종류나 개인적인 선호도에 따라 속도를 더 높이고 싶으실 수도 있습니다.
●또 하나 주목할 만한 줄은 G92로 시작하는 코드입니다. 이 줄을 통해 우리는 플로터에게 "현재 위치가 어디든, 그곳을 원점(Home)으로 삼으라"는 명령을 내리는 것입니다.
플로팅 작업을 보정(calibrate)하려면, 플로터 헤드를 수동으로(그리고 조심스럽게) 용지의 왼쪽 하단 모서리로 이동시켜 주셔야 합니다.
SVG 파일 내에서 용지 크기가 올바르게 설정되어 있는지 확인하는 것이 매우 중요합니다.
Juicy-Gcode를 실행하는 명령어는 대략 다음과 같은 형태입니다:
juicy-gcode -f flavor.yaml image.svg -o image.gcode
매번 이 명령어를 일일이 입력하기에는 다소 번거로울 수 있어, 작업을 좀 더 편리하게 만들어 줄 작은 스크립트를 하나 만들었습니다:
#!/bin/bash
# 사용법: ./run-juicy.sh input.svg [speed]
# 속도(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” 버튼을 클릭하여 파일을 직접 업로드하거나, '감시 디렉터리(watch directory)'를 설정하여 해당 폴더에 GCode 파일이 추가될 때마다 플로터가 자동으로 작동하도록 할 수 있습니다.
후자의 방법은 이론상으로는 꽤 근사해 보이지만, 실제로는 별로 실용적이지 않습니다. 어차피 매번 플로팅 작업을 시작하기 전에는 수동으로 준비해야 할 과정(종이 배치, 펜 장착 등)이 필요하기 때문입니다. 따라서 제 경우에는 브라우저를 통해 파일을 수동으로 업로드하는 편이 훨씬 더 합리적이라고 생각합니다.
파일 업로드를 마쳤다면, 화면을 축소(zoom out)하여 미리보기 화면을 확인해 보세요.

이 미리보기 화면을 통해 몇 가지 중요한 점검 사항을 확인할 수 있습니다.
●플로팅 작업이 종이의 '왼쪽 하단' 모서리에서부터 시작된다는 사실을 다시 한번 상기시켜 줍니다.
●X축과 Y축의 치수 정보를 확인할 수 있습니다. 잠시 시간을 내어 이 치수들을 확인하고, 설정된 플로팅 영역(작업 범위)을 초과하지는 않는지 검토해 보는 것이 좋습니다. 만약 치수가 작업 영역을 벗어난다면 SVG 파일 자체에 문제가 있는 것이므로, 절대 플로팅을 시작하지 마세요. 자칫하면 서보 모터에 무리가 가거나 고장을 일으킬 수 있습니다.
펜이 종이의 왼쪽 하단 모서리에 정확히 위치해 있고 치수 정보 또한 정상적으로 표시된다면, 이제 본격적으로 플로팅을 시작할 시간입니다! 재생 버튼을 누르고 플로터를 지켜보세요. 이제 라즈베리 파이와 플로터가 작동하는 동안 컴퓨터의 전원을 끄거나 다른 방으로 옮겨도 됩니다. 승리입니다!

블로그로 돌아가기

댓글 남기기

댓글 게시 전에는 반드시 승인이 필요합니다.