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

iDraw 2.0 라즈베리 파이 설정 가이드 | 헤드리스 펜 플로터

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

저는 iDraw 2.0 플로터를 사용하는 것을 정말 좋아합니다. 특히 플로터를 느린 속도로 작동시키는 것을 선호하는데, 그만큼 하나의 작업을 완료하는 데 시간이 꽤 오래 걸릴 수 있습니다. 오랫동안 기본 Inkscape 설정을 사용했지만, 작업이 진행되는 동안 메인 컴퓨터를 계속 켜 두고 플로터에 연결해 놓아야 했습니다.

이 방식은 그다지 편리하지 않았기 때문에 Raspberry Pi를 활용해 헤드리스 펜 플로터 시스템을 구성할 수 있는지 직접 시도해 보기로 했습니다.

생각했던 것보다 설정 과정은 훨씬 간단했고, 직접 구성하는 과정도 꽤 재미있었습니다. 전체적인 설정은 다음 네 가지 단계로 진행됩니다.

  • Raspberry Pi를 설정합니다.
  • CNCjs와 필요한 종속 프로그램을 설치하여 GCode를 통해 플로터를 제어합니다.
  • Raspberry Pi가 부팅될 때마다 CNCjs가 자동으로 실행되도록 설정합니다.
  • 펜 속도를 제어하면서 SVG 파일을 GCode로 변환하는 방법을 설정합니다.

이 튜토리얼은 Linux 명령줄 환경을 사용하는 데 익숙한 사용자를 대상으로 합니다. 운영체제와 소프트웨어는 시간이 지나면서 변경될 수 있으므로, 이 글이 처음 작성된 후 오랜 시간이 지나 따라 하는 경우 오류나 설정 차이가 발생할 수 있습니다. 아래에 설명된 시스템은 작성 당시 정상적으로 작동했습니다.

그럼 시작해 보겠습니다.

Raspberry Pi 설정하기

가능하다면 이 프로젝트 전용 Raspberry Pi를 준비하고 플로터 컨트롤러로 사용하는 것이 좋습니다. 다른 용도로 사용하는 Raspberry Pi에서도 설정할 수 있지만, 전용 장치로 구성하면 장기적으로 관리하기가 더 편리합니다.

깨끗한 환경에서 Raspberry Pi를 시작하면 라즈베리 파이 펜 플로터 컨트롤러에 맞는 설정을 처음부터 구성할 수 있다는 장점도 있습니다.

저는 32GB SD 카드를 준비하고 공식 Raspberry Pi Imager를 사용하여 Raspberry Pi OS를 설치했습니다.

Raspberry Pi Imager에서는 첫 부팅 전에 여러 가지 기본 설정을 미리 지정할 수 있습니다. 이 기능을 사용하는 것을 권장합니다. 저는 다음 항목을 설정했습니다.

  • 사용자 이름과 비밀번호
  • 플로터 컨트롤러의 로컬 호스트 이름 (plotter.local)
  • Raspberry Pi에 바로 SSH로 접속할 수 있도록 공개 SSH 키
  • 부팅할 때 Raspberry Pi가 자동으로 네트워크에 연결되도록 WLAN SSID와 비밀번호

설정을 완료한 후 Raspberry Pi Imager가 설치를 진행하도록 했습니다. 설치가 끝나면 microSD 카드를 분리하여 Raspberry Pi에 삽입합니다.

첫 번째 부팅 과정에서는 키보드와 디스플레이를 Raspberry Pi에 연결했습니다. 하지만 반드시 필요한 과정은 아닙니다. 제가 설정한 plotter.local 호스트 이름이 네트워크에서 인식되기까지 약간의 시간이 필요했기 때문에, 키보드와 디스플레이를 사용하여 터미널에서 ifconfig 명령을 실행하고 Raspberry Pi의 현재 IP 주소를 확인했습니다.

그 후 SSH를 통해 Raspberry Pi에 접속했습니다.

다음 단계는 CNCjs를 설치하는 것입니다.

CNCjs 설치하기

CNCjs는 Node.js를 기반으로 작동하므로 먼저 Node.js를 설치해야 합니다.

다음 단계를 진행합니다.

  • Raspberry Pi에 SSH로 접속합니다.
  • NVM을 설치합니다.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
  • 터미널 세션을 종료한 다음 Raspberry Pi에 다시 SSH로 접속합니다. 이렇게 하면 NVM이 로드됩니다.
  • Node.js를 설치합니다.
nvm install node
  • 이제 CNCjs를 설치합니다.
npm install -g cncjs

여기까지 모든 과정이 정상적으로 진행되었다면 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": true

이 설정을 사용하면 네트워크에 연결된 다른 컴퓨터에서 CNCjs에 원격으로 접속할 수 있습니다.

이제 Raspberry Pi에서 CNCjs를 다시 실행합니다.

메인 컴퓨터의 웹 브라우저를 열고 다음 주소로 접속합니다.

plotter.local:8000

CNCjs가 브라우저에 표시되어야 합니다.

CNCjs가 브라우저에 표시되어야 합니다.

다음으로 UUNA TEK iDraw 2.0 A4 펜 플로터를 Raspberry Pi에 연결하고 CNCjs가 플로터와 통신할 수 있는지 확인합니다.

  • iDraw 2.0 플로터를 Raspberry Pi의 USB 포트에 연결합니다.
  • 플로터의 전원을 켭니다.
  • CNCjs에서 Connection 위젯을 찾습니다. 기본적으로 화면 왼쪽 상단에 있습니다.
  • Port 아래에 있는 Refresh 버튼을 클릭합니다.
  • 포트 드롭다운 메뉴를 열고 해당 포트를 선택합니다.
CNCjs가 브라우저에 표시되어야 합니다.

Open을 클릭합니다.

연결이 정상적으로 이루어졌다면 GCode 콘솔에 텍스트가 표시되기 시작합니다.

연결이 정상적으로 이루어졌다면 GCode 콘솔에 텍스트가 표시되기 시작합니다.

이제 플로터 모터가 제대로 움직이는지 테스트할 수 있습니다.

플로터 모터 움직이기

Axes 위젯에서 각 축의 +- 버튼을 사용하여 모터를 움직입니다.

또한 keypad jogging 기능을 활성화하면 키보드의 방향키를 사용하여 플로터를 움직일 수도 있습니다.

펜을 장착하고 Z축을 아래로 내리면, 말 그대로 매우 비싼 Etch-a-Sketch처럼 사용할 수 있습니다.

플로터 모터 움직이기

여기에서 한 가지 중요한 점을 기억해야 합니다. Y축의 0 위치는 예상했던 위치와 다를 수 있습니다. 이 설정에서는 0 위치가 플로팅 영역의 하단에 있습니다.

이 부분은 뒤에서 다시 설명하겠습니다.

CNCjs가 부팅할 때 자동으로 실행되도록 설정하기

다음 목표는 Raspberry Pi가 재부팅될 때마다 CNCjs가 자동으로 실행되도록 만드는 것입니다. 이렇게 하면 헤드리스 펜 플로터 컨트롤러를 사용할 때 매번 직접 로그인하고 CNCjs를 실행할 필요가 없습니다.

다음 단계를 진행합니다.

  • Raspberry Pi의 SSH 세션으로 돌아가 Ctrl+C를 눌러 CNCjs를 종료합니다.
  • 브라우저에서 plotter.local:8000을 새로 고쳐 CNCjs가 실제로 종료되었는지 확인합니다. 앞에서 설정한 호스트 이름을 사용했다면 페이지가 더 이상 로드되지 않아야 합니다.
  • Raspberry Pi에 pm2를 설치합니다.
npm install -g pm2
  • pm2를 사용하여 CNCjs를 실행합니다.
pm2 start cncjs --name cncjs
  • CNCjs가 정상적으로 실행되는지 확인합니다. 잠시 기다린 다음 plotter.local:8000에 다시 접속하여 인터페이스가 정상적으로 표시되는지 확인합니다.
  • 시작 스크립트를 생성합니다.
pm2 startup

이 명령을 실행하면 sudo를 사용하여 실행해야 하는 또 다른 명령이 표시됩니다. 안내된 명령을 실행합니다.

  • 현재 프로세스 목록을 저장합니다.
pm2 save
  • Raspberry Pi를 재부팅합니다.
sudo reboot
  • Raspberry Pi가 다시 온라인 상태가 될 때까지 기다립니다. 약 3~5분 정도 걸릴 수 있습니다.
  • 다음 주소로 접속합니다.
http://plotter.local:8000/

모든 설정이 올바르게 완료되었다면 CNCjs가 자동으로 다시 실행되어야 합니다.

이제 CNCjs 설정이 완료되었습니다. Raspberry Pi를 컨트롤러로 사용할 수 있으며, 메인 컴퓨터를 계속 연결해 둘 필요가 없습니다.

하지만 실제로 플로팅 작업을 진행하려면 한 가지 문제가 더 있습니다. CNCjs는 SVG 파일을 기본적으로 처리하지 않기 때문에, 플로팅하기 전에 SVG를 GCode로 변환해야 합니다.

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

SVG를 GCode로 변환하기 위해 Juicy-Gcode라는 간단한 명령줄 유틸리티를 사용합니다.

이 과정에서 한 가지 중요한 차이점이 있습니다. 작업의 원점은 용지의 오른쪽 위가 아니라 왼쪽 아래 모서리를 기준으로 설정됩니다.

이 점을 작업 과정에서 기억해 두는 것이 좋습니다.

  • 메인 컴퓨터에서 사용하는 운영체제에 맞는 Juicy-Gcode 릴리스 바이너리를 다운로드합니다.

Juicy-Gcode 릴리스 다운로드

Juicy-Gcode는 설정을 flavor file이라는 파일에 저장합니다. 이것은 YAML 파일입니다.

다음 설정을 기본 설정으로 사용할 수 있습니다. 복사하여 컴퓨터에 flavor.yaml이라는 이름으로 저장합니다.

begin: |
  G21 ; Set Units to Millimeters
  G17 ; Set Plane Selection to XY
  G90 ; Set Absolute Positioning
  F600  ; Set Speed to 600 mm/min -- this is really slow, you may want to edit
  G00 Z0 ; pen up
  G92 X0 Y0 ; consider current position as 0,0 -- this is BOTTOM LEFT corner
end: |
  G0Z0 ; pen up
  G00 X0 Y0 Z0
toolon: |
  G0Z6 ; pen down on paper
tooloff: |
  G0Z0 ; pen up

이 flavor file에서 몇 가지 중요한 부분을 확인해야 합니다.

먼저 플로팅 속도는 600mm/min으로 설정되어 있습니다. 의도적으로 매우 느린 속도이므로 사용하는 펜과 원하는 작업 속도에 따라 이 값을 변경할 수 있습니다.

또 하나 중요한 부분은 다음 줄입니다.

G92 X0 Y0

이 명령은 현재 플로터 헤드의 위치를 홈 위치로 지정합니다.

따라서 이 방식으로 작업을 보정하려면 플로팅을 시작하기 전에 플로터 헤드를 용지의 왼쪽 아래 모서리로 수동으로, 그리고 조심스럽게 이동해야 합니다.

또한 SVG 파일에서 용지 크기가 정확하게 설정되어 있는지 확인하는 것이 중요합니다.

SVG를 변환하는 명령은 다음과 같습니다.

juicy-gcode -f flavor.yaml image.svg -o image.gcode

매번 이 명령을 직접 입력하는 것이 번거로울 수 있으므로, 작은 스크립트를 사용하면 작업을 조금 더 편리하게 만들 수 있습니다.

#!/bin/bash
# Usage: ./run-juicy.sh input.svg [speed]
# If speed is not provided, defaults to 600

# Check if at least one argument is provided

if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
echo "Usage: $0 <input-svg> [speed]"
echo " If speed is not provided, defaults to 600"
exit 1
fi

inputfile="$1"

# Set default speed to 600 if not provided
speed="${2:-600}"

# Build the flavor file name
flavor_file="flavor-${speed}mm-speed.yaml"

# Generate output filename by replacing .svg extension with .gcode
outputfile="${inputfile%.*}.gcode"

# Run the juicy-gcode command

juicy-gcode -f "$flavor_file" "$inputfile" -o "$outputfile"

이 방법을 사용하면 서로 다른 플로팅 속도를 지정한 여러 flavor file을 만들어 둘 수 있습니다. 이후 flavor 파일 이름에 포함된 숫자를 사용하여 원하는 속도를 간단하게 지정할 수 있습니다.

이제 GCode 파일이 생성되었으므로 플로터로 전송할 준비가 되었습니다.

GCode 업로드 및 플로팅 시작하기

CNCjs에는 GCode 파일을 불러오는 두 가지 방법이 있습니다.

첫 번째 방법은 브라우저에서 Upload G-code를 클릭하여 파일을 직접 업로드하는 것입니다.

두 번째 방법은 watch directory를 설정하는 것입니다. 이렇게 하면 지정된 폴더에 GCode 파일이 나타날 때 CNCjs가 자동으로 해당 파일을 처리하기 시작할 수 있습니다.

자동 파일 감시는 이론적으로 편리해 보이지만 전체 작업 과정을 반드시 더 쉽게 만들어 주는 것은 아닙니다. 각각의 플로팅 작업에는 용지를 배치하고 펜을 장착하는 등의 물리적인 준비가 필요하기 때문입니다.

따라서 이 설정에서는 브라우저를 통해 GCode 파일을 직접 업로드하는 방법이 더 적합합니다.

파일을 업로드한 후 화면을 축소하여 미리보기를 확인합니다.

파일을 업로드한 후 화면을 축소하여 미리보기를 확인합니다.

미리보기에서는 작업을 시작하기 전에 몇 가지 중요한 사항을 확인할 수 있습니다.

  • 플로팅이 다시 한 번 용지의 왼쪽 아래 모서리에서 시작된다는 것을 확인할 수 있습니다.
  • X축과 Y축의 크기가 표시됩니다. 이 값을 확인하고 플로터의 실제 작업 영역을 초과하지 않는지 확인하는 것이 좋습니다.

표시된 크기가 플로터의 작업 영역을 초과한다면 SVG 파일에 문제가 있을 가능성이 있습니다. 이 경우 작업을 시작하지 마십시오. 그렇지 않으면 플로터의 서보 모터에 불필요한 부담이 발생할 수 있습니다.

펜이 용지의 왼쪽 아래 모서리에 위치하고 표시된 크기도 정확하다면 이제 플로팅을 시작할 수 있습니다.

Play 버튼을 클릭하면 플로터가 작업을 시작합니다.

이제 Raspberry Pi와 UUNA TEK iDraw 2.0 A4 펜 플로터가 작업을 진행하는 동안 메인 컴퓨터를 계속 연결해 둘 필요가 없습니다. 컴퓨터를 종료하거나 다른 장소로 가져가도 Raspberry Pi가 계속해서 플로터를 제어할 수 있습니다.

이것이 바로 iDraw 2.0 라즈베리 파이 설정의 장점입니다. CNCjs가 백그라운드에서 작업을 처리하면서 플로터를 독립적인 라즈베리 파이 펜 플로터 시스템으로 사용할 수 있습니다.