【XYペンプロッター制作⑦】サーボモータでペンを上下させる(仮完成)

こんなこと、やります。

  • CNCシールドにサーボモータを追加
  • Servo-Grblのインストール
  • GコードファイルのZ軸命令をサーボ命令へ書き換える

【XYペンプロッター制作】サーボモータでペンを上下させる(仮完成)
【XYペンプロッター制作】サーボモータでペンを上下させる(仮完成)

これまでの制作過程は、下記の記事をご覧ください。

つかうもの

はじめに、この記事でつかうものをご紹介いたします。

サーボモータ

ペンを上下させるために、マイクロサーボモータの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をベースとして、サーボモータを動かせるように改良されたライブラリです。 GitHub - cprezzi/grbl-servo: Special Grbl version for use with servo instead of spindle or laser.

今回はこのライブラリをArduino IDEへインストールして、Arduinoボードに書き込みました。Grblライブラリのインストール、およびスケッチのアップロードの方法は、以前にも解説したやり方とまったく同じです。 こちらの記事 を参考に、Arduino IDEへgrbl-servoをインストールしてください。

すでに他のバージョンのGrblライブラリが存在する場合は、古いライブラリを削除してください。複数のGrblライブラリが存在すると、スケッチをArduinoへアップロードしても、うまく書き換えられませんでした。

PWMパルスの範囲を変更する

ArduinoへGrblライブラリをアップロードする前に、grbl-servoライブラリの中に入っているcpu_map.hの一部を次のように編集しました。

cpp
...
#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とサーボモータの配線
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コードを修正する
Inkscapeで書き出したGコードを修正する

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

G04 P数値

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

一括置換Pythonプログラム

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

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

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

XYペンプロッターの完成

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

ペンの上下機構を作る

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

ペンの上下機構を作る
ペンの上下機構を作る

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

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

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

描画テスト

あとは、 【XYペンプロッター制作⑥】Inkscapeで画像をGコードに変換する と同様にして、CNCjsからGコードファイルをアップロードして、ペンプロッターに描画させます。

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

XYペンプロッターでドラえもんを描いてみた
XYペンプロッターでドラえもんを描いてみた

サーボモータ加えて、ペンの押し出しに成功です!とりあえずXYペンプロッターの完成とします!あとは、細かい点をブラッシュアップします。

精度的な面でまだまだ甘いので、引き続きXYペンプロッターの研究&改善してみます。とりあえずは、XYペンプロッターの完成(仮)とします。 ▼ XYペンプロッターで描画しているようすを、動画にしてみました。ぜひご覧ください。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

いろいろなCNCマシン
いろいろなArduino
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容です。ほかのArduino書籍と比べて図や説明がとてもていねいで読みやすいです。Arduinoでひととおりのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書をすでに読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事