PR

自作CNCのリミットスイッチ配線とホーミング設定|プルアップ回路・チャタリング対策【自作CNC第2回】

CNC自作

自作CNCシリーズ 第2回

スポンサーリンク

はじめに:なぜ「動く」だけではCNCとして不十分なのか

こんにちは。にんじんです🥕

自作CNCで穴あけや刻印の位置が毎回わずかにズレる——その原因は、機械が「自分の現在地」を知らないことにあります。前回(第1回)でArduinoからXYテーブルのステッピングモーターを回すところまでは進みましたが、電源を入れた場所がそのまま「0」になってしまうため、起動のたびに手で位置を合わせ直す必要がありました。

この記事では、自作CNC(Arduino+GRBL)にリミットスイッチを追加し、原点(0, 0)を毎回同じ位置に再現するホーミングの設定方法を解説します。ノイズに強いプルアップ回路の配線、接点のチャタリング対策、Arduino Unoで動作を確認できるテストコード(ZIP配布)まで、実際にハマったポイントを添えてまとめました。

この記事で分かること

  • リミットスイッチで「機械原点(0, 0)」を作ると、位置の再現性がどう変わるのか
  • ホーミング(原点復帰)でなぜ2回スイッチに当てるのか(慣性の影響を消す仕組み)
  • マイクロスイッチの選び方と、プルアップ配線にする理由(ノイズ誤検出対策)
  • X軸・Y軸のホーミング動作を確認できるテストコード(test_code_XY_switch.ino、ZIP配布)
  • チャタリング・ノイズで止まる・毎回数ミリずれる、といったトラブルの原因と対策

スポンサーリンク

CNCでリミットスイッチが必要な理由と「位置の再現性」

CNC(コンピュータ数値制御)の運用で最も重要なのが「位置の再現性」です。手動での位置合わせや、基準があいまいな状態では次のような問題が起きます。

  • 寸法のズレ:穴あけや刻印の位置がわずかにズレるだけで、組み立てパーツとしての実用性が失われる
  • 誤差の蓄積:モーターの脱調(ステップ抜け)や電源投入タイミングの差で、位置は少しずつずれていく
  • 基準の不在:電源を入れた場所が自動的に「0」になると、起動のたびに手動で位置合わせが必要になる

これを解決するのがリミットスイッチです。物理的なスイッチに軸を接触させることで、「ここが本当の0地点である」という明確な基準(機械原点)を作れます。


スポンサーリンク

ホーミング(原点復帰)の仕組み:なぜリミットスイッチに2回当てるのか

リミットスイッチに接触して軸を止め、原点を確定させる一連の動作を「ホーミング(Homing)」と呼びます。単純に1回ぶつけて終わりではなく、次のステップを踏みます。

  1. 高速アプローチ:対象の軸をスイッチ方向へ高速で移動させる
  2. 接触と停止:スイッチに当たった瞬間に停止する
  3. プルオフ(退避):少しだけ反対方向に引き返し、スイッチをOFFに戻す
  4. 再接触:1回目よりもかなり遅い速度で、もう一度ゆっくりスイッチに触れる

なぜ2回当てるのか:1回目の高速移動では、機械の慣性(惰性)で停止位置にわずかなバラつきが出ます。2回目に超低速で優しく触れ直すことで慣性の影響を排除し、高い精度で原点座標を特定できます。


スポンサーリンク

マイクロスイッチの選定とプルアップ配線の方法

今回追加するパーツはシンプルで、リミットスイッチ ×2(X軸・Y軸用)だけです。レバーを押すと「カチッ」と明確な音がする一般的なマイクロスイッチが扱いやすくおすすめです。

レバー付きマイクロスイッチ(リミットスイッチ)の外観
X軸・Y軸に取り付けるマイクロスイッチ

配線は「プルアップ」方式にする

リミットスイッチのプルアップ配線図。スイッチの片側をArduinoの入力ピン、もう片側をGNDに接続する

ドライバーボードでは基板上の「END STOPS」端子に接続します。

  • スイッチの片側:Arduinoの入力ピン
  • もう片側:GND(接地)
ArduinoとCNCシールドのEND STOPS端子まわりの結線を示した図

なぜプルアップなのか:配線が浮いた状態(どこにも繋がっていない状態)だと、ノイズを拾って勝手に「スイッチが押された」と誤検出することがあります。プログラム側で常にHIGH(電圧あり)にしておき、スイッチが押されたときだけLOW(0V)に落とすことで、ノイズに強い確実な検出ができます。Arduinoでは pinMode(pin, INPUT_PULLUP) で内蔵プルアップを有効化します。

A4988のVref調整も忘れずに

モーターを回す前提として、A4988ドライバの電流制限(Vref)調整が必要です。未調整だと動作が不安定になったり発熱が激しくなったりします。

モーターを回す前に(必読) A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 計算式とテスターでの手順でVref調整を解説。CNC・ステッピングモーター記事の共通の前提です。 🔧 前回はこちら(第1回) XYテーブルをCNC化!ArduinoとA4988を使ったステッピングモーター制御の基本 Arduino IDEのインストール、A4988の結線、電解コンデンサの入れ方、モーターを回すテストコードまで。

スポンサーリンク

テストコードによる動作確認とArduino Unoへの書き込み手順

結線が終わったら、テスト用のスケッチを書き込んで動作を確認します。テストコード test_code_XY_switch.ino は、X軸・Y軸を往復させながら、シリアルモニタから g でホーミング開始、s で停止できる内容です。

test_code_XY_switch.ino(Arduino IDEに貼り付けて書き込みます)

// テストコード test_code_XY_SWITCH.ino
#define X_STEP 2
#define X_DIR 5

#define Y_STEP 3
#define Y_DIR 6

#define ENABLE 8

#define X_LIMIT 9
#define Y_LIMIT 10

// ===== 調整パラメータ =====
#define BACKOFF_STEPS 250
#define HOMING_FAST 800
#define HOMING_SLOW 2000

// ===== ホーミング方向 =====
#define X_HOME_DIR HIGH   // ← Xだけ逆にした
#define Y_HOME_DIR LOW    // Yはそのまま

bool stopFlag = false;

void setup() {
  pinMode(X_STEP, OUTPUT);
  pinMode(X_DIR, OUTPUT);
  pinMode(Y_STEP, OUTPUT);
  pinMode(Y_DIR, OUTPUT);
  pinMode(ENABLE, OUTPUT);

  pinMode(X_LIMIT, INPUT_PULLUP);
  pinMode(Y_LIMIT, INPUT_PULLUP);

  digitalWrite(ENABLE, LOW);

  Serial.begin(115200);
  Serial.println("Press 's' to STOP, 'g' to HOME");
}

// ===== 入力チェック =====
void checkInput() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == 's' || c == 'S') stopFlag = true;
    if (c == 'g' || c == 'G') homeXY();
  }
}

// ===== 停止処理 =====
void stopAll() {
  Serial.println("STOPPED");
  digitalWrite(ENABLE, HIGH);
  while (1);
}

// ===== 1軸ホーミング =====
void homeAxis(int stepPin, int dirPin, int limitPin, bool homeDir) {

  // ① 高速で当たる
  digitalWrite(dirPin, homeDir);
  while (digitalRead(limitPin) == LOW) {
    checkInput();
    if (stopFlag) stopAll();

    digitalWrite(stepPin, HIGH);
    delayMicroseconds(HOMING_FAST);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(HOMING_FAST);
  }

  delay(100);

  // ② BACKOFF(逆方向)
  digitalWrite(dirPin, !homeDir);
  for (int i = 0; i < BACKOFF_STEPS; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(HOMING_FAST);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(HOMING_FAST);
  }

  delay(200);

  // ③ ゆっくり再接触
  digitalWrite(dirPin, homeDir);
  while (digitalRead(limitPin) == LOW) {
    checkInput();
    if (stopFlag) stopAll();

    digitalWrite(stepPin, HIGH);
    delayMicroseconds(HOMING_SLOW);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(HOMING_SLOW);
  }

  delay(100);
}

// ===== XYホーミング =====
void homeXY() {
  Serial.println("HOMING START");

  homeAxis(X_STEP, X_DIR, X_LIMIT, X_HOME_DIR);
  homeAxis(Y_STEP, Y_DIR, Y_LIMIT, Y_HOME_DIR);

  Serial.println("HOMING DONE");
}

// ===== モーター動作 =====
void moveMotor(int stepPin, int dirPin, bool dir, int steps) {
  digitalWrite(dirPin, dir);

  for (int i = 0; i < steps; i++) {
    checkInput();
    if (stopFlag) stopAll();

    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
}

void loop() {
  checkInput();

  stopFlag = false;

  // ===== X軸 =====
  moveMotor(X_STEP, X_DIR, LOW, 300);
  delay(500);
  moveMotor(X_STEP, X_DIR, HIGH, 300);

  delay(1000);

  // ===== Y軸 =====
  moveMotor(Y_STEP, Y_DIR, HIGH, 300);
  delay(500);
  moveMotor(Y_STEP, Y_DIR, LOW, 300);

  delay(2000);
}
⬇ test_code_XY_switch.ino をダウンロード(ZIP)
Arduino IDEにテストコードを貼り付け、ポートを選択して書き込みボタンを押す画面
  • Arduino IDEを開く
  • 上部のプルダウンでArduinoが接続されているポートを選択
  • デフォルトのコードを削除し、テストコードを貼り付け
  • 左上の → ボタンをクリックしてArduino Uno R3に書き込み
  • 自動でX軸・Y軸の動作が始まります

※ Arduino IDE右上の「シリアルモニタ」を開き、キーボードの S +Enterで動作停止、g +Enterで原点復帰(ホーミング)が開始されます。

動作動画


スポンサーリンク

ホーミングでよくあるトラブルとノイズ対策(チャタリング・脱調・位置ずれ)

実際に動かすと、想定通りに動かないことがあります。代表的なトラブルと原因・対策をまとめました。

トラブル内容原因と対策
チャタリングスイッチの接点が細かくバタつく現象。ソフト側で数ミリ秒待つ(デバウンス)か、コンデンサを入れて電気的に平滑化する。
ノイズで勝手に止まるモーターの配線からノイズを拾っている可能性。配線をツイストするか、シールド線を使うのが効果的。
位置が毎回数ミリずれるスイッチの固定が甘い(剛性不足)かもしれない。ネジの緩みやステーのたわみをチェックする。

スポンサーリンク

まとめと次回予告:GRBLの導入とCNCjsによるPC制御へ

リミットスイッチが正常に機能すれば、XYテーブルは自分の初期位置を正確に把握できるようになります。これで工作機械としてのハードウェアの土台が整いました。

  • [x] モーターの回転動作(第1回)
  • [x] 機械原点の確定(今回ここまで完了)

次回・第3回では、このハードウェアをPCの画面から操作できるようにするため、専用ファームウェア「GRBL」の書き込み手順と、操作画面となる「CNCjs」の初期設定を解説します。

次に読む記事

💻 次回はこちら(第3回) ArduinoへGRBLを書き込む手順とCNCjsの使い方|XYテーブルをPC制御 GRBLの書き込み、CNCjsのインストールと接続、ジョグ操作までを解説します。 🗺️ シリーズ全体像 ゼロから自作するCNCの全手順ロードマップ|Arduino・GRBL・CNCjsでレーザー刻印機を作る 第1回〜第10回の全工程をまとめたロードマップ。どの順で読めばいいかが分かります。

スポンサーリンク

よくある質問(FAQ)

Qホーミングでなぜ2回スイッチに当てるのですか?

A1回目は高速で動くため、機械の慣性で停止位置にバラつきが出ます。2回目に超低速でゆっくり触れ直すことで慣性の影響を排除し、原点座標を高い再現性で特定できます。

Qリミットスイッチの配線をプルアップにする理由は?

A配線が浮いた状態だとノイズを拾って誤検出することがあります。常にHIGHにしておき、押されたときだけLOWに落とすことでノイズに強くなります。Arduinoでは pinMode(pin, INPUT_PULLUP) で内蔵プルアップを使います。

Qスイッチはノーマルオープン(NO)とノーマルクローズ(NC)のどちらで配線しますか?

A今回のテストコードは押されたときにLOWになる前提(実質NO+プルアップ)で書いています。NC配線にすると断線を検知できる利点がありますが、GRBL側の $5(limit pins invert)設定と合わせる必要があります。

Qホーミング中にスイッチを通り過ぎて軸がぶつかります。

Aアプローチ速度が速すぎるか、プルオフ量が大きすぎます。テストコードの HOMING_FAST / BACKOFF_STEPS を調整してください。GRBL運用時は $25(homing seek rate)と $27(homing pull-off)で調整します。

Qスイッチに触れていないのに反応してしまいます。

Aモーター配線からのノイズが原因のことが多いです。信号線をツイストする、シールド線を使う、スイッチ端子に0.1μF程度のコンデンサを入れる(ハードウェアデバウンス)などが有効です。

Qこの段階でGRBLを入れないのはなぜですか?

Aまず素のArduinoスケッチで「配線とホーミング動作そのものが正しいか」を切り分けて確認するためです。GRBLの書き込みとCNCjsでのPC制御は第3回で解説します。



ニンジン🥕アイコン

Follow me on X

本ブログの中の人「ニンジン🥕」はXやってます。新着記事はいち早くポストでお知らせしているので、見逃したくない方は @ninjin_py_vba をフォローしてみてください🥕

@ninjin_py_vba をフォロー

この記事が役に立ったら、シェアしてもらえると嬉しいです🥕

Xでポスト はてブ LINE Pocket

PROJECT LOG — SERIES INDEX
スポンサーリンク

シリーズ記事一覧

電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。


超音波距離センサーHC-SR04をRaspberry Pi Picoで使う|仕組み・配線・精度検証
.uds1-block { position: relative; overflow: hidden; border-radius: 12px; border: 1px solid #f0cba8; background: linear-g…
今週の注目ガジェット〜09/07週〜|電子工作・自作向け新製品まとめ(TickrCast/Radxa Linkr ほか)
ニンジンのガジェット通信 09/07週。ESP32-P4の自作気象モニター、極小IP-KVM「Radxa Linkr」、ESP32のDINレール型PLC、LTE開発キットなど、電子工作で使えそうな新製品5つを解説。
サーボモータの角度をタクトスイッチで可変|OLED(SSD1306)に現在角度をリアルタイム表示
Raspberry Pi Pico 2W×MG996RにタクトスイッチとOLED(SSD1306)を追加。ボタンで角度を可変しながら現在角度をリアルタイム表示するMicroPython実装を、framebufの文字拡大やサーボの遊び対策まで実機ベースで解説します。
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす:PWM制御とキャリブレーション実践
MG996RサーボモーターをRaspberry Pi Pico 2Wで動かす方法を解説。公称180度のはずが実測198度だった個体差の原因究明から、ホーンのズレ補正、タクトスイッチでの角度制御まで実機検証の様子を紹介します。
Tapo P110Mの消費電力をExcelレポート化する【年次集計・電気代試算・セキュリティ判断編】
FastAPI+openpyxlでTapo P110Mの消費電力をExcelレポート化。15秒間隔の生ログを日次集計する設計や、31円/kWhでの電気代試算、外部公開を見送った理由まで解説します。

コメント