【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です。
CNCシールドV3.00でサーボモータを使えるようにする
XYペンプロッターの制作ということで、Z軸は使わず、ペンのオンオフをサーボモータで動かしたいです。しかし、 今まで使ってきたGrbl v0.9 では、サーボモータを使うことができません。そこで、サーボモータに対応した「grbl-servo」というライブラリを使います。 ここでは「grbl-servo」ライブラリを使って、サーボモータを制御できるように解説します。
grbl-servoのインストール
「cprezzi/grbl-servo」は、grbl 1.1をベースとして、サーボモータを動かせるように改良されたライブラリです。 https://github.com/cprezzi/grbl-servo
今回はこのライブラリを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コードファイルを、テキストエディタで開いてみます。そして次の部分に注目します。 1. 「G00 Z 5.0000」→スピンドルを持ち上げる 2. 「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ペンプロッターの完成
さいごに、ペンをサーボモータで動かす機構を追加して、XYペンプロッターを完成させます。
ペンの上下機構を作る
ペンプロッターのペンを上下させる機構に頭を悩ませたのですが、とりあえずはこんな感じで作ってみました。
5mmのアルミ棒を使ってます。スプリングが届くまでは、輪ゴムで代用します。
この部分は、描画の精度にかなり直結する部分です。軸に隙間ができてどうしてもブレるので、リニアベアリングも発注しました。 XYペンプロッターの精度の改善は、また別の機会に紹介します。
▼ 3Dプリンタで印刷したパーツ類は、Thingiverseで公開してます。 https://www.thingiverse.com/thing:5241745/files
描画テスト
あとは、 と同様にして、CNCjsからGコードファイルをアップロードして、ペンプロッターに描画させます。
こちらの写真のとおり、自作のXYペンプロッターでキレイに印刷できました!(このときの喜びと言ったら、それはもう…)

サーボモータ加えて、ペンの押し出しに成功です!とりあえずXYペンプロッターの完成とします!あとは、細かい点をブラッシュアップします。
精度的な面でまだまだ甘いので、引き続きXYペンプロッターの研究&改善してみます。とりあえずは、XYペンプロッターの完成(仮)とします。 ▼ XYペンプロッターで描画しているようすを、動画にしてみました。ぜひご覧ください。
関連記事
- 【XYペンプロッター制作①】CNCシールドでステッピングモータを動かすまで
- 【XYペンプロッター制作⑥】Inkscapeで画像をGコードに変換する
- 【XYペンプロッター制作④】Grbl v0.9とCNCjsのインストール
- 超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説
- ArduinoでマイクロサーボモータSG90の使い方