この記事は@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
}
ここで追加する重要な行は、1 行目の allowRemoteAccess です。
●Pi で cncjs をもう一度実行します。
●メインマシンのブラウザーで plotter.local:8000 にアクセスします。CNCjs が表示されるはずです。

次に、プロッターを接続して、CNCjs と通信できるか確認します。
●iDraw 2.0 プロッターを Pi の USB ポートに接続します。
●プロッターの電源を入れます。
●CNCjs で Connection ウィジェット(デフォルトでは左上)を見つけます。
○Port の下にある Refresh ボタンを押します。
○ドロップダウンを開き、ポートを選択します。

●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という小さなコマンドラインユーティリティを使用します。
ここでの大きな変更点は、用紙の右上隅ではなく左下隅を基準にゼロ設定することです。この変更には少し慣れが必要かもしれません。後でもう一度お知らせします。
●メインマシンで、お使いのOS向けのJuicy-Gcodeリリースバイナリをダウンロードします: https://github.com/domoszlai/juicy-gcode/releases
●Juicy-Gcodeの設定は「フレーバーファイル」と呼ばれるファイルに保存されます。これは単なるYAMLファイルです。以下は、フレーバー.yamlとしてマシンにコピー&ペーストして使える、よい出発点となるフレーバーファイルです。
begin: |
G21 ; 単位をミリメートルに設定
G17 ; 平面選択をXYに設定
G90 ; 絶対位置指定を設定
F600 ; 速度を600 mm/minに設定 -- 本当に遅いので、編集したほうがよいかもしれません
G00 Z0 ; ペンを上げる
G92 X0 Y0 ; 現在位置を0,0として扱う -- ここが左下隅
end: |
G0Z0 ; ペンを上げる
G00 X0 Y0 Z0
toolon: |
G0Z6 ; 用紙上でペンを下ろす
tooloff: |
G0Z0 ; ペンを上げる
このフレーバーファイルについて、いくつか重要な点を説明します。
●私はプロッターを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がデフォルトになります
# 引数が少なくとも1つ指定されているか確認
if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
echo "使用方法: $0 <input-svg> [speed]"
echo " 速度が指定されていない場合は600がデフォルトになります"
exit 1
fi
inputfile="$1"
# 指定されていない場合の速度を600に設定
speed="${2:-600}"
# フレーバーファイル名を作成
flavor_file="flavor-${speed}mm-speed.yaml"
# .svg拡張子を.gcodeに置き換えて出力ファイル名を生成
outputfile="${inputfile%.*}.gcode"
# juicy-gcodeコマンドを実行
juicy-gcode -f "$flavor_file" "$inputfile" -o "$outputfile"
これで、実行速度の異なる複数のフレーバーファイルを用意し、フレーバーファイルのファイル名に対応する数字を渡すことで、速度を簡単に指定できます。
Gコードファイルを用意できたので、アップロードしてプロットしましょう!
Gコードをアップロードしてプロットする
CNCjsでGコードファイルを読み込む方法は2つあります。「G-codeをアップロード」をクリックしてブラウザーからアップロードする方法と、監視ディレクトリを設定する方法です(そこにGコードファイルが入るたびに、プロッターが動き始めます)。
後者は理論上は魅力的に聞こえますが、あまり意味がありません。どのプロットでも、結局は手動で準備する必要があるからです。用紙を設置したり、ペンを取り付けたりする必要があります。そのため私としては、ブラウザーから手動でファイルをアップロードするほうがはるかに理にかなっています。
そうしたら、ズームアウトしてプレビューを確認します。

これにより、重要な確認をいくつか行えます。
●プロットは用紙の左下隅から始まることを、もう一度(…)思い出させてくれます。
●X軸とY軸の両方の測定値を確認できます。少し時間を取ってこれを読み、プロット領域を超えていないことを確認する価値があります。超えている場合はSVGに問題があるため、プロットを開始しないでください。そうしないとサーボがかなり困ったことになります。
ペンが用紙の左下隅にあり、測定値にも問題がなければ、いよいよプロットです!「再生」ボタンを押して、プロッターの動きを見守りましょう。これで、Piとプロッターが作業している間に、コンピューターをシャットダウンしたり別の部屋へ持って行ったりできます。成功です!