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

こんなこと、やります。

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

【ArduinoでXYプロッター】リミットスイッチでホーミング
【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につなげば、スイッチが押されていないときは、ショート(導通)状態になります。 ここらへんは、 リレーモジュールの使い方|Raspberry Pi・Arduino(ESP32) でも扱った、リレースイッチと同じ原理になります。

環境によっては、リミットスイッチ周辺のノイズ対策が必要になるようです。 Wiring Limit Switches · gnea/grbl Wiki · GitHub

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を反転
000000000NNN
100000001YNN
200000010NYN
300000011YYN
400000100NNY
500000101YNY
600000110NYY
700000111YYY

当然ですが、ステッピングモータの端子の向きによっても移動方向は反転されます。私の場合は、$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の実行

関連記事

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

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

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

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

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

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

関連記事