はじめに

これまで製作してきたXYテーブルシリーズも、今回で一区切り。
次のステップとして、いよいよ「CNC制御」に挑戦していきます。
今回のテーマはシンプルです。
👉 「CNC制御を自作する」
(ここに完成イメージ図)
まずは前回まで製作していたXYテーブルを流用して、
CNC化にチャレンジしていきます。
今回のゴール
今回の到達目標は以下です。
👉 Arduinoからの指示でX軸・Y軸を動作させること
いきなりCNCとして完成を目指すのではなく、まずは「動く状態」を作って、
ハードウェアの結線に問題ないことを確認するところまで進めます。
ハードウェア構成
PC(Windows11)
Arduino UNO R3
A4988用ドライバーボード・・・Arduinoと互換
A4988 ×2
USBケーブル(TypeA-TypeB)
Arduino電源(9V 1A推奨)
モーター用電源(12V 3A)
ステッピングモーター:SM-42BYG011-25
機構:過去記事のXYテーブルを流用




💡補足:A4988について(豆知識)
A4988はステッピングモーター用のドライバで、以下の特徴があります。
- マイクロステップ制御が可能(1/16など)
- 電流制限を調整できる
- 比較的安価で入手しやすい
👉 CNC自作ではほぼ定番のドライバ
ただし注意点として、
👉 電流調整(Vref調整)をしないとモーターが不安定になる
調整方法については、過去に記事にしていますので、そちらを参考にしてください。
なぜ今回はRaspberry Piではないのか
CNC制御といえば、Raspberry Piを使う構成も見かけますが、
今回はArduinoを選択しました。
理由はシンプルで「リアルタイム制御が重要」だからです。
CNC制御では
・ステップ信号のタイミング
・モータの同期制御
がシビアに行わないといけない為です。
Raspberry Piの弱点
Raspberry Piは「リアルタイム処理が苦手」とされています
・タイミングがばらつく
・ステップ抜けの原因になりえます
実際にオシロスコープで波形をみてみると、CNC制御では使用できないと思いました。
Arduinoの強み
一方Arduinoは、「 単一処理でリアルタイム制御に強い」です。
CNC制御をするにはArduinoの方が適しているというわけです。
オシロスコープでみた波形はキレイでした
Raspberry Piがダメということでは無くて、役割分担で、ステッピングモーターを回すのはArduino、Arduinoに指示を頭脳になるのがRaspberryPiです。
現時点で最終的な構成はRaspberru piのGUIで指示をだしてArduinoでモーター制御をする形でCNCを作ろうと思っています。
ハードウェアの接続



あれ?コンデンサが入っているって思った方いますかね
豆知識:なぜA4988に電解コンデンサを入れるのか
A4988を使う場合、モーター電源(12V)に対して
電解コンデンサ(100μF以上)を並列に入れるのが必須です。
理由は「電圧の安定化」です。
ステッピングモーターは電流の変動が激しい
・ステッピングモーターは動作中、
・コイルに急激な電流変化が発生する
👉 その結果、電源ラインにノイズや電圧の揺れが発生します。
コンデンサなしだと何が起きるか
コンデンサを入れていない場合、
・電圧が瞬間的に落ちる(電圧降下)
・逆起電力によるスパイクが発生
その結果👇
・モーターが不安定になる
・誤動作(ステップ抜け)
・最悪の場合、A4988が破損する
コンデンサの役割
電解コンデンサは、
👉 「電気のバッファ(貯水タンク)」の役割
・電圧が下がったとき → 電気を供給
・電圧が上がりすぎたとき → 吸収
これによって、👉 電源を安定させることができる
実務的なポイント
・容量は100μF〜470μF程度が一般的
・電圧は使用電圧より余裕を持たせる(例:30V~50V)
・できるだけA4988の近くに配置する
Arduinoのインストール
Arduino Uno R3を動作させるために専用アプリケーションをインストールします
下記のArduino更新サイトより、使用するPCに対応するインストーラーをダウンロードしてください。

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

DOWNLOADしたファイルを実行

同意するをクリック

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

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

インストールが開始されます

「完了」をクリック
テストコードで動作確認
結線が完了したら、テストコードで動作させてみましょう
折りたたまれたテストコードを表示する
// テストコード 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が接続されているポートを選択します。
- デフォルトで入力されているコードを削除する。
- テストコードを張り付ける
- 画面左上の→矢印をクリックし、Arduino Uno R3に書き込まれます。
- 自動でX軸Y軸の動作が実行されます。
※アプリ画面右上の「シリアルモニタ」のボタンをクリックし、キーボードの「S」を入力しEnterで動作がストップされます
動作動画
この段階で確認すべきこと
- 回転方向が正しいか
- 異音や振動がないか
- スムーズに回転するか
👉 この時点で違和感がある場合は
配線 or 電流設定が原因の可能性が高いです
■ 次回予告
今回の記事が思ったより長くなってしまったので、本当はリミットスイッチも入れようと思ったのですが次回に回します
次回は、
👉 リミットスイッチの実装(検証用のハードウェア結線の完了)
を進めていきます。



コメント