はじめに
ステッピングモータを使っていると、「フルステップ」「1/8ステップ」「1/16ステップ」など、ステップモードという言葉をよく目にします。
でも、実際にどう違うのか、どのモードを使えばいいのか迷う方も多いと思います。
この記事では、A4988ドライバとArduinoを使って、実際にフルステップ・1/8ステップ・1/16ステップで回してみた結果を紹介します。
また、モードの使い分け方についても解説します。
この記事でわかること
- フルステップとマイクロステップの違い
- ステップモードを切り替える方法
- 音・振動・滑らかさの違い
- 状況に応じたおすすめの使い分け方
ステップモードとは?
ステッピングモータを**どれだけ細かく動かすか(1回のステップでどれくらい回転させるか)**を決める設定のことです。
ステッピングモータの基本動作
ステッピングモータは、内部のコイルに電流を順番に流すことで「カクカク」と少しずつ回転します。
この「1回カクッと動く」動作が 1ステップ です。
たとえば、1回転が200ステップ(1.8°/step)のモータなら、
フルステップモードでは200回パルスを送ると1回転します。
ステップモードを変えるとどうなる?
ドライバ(A4988など)には、ステップをさらに細かく分けて動かす機能があります。
これが「マイクロステップ制御」です。
| モード | 1ステップあたりの角度(1.8°の場合) | 1回転に必要なパルス数 | 特徴 |
|---|---|---|---|
| フルステップ(1/1) | 1.8° | 200 | 最も単純。トルクが強く、動作音が大きい。 |
| ハーフステップ(1/2) | 0.9° | 400 | 少し滑らか。振動が減る。 |
| 1/4ステップ | 0.45° | 800 | 滑らかで安定。 |
| 1/8ステップ | 0.225° | 1600 | 静かでバランスが良い。 |
| 1/16ステップ | 0.1125° | 3200 | 非常に滑らかで静かだが、トルクはやや弱い。 |
ステップモードの設定方法(A4988の場合)
A4988ドライバでは、
「MS1 / MS2 / MS3」という3本のピンを使ってステップモードを切り替えます。
これらのピンを「HIGH(5V)」または「LOW(0V)」に設定することで、
モータの動きを細かく制御できます。
ステップモード設定表
| モード | MS1 | MS2 | MS3 | 分解能 | 特徴 |
|---|---|---|---|---|---|
| フルステップ(1/1) | LOW | LOW | LOW | 200ステップ/回転 | トルク強い・音が大きい |
| ハーフステップ(1/2) | HIGH | LOW | LOW | 400ステップ/回転 | 少し滑らか |
| 1/4ステップ | LOW | HIGH | LOW | 800ステップ/回転 | バランス良い |
| 1/8ステップ | HIGH | HIGH | LOW | 1600ステップ/回転 | 静かで滑らか |
| 1/16ステップ | HIGH | HIGH | HIGH | 3200ステップ/回転 | 非常に滑らか・精密 |
実験環境
使用したもの
- Arduino
- ステッピングモータ:NEMA17(1.8°/step, 200ステップ/1回転)
- ドライバ:A4988
- 電源(12V):ACアダプタ
- ブレッドボード
- ジャンパーワイヤー
- コンデンサ(100µF)
接続図
A4988とArduinoの基本的な配線は以下の通りです👇
接続ポイント(概要)
- VMOT:モーター電源(8〜35 V)
- VDD:ロジック電源(3〜5.5 V)
- GND:共通グランド
- STEP:Arduino のデジタルピン9
- DIR:Arduino のデジタルピン8
- MS1〜MS3:Arduino D5,D6,D7
- RESET と SLEEP:ショート
プログラム
以下のスケッチを使って、各ステップモードで回転させました。
// --- ピン設定 ---
const int DIR = 8; // 回転方向ピン(A4988のDIRへ)
const int STEP = 9; // ステップパルスピン(A4988のSTEPへ)
const int MS1 = 5; // ステップモード選択 MS1
const int MS2 = 6; // ステップモード選択 MS2
const int MS3 = 7; // ステップモード選択 MS3
// --- パラメータ設定 ---
const int BASE_PPS = 1300; // フルステップ時の回転速度(pps)
const int ACCEL_STEPS = 1000; // 加速・減速に使うステップ数
const unsigned long RUN_TIME = 5000; // 定速維持時間(ms)
// --- 関数プロトタイプ ---
void setStepMode(int mode);
void runMotor(int target_pps, unsigned long run_time);
void setup() {
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(MS3, OUTPUT);
digitalWrite(DIR, HIGH); // 回転方向固定
Serial.begin(115200);
delay(500);
Serial.println("=== Stepper Microstepping (Accel + Decel) Test ===");
}
void loop() {
// ---- フルステップ ----
Serial.println("\n--- FULL STEP ---");
setStepMode(1);
runMotor(BASE_PPS, RUN_TIME);
delay(1000);
// ---- クオータステップ(1/4)----
Serial.println("\n--- QUARTER STEP (1/4) ---");
setStepMode(4);
runMotor(BASE_PPS * 4, RUN_TIME);
delay(1000);
// ---- マイクロステップ(1/16)----
Serial.println("\n--- MICRO STEP (1/16) ---");
setStepMode(16);
runMotor(BASE_PPS * 16, RUN_TIME);
delay(1000);
Serial.println("\n=== All tests finished ===");
while (1); // 停止
}
// --- ステップモード設定関数 ---
void setStepMode(int mode) {
switch (mode) {
case 1: // フルステップ
digitalWrite(MS1, LOW);
digitalWrite(MS2, LOW);
digitalWrite(MS3, LOW);
break;
case 2: // ハーフ
digitalWrite(MS1, HIGH);
digitalWrite(MS2, LOW);
digitalWrite(MS3, LOW);
break;
case 4: // クオータ
digitalWrite(MS1, LOW);
digitalWrite(MS2, HIGH);
digitalWrite(MS3, LOW);
break;
case 8: // 1/8
digitalWrite(MS1, HIGH);
digitalWrite(MS2, HIGH);
digitalWrite(MS3, LOW);
break;
case 16: // 1/16
digitalWrite(MS1, HIGH);
digitalWrite(MS2, HIGH);
digitalWrite(MS3, HIGH);
break;
}
Serial.print("Step mode set to 1/");
Serial.println(mode);
}
// --- モーター駆動関数(加速→定速→減速) ---
void runMotor(int target_pps, unsigned long run_time) {
Serial.print("Target pps: ");
Serial.println(target_pps);
// --- 加速フェーズ ---
Serial.println("Accelerating...");
for (int i = 1; i <= ACCEL_STEPS; i++) {
float progress = (float)i / ACCEL_STEPS;
float current_pps = target_pps * progress;
if (current_pps < 1) current_pps = 1;
unsigned long pulse_delay = 1000000UL / (current_pps * 2UL);
digitalWrite(STEP, HIGH);
delayMicroseconds(pulse_delay);
digitalWrite(STEP, LOW);
delayMicroseconds(pulse_delay);
}
// --- 定速フェーズ ---
Serial.println("Hold max speed...");
unsigned long pulse_delay = 1000000UL / (target_pps * 2UL);
unsigned long tStart = millis();
while (millis() - tStart < run_time) {
digitalWrite(STEP, HIGH);
delayMicroseconds(pulse_delay);
digitalWrite(STEP, LOW);
delayMicroseconds(pulse_delay);
}
// --- 減速フェーズ ---
Serial.println("Decelerating...");
for (int i = ACCEL_STEPS; i >= 1; i--) {
float progress = (float)i / ACCEL_STEPS;
float current_pps = target_pps * progress;
if (current_pps < 1) current_pps = 1;
unsigned long pulse_delay = 1000000UL / (current_pps * 2UL);
digitalWrite(STEP, HIGH);
delayMicroseconds(pulse_delay);
digitalWrite(STEP, LOW);
delayMicroseconds(pulse_delay);
}
Serial.println("Stop.\n");
}
実際に回してみた結果
フルステップでは「カタカタ」とした明確な動きが見られ、トルクは強い反面、音と振動が大きめです。
一方で1/16ステップではとても滑らかで静かに動作しますが、トルクはやや低下します。
ステップモードの使い分け方
使い分けの基本は以下の通りです。
- まずはフルステップで試す
最も単純で、設定も簡単です。
モータの方向や動作確認にはこれが最適。 - 振動や音が気になる場合は1/8や1/16へ
滑らかさを重視したいときに。
例えば3Dプリンタやカメラのパン動作などにおすすめ。 - 精密制御が必要な場合はマイクロステップ
1/16以上にすると位置精度が上がりますが、トルクは弱くなります。
用途に応じてバランスを取るのがポイントです。
まとめ:まずは「フルステップ」から始めよう
ステッピングモータのステップモードは、滑らかさとトルクのトレードオフです。
実際に試して、音・振動・精度の違いを体感してみると理解が深まります。
まずはフルステップで回してみて、必要に応じて1/8・1/16と細かくしていくのがおすすめです。


コメント