【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をベースとして、サーボモータを動かせるように改良されたライブラリです。

今回はこのライブラリを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とサーボモータの配線

【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で一括置換できるプログラムを作ってみました。活用してみてください。

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コードファイルをアップロードして、ペンプロッターに描画させます。

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

精度的な面でまだまだ甘いので、引き続きXYペンプロッターの研究&改善してみます。とりあえずは、XYペンプロッターの完成(仮)とします。

▼ XYペンプロッターで描画しているようすを、動画にしてみました。ぜひご覧ください。

記事に関するご質問などがあれば、
@tosisico または お問い合わせ までご連絡ください。
いろいろなCNCマシン
いろいろなArduino
Arduinoのオススメ参考書

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

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

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

関連記事