Arduinoで作る!XYペンプロッターへの道
この記事は、2022年にArduinoでXYペンプロッターを初めて作るまでの試行錯誤をまとめたものになります。ペンプロッターに関してゼロベースからの知識で取り組んだので、今ではもっとスマートな手段を取れたと思う部分もありますが、これからXYペンプロッター並びにCNC工作機械などを自作したい方にとって何かしらの参考になる部分も多いと思いますので、失敗も含めそのまま残すことにしました。
①CNCシールドでステッピングモータを動かすまで
はじめに、ArduinoとCNCシールドを使ってGコードでステッピングモータを動かすまでの詳しい解説を行います。Gコードでステッピングモータを動かすことができれば、CNC工作機械はもちろんレーザー彫刻機や3Dプリンタなんかも作れます。ステッピングモータがはじめての方でも、ぜひチャレンジしてみてください。
ArduinoへGRBLをインストール
ArduinoにGRBLというソフトウェアをインストールします。CNCシールドのバージョンによってGRBLのソフトウェアバージョンを選ぶ必要があるようです。 今回使用したCNCシールドはVer3.00でして、こちらのGRBL0.8(GRBL-Arduino-Library)をインストールしました。
下記ページの「Code」から「Download ZIP」を選択して、zipファイルでライブラリをダウンロードします。

その後、Arduino IDEで「Sketch」→「Include Library」→「Add .ZIP
Library…」を選択して、ダウンロードしたzipファイルを追加します。
その後、「File」→「Examples」→「GRBL-Arduino-Library-master」→「GRBLtoArduino」を開いて、スケッチをそのままArduinoへアップロードします。
以上で、ArduinoにGRBLをインストールできました。
シリアルモニターから、$$
などのコマンドを送信するとレスポンスがあるはずです。

配線
CNCシールドとモータドライバ、そしてステッピングモータの配線は写真のようになりました。今回はX、Y軸のみ使います。

モータドライバをマウントする向きにご注意ください。また、お使いのステッピングモータによっては、配線の色が異なりますのでご注意ください。
GRBLコントローラで操作
配線がそれぞれできましたら、最後にGRBLコントローラーでステッピングモータを動かしてみます。Arduino IDEは使いませんので、閉じてください。とくに、シリアルモニタがつながっていると、GRBLコントローラから通信できません。
本格的に使う場合は、GRBLコントローラよりCNCjsがおすすめです。
GRBLコントローラのインストール
macOS環境ですので、こちらのページから「GrblController-3.6.1.7z」をダウンロードし、インストールしました。
GRBLコントローラを立ち上げます。Arduino
IDEのときと同じように、Arduinoがつながっているポートを選択します。
その後、矢印ボタンを適当に押してみてください。Gコードが表示されつつ、ステッピングモータが動くはずです。
下記の動画では、ArduinoをつかってステッピングモータをGコードで動かしてみました。
②リニアガイドとタイミングベルトで直線運動
次にステッピングモータの運動を、X軸、Y軸の直線運動に変えます。モーターの回転を直線運動に変換する方法はいろいろ考えられますが、ここでは「リニアガイド」と「タイミングベルト」を使ってみました。
3Dプリンタで部品制作、リニアガイドの組み立て
3Dプリンタで土台などの部品を制作し、リニアガイドを木板上に設置しました。

はじめて使う部品ばかりで右も左もわからないため、カット&トライで作り上げていきました。
▼ 制作したパーツはThingiverseで公開してます。
▼ 2つの リニアガイド を使って、X軸の土台がなんとかできました。今後は、Y軸を作る前に原点リセットの導入やCNCjsの使い方を覚えていきます。
③CNCシールドの設定「マイクロステップ分解能」
次に、精度を出すためにステッピングモータの動かす単位をできるだけ小さくする「マイクロステップ分解能の設定」を行います。
マイクロステップ分解能の設定
ここでは、ステッピングモータのマイクロステップ分解能の設定を行います。マイクロステップの値を小さくすることで、ステッピングモータをより細かく動かす事ができます。つまりCNC工作の精度を上げたい場合は、マイクロステップ値を適正なものにします。
CNCシールド端子をショート
モータドライバの下に配置されている6つのピンで、マイクロステップの設定を行うことができます。 CNCシールドV3.00、A4988モータドライバの場合、次の表のマイクロステップ値となります。
M0 | M1 | M2 | マイクロステップ |
---|---|---|---|
L | L | L | フルステップ 1/1 |
H | L | L | 1/2 |
L | H | L | 1/4 |
H | H | L | 1/8 |
H | H | H | 1/16 |
開放状態がL、ショートさせるとHになります。ここでは、最大の分解能である1/16に設定しました。
単位mmあたりのステップ数の算出
実際にGコードでCNC工作するためには、ステッピングモータのステップ数でどれだけ移動するかあらかじめ計算し、Grblに設定しなければなりません。当然、ステッピングモータの種類や、タイミングベルト、プーリ、マイクロステップの設定値によって速度は異なります。ここでは次のようにして速度を算出しました。
使用したタイミングベルトのピッチは2mmです。また、タイミングプーリには歯が20個ついているので、1回転すると40mm移動することになります。
ステッピングモータは、SM-42BYG011
を使用しました。データシートによれば200[step/回転]となります。
まとめると次のとおりです。
- 分解能、1/16
- タイミングベルト&プーリ、40[mm/回転]
- ステッピングモータ、200[step/回転]
次式により、ステッピングモータを1回転させるためには3200ステップ必要になります。
\[ 200 \times 16 = 3200 [step/回転] \]
さらに次式により、タイミングベルトを使って1mm移動させるには、80ステップ必要です。
\[ \frac{3200}{40} = 80 [step/mm]\]
ここで算出された80[step/mm]を、Grblの設定値に入力します。
Grbl 0.8cの設定値一覧
ここで、Grbl 0.8cの設定値一覧を確認します。ただし、Grbl
0.9以降の場合は、番号と内容が大きく変わってますのでご注意ください。
$$
コマンドで設定値一覧を表示できます。
番号 | 内容 | 設定値 | 意味 |
---|---|---|---|
$0 | x, step/mm | 250 | X軸の単位mmあたりのステップ数 |
$1 | y, step/mm | 250 | y軸の単位mmあたりのステップ数 |
$2 | z, step/mm | 250 | z軸の単位mmあたりのステップ数 |
$3 | step pulse, usec | 10 | |
$4 | default feed, mm/min | 250 | |
$5 | default seek, mm/min | 500 | |
$6 | step port invert mask, int:11000000 | 192 | |
$7 | step idle delay, msec | 25 | |
$8 | acceleration, mm/sec^2 | 10 | |
$9 | junction deviation, mm | 0.05 | |
$10 | arc, mm/segment | 0.1 | |
$11 | n-arc correction, int | 25 | |
$12 | n-decimals, int | 3 | |
$13 | report inches, bool | 0 | |
$14 | auto start, bool | 1 | |
$15 | invert step enable, bool | 0 | |
$16 | hard limits, bool | 0 | リミットスイッチの有効化 |
$17 | homing cycle, bool | 0 | ホーミングサイクルの有効化 |
$18 | homing dir invert mask, int:00000000 | 0 | |
$19 | homing feed, mm/min | 25 | ホーミング中に座標ゼロポイントを決定するときの速度設定 |
$20 | homing seek, mm/min | 250 | ホーミング中にリミットスイッチを探すときの速度設定 |
$21 | homing debounce, msec | 100 | ホーミング時でリミットスイッチを押すときのチャタリング/デバウンス防止のためのディレイ時間設定 |
$22 | homing pull-off, mm | 1 | ホーミングサイクル後、リミットスイッチから少しだけ離れておく距離(事故防止のため) |
この中で、今回変更が必要となる設定値は、$0の「x, step/mm」です。
Grblで設定値の変更
Grblの設定値を変更します。Grbl
0.8cでは、$0
がX軸の単位mmあたりのステップ数[step/mm]になってます。デフォルトでは250[step/mm]ですが、先ほど計算された80[step/mm]を設定します。
GRBLコントローラなどで、つぎのコードを入力して設定値を変更します。
$0=80
この後、たとえばちょうど50mmだけ移動させてみましょう。G01 X50
を命令すると、こちらの動画のようにジャスト50mmの移動ができました。
ピッタリ50mmの移動に成功です!
分解能1/16 プーリ40mm/回転 モータ200step/回転 以上より80step/mmが導き出され、$0=80で設定値を変更
G01 X50で移動させました。
さて、この後リミットスイッチを取り付けてホーミング(機械原点復帰)を行いたかったのですが、使っていたGRBLコントローラとGrbl v0.8が少し古くて問題があったため、Grbl v0.9をインストールしCNCjsを使うことにしました。
④Grbl v0.9とCNCjsのインストール
ここではこんなこと、やります。
- Grbl v0.9をArduinoに書き込む
- CNCjsをmacOSへインストールする
- CNCjsでX軸のステッピングモータを動かしてみる
Grbl v0.9をArduinoに書き込むまで
ここではGrbl v0.9をダウンロードし、Arduinoに書き込むまでを解説します。
Grbl v0.9ライブラリのインストール
こちらのページから、Grbl v0.9のzipファイルをダウンロードします。

ダウンロードしたzipファイルを解凍します。解凍された「grbl-master」の中にある「grbl」というフォルダだけを、Arduinoのlibrariesディレクトリへ移動させます。

ちなみに、Arduinoのlibrariesディレクトリの場所は、Arduino IDEのメニューの「Arduino」→「Preferences…」→「Sketchbook location:」に記載されているパス下にあります。

Arduino IDEを再起動し、「Sketch」→「Include Library」→「grbl」が追加されていればOKです。

config.hの変更
今回のプロジェクトはXYプロッターです。よって、Z軸は使いません。 デフォルトでは、ホーミング(機械原点復帰)する際に、Z軸もゼロ点合わせしようとするため困ったことになります。 Z軸を使わない場合は、先ほどのgrblフォルダの中にあるconfig.hをエディタで次の編集します。

#define HOMING_CYCLE_0 ((1<<X_AXIS)|(1<<Y_AXIS)) // ←追記する
// #define HOMING_CYCLE_0 (1<<Z_AXIS) // ←コメントアウトする
// #define HOMING_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS)) // ←コメントアウトする
もちろんZ軸を使う場合は、この編集作業をおこなう必要はありません。
GrblをArduino Unoへ書き込む
さいごに、GrblライブラリをArduino Unoへ書き込みます。 Arduino IDEのメニューから「File」→「Examples」→「grbl」→「grblUpload」を開きます。
パソコンとArduinoをUSBで繋ぎ、スケッチをそのままArduinoにアップロードすれば完了です。
これでArduinoをGコードで動くCNCマシンにすることができました。 ArduinoへGコードを送信したりするためには、パソコンにアプリケーションを入れる必要があります。これまでは、GRBLコントローラというソフトを使ってきましたが、少し古くて使いづらいので定評のあるCNCjsをmacOSにインストールします。
CNCシールドV3.00をGrbl v0.9で使う場合の注意
ここでひとつ、CNCシールドV3.00をGrbl v0.9で使う場合の注意点があります。Grbl v0.8では問題なかったのですが、Grbl v0.9では画像のように一部端子の割当が変わってます。

Grbl v0.9では、スピンドルがPWM制御により可変可能になったので、ArduinoボードD11に割り当てられました。また、リミットスイッチのZ軸がD12ピンに割り当てられてます。CNCシールドV3.00でGrbl v0.9をインストールした場合は、スピンドルやZ軸の端子にご注意ください。
CNCjsのインストール
ここからは、CNCjsをmacOSへインストールします。
▼ こちらのページからmacOS用のdmgファイルをダウンロードします。

ダウンロードしたdmgファイルをクリックして、アプリケーションを移動しインストールします。
とりあえずCNCjsを使ってみよう
それではさっそく、CNCjsを使ってみましょう。
Grblに接続する
CNCjsを起動すると、インターフェースの美しさに感動します。(GRBLコントローラとはエライ違いです!)
ArduinoとパソコンをUSBケーブルで繋ぎ、左上の「Port」でインタフェースを選択します。ここはArduino IDEと同じですね。Grbl v0.9の場合、Baud rateは115200のままでOKですが、Grbl v0.8の場合は9600に設定してください。
つぎに「Open」ボタンを押して、Arduinoと接続します。すると、Consoleウィンドウにバージョン情報や初期設定値が表示されるはずです。
X軸を動かしてみよう
CNCシールドのX軸にステッピングモータを取り付けた状態で、たとえば次のコマンドを実行してみましょう。
G01 X100 F100

画像のように「error: Alarm
lock」が表示されてコマンド実行できない場合は、$X
を入力してアラームロックを解除してあげます。その後、ふたたび先ほどのコマンドを入力してみてください。X軸のステッピングモータが回転するはずです。
とりあえず今回は簡単な操作のみで終わります。次回は、リミットスイッチを取り付けてホーミング(機械原点復帰)に挑戦です。
⑤リミットスイッチでホーミング
ここではホーミングに絞って解説いたします。
Y軸のリニアレール追加
X軸のステッピングモータ側と同じレールを作って、Y軸にしました。タイミングベルトは少し緩めに作って、後からバネで引っ張ります。タイミングベルトの接続部分は、写真のとおり機械的に圧着してつなぎ合わせてます。
細かい部品は3Dプリンタで自作してます。作ったパーツはThingiverseで無料ダウンロードいただけます。
リミットスイッチの取り付け
写真のように、マイクロスイッチをホットボンドで固定しました。合計2つのマイクロスイッチを使って、X軸とY軸の片側にリミットスイッチを設けいてます。安全を考えると、もう片方側にもリミットスイッチを設けるべきですが、今回は最小限の設備で先へすすめます。
リミットスイッチの配線
リミットスイッチの配線は次のとおりです。

マイクロスイッチの端子は通常、C(Common)、NO(Normally Open)、NC(Normally Closed)です。片方の配線をCommonへつなぎ、もう片方の配線をNormally Openにつなげば、スイッチが押されていないときはオープン(絶縁)状態になります。また、Normally Closedにつなげば、スイッチが押されていないときは、ショート(導通)状態になります。 ここらへんはリレースイッチと同じ原理になります。
環境によっては、リミットスイッチ周辺のノイズ対策が必要になるようです。
Grbl v0.9設定値
ホーミングを行うにあたって、Grbl v0.9の初期設定値をいくつか変更する必要がありました。ここでは私の環境下での設定値を紹介します。
$0=10 (step pulse, usec)
モータードライバへ送る最小パルスの長さです。A4988を使用する場合は、1μs以上が必要です。 A4988のデータシート デフォルトのままです。
$1=25 (step idle delay, msec)
デフォルトのままです。
$2=0 (step port invert mask:00000000)
デフォルトのままです。
$3=0 (dir port invert mask:00000000)
デフォルトのままです。
$4=0 (step enable invert, bool)
デフォルトのままです。
$5=0 (limit pins invert, bool)
デフォルトのままです。
$6=0 (probe pin invert, bool)
デフォルトのままです。
$10=3 (status report mask:00000011)
デフォルトのままです。
$11=0.010 (junction deviation, mm)
デフォルトのままです。
$12=0.002 (arc tolerance, mm)
デフォルトのままです。
$13=0 (report inches, bool)
デフォルトのままです。
$20=0 (soft limits, bool)
ソフト的に移動限界を制御するかどうか設定します。※今回は使用しません。
$21=1 (hard limits, bool)
リミットスイッチを使う場合は、1を設定します。
$22=1 (homing cycle, bool)
ホーミングサイクルを許可するかどうかの設定です。ホーミングするには1を設定します。
$23=7 (homing dir invert mask:00000000)
ホーミングの回転方向を変えます。設定値と動作の関係は、次の表のとおりです。
設定値 | マスク | Xを反転 | Yを反転 | Zを反転 |
---|---|---|---|---|
0 | 00000000 | N | N | N |
1 | 00000001 | Y | N | N |
2 | 00000010 | N | Y | N |
3 | 00000011 | Y | Y | N |
4 | 00000100 | N | N | Y |
5 | 00000101 | Y | N | Y |
6 | 00000110 | N | Y | Y |
7 | 00000111 | Y | Y | Y |
当然ですが、ステッピングモータの端子の向きによっても移動方向は反転されます。私の場合は、$23=7にしましたが、CNCマシンのセッティング合わせて変更してください。
$24=25.000 (homing feed, mm/min)
ホーミング後の微調整時の速度です。
$25=500.000 (homing seek, mm/min)
ホーミング中の速度です。
$26=250 (homing debounce, msec)
機械式のリミットスイッチにて、チャタリングを防ぐための余裕時間です。
$27=1.000 (homing pull-off, mm)
リミットスイッチを押した後に、設定値の距離だけ移動して、リミットスイッチが入りっぱなしになるのを防ぎます。
$100=80.000 (x,
step/mm)
$101=80.000 (y, step/mm)
$102=250.000 (z, step/mm)
**軸の単位mmあたりのステップ数です。この値は、ステッピングモータとタイミングベルト、プーリの仕様を元に算出します。
$110=500.000
(x max rate, mm/min)
$111=500.000 (y max rate,
mm/min)
$112=500.000 (z max rate, mm/min)
デフォルトのままです。
$120=10.000
(x accel, mm/sec^2)
$121=10.000 (y accel, mm/sec^2)
$122=10.000 (z
accel, mm/sec^2)
デフォルトのままです。
$130=200.000
(x max travel, mm)
$131=200.000 (y max travel, mm)
$132=200.000 (z
max travel, mm)
ソフトリミットが有効の場合の軸の最大移動量です。デフォルトのままです。
いざ、ホーミング!
XY軸にリミットスイッチを取り付けて、$Hを送信しホーミングしてみました。そのようすを動画でご覧ください!
Z軸を使わない場合は、config.hを修正する必要があります。
機械原点(Machine Position)をゼロにするには?
ところで、CNCjsでホーミングを行ったあと、画像のようにX軸Y軸の機械原点がゼロになりません。

加工原点(Work Position)をゼロにすることはできるのですが、機械原点をコマンドなどでゼロにセットする方法が見つかりませんでした。 そもそも機械原点は、CNCjsがCNCマシンと接続した時点をゼロとみなします。よって、少し手間ではありますが、次のような手順で機械原点をゼロにセットしてます。
- $Hでホーミングして、ホームポジションへ移動
- Arduinoとの接続をいったん解除、再接続する
- 機械原点がゼロにセットされる
- $Xでアラームロックを解除する
ホーミングサイクルを有効にしている場合は、CNCマシン接続時にアラームロックがかかってます。その状態でGコードを送信すると「error:Alarm lock」となり動作しないので、\(Hでホーミングするか、\)Xでロックを解除させる必要があります。
機械原点をゼロにしてからたとえば、「G01 X50 Y50 F200」を命令してみましょう。画像のように、正確に移動できるはずです。

⑥Inkscapeで画像をGコードに変換する
次に、Inkscapeで画像をGコードに変換する方法を解説します。Gコードに変換したデータを、XYプロッターへアップロードし、ペンを持たせてお絵かきさせてみます。
Inkscape
Inkscape(インクスケープ)を使います。Inkscapeは、オープンソースで開発されているベクター画像編集ソフトです。Linux、macOS、Windowsにて無料で利用できます。あらかじめ、下記ページからダウンロード&インストールしてください。
本記事では、macOS 12.0.1、Inkscape1.1で解説していきます。また、ボタンやメニューなどは英語表記ですのでご了承ください。 CNCシールドのバージョンはV3.00です。また、Arduino Unoに書き込んだGrblはv0.9となります。
Inkscapeで画像をGコードに変換する方法の解説
Inkscapeは操作にクセがあり、正直、とても使いづらいです。しかし、今のところ、無料で画像をGコードに変換できるソフトが、Inkscapeしか見当たりません。この記事では、Inkscapeの操作画面を、できるだけキャプチャしつつ解説します。
ページサイズの設定
Inkscapeを立ち上げ、新規ファイルを作成します。 ページサイズの設定をおこなうには、メニューの「File」→「Document Properties」を開きます。XYプロッターのプラットフォームに合わせて、適当なページサイズを選択します。

画像ファイルをインポート
Gコードに変換したい画像を、JPEGやPNGファイルで用意します。そのファイルを、Inkscapeへドラックアンドドロップします。その際、ダイアログが表示されますが、とくに変更せず、OKで大丈夫です。画像ファイルが読み込まれますので、ページサイズに合うように、適当に画像を拡大縮小します。
画像をパスに変換
画像オブジェクトを選択した状態で、メニューの「Path」→「Trace Bitmap」を開きます。サイドビューにある「Update」を押すと、ビューに画像が表示されます。そして「Apply」で画像をパスに変換します。

これで画像がパスに変換されたのですが、キャンバスの見た目では変化がありません。
パスの確認
どちらがパスなのか分からない場合は、オブジェクトを選択して、下部の表示を確認します。Pathと書かれている方を残すようにします。元画像は必要ありませんので、削除してしまいましょう。

いよいよこれから、パスをGコードへ変換します。
Orientation Pointsの設定
メニューの「Extensions」→「Gcodetools」→「Orientation Points…」をクリックします。今回はこのような設定で「Apply」してみます。

すると、キャンバスの方に座標が表示されます。ご自身のXYプロッターの機械原点と照らし合わせて、パスオブジェクトの位置を決めましょう。

Tools Libraryの設定
今度は、パスオブジェクトを選択した状態で、メニューの「Extensions」→「Gcodetools」→「Tools Library…」を開きます。この画面では、加工機械の種類を設定できるようです。ペンプロッターですので、「cylinder」を選択し「Apply」しました。

すると、キャンバスに設定値が表示されます。今回は初期設定のまま進みますが、必要があればここで設定値を変更します。

Gcodeファイルへ書き出し
こちらも必ずパスオブジェクトを選択した状態で、メニューの「Extensions」→「Gcodetools」→「Path to Gcode…」を開きます。 はじめに「Preferences」タブを開き、Gコードファイルを書き出す場所を設定します。

つぎに、「Path to Gcode」タブの「Cutting order」項目を、「Pass by Pass」に設定します。

そして、この「Path to Gcode」を開いた状態で「Apply」します。この手順でやらないと、書き出しに失敗したりします。
下の画像のように、パスに三角の矢印がいっぱい追加されました。CNCマシンの動きを表しているのでしょう。

同時に、指定したディレクトリに「output_0001.ngc」のようなGコードファイルが生成されているはずです。このファイルをテキストエディタなどで開けば、Gコードの中身を見ることができます。
%
(Header)
(Generated by gcodetools from Inkscape.)
(Using default header. To add your own header create file "header" in the output dir.)
M3
(Header end.)
G21 (All units in mm)
(Pass at depth -1.0)
(Start cutting path id: path77)
(Change tool to Cylindrical cutter)
G00 Z 5.0000
G00 X 55.7065 Y 2.6770
G01 Z -1.0000 F 100.0000(Penetrate)
G03 X 50.9373 Y 3.4663 Z -1.0000 I -425.0925 J -2553.7170 F 400.0000
G03 X 43.7486 Y 4.6445 Z -1.0000 I -951.4406 J -5782.3642
G02 X 36.5597 Y 5.8212 Z -1.0000 I 1428.8817 J 8751.8988
G02 X 35.2387 Y 6.0411 Z -1.0000 I 48.7330 J 296.9555
G03 X 29.4802 Y 6.9959 Z -1.0000 I -173.2628 J -1027.1138
G03 X 14.5508 Y 9.4118 Z -1.0000 I -1125.1447 J -6905.6521
G02 X 2.8037 Y 11.3587 Z -1.0000 I 192.8638 J 1200.0607
G02 X 2.6329 Y 11.4471 Z -1.0000 I 0.0534 J 0.3125
G02 X 2.5883 Y 11.5360 Z -1.0000 I 0.1119 J 0.1118
G02 X 2.6102 Y 11.6021 Z -1.0000 I 0.0768 J 0.0113
G02 X 2.6859 Y 11.6542 Z -1.0000 I 0.1784 J -0.1783
G02 X 11.6919 Y 15.6463 Z -1.0000 I 1179.7542 J -2649.2801
G03 X 20.6997 Y 19.6357 Z -1.0000 I -1452.1736 J 3291.0677
G03 X 20.7606 Y 19.6776 Z -1.0000 I -0.0823 J 0.1851
G01 X 20.7573 Y 19.7221 Z -1.0000
...
自作XYプロッターで描画テスト
生成したGコードを自作XYプロッターに送信し、描画テストしてみました。Grbl v0.9、CNCjsを使用します。
パソコンとArduinoボードを繋いで、CNCjsに接続します。CNCjs画面の「Upload G-code」から、先ほどのGコードファイルを選択肢アップロードします。その後、再生ボタンを押せば描画がはじまるはずです。

いまのところZ軸を装備しておらず、ペンの押し出しはできませんが、Y軸にペンを縛り付け動作させてみました。こちらが描画の結果です。

プラットフォームは平行でないため、ペンが紙に当たらず手で押して上げる必要がありました。Z軸がないため、当然ですが移動時もつなげて描画されます。また、X軸のディレクション設定が正しくないため、絵も左右反転してしまいました。 とは言え、とりあえず画像をGコードに変換し、自作XYプロッターで描画できたことに感動です!
⑦サーボモータでペンを上下させる(仮完成)
いよいよ、ペンの押し出しを実装してXYプロッターを完成させます!
サーボモータ
ペンを上下させるために、マイクロサーボモータのSG90を使用します。
その他XYプロッターの部品
ここまでの段階で、XYプロッターで使用している部品は、こちらになります。
- Arduino Uno x 1個
- ステッピングモータ x 2個
- CNCシールド x 1個
- モータドライバ x 2個
- スイッチング電源 x 1個
- タイミングベルト&タイミングプーリー x 1セット
- リニアガイド x 3個
- ジャンパーキャップ x 6個
- マイクロスイッチ x 2個
CNCシールドのバージョンはV3.00です。
CNCシールドV3.00でサーボモータを使えるようにする
XYペンプロッターの制作ということで、Z軸は使わず、ペンのオンオフをサーボモータで動かしたいです。しかし、Grbl v0.9では、サーボモータを使うことができません。そこで、サーボモータに対応した「grbl-servo」というライブラリを使います。 ここでは「grbl-servo」ライブラリを使って、サーボモータを制御できるように解説します。
grbl-servoのインストール
「cprezzi/grbl-servo」は、grbl 1.1をベースとして、サーボモータを動かせるように改良されたライブラリです。
今回はこのライブラリをArduino IDEへインストールして、Arduinoボードに書き込みました。Grblライブラリのインストール、およびスケッチのアップロードの方法は、以前にも解説したやり方とまったく同じです。 Arduino IDEへgrbl-servoをインストールしてください。
すでに他のバージョンのGrblライブラリが存在する場合は、古いライブラリを削除してください。複数のGrblライブラリが存在すると、スケッチをArduinoへアップロードしても、うまく書き換えられませんでした。
PWMパルスの範囲を変更する
ArduinoへGrblライブラリをアップロードする前に、grbl-servoライブラリの中に入っているcpu_map.h
の一部を次のように編集しました。
...
#ifdef SPINDLE_IS_SERVO
#define SPINDLE_PWM_MAX_VALUE 37
//#define SPINDLE_PWM_MAX_VALUE 38 // set max pulse duration to 2.5ms
#ifndef SPINDLE_PWM_MIN_VALUE
#define SPINDLE_PWM_MIN_VALUE 8 // set min pulse duration to 0.5ms
//#define SPINDLE_PWM_MIN_VALUE 7 // set min pulse duration to 0.5ms
#endif
...
これは、PWMのパルス幅の範囲を指定するものです。デフォルトの設定で「M5」コマンドで命令した時、SG90ですと少し挙動が不安定でしたので、可動範囲をすこし狭くします。ここら辺は、お使いのサーボに合わせて調整してみてください。
CNCシールドV3.00とサーボモータの配線
取り付けたリミットスイッチに加え、サーボモータを図のように追加します。

CNCシールドV3.00でGrbl v1.1やv0.9を使う場合は、Zのリミットスイッチ端子がスピンドルのPWM制御用の端子になってます。基板のシルクプリントと異なるので注意してください。
Gコードでサーボモータを動かす
サーボモータを動かすには、次のGコードを命令します。
M3 S0〜1000
「M3
S数値」というコマンドで、サーボモータを動かせます。Sの後につづく数値は、0〜1000の範囲で指定します。これは、PWM信号のパルス時間に対応するもので、先ほどのcpu_map.h
で設定されているSPINDLE_PWM_MIN_VALUE
とSPINDLE_PWM_MAX_VALUE
の範囲の間で変化します。
M5
「M5」コマンドは、サーボモータを0度にする命令です。つまりは、「M3 S0」と同様の動作をします。ペンを持ち上げたい時に使用します。
Inkscapeで書き出したGコードを修正する
画像ファイルをInkscapeでGコード化しました。しかし、Inkscapeで書き出したGコードでは、サーボモータに対応していないため、そのままではペンプロッターを動かせません。
Inkscapeの拡張機能「MI GRBL」ならば、サーボモータに対応したGコードを生成できるとの情報があります。しかし、Inkscape1.1では拡張機能をインストールできず、また、Inkscapeをダウングレードしたかったのですが、macOSでは32bitのソフトは動作できず詰みました。
そこで考えたのが、Inkscapeで生成したGコードファイルを、直接書き換えることです。一見難しそうですが意外と簡単です。 ここでは、そのやり方を解説します。
Gコードの書き換え
InkscapeでGコードファイルをご用意ください。 Inkscapeで生成したGコードファイルを、テキストエディタで開いてみます。そして次の部分に注目します。
- 「G00 Z 5.0000」→スピンドルを持ち上げる
- 「G01 Z -1.0000 F 100.0000(Penetrate)」→スピンドルを加工面に当てる
この部分をサーボの動きに変えれば、ペンを上下できそうです。 実際に、❶を「M5」に、❷を「M3 S〇〇」の命令へ書き換えて、ペンプロッターのペンをサーボモータで上下させるようにしました。
下図のとおり、Gコードファイルを修正します。

注意点として、サーボモータを動かした後、プログラムを少し待機させる必要があります。そうしないと、サーボモータが動かなかったりします。その命令が「G4 P1」になります。
G04 P数値
「G04」はドウェルと呼ばれるもので、プログラムを一定時間待機します。Pのあとに続く数値で、0.001 〜 99999.999(秒)の範囲の時間を指定できます。 例:G4 P1(1秒間待機する)
一括置換Pythonプログラム
毎回手動で書き換えるのは大変ですので、Pythonで一括置換できるプログラムを作ってみました。活用してみてください。
import re
import sys
import os
= sys.argv
args = args[1]
input_path
= os.path.dirname(input_path)
dirname = dirname + '/out.ngc'
out_path print(args[1])
print(dirname)
def toM5(line):
= r'^G00 Z 5.0000$'
pattern = re.match(pattern, line)
match if match:
return 'M5'
else:
return line
def toM3(line):
= r'^G01 Z -1.0000 F 100.0000\(Penetrate\)$'
pattern = re.match(pattern, line)
match if match:
return 'M3 S400'
else:
return line
def addG4(line):
= r'^(M5|M3 S400)$'
pattern = re.match(pattern, line)
match if match:
return '{}\nG4 P1'.format(match.groups()[0])
else:
return line
= ''
contents with open(input_path) as f:
= f.read()
text for l in text.splitlines():
= toM5(l)
l = toM3(l)
l = addG4(l)
l += l + '\n'
contents
# print(contents)
try:
with open(out_path, mode='w') as f:
f.write(contents)except FileNotFoundError:
print("RelatedPosts Error: Cant write... " + out_path)
上記のPythonファイルを「makePlotterGcode.py」などの適当な名前に保存して、Python3で実行します。第一引数に、Inkscapeで生成したGコードファイルを入力します。インプットファイルと同じディレクトリに、サーボモータのコマンドに置換されたout.ngcが出力されます。
/Users/hogehoge/Desktop/output_0001.ngc python3 makePlotterGcode.py
ペンの上下機構を作る
さいごに、ペンをサーボモータで動かす機構を追加して、XYペンプロッターを完成させます。
ペンプロッターのペンを上下させる機構に頭を悩ませたのですが、とりあえずはこんな感じで作ってみました。
5mmのアルミ棒を使ってます。スプリングが届くまでは、輪ゴムで代用します。
この部分は、描画の精度にかなり直結する部分です。軸に隙間ができてどうしてもブレるので、リニアベアリングも発注しました。 XYペンプロッターの精度の改善は、また別の機会に紹介します。
▼ 3Dプリンタで印刷したパーツ類は、Thingiverseで公開してます。
描画テスト
CNCjsからGコードファイルをアップロードして、ペンプロッターに描画させます。
こちらの写真のとおり、自作のXYペンプロッターでキレイに印刷できました!(このときの喜びと言ったら、それはもう…)

サーボモータ加えて、ペンの押し出しに成功です!とりあえずXYペンプロッターの完成とします!あとは、細かい点をブラッシュアップします。
精度的な面でまだまだ甘いので、引き続きXYペンプロッターの研究&改善してみます。とりあえずは、XYペンプロッターの完成(仮)とします。 ▼ XYペンプロッターで描画しているようすを、動画にしてみました。ぜひご覧ください。
⑧必要な部品、おすすめパーツのまとめ
XYペンプロッターを作ってみたい方のためにも、私が実際に自作XYペンプロッターで使った部品をまとめました。XYペンプロッターはいろいろな形があるため、あくまでも私のXYペンプロッターの例ではありますが、それでも多くの部品は共通すると思います。
XYペンプロッターでよく使われる部品、おすすめパーツの一覧
XYペンプロッターでよく使われる部品、おすすめパーツを一覧でご紹介いたします。
部品 | 数量 |
---|---|
Arduino Uno | 1個 |
ステッピングモータ | 2個 |
CNCシールド | 1個 |
モータドライバA4988 | 2個 |
ジャンパーキャップ | 6個 |
スイッチング電源 | 1個 |
リニアガイド | 3個 |
タイミングベルト | 数メートル |
タイミングプーリ | 2個 |
アイドラー | 2個 |
マイクロスイッチ | 2個 |
サーボモータ | 2個 |
XYペンプロッターでよく使われる部品の詳細
ここからは、先ほど紹介したXYペンプロッターでよく使われる部品一覧を、ひとつひとつ詳しく見ていきます。
Arduino Uno
Arduino Unoが必要です。他のArduinoでも、XYペンプロッターを作ることはできますが、後に紹介するCNCシールドがArduino Unoのために作られてますので、Arduino Unoを使うのがおすすめです。
関連記事
もしもCNCシールドを使わずに、ステッピングモータやマイクロスイッチを自分で配線する場合は、お好きなArduinoをご利用になれます。Arduino選びはこちらの記事もご覧ください。
ステッピングモータ
XYペンプロッターはじめ、CNC工作機械や3Dプリンタではバイポーラ型のステッピングモータを使うのが普通です。中でも、四角形の一辺が42.3mmの規格である、NEMA17がよく使われてます。
CNCシールド
ステッピングモータやモータドライバを配線する際、煩雑になりやすいため、このようなCNCシールドを使うのがおすすめです。こちらの商品は、Arduino UNOにピッタリ装着できるようにできてます。 もちろんCNCシールドがなくても自力で配線可能ですが、CNCシールドは1000円以下で購入可能ですので使わない手はないです。 CNCシールドにはバージョンがありまして、こちらの商品はバージョン3になります。
CNC機械工作用の無料ソフトが存在しますので、実際やってみると、案外簡単にステッピングモータを制御できました。
モータドライバA4988
さきほどのCNCシールドにちょうどマウントできるモータドライバです。複雑なステッピングモータの制御を簡単にしてくれるものです。
ジャンパーキャップ
CNCシールドを使う場合、ステッピングモータの分解能を変更するために、ジャンパーキャップが必要です。分解能というのは、ステッピングモータをどのくらい細かく動かせるか決める機能です。詳しくは下記の関連記事をご覧ください。
スイッチング電源
ステッピングモータの電圧や電流消費は大きいため、Arduinoからは電源供給できません。そのため、ステッピングモータのための外部電源が必要になります。 その際は、12Vのスイッチング電源を使うと便利です。ステッピングモータの数に合わせてワット数を決めてあげる必要がありますが、XYペンプロッターであれば、120Wもあれば十分です。
リニアガイド
タイミングベルト&タイミングプーリー&アイドラー
タイミングベルトとは、ギア(タイミングプーリー)に噛み合わせて、直線運動にするためのゴム製ベルトです。ギアに噛み合うように、山谷のギザギザがついてます。
タイミングプーリーとは、ステッピングモータなどの駆動軸に取り付けて、タイミングベルトを動かすためのギアのような滑車です。ステッピングモータのシャフト径は5mmですので、それにあったタイミングプーリを選びます。
また、アイドラーはタイミングベルトのタワミを伸ばしたり、折返しに使うための滑車です。
項目 | 値 |
---|---|
タイミングベルトのピッチ | 2mm |
タイミングプーリー歯数 | 20 |
リニアガイドとタイミングベルトを使って、ステッピングモータの回転運動を直線運動へ変換します。ここからは3Dプリンタが必要になります。もちろん工夫次第で、3Dプリンタなしでもお作りになれます。
マイクロスイッチ
機械原点を決めるためのホーミング作業をする際に、マイクロスイッチが必要です。ホーミング作業を行わなくても、XYペンプロッターを作ることは可能です。
サーボモータ
ペンを上下するためにサーボモータを使用します。ペンを動かす程度なので有名で低価格なSG90がお手頃です。
ソフトウェア
ここでは、XYペンプロッターで使うソフトウェアをご紹介します。
GRBLライブラリ
ArduinoにはGrblというライブラリをアップロードしてCNCマシンにします。ライブラリを書き込むだけですので、プログラミングの必要ありません。 よく使われるのは「Grbl v0.9」や「Grbl v1.1」です。「Grbl v0.8」は古いのでおすすめしません。
GRBLコントローラー
パソコンとArduinoをつないでステッピングモータなどを動かすわけですが、Arduinoに書き込んだGrblと通信するためにはGRBLコントローラーがパソコンで必要になります。 GRBLコントローラーは無料で入手できます。私が使っているのはCNCjsというソフトウェアです。CNCjsはXYペンプロッターを操作する上で、十分な機能を備えてます。
画像をGコード変換に変換
実際にXYペンプロッターでお絵かきをさせたい場合、画像をGコードに変換する必要があります。方法は色々ありますが、私はInkscapeを使って画像をGコードへ変換してます。