【XYペンプロッター制作⑦】サーボモータでペンを上下させる(仮完成)
こんなこと、やります。
- CNCシールドにサーボモータを追加
- Servo-Grblのインストール
- GコードファイルのZ軸命令をサーボ命令へ書き換える
これまでの制作過程は、下記の記事をご覧ください。
つかうもの
はじめに、この記事でつかうものをご紹介いたします。
サーボモータ
ペンを上下させるために、マイクロサーボモータのSG90を使用します。
サーボモータの詳しい使い方は、こちらの記事をご覧ください。
その他XYプロッターの部品
ここまでの段階で、XYプロッターで使用している部品は、こちらになります。
- Arduino Uno x 1個
- ステッピングモータ x 2個
- CNCシールド x 1個
- モータドライバ x 2個
- スイッチング電源 x 1個
- タイミングベルト 5M
- タイミングプーリ x 2個
- リニアガイド x 3個
- ジャンパーキャップ x 6個
- マイクロスイッチ x 2個
CNCシールドV3.00でサーボモータを使えるようにする
XYペンプロッターの制作ということで、Z軸は使わず、ペンのオンオフをサーボモータで動かしたいです。しかし、 今まで使ってきたGrbl v0.9 では、サーボモータを使うことができません。そこで、サーボモータに対応した「grbl-servo」というライブラリを使います。 ここでは「grbl-servo」ライブラリを使って、サーボモータを制御できるように解説します。
grbl-servoのインストール
「cprezzi/grbl-servo」は、grbl 1.1をベースとして、サーボモータを動かせるように改良されたライブラリです。 GitHub - cprezzi/grbl-servo: Special Grbl version for use with servo instead of spindle or laser.
今回はこのライブラリをArduino IDEへインストールして、Arduinoボードに書き込みました。Grblライブラリのインストール、およびスケッチのアップロードの方法は、以前にも解説したやり方とまったく同じです。 こちらの記事 を参考に、Arduino IDEへgrbl-servoをインストールしてください。
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とサーボモータの配線
【XYペンプロッター制作⑤】リミットスイッチでホーミング で取り付けたリミットスイッチに加え、サーボモータを図のように追加します。 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で生成した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
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ペンプロッターの完成
さいごに、ペンをサーボモータで動かす機構を追加して、XYペンプロッターを完成させます。
ペンの上下機構を作る
ペンプロッターのペンを上下させる機構に頭を悩ませたのですが、とりあえずはこんな感じで作ってみました。
5mmのアルミ棒を使ってます。スプリングが届くまでは、輪ゴムで代用します。
この部分は、描画の精度にかなり直結する部分です。軸に隙間ができてどうしてもブレるので、リニアベアリングも発注しました。 XYペンプロッターの精度の改善は、また別の機会に紹介します。
▼ 3Dプリンタで印刷したパーツ類は、Thingiverseで公開してます。
描画テスト
あとは、 【XYペンプロッター制作⑥】Inkscapeで画像をGコードに変換する と同様にして、CNCjsからGコードファイルをアップロードして、ペンプロッターに描画させます。
こちらの写真のとおり、自作のXYペンプロッターでキレイに印刷できました!(このときの喜びと言ったら、それはもう...)
精度的な面でまだまだ甘いので、引き続きXYペンプロッターの研究&改善してみます。とりあえずは、XYペンプロッターの完成(仮)とします。 ▼ XYペンプロッターで描画しているようすを、動画にしてみました。ぜひご覧ください。