【XYペンプロッター制作⑤】リミットスイッチでホーミング

こんなこと、やります。

  • Y軸のリニアレールの追加
  • CNCシールドV3.00にリミットスイッチ取り付け
  • Grbl v0.9の初期設定値の変更
  • ホーミングで原点復帰

【ArduinoでXYプロッター】リミットスイッチでホーミング

この記事は、ArduinoでXYプロッターを制作する過程の一部をご紹介しています。今回はホーミングに絞って解説いたします。他のテーマでの解説は、下記の記事をご参考ください。

つかうもの

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

リミットスイッチ

本記事で新たにリミットスイッチを使用します。

一般には、マイクロスイッチと呼ばれるプッシュ型のスイッチになります。私は、秋月電子通商のものを使いましたが、Amazonでも安く入手できますので、ご参考になさってみてください。

その他

また、前回の記事までで、使用している部品一覧はこちらになります。

  • Arduino Uno x 1
  • ステッピングモータ x 2
  • CNCシールド x 1
  • モータドライバ x 2
  • スイッチング電源 x 1
  • タイミングベルト&タイミングプーリー x 1
  • リニアガイド x 3
  • ジャンパーキャップ x 6
CNCシールドのバージョンはV3.00です。また、Arduino Unoに書き込んだGrblはv0.9となります。

Y軸のリニアレール追加

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

Y軸の制作
Y軸の制作

タイミングベルトは付属のバネで張る
タイミングベルトは付属のバネで張る

タイミングベルトの繋ぎ合わせ
タイミングベルトの繋ぎ合わせ

タイミングベルトの繋ぎ合わせ
タイミングベルトの繋ぎ合わせ

Y軸の完成
Y軸の完成

細かい部品は3Dプリンタで自作しています。作ったパーツはThingiverseで無料ダウンロードいただけますので、ご参考になさってみてください。

▼ ちなみに、私が使用している3DプリンタはCrealityの「Ender3 V2」です。

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

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

X軸のリミットスイッチ
X軸のリミットスイッチ

Y軸のリミットスイッチ
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を修正する必要があります。詳しくは【XYペンプロッター制作④】Grbl v0.9とCNCjsのインストールをご覧ください。

機械原点(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の実行
G01 X50 Y50 F200の実行

「キッチンノート.fun」という料理サイトを立ち上げました!このサイトで紹介していた料理記事は、そちらへ移動しました。
記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
いろいろなCNCマシン
いろいろなArduino
Arduinoのオススメ参考書

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

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

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

関連記事