PR

XYテーブルをCNC化!ArduinoとA4988を使ったステッピングモーター制御の基本【自作CNC第1回】

CNC自作
スポンサーリンク

はじめに

自作CNCシリーズ 第1回

スポンサーリンク

はじめに

自作CNCマシンの完成イメージ図。アルミフレーム筐体にステッピングモーターと制御基板を搭載
自作CNCシリーズの最終的な完成イメージ

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

この記事は、手元にある自作XYテーブルを流用して、ArduinoとA4988でCNC制御の基盤を作る「自作CNCシリーズ」の第1回です。今回のゴールはシンプルで、Arduinoからの指示でX軸・Y軸のステッピングモーターを回すところまで。加工機としての完成ではなく、まず「配線と電気的な仕様に問題がないか」を確認します。

この記事で分かること

  • 自作CNCに必要な部品構成(Arduino UNO・A4988ドライバボード・A4988・ステッピングモーター)
  • CNC制御でRaspberry PiではなくArduinoを選ぶ理由(リアルタイム処理の適性)
  • モーター電源に電解コンデンサ(100μF以上)を並列で入れる理由と、入れないとA4988が壊れる仕組み
  • Arduino IDEのインストール手順(画面キャプチャ付き)
  • X軸・Y軸を正転/逆転させるテストコード(test_code_XY.ino、ZIP配布)と動作確認のポイント

スポンサーリンク

今回の検証ゴールとハードウェア構成

今回の到達目標は 「Arduinoからの指示でX軸・Y軸を動作させること」です。加工機としての完成ではなく、まず「問題なく動く状態」を作り、結線や電気的な仕様に問題がないかを確認します。

自作CNCのハードウェア構成と部品選定

テストにあたり、以下の部品一式を用意しました。

Arduino UNO R3 本体
Arduino UNO R3
A4988用ドライバーボード(Arduino互換のCNC制御基板)
A4988用ドライバーボード
Type A - Type B のUSBケーブル
USBケーブル(Type A – Type B)
9V 1A のDC電源アダプター(Arduino用)
Arduino用 9V 1A DC電源

※一部のリンクはアフィリエイトプログラムを利用しています。

ステッピングモータードライバ「A4988」の特徴と電流調整(Vref)の注意点

CNC自作の定番ドライバが「A4988」です。特徴は次のとおりです。

  • マイクロステップ制御に対応し、細かな位置決め(1/16分割など)ができる
  • 基板上の半固定抵抗を回して、電流制限値を手動で調整できる
  • 比較的安価で入手性が良い
注意:電流調整(Vref調整)をしないと、モーターの動作が不安定になったり発熱が激しくなったりします。具体的な調整方法は A4988の電流制限(Vref)調整方法の記事で解説しています。

CNC制御でRaspberry PiではなくArduinoを選ぶ理由

CNCの制御にRaspberry Pi(ラズパイ)を使う構成も見かけますが、今回はメインのモーター制御にArduinoを選びました。理由は、CNCで極めて重要な「リアルタイム処理」の適性にあります。

Raspberry Piの特性:汎用OS(Linux)が動いており、バックグラウンドで様々な処理が同時に走ります。そのため厳密なリアルタイム処理が苦手で、モーター制御では次の課題が出ます。

  • パルス信号の出力タイミングにわずかなバラつきが生じる
  • 信号の遅延がモーターの「脱調(ステップ抜け)」の原因になり得る

実際にオシロスコープで波形を見ても、ラズパイ単体でシビアなCNC制御を行うのは難しいという印象でした。

Arduinoの強み:OSを持たず「単一のプログラムだけを愚直に実行する」構造のため、リアルタイム制御に非常に強いです。測定したパルス波形も安定していました。

これはラズパイが劣るという話ではなく、適材適所です。実機を動かすパルス制御はArduino、命令を送る上位の頭脳(GUI操作盤)はRaspberry Pi、という組み合わせが理想的で、このシリーズもその構成でCNCマシンを製作していきます。


スポンサーリンク

ハードウェアの回路接続と電解コンデンサによるノイズ対策

ArduinoとA4988ドライバボード、ステッピングモーター、電源、電解コンデンサをつないだ全体の結線図
全体の結線図
A4988まわりの結線を拡大した図(STEP・DIR・ENABLEピンの接続)
A4988まわりの結線(拡大)
モーター電源ラインへの電解コンデンサの取り付け位置を示した図
電解コンデンサの取り付け位置

電源ラインに電解コンデンサ(100μF以上)が必須となる理由

結線図をよく見ると、モーター電源(12V)に電解コンデンサ(100μF以上)を並列で入れています。目的は「電圧の安定化」です。

豆知識:なぜA4988に電解コンデンサを入れるのか
ステッピングモーターは動作中、コイルに急激な電流変化が起きるため、電源ラインにノイズや電圧の揺れが発生します。

コンデンサなしだと何が起きるか:

  • 電圧が瞬間的に落ちる(電圧降下)
  • 逆起電力によるスパイクが発生する
  • その結果、モーターが不安定になる・ステップ抜け(脱調)・最悪の場合 A4988が破損する

コンデンサの役割:電解コンデンサは「電気のバッファ(貯水タンク)」として働きます。電圧が下がったときは電気を供給し、上がりすぎたときは吸収して、電源を安定させます。

実務的なポイント:

  • 容量は 100μF〜470μF程度が一般的
  • 耐圧は使用電圧(12V)より余裕を持たせる(例:30V〜50V)
  • できるだけ A4988の近くに配置する

開発環境の準備:Arduino IDEのインストール手順

Arduino UNO R3 を動かすために、専用アプリ「Arduino IDE」をインストールします。Arduino公式のソフトウェアページから、使用するPCに対応するインストーラーをダウンロードしてください。

Arduino公式サイトのソフトウェアダウンロードページ

対応するインストーラーを選択し「DOWNLOAD」をクリック

Arduino IDEインストーラーのライセンス同意画面

ダウンロードしたファイルを実行し、「同意する」をクリック

Arduino IDEインストーラーのインストール対象ユーザー選択画面

どちらかを選択し「次へ」をクリック

Arduino IDEインストーラーのインストール開始確認画面

「インストール」をクリック

Arduino IDEインストール完了画面

「完了」をクリックして終了


スポンサーリンク

テストコードによるステッピングモーターの動作確認手順

結線と開発環境が整ったら、テストプログラムを実行して動作を確認します。検証用のテストコード test_code_XY.ino は、X軸・Y軸をそれぞれ正転→逆転させるシンプルな内容です。シリアルモニタで s を送ると停止します。

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

// テストコード test_code_XY.ino

#define X_STEP 2
#define X_DIR 5

#define Y_STEP 3
#define Y_DIR 6

#define ENABLE 8

bool stopFlag = false;

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

  digitalWrite(ENABLE, LOW); // 有効化

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

// 停止チェック
void checkStop() {
  if (Serial.available()) {
    char c = Serial.read();
    if (c == 's' || c == 'S') {
      stopFlag = true;
    }
  }
}

// 停止処理
void stopAll() {
  Serial.println("STOPPED");
  digitalWrite(ENABLE, HIGH); // モーターOFF
  while (1); // 完全停止
}

// 指定軸を指定方向に回す
void moveMotor(int stepPin, int dirPin, bool dir, int steps) {
  digitalWrite(dirPin, dir);

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

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

void loop() {
  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.ino をダウンロード(ZIP)
Arduino IDEにテストコードを貼り付け、ポートを選択して書き込むボタンを押す画面
  • Arduino IDEを開く
  • 上部のプルダウンで、Arduinoが接続されているポートを選択
  • デフォルトのコードを削除し、テストコードを貼り付け
  • 左上の → ボタンをクリックして書き込み
  • 自動でX軸・Y軸の動作が始まります

※ 動作を一時停止したい場合は、Arduino IDE右上のボタンから「シリアルモニタ」を起動し、キーボードの S を入力して Enter を押してください。


スポンサーリンク

動作動画

プログラム実行時に重点的に確認するポイント

  • 意図した方向に軸(モーター)が回転しているか
  • 回転時に異常な異音や、不自然な激しい振動が出ていないか
  • 引っかかりがなく、スムーズに同期して回転しているか

この段階で違和感がある場合は、モーターの配線順(相の組み合わせ)が間違っているか、A4988の電流制限値(Vref)の設定が不適切な可能性が高いので、再確認してください。


スポンサーリンク

まとめと次回予告:リミットスイッチの実装と機械原点の確定へ

今回は、Arduinoを使ったCNC制御の基本構成と、最初の回転テストまでの手順を紹介しました。本来はリミットスイッチの配線までまとめる予定でしたが、解説が長くなったため、回路の安全に関わるスイッチの実装は次回に回します。

次回・第2回では、工作機械として正確な位置決め(原点復帰/ホーミング)を行うための、リミットスイッチの実装と配線を進めます。

次に読む記事

🔧 次回はこちら(第2回) 自作CNCの原点出し(ホーミング)とリミットスイッチの配線・設定方法 リミットスイッチで機械原点(0,0)を確定させます。GRBLが2回触れて原点を特定する理由も解説。 モーターを回す前に(必読) A4988の電流制限(Vref)調整方法|焼損を防ぐ計算式とテスターでの設定手順 今回「必須」と書いたVref調整を、計算式とテスターでの手順で詳しく解説しています。 🗺️ シリーズ全体像 ゼロから自作するCNCの全手順ロードマップ|Arduino・GRBL・CNCjsでレーザー刻印機を作る 第1回〜第10回の全工程をまとめたロードマップ。どの順で読めばいいかが分かります。

スポンサーリンク

よくある質問(FAQ)

QCNC制御になぜArduinoを使うのですか?Raspberry Piではダメですか?

ARaspberry PiはOS(Linux)上で動くため、パルス信号の出力タイミングにバラつきが出やすく、脱調の原因になります。OSを持たないArduinoはリアルタイム制御に強く、パルス波形が安定します。ラズパイは上位のGUI操作盤として組み合わせるのが理想です。

Q電解コンデンサはどのくらいの容量を入れればいいですか?

A100μF〜470μF程度が一般的です。耐圧は使用電圧(12V)より余裕を持たせて30V〜50Vのものを選び、できるだけA4988の近くに配置します。

Qコードを書き込んでもモーターが回りません。

A次を順に確認してください。(1)ENABLEピン(D8)がLOWになっているか(コードでは digitalWrite(ENABLE, LOW) で有効化)。(2)A4988のVref調整をしたか。(3)モーターの配線(コイルA/Bの相順)が合っているか。(4)モーター用電源(12V)が入っているか。

Qモーターが「ガガガ」と鳴って回らない・脱調します。

AVref(電流)が低すぎる/高すぎる、delayMicroseconds() の値が短すぎて速すぎる、電源容量不足、などが原因です。まずVref調整とステップ間隔(コードの 1000 の値)を見直してください。

QA4988がかなり熱くなります。壊れませんか?

Aマイクロステップ動作中はある程度発熱します。触れないほど熱い・焦げ臭い場合はVrefが過大です。ヒートシンクを貼り、Vrefをモーターの定格電流に合わせて下げてください。

Qこのシリーズは後半でGRBLを使いますが、第1回でGRBLを入れないのはなぜですか?

A第1回は「配線と電気仕様に問題がないか」を、素のArduinoスケッチで確認するのが目的だからです。GRBLの書き込みとCNCjsでのPC制御は第3回で解説しています。



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での電気代試算、外部公開を見送った理由まで解説します。

コメント