ステッピングモータのステップモード(フル・1/8・1/16)の違いを比較してみた

Arduino

はじめに

ステッピングモータを使っていると、「フルステップ」「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)」に設定することで、
モータの動きを細かく制御できます。

ステップモード設定表

モードMS1MS2MS3分解能特徴
フルステップ(1/1)LOWLOWLOW200ステップ/回転トルク強い・音が大きい
ハーフステップ(1/2)HIGHLOWLOW400ステップ/回転少し滑らか
1/4ステップLOWHIGHLOW800ステップ/回転バランス良い
1/8ステップHIGHHIGHLOW1600ステップ/回転静かで滑らか
1/16ステップHIGHHIGHHIGH3200ステップ/回転非常に滑らか・精密

実験環境

使用したもの

  • 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. まずはフルステップで試す
     最も単純で、設定も簡単です。
     モータの方向や動作確認にはこれが最適。
  2. 振動や音が気になる場合は1/8や1/16へ
     滑らかさを重視したいときに。
     例えば3Dプリンタやカメラのパン動作などにおすすめ。
  3. 精密制御が必要な場合はマイクロステップ
     1/16以上にすると位置精度が上がりますが、トルクは弱くなります。
     用途に応じてバランスを取るのがポイントです。

まとめ:まずは「フルステップ」から始めよう

ステッピングモータのステップモードは、滑らかさとトルクのトレードオフです。
実際に試して、音・振動・精度の違いを体感してみると理解が深まります。

まずはフルステップで回してみて、必要に応じて1/8・1/16と細かくしていくのがおすすめです。

関連記事

コメント

タイトルとURLをコピーしました