Arduinoで作る!XYペンプロッターへの道

著者画像
Toshihiko Arai

この記事は、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ファイルでライブラリをダウンロードします。

zipファイルのライブラリをダウンロード

その後、Arduino IDEで「Sketch」→「Include Library」→「Add .ZIP Library…」を選択して、ダウンロードしたzipファイルを追加します。 「Add .ZIP Library…」からライブラリを追加する

その後、「File」→「Examples」→「GRBL-Arduino-Library-master」→「GRBLtoArduino」を開いて、スケッチをそのままArduinoへアップロードします。 GRBLtoArduinoを開いてArduinoに書き込む

以上で、ArduinoにGRBLをインストールできました。 シリアルモニターから、$$などのコマンドを送信するとレスポンスがあるはずです。

シリアルモニタからコマンド送信

配線

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

CNCシールドとモータドライバ、そしてステッピングモータの配線

モータドライバをマウントする向きにご注意ください。また、お使いのステッピングモータによっては、配線の色が異なりますのでご注意ください。

GRBLコントローラで操作

配線がそれぞれできましたら、最後にGRBLコントローラーでステッピングモータを動かしてみます。Arduino IDEは使いませんので、閉じてください。とくに、シリアルモニタがつながっていると、GRBLコントローラから通信できません。

本格的に使う場合は、GRBLコントローラよりCNCjsがおすすめです。

GRBLコントローラのインストール

macOS環境ですので、こちらのページから「GrblController-3.6.1.7z」をダウンロードし、インストールしました。

GRBLコントローラを立ち上げます。Arduino IDEのときと同じように、Arduinoがつながっているポートを選択します。 GRBLコントローラでポートの選択

その後、矢印ボタンを適当に押してみてください。Gコードが表示されつつ、ステッピングモータが動くはずです。 GRBLコントローラでステッピングモータを動かす

下記の動画では、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に設定しました。

マイクロステップ1/16に設定 マイクロステップ設定ピン

単位mmあたりのステップ数の算出

実際にGコードでCNC工作するためには、ステッピングモータのステップ数でどれだけ移動するかあらかじめ計算し、Grblに設定しなければなりません。当然、ステッピングモータの種類や、タイミングベルト、プーリ、マイクロステップの設定値によって速度は異なります。ここでは次のようにして速度を算出しました。

使用したタイミングベルトのピッチは2mmです。また、タイミングプーリには歯が20個ついているので、1回転すると40mm移動することになります。

ステッピングモータは、SM-42BYG011 を使用しました。データシートによれば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に書き込むまで

ここではGrbl v0.9をダウンロードし、Arduinoに書き込むまでを解説します。

Grbl v0.9ライブラリのインストール

こちらのページから、Grbl v0.9のzipファイルをダウンロードします。

grblのzipファイルダウンロード

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

grblフォルダをlibrariesディレクトリへ移動

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

Sketchbook location

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

grblがライブラリに追加された

config.hの変更

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

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にアップロードすれば完了です。 grblUploadスケッチを書き込む

これで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ファイルをダウンロードします。

cncjs-app-1.9.23-macos.x64.dmgのダウンロード

ダウンロードしたdmgファイルをクリックして、アプリケーションを移動しインストールします。 アプリケーションのインストール

とりあえずCNCjsを使ってみよう

それではさっそく、CNCjsを使ってみましょう。

Grblに接続する

CNCjsを起動すると、インターフェースの美しさに感動します。(GRBLコントローラとはエライ違いです!) CNCjsでボードに接続

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
Alarm lockの解除

画像のように「error: Alarm lock」が表示されてコマンド実行できない場合は、$Xを入力してアラームロックを解除してあげます。その後、ふたたび先ほどのコマンドを入力してみてください。X軸のステッピングモータが回転するはずです。

とりあえず今回は簡単な操作のみで終わります。次回は、リミットスイッチを取り付けてホーミング(機械原点復帰)に挑戦です。

⑤リミットスイッチでホーミング

ここではホーミングに絞って解説いたします。

Y軸のリニアレール追加

X軸のステッピングモータ側と同じレールを作って、Y軸にしました。タイミングベルトは少し緩めに作って、後からバネで引っ張ります。タイミングベルトの接続部分は、写真のとおり機械的に圧着してつなぎ合わせてます。

Y軸の制作タイミングベルトは付属のバネで張るタイミングベルトの繋ぎ合わせタイミングベルトの繋ぎ合わせY軸の完成

細かい部品は3Dプリンタで自作してます。作ったパーツはThingiverseで無料ダウンロードいただけます。

リミットスイッチの取り付け

写真のように、マイクロスイッチをホットボンドで固定しました。合計2つのマイクロスイッチを使って、X軸とY軸の片側にリミットスイッチを設けいてます。安全を考えると、もう片方側にもリミットスイッチを設けるべきですが、今回は最小限の設備で先へすすめます。

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マシンと接続した時点をゼロとみなします。よって、少し手間ではありますが、次のような手順で機械原点をゼロにセットしてます。

  1. $Hでホーミングして、ホームポジションへ移動
  2. Arduinoとの接続をいったん解除、再接続する
  3. 機械原点がゼロにセットされる
  4. $Xでアラームロックを解除する

ホーミングサイクルを有効にしている場合は、CNCマシン接続時にアラームロックがかかってます。その状態でGコードを送信すると「error:Alarm lock」となり動作しないので、\(Hでホーミングするか、\)Xでロックを解除させる必要があります。

機械原点をゼロにしてからたとえば、「G01 X50 Y50 F200」を命令してみましょう。画像のように、正確に移動できるはずです。

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プロッターのプラットフォームに合わせて、適当なページサイズを選択します。

Document Propertiesでページサイズの変更

画像ファイルをインポート

Gコードに変換したい画像を、JPEGやPNGファイルで用意します。そのファイルを、Inkscapeへドラックアンドドロップします。その際、ダイアログが表示されますが、とくに変更せず、OKで大丈夫です。画像ファイルが読み込まれますので、ページサイズに合うように、適当に画像を拡大縮小します。 鍵ボタンをロックし、画像サイズを入力してリサイズ

画像をパスに変換

画像オブジェクトを選択した状態で、メニューの「Path」→「Trace Bitmap」を開きます。サイドビューにある「Update」を押すと、ビューに画像が表示されます。そして「Apply」で画像をパスに変換します。

Trace Bitmapで、画像をパスに変換

これで画像がパスに変換されたのですが、キャンバスの見た目では変化がありません。

パスの確認

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

オブジェクトを選択して、Pathを確認

いよいよこれから、パスをGコードへ変換します。

Orientation Pointsの設定

メニューの「Extensions」→「Gcodetools」→「Orientation Points…」をクリックします。今回はこのような設定で「Apply」してみます。

Orientation Pointsの設定

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

機械座標が表示される

Tools Libraryの設定

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

Tools Libraryの設定

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

Toolsの詳細設定値

Gcodeファイルへ書き出し

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

書き出す場所を指定する

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

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コードファイルを選択肢アップロードします。その後、再生ボタンを押せば描画がはじまるはずです。

CNCjsでGコードファイルをアップロード

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

自作XYプロッターで描画テスト

プラットフォームは平行でないため、ペンが紙に当たらず手で押して上げる必要がありました。Z軸がないため、当然ですが移動時もつなげて描画されます。また、X軸のディレクション設定が正しくないため、絵も左右反転してしまいました。 とは言え、とりあえず画像をGコードに変換し、自作XYプロッターで描画できたことに感動です!

⑦サーボモータでペンを上下させる(仮完成)

いよいよ、ペンの押し出しを実装してXYプロッターを完成させます!

サーボモータ

ペンを上下させるために、マイクロサーボモータのSG90を使用します。

その他XYプロッターの部品

ここまでの段階で、XYプロッターで使用している部品は、こちらになります。

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とサーボモータの配線

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_VALUESPINDLE_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コードファイルを、テキストエディタで開いてみます。そして次の部分に注目します。

  1. 「G00 Z 5.0000」→スピンドルを持ち上げる
  2. 「G01 Z -1.0000 F 100.0000(Penetrate)」→スピンドルを加工面に当てる

この部分をサーボの動きに変えれば、ペンを上下できそうです。 実際に、❶を「M5」に、❷を「M3 S〇〇」の命令へ書き換えて、ペンプロッターのペンをサーボモータで上下させるようにしました。

下図のとおり、Gコードファイルを修正します。

Inkscapeで書き出したGコードを修正する

注意点として、サーボモータを動かした後、プログラムを少し待機させる必要があります。そうしないと、サーボモータが動かなかったりします。その命令が「G4 P1」になります。

G04 P数値

「G04」はドウェルと呼ばれるもので、プログラムを一定時間待機します。Pのあとに続く数値で、0.001 〜 99999.999(秒)の範囲の時間を指定できます。 例:G4 P1(1秒間待機する)

一括置換Pythonプログラム

毎回手動で書き換えるのは大変ですので、Pythonで一括置換できるプログラムを作ってみました。活用してみてください。

import re
import sys
import os

args = sys.argv
input_path = args[1]

dirname = os.path.dirname(input_path)
out_path = dirname + '/out.ngc'
print(args[1])
print(dirname)


def toM5(line):
    pattern = r'^G00 Z 5.0000$'
    match = re.match(pattern, line)
    if match:
        return 'M5'
    else:
        return line

def toM3(line):
    pattern = r'^G01 Z -1.0000 F 100.0000\(Penetrate\)$'
    match = re.match(pattern, line)
    if match:
        return 'M3 S400'
    else:
        return line

def addG4(line):
    pattern = r'^(M5|M3 S400)$'
    match = re.match(pattern, line)
    if match:
        return '{}\nG4 P1'.format(match.groups()[0])
    else:
        return line



contents = ''
with open(input_path) as f:
    text = f.read()
    for l in text.splitlines():
        l = toM5(l)
        l = toM3(l)
        l = addG4(l)
        contents += l + '\n'

    # 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が出力されます。

python3 makePlotterGcode.py /Users/hogehoge/Desktop/output_0001.ngc 

ペンの上下機構を作る

さいごに、ペンをサーボモータで動かす機構を追加して、XYペンプロッターを完成させます。

ペンプロッターのペンを上下させる機構に頭を悩ませたのですが、とりあえずはこんな感じで作ってみました。 ペンの上下機構を作る

5mmのアルミ棒を使ってます。スプリングが届くまでは、輪ゴムで代用します。

この部分は、描画の精度にかなり直結する部分です。軸に隙間ができてどうしてもブレるので、リニアベアリングも発注しました。 XYペンプロッターの精度の改善は、また別の機会に紹介します。

▼ 3Dプリンタで印刷したパーツ類は、Thingiverseで公開してます。

描画テスト

CNCjsからGコードファイルをアップロードして、ペンプロッターに描画させます。

こちらの写真のとおり、自作のXYペンプロッターでキレイに印刷できました!(このときの喜びと言ったら、それはもう…)

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コードへ変換してます。

Amazonで探す