部品 · 読了まで18分

A4988ステッピングモータードライバとNEMA 17:Vref、マイクロステップ、コード

A4988でNEMA 17を駆動する方法を解説します。STEP/DIRの配線、Vrefの計算式、テスターでの電流設定、MS1〜MS3のマイクロステップ、AccelStepperとCNC Shieldまで紹介します。

A4988でNEMA 17を駆動するのは、3DプリンターやCNCマシン、レーザー彫刻機で使われている精密な動きを自分のプロジェクトに取り入れる、いちばん安上がりな方法です。A4988はAllegro社のバイポーラ型ステッピングモータードライバで、指先ほどの大きさのモジュールとして売られています。ArduinoからSTEPパルスが1回届くたびにモーターが1ステップ進み、DIRピンで回転方向を選び、ドライバはモーターのコイルに流れる電流を設定した値に保ちます。つまり、モーターを回すのに必要なのは2本のピンと8〜35 Vの電源だけです。

このガイドでは、A4988の仕組み、テスターでNEMA 17のコイルを見つける方法、配線、そして電源に100 µFのコンデンサが必要な理由を学びます。続いて、いちばん重要なステップであるVrefによる電流設定に進み、計算式とテスターでの測定を順を追って説明します。MS1〜MS3ピンによるマイクロステップ、ライブラリを使わない最初のスケッチ、AccelStepperによるなめらかな加速、CNC Shield、ESP32とRaspberry Pi Picoのコード、発熱とヒートシンク、DRV8825やTMC2208との比較、そして定番の「モーターが振動するだけで回らない」問題の解決法もまとめています。

A4988ステッピングモータードライバモジュール
A4988ステッピングモータードライバモジュール:2列に並んだ16本のピンと、電流の上限を設定する小さなポテンショメーター。

A4988とは?その仕組み

A4988の内部には、2つのフルHブリッジ(コイルごとに1つ)、トランスレーター、電流制御回路が入っています。トランスレーターはSTEPピンのLOW→HIGHの変化を1回ごとにコイルの正しい電流の順序に変換するため、コイルを励磁する順番をコードで考える必要はありません。電流制御にはチョッパ方式が使われています。ドライバは各コイルの電流を小さな電流検出抵抗(Rs)で常に監視し、電流が設定した上限に達するたびに出力を短時間オフにします。そのため、モーターの定格電圧よりかなり高い電圧、たとえば12 Vや24 Vで駆動しても、コイルの電流は安全な値に保たれます。チップには過熱、低電圧、負荷の短絡、GNDへの短絡に対する保護機能も備わっています。

項目値
モーター電源(VMOT)8〜35 V
ロジック電源(VDD)3〜5.5 V(Arduinoでは5 V、ESP32とPicoでは3.3 V)
コイルあたりの電流ヒートシンクなしで約1 A、十分に冷却すれば最大2 A
マイクロステップフル、1/2、1/4、1/8、1/16
制御ピンSTEP、DIR、ENABLE、MS1〜MS3、RESET、SLEEP
STEPパルスHIGHとLOWの部分がそれぞれ1 µs以上
保護機能過熱保護(165 °C)、低電圧ロックアウト、短絡保護
対応モーター4線式のバイポーラ型ステッピングモーター(NEMA 17、NEMA 14など)

NEMA 17ステッピングモーター:仕様とコイルの見つけ方

NEMA 17はモーターの型番ではなく、取り付け面が42 × 42 mmのモーターを表すサイズ規格です。中身は本体の長さやメーカーによって異なります。ホビー用途でいちばんよく使われる17HS4401は、1回転200ステップ(1.8°)、定格電流は1相あたり1.7 A、コイル抵抗は約1.5 Ω、保持トルクはおよそ40 N·cmです。ラベルに書かれた電圧は1.7 A × 1.5 Ω ≈ 2.6 Vにすぎませんが、これにまどわされないでください。A4988が自分で電流を制限するので、モーターは12〜24 Vで駆動します。電圧が高いほど各ステップでコイルの電流が速く立ち上がるため、高速でもトルクが落ちにくくなります。28BYJ-48のような小型のユニポーラ型モーターとの違いが気になる場合は、28BYJ-48とULN2003の記事を参照してください。

モーターの4本の線は2つの独立したコイルにつながっていて、A4988に接続する前に、どの2本が同じコイルなのかを知っておく必要があります。多くの機種では黒と緑が一方のコイル、赤と青がもう一方のコイルですが、色はメーカーによって違うため、いちばん確実なのは測ることです。

  1. テスターを抵抗(Ω)レンジにします。やり方がわからない場合はテスターの使い方を見てください。
  2. 1本の線を決めて、残りの3本それぞれとの間を測ります。1〜4 Ωを示した線が同じコイルのもう一方の端です。残りの2本は開放(OL)を示します。
  3. 残った2本が2つ目のコイルで、同じ抵抗値を示すはずです。測った抵抗と定格電流から、オームの法則計算ツールでモーターのラベルの電圧を確かめられます。
  4. テスターがない場合は、2本の線の先を触れ合わせて、軸を手で回してみてください。明らかに回しにくくなったら、その2本は同じコイルです。
  5. 一方のコイルをA4988の1A〜1Bピンに、もう一方を2A〜2Bピンにつなぎます。モーターが思った方向と逆に回る場合は、どちらか一方のコイルの2本を入れ替えるだけで直ります。

A4988のピン配置と配線図

A4988のピンArduino UnoESP32Raspberry Pi Pico
VMOT12〜24 VのACアダプターのプラス(+ 100 µF)12〜24 VのACアダプターのプラス(+ 100 µF)12〜24 VのACアダプターのプラス(+ 100 µF)
GND(VMOTの隣)ACアダプターのマイナスACアダプターのマイナスACアダプターのマイナス
1A、1Bモーターのコイル1モーターのコイル1モーターのコイル1
2A、2Bモーターのコイル2モーターのコイル2モーターのコイル2
VDD5V3V33V3(OUT)
GND(VDDの隣)GNDGNDGND
STEPD2GPIO 25GP2
DIRD5GPIO 26GP3
ENABLED8GPIO 27GP4
MS1、MS2、MS35V(1/16ステップ)3V3(1/16ステップ)3V3(1/16ステップ)
RESET、SLEEP2本をつなぐ2本をつなぐ2本をつなぐ
ドライバに電源が入っている間は、モーターの線を絶対に抜き差ししないでください。その瞬間にコイルにたまったエネルギーが高い電圧スパイクを生み、A4988が一瞬で壊れることがあります。VMOTを逆につないでもチップは焼損します。RESETピンを浮いた状態(未接続)にしておくと、ドライバは動かないか不安定な動作になります。隣のSLEEPピンとつないでください。ACアダプターのマイナス端子とArduinoのGNDは必ずつないでおきます(共通GNDを参照)。

100 µFのコンデンサが必須なのはなぜ?

A4988の基板には小さなセラミックコンデンサしか載っていません。ESRの低いこれらのコンデンサは、電源線のインダクタンスと組み合わさることで、電源を入れたときやモーターが急に電流を引いたときに電圧スパイクを生みます。このスパイクは12 V電源でもチップの上限である35 Vを超えることがあり、ドライバに回復できない損傷を与えます。対策は簡単で、VMOTとGNDの間に、基板のできるだけ近くに47 µF以上、理想的には100 µFの電解コンデンサを入れます。耐圧は電源電圧より十分に高くしてください。12 V電源なら25 V、24 Vなら35 Vか50 Vを選びます。電解コンデンサには極性があり、長い足(+)をVMOTに、本体の帯で示された短い足(–)をGNDにつなぎます。コンデンサの種類はコンデンサとは?を、適切なACアダプターの選び方はArduinoを電池で動かす方法を参照してください。

Vrefで電流を設定する:計算式

A4988の小さなポテンショメーターはVref(基準電圧)を設定し、これがモーター電流の上限を決めます。ドライバはこの電圧を基板上の2つの電流検出抵抗(Rs)にかかる電圧と比較し、コイルのピーク電流はI = Vref / (8 × Rs)で求まります。必要なVrefを求めるには式を変形してVref = I × 8 × Rsとします。Rsはチップの横にある2つの小さなSMD抵抗の表記を読んで調べます。R100は0.1 Ω、R068は0.068 Ω、R050は0.05 Ωです。表記がわかりにくい場合は、SMDコード解読ツールかSMD抵抗のコードの記事を使ってください。

Rsの表記Rsの値計算式0.8 AのときのVref1 AのときのVref1.2 AのときのVref
R0500.05 ΩVref = I × 0.40.32 V0.40 V0.48 V
R0680.068 ΩVref = I × 0.5440.44 V0.54 V0.65 V
R1000.1 ΩVref = I × 0.80.64 V0.80 V0.96 V

電流はいくつにすればよいでしょうか。モーターのラベルにある電流(17HS4401なら1.7 A)は、絶対に超えてはいけない上限です。ヒートシンクなしのA4988が無理なく扱えるのは約1 Aなので、0.8〜1 Aから始めるのがよいでしょう。R100抵抗の一般的な基板では、Vrefは0.64〜0.80 Vになります。負荷がかかると脱調する場合は、電流を0.1 Aずつ上げてください。1.2 Aを超える場合は、チップにヒートシンクとファンを付けます。必要以上の電流は、モーターを目に見えて強くするよりも、ドライバとモーターをはるかに大きく発熱させます。

テスターでVrefを測る:ステップごとの手順

  1. すべての電源を切った状態で、モーターをドライバから外します。Vrefの測定にモーターは必要ありません。
  2. A4988のVDDとGNDピンにロジック電源を供給します(Arduinoの5Vで十分です)。Vrefはこの電圧から作られるので、VDDがないと測れません。VMOTはつないだままでも問題ありません。
  3. テスターを直流電圧(2 Vか20 Vのレンジ)にします。黒のテスト棒をGNDに、赤のテスト棒をポテンショメーターの上の金属部分に当てます。基板によっては、代わりにVREFと書かれた小さなテストポイントがあります。
  4. プラスチックかセラミックの小さなドライバーで、ポテンショメーターをほんの少しずつ回しながら表示を見ます。多くの基板では時計回りでVrefが上がりますが、違う場合もあります。1回転すると値が一周して戻るポテンショメーターもあるので、少しずつ回してください。
  5. 計算した値になったら電源を切り、モーターをつないでから、改めて電源を入れます。
  6. モーターを数分回して、チップの温度を確かめます。数秒でも指を当てていられないほど熱い場合は、Vrefを少し下げるか、ヒートシンクを付けてください。
便利な方法として、赤のテスト棒をワニ口クリップで金属製のドライバーにつなぐと、ポテンショメーターを回しながら表示を見られます。ただし、ドライバーが隣のピンに触れないように注意してください。VrefはVDDから作られるため、ロジック電源を5 Vから3.3 Vに変えた場合(たとえばArduinoからESP32に切り替えたとき)はVrefを測り直してください。電流計で1つのコイルの電流を測りたい場合は、フルステップモードで測り、表示が設定した上限の約70%になることを覚えておいてください。

MS1、MS2、MS3によるマイクロステップ

マイクロステップとは、ドライバが2つのコイルの電流を段階的に変えて、1つのフルステップをさらに細かく分けることです。A4988はMS1〜MS3ピンのロジックレベルに応じて5つのモードから1つを選びます。これらのピンには内部プルダウン抵抗があるので、3本とも未接続のままにすると、モーターはフルステップモードで動きます。

MS1MS2MS3モード1回転のステップ数ステップ角
LOWLOWLOWフルステップ2001.8°
HIGHLOWLOWハーフステップ4000.9°
LOWHIGHLOW1/4ステップ8000.45°
HIGHHIGHLOW1/8ステップ16000.225°
HIGHHIGHHIGH1/16ステップ32000.1125°

マイクロステップの本当の利点はなめらかで静かな回転です。フルステップモードではモーターが1ステップごとにカクカク動き、特定の速度で共振して振動しますが、1/16ではほぼ連続した動きになります。ただし、精度が本当に16倍になるとは期待しないでください。1つのマイクロステップを進めるトルクは、保持トルクのわずかsin(90° / 16) ≈ 10%しかありません。摩擦や負荷がこの小さな力に勝つと、モーターは数マイクロステップ遅れます。速度の計算にはステップ/秒 = RPM × 200 × マイクロステップ数 / 60を使います。たとえば、1/16で60 RPMにするには、1秒間に3200回のSTEPパルスが必要です。モードをソフトウェアで切り替えたい場合はMSピンもArduinoにつなげますが、ほとんどのプロジェクトでは配線で固定のモードを選べば十分です。

最初のスケッチ:ライブラリを使わずSTEPとDIRでモーターを回す

次のスケッチは、ライブラリを使わず、STEPピンにパルスを送るだけでモーターを1回転前に、1回転後ろに回します。MS1〜MS3を5Vにつないでいるものとするので、モーターは1/16で動き、1回転は3200ステップです。

C++ (Arduino IDE)
1// A4988 + NEMA 17, kütüphanesiz / without a library
2const int STEP_PIN = 2;            // CNC Shield X ekseniyle aynı / same as CNC Shield X axis
3const int DIR_PIN  = 5;
4const int EN_PIN   = 8;            // aktif LOW / active LOW
5
6const long STEPS_PER_REV = 200L * 16;   // 1,8° motor, 1/16 mikro adım = 3200 / 1.8° motor, 1/16 microstep
7
8void setup() {
9  pinMode(STEP_PIN, OUTPUT);
10  pinMode(DIR_PIN, OUTPUT);
11  pinMode(EN_PIN, OUTPUT);
12  digitalWrite(EN_PIN, LOW);       // sürücüyü aç / enable the driver
13}
14
15void rotate(long steps, unsigned int pauseUs) {
16  digitalWrite(DIR_PIN, steps > 0 ? HIGH : LOW);   // yön / direction
17  delayMicroseconds(5);                           // DIR, STEP'ten önce otursun / let DIR settle before STEP
18  for (long i = 0; i < labs(steps); i++) {
19    digitalWrite(STEP_PIN, HIGH);
20    delayMicroseconds(5);                         // darbe en az 1 µs / pulse at least 1 µs
21    digitalWrite(STEP_PIN, LOW);
22    delayMicroseconds(pauseUs);                   // küçüldükçe hız artar / smaller = faster
23  }
24}
25
26void loop() {
27  rotate(STEPS_PER_REV, 500);      // 1 tur ileri, ~1,6 sn / one turn forward, ~1.6 s
28  delay(1000);
29  rotate(-STEPS_PER_REV, 500);     // 1 tur geri / one turn back
30  delay(1000);
31}

このコードで注意すべきタイミングは3つあります。A4988では、STEPパルスのHIGHとLOWの部分がそれぞれ1 µs以上続く必要があります。5 µsなら安全です。DIRを変えた後は、最初のSTEPパルスまで200 ns以上待つ必要があり、コードではそのために5 µs待っています。速度はパルスの間の待ち時間で決まります。待ち時間が500 µsなら1ステップは約0.51 msなので、1回転(3200ステップ)は約1.6秒、およそ36 RPMになります。このコードには弱点が2つあります。モーターがいきなり全速で動き出すことと、ループの実行中はArduinoがほかのことを何もできないことです。待ち時間をいきなり100 µsまで縮めると、モーターはほぼ確実に動き出せず、ブーンとうなるだけになります。

AccelStepperで加速と減速をする

ステッピングモーターは、停止状態から一瞬で高速にはできません。ローターと負荷がそんな急な変化についていけず、モーターが同期を失って脱調します。解決策は、速度を徐々に上げ、目標に近づいたら徐々に下げることです。ライブラリマネージャからインストールできるAccelStepperは、これをプログラムを止めずに行います。loop()の中でrun()を常に呼び出し、ステップのタイミングが来るたびにライブラリが1ステップ進めます。こうすればモーターが回っている間もボタンを読んだり、ディスプレイを更新したり、センサーを読み取ったりできます。この考え方はmillis()とdelay()の違いで詳しく説明しています。UnoでのAccelStepperは毎秒数千ステップまで確実に出せます(ドキュメントでは16 MHzで約4000ステップ/秒)。そのため例では2000ステップ/秒を使っています。これは1/16で約37 RPMです。

C++ (Arduino IDE)
1#include <AccelStepper.h>
2
3const int STEP_PIN = 2;
4const int DIR_PIN  = 5;
5const int EN_PIN   = 8;
6const long STEPS_PER_REV = 200L * 16;            // 1/16 mikro adımda 1 tur / one turn at 1/16 microstep
7
8AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
9
10void setup() {
11  stepper.setEnablePin(EN_PIN);
12  stepper.setPinsInverted(false, false, true);   // EN aktif LOW / EN is active LOW
13  stepper.enableOutputs();
14  stepper.setMaxSpeed(2000);                     // adım/sn, Uno için güvenli / steps per second, safe on Uno
15  stepper.setAcceleration(1500);                 // adım/sn² / steps per second²
16  stepper.moveTo(STEPS_PER_REV * 3);             // 3 tur ileri / three turns forward
17}
18
19void loop() {
20  if (stepper.distanceToGo() == 0) {             // hedefe varıldı / target reached
21    delay(500);
22    stepper.moveTo(stepper.currentPosition() == 0 ? STEPS_PER_REV * 3 : 0);   // git-gel / back and forth
23  }
24  stepper.run();                                 // her döngüde çağır, bekletmez / call every loop, non-blocking
25}
関数働き
AccelStepper(AccelStepper::DRIVER, STEP, DIR)STEP/DIR入力のドライバ用のオブジェクトを作る
setMaxSpeed(ステップ/秒)到達する最高速度
setAcceleration(ステップ/秒²)加速と減速の割合
moveTo(位置) / move(ステップ数)絶対位置へ、または現在地からの相対位置へ移動する
run()タイミングが来ていれば1ステップ進める。loop()の中で常に呼び出す必要がある
runToPosition()目標に着くまでプログラムを止める
distanceToGo() / currentPosition()残りのステップ数と現在の位置
setCurrentPosition(0)現在の位置をゼロとみなす(リミットスイッチで原点復帰した後)
setEnablePin() / setPinsInverted()ENピンを指定する。A4988のENはアクティブLOWなので反転させる
enableOutputs() / disableOutputs()コイルを励磁する、または解放する

CNC Shield V3で複数のモーターを動かす

NEMA 17を2台以上動かすなら、配線がごちゃごちゃにならないいちばん簡単な方法はArduino CNC Shield V3です。この基板はUnoの上に差し込むタイプで、4つのA4988用ソケット(X、Y、Z、A)、各ドライバの下にあるマイクロステップ用ジャンパー、モーター用のピンヘッダー、リミットスイッチの入力、電源端子を備えています。3つのジャンパーをすべて付けると、A4988は1/16で動きます。配線表でSTEP、DIR、ENにD2、D5、D8を選んだのは意図的です。これらはシールドのX軸のピンなので、ここまでのスケッチはシールドでもそのまま動きます。UnoにGRBLを書き込むと、シールドはパソコンからGコードを受け取るCNCやレーザーのコントローラーになります。GRBLでは、各軸が1 mmあたり何ステップ必要かを$100、$101、$102の設定に入力します。20歯のGT2プーリーと1/16マイクロステップなら200 × 16 / (20 × 2) = 80ステップ/mm、リード8 mmのT8送りねじなら200 × 16 / 8 = 400ステップ/mmです。

軸STEPDIR備考
XD2D5リミットスイッチD9
YD3D6リミットスイッチD10
ZD4D7リミットスイッチD12(GRBL 1.1)
Aジャンパーで設定ジャンパーで設定X、Y、Zのいずれかを複製(例:2モーターのY軸)
全ドライバ––共通のENピンD8:LOW = ドライバ有効
ドライバをシールドに差し込むときは、ポテンショメーターの位置で向きを判断しないでください。ドライバのENピンをシールドのENの表示に合わせます。逆向きに差したドライバは、電源を入れた瞬間に焼損します。自分のコードでD8をLOWにしないと、モーターはまったく動きません。A4988の代わりにDRV8825を付けると、3つのジャンパーで1/32モードになり、1回転のステップ数が2倍になります。シールドの端子には12〜36 Vと書かれていますが、A4988の上限は35 Vです。12 Vか24 Vがいちばん安全です。

ESP32でA4988を使う

ESP32のピンの出力は3.3 Vです。A4988が入力を確実にHIGHと読むのは、VDDの70%を超えたときだけです。VDDが5 Vだとこのしきい値は3.5 Vになり、3.3 Vの信号では足りません。そのため、ESP32やPicoを使うときはA4988のVDDピンを3V3につないでください。ドライバは3〜5.5 Vで問題なく動き、レベル変換モジュールも不要になります。VDDが変わったので、Vrefを測り直すのを忘れないでください。次のスケッチは、シリアルモニタに入力した角度(たとえば90や-45)まで、モーターを加速付きで動かします。ESP32ははるかに高速なので、ここではAccelStepperが毎秒6000ステップに楽に届きます。さらに高速にしたい場合は、ハードウェアタイマーを使うFastAccelStepperライブラリを検討してください。ESP32が初めてなら、ESP32とは?から始めてください。

C++ (Arduino IDE)
1#include <AccelStepper.h>
2
3// ESP32: STEP=25, DIR=26, EN=27, A4988 VDD → 3V3
4const int STEP_PIN = 25;
5const int DIR_PIN  = 26;
6const int EN_PIN   = 27;
7const float STEPS_PER_DEG = 200.0 * 16 / 360.0;  // 1/16'da derece başına 8,89 adım / 8.89 steps per degree at 1/16
8
9AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
10
11void setup() {
12  Serial.begin(115200);
13  stepper.setEnablePin(EN_PIN);
14  stepper.setPinsInverted(false, false, true);   // EN aktif LOW / EN is active LOW
15  stepper.enableOutputs();
16  stepper.setMaxSpeed(6000);                     // adım/sn / steps per second
17  stepper.setAcceleration(4000);                 // adım/sn² / steps per second²
18  Serial.println("Aci yaz, ornek 90 / type an angle, e.g. 90");
19}
20
21void loop() {
22  if (Serial.available()) {
23    float angle = Serial.parseFloat();           // Seri Monitör'den açı / angle from the Serial Monitor
24    while (Serial.available()) Serial.read();    // satır sonunu at / drop the line ending
25    stepper.moveTo(lround(angle * STEPS_PER_DEG));
26    Serial.printf("Hedef / target: %.1f\n", angle);
27  }
28  stepper.run();                                 // bekletmeden adım at / step without blocking
29}

Raspberry Pi PicoとMicroPythonでA4988を使う

PicoでもA4988のVDDピンは3V3(OUT)ピンにつなぎます。MicroPythonでは加速用のライブラリの代わりに、次のような簡単な直線的な加減速を書けます。move()関数は、最初と最後の600ステップでパルスの間隔を2000 µsから400 µsへ徐々に変え、その間は全速で回します。MicroPythonのループは1ステップごとに数十マイクロ秒を加えるので、実際の速度は計算より少し遅くなります。毎秒数万ステップが必要な場合や、複数のモーターを同時に動かしたい場合は、PicoのPIOブロックを使えば、CPUをまったく使わずにパルスを作れます。PicoへのMicroPythonのインストールはRaspberry Pi Picoとは?を参照してください。

MicroPython
1from machine import Pin
2import time
3
4step = Pin(2, Pin.OUT)              # STEP → GP2
5direction = Pin(3, Pin.OUT)         # DIR → GP3
6enable = Pin(4, Pin.OUT, value=0)   # EN → GP4, 0 = sürücü açık / 0 = driver enabled
7
8STEPS_PER_REV = 200 * 16            # 1/16 mikro adım / 1/16 microstep
9
10def move(steps, max_sps=2500, ramp_steps=600):
11    direction.value(1 if steps > 0 else 0)    # yön / direction
12    time.sleep_us(5)
13    n = abs(steps)
14    ramp = min(ramp_steps, n // 2)            # hızlanma ve yavaşlama adımı / accel and decel steps
15    fast = 1000000 // max_sps                 # en kısa bekleme, µs / shortest pause, µs
16    slow = 2000                               # 500 adım/sn ile başla / start at 500 steps/s
17    for i in range(n):
18        k = min(i, n - 1 - i)                 # başa ya da sona uzaklık / distance to start or end
19        pause = slow - (slow - fast) * k // ramp if k < ramp else fast
20        step.value(1)
21        time.sleep_us(3)                      # STEP darbesi / STEP pulse
22        step.value(0)
23        time.sleep_us(pause)
24
25while True:
26    move(STEPS_PER_REV)             # 1 tur ileri / one turn forward
27    time.sleep(1)
28    move(-STEPS_PER_REV // 2)       # yarım tur geri / half a turn back
29    time.sleep(1)

発熱、ヒートシンク、過熱保護

A4988が熱くなるのは正常です。コイルの電流がチップ内部のMOSFETを流れるからです。各コイルの電流経路の合計抵抗は通常0.64 Ωで、消費される電力は電流の2乗に比例して増え、おおよそP ≈ I² × 0.64 Ωになります。1 Aの設定なら約0.65 W、1.5 Aなら約1.45 Wです。チップが熱くなると抵抗も上がるので、実際の値はさらに大きくなります。指先ほどの基板にとっては大きな熱量です。チップが165 °Cに達すると過熱保護が出力をオフにし、約15 °C下がると再びオンにします。数秒回って止まり、その後また勝手に動き出すモーターは、この保護が働いている典型的なサインです。

  • ヒートシンクを付ける:小さなアルミ製のヒートシンクを放熱テープでチップに貼ります。ピンやポテンショメーターに触れないように注意してください。
  • 風を通す:1.2 Aを超える場合や、閉じたケースの中では、小さなファンがヒートシンクの効果を何倍にも高めます。
  • 電流を必要な分だけにする:負荷がかかっても脱調しないなら、Vrefを少し下げます。電流を20%減らすと、熱は約36%減ります。
  • 停止中はコイルをオフにする:保持トルクが不要なら、動作が終わったときにENピンをHIGHにするか、disableOutputs()を呼び出します。ドライバもモーターも冷えます。
  • モーターの温度も確かめる:ステッピングモーターは停止中も電流を消費するので、温かく、ときには熱くなります。本体が60 °Cを超えるなら電流を下げてください。この温度になると、3DプリンターのPLA部品が柔らかくなり始めます。
  • より強力なドライバに替える:モーターに1.5 Aを超える電流が必要なら、DRV8825やTMC2209のようなドライバのほうが適しています。

A4988、DRV8825、TMC2208の比較

項目A4988DRV8825TMC2208
モーター電圧8〜35 V8.2〜45 V4.75〜36 V
無理のない連続電流約1 A(ヒートシンクなし)約1.5 A(ヒートシンクなし)約0.85 A RMS(小型ヒートシンク)
最大電流2 A(十分な冷却)2.2 A(十分な冷却)約1.4 A RMS(ピーク2 A)
最も細かいマイクロステップ1/161/321/16(1/256に補間)
Vrefからの電流I = Vref / (8 × Rs)I = Vref × 2基板によって異なるため、メーカーの式を使う
ロジック電源ピンVDDが必要不要(そのピンはFAULT出力)VIOが必要
騒音はっきりした高い音A4988と同程度の高い音ほぼ無音(StealthChop)
最短のSTEPパルス1 µs1.9 µsごく短く、問題にならない
選ぶとよい場面初心者向け、安くて入手しやすいより大きな電流と電圧が必要なとき静かな3Dプリンターや卓上の工作機械

3つのドライバはどれも同じ16ピンの「StepStick」形状で、CNC Shieldでは差し替えられることが多いのですが、注意すべき違いもあります。DRV8825はポテンショメーターの位置が違い、計算式も異なります。A4988でVDDのピンは、DRV8825ではFAULT出力です。同じコードでも、TMC2208はA4988と逆方向にモーターを回すので、ソフトウェアでDIRを反転させるか、モーターのコネクターを180°回して差し直す必要があります。高度な設定はUARTで行い、センサーレス原点復帰(StallGuard)を使いたいならTMC2209を検討してください。まとめると、学習用や低コストのプロジェクトでは、A4988が今でもいちばん無難な出発点です。静かさが大事ならTMC2208を、より大きな電流が必要ならDRV8825を選んでください。モーターの種類の全体的な比較はDCモーター、サーボ、ステッピングモーターの違いを読んでください。

モーターが振動するだけで回らない:よくある間違いと対策

症状考えられる原因対策
モーターが振動してうなるが回らないコイルの組み合わせが違う:1A〜1Bが同じコイルではないテスターでコイルを見つけ、一方を1A〜1Bに、もう一方を2A〜2Bにつなぐ
軸が前後に揺れるコイルの線の断線か、ブレッドボードの接触不良モーターの線をネジ端子かはんだ付けでつなぎ、1本ずつ測る
低速では回るが、速度を上げると止まって高い音を出す速度が高すぎる、加速がない、または電源電圧が低すぎるAccelStepperで加速を付け、最高速度を下げ、12 Vの代わりに24 Vを試す
力が弱く、手で簡単に止められ、脱調するVref(電流の上限)が低すぎるVrefを0.1 Aずつ上げる
数秒回って止まり、また動き出す過熱で過熱保護が働いているヒートシンクとファンを付け、電流を下げる
トルクがまったくなく、軸が自由に回るENがHIGH、RESETが浮いている、またはVMOTかVDDがないRESETをSLEEPとつなぎ、ENをLOWにし、テスターで電源を測る
いつも同じ方向に回るDIRピンが未接続か、コードのピンが違うDIRの線とコードのピン番号を確認する
モーターが動き出すとArduinoが再起動するモーターとArduinoを同じ非力な電源から給電しているモーターには別のACアダプターを使い、GNDをつなぐ
ドライバが突然壊れた通電中にモーターを抜いた、コンデンサがない、またはドライバを逆向きに差した配線は電源を切ってから行い、100 µFを追加し、ENピンでドライバの向きを合わせる
「振動するだけで回らない」問題では、まずテストを基本だけに絞ります。上のライブラリなしのスケッチを、待ち時間2000 µsにして動かしてください。この低速でなめらかに回るなら配線は正しく、問題は速度か加速です。それでも振動するなら、問題はコイルの組み合わせ、線、または電流の設定です。モーターと一緒にArduinoが再起動するのは別の電源の問題です。Arduinoがリセットを繰り返すときを参照してください。

A4988とNEMA 17のプロジェクトアイデア

  • カメラスライダー:GT2ベルトとプーリーでカメラをレールに沿って1ミリずつ動かし、タイムラプス動画を撮ります。
  • ペンプロッター:CNC ShieldとGRBLでペンを2軸で動かし、パソコンの絵を紙に描きます。ペンの上げ下げにはサーボモーターが1つあれば十分です。
  • ターンテーブル:商品写真や3Dスキャンのために物体を等しい角度ずつ回します。1/16では1回転が3200ステップなので、36枚の写真の間隔はそれぞれ約89ステップです。
  • 太陽追尾装置:パネルを一日中太陽の方に向ける装置を作ります。全体のアイデアは太陽追尾装置の記事にあります。
  • ロボットアームの土台:重いアームの土台を、サーボの代わりにNEMA 17とギアで回します。ほかの関節についてはロボットアームの記事を参照してください。
  • 手動での位置決め:ジョイスティックでモーターを素早く動かし、ロータリーエンコーダーで1ステップずつ正確に動かします。
  • 自動カーテンやスライド式のカバー:起動時にリミットスイッチでゼロ点を見つけ、setCurrentPosition(0)で記録し、カーテンを好きな位置に動かします。

A4988でNEMA 17を駆動する要点をまとめると、コイルを正しく組み合わせ、電源に100 µFを入れ、Vrefを計算式で求めてテスターで設定し、マイクロステップを選び、加速を付けてモーターを回す、ということです。この基礎を身につければ、3DプリンターやCNCのような機械がどう動いているのかもよくわかるようになります。BlueGraysアプリでは、「ステッピングモーターの使い方」や「ステッピングモーターで作る360度サーボモーター」といった動きのあるプロジェクトを、回路図とコード付きでステップごとに学べます。

よくある質問

A4988のVrefはいくつにすればよいですか?

VrefはVref = I × 8 × Rsで計算します。R100(0.1 Ω)抵抗の一般的な基板ではVref = I × 0.8になるので、1 Aなら0.8 Vに設定します。17HS4401のような1.7 AのNEMA 17では、ヒートシンクなしなら0.64〜0.8 V(0.8〜1 A)から始めるのがよく、ヒートシンクを付ければ0.96 V(1.2 A)まで上げられます。

A4988でNEMA 17を駆動できますか?何アンペアまで流せますか?

はい、A4988はNEMA 17用として最も一般的なドライバです。ヒートシンクなしでもコイルあたり約1 Aを無理なく流せ、十分なヒートシンクとファンがあれば2 Aまで届きます。実際には、1.2〜1.5 Aを超える電流を連続して流す必要があるなら、DRV8825やTMC2209のほうが余裕があります。

NEMA 17ステッピングモーターには何ボルトが必要ですか?

ラベルに書かれた電圧(17HS4401なら約2.6 V)は、コイル抵抗に定格電流を掛けた値にすぎず、モーターに直接かける電圧ではありません。A4988が自分で電流を制限するので、モーターは12〜24 Vで駆動します。電圧が高いほど、高速でのトルクが大きくなります。A4988の上限は35 Vです。

ステッピングモーターが振動するだけで回らないのはなぜですか?

いちばん多い原因はコイルの組み合わせの間違いです。一方のコイルの2本を1A〜1Bに、もう一方のコイルの2本を2A〜2Bにつなぐ必要があります。ほかには、加速なしで高すぎる速度を指定している、Vrefが低い、線が断線している、電源が不十分といった原因があります。まずはごく低速でモーターを試してください。なめらかに回るなら、問題は速度です。

A4988がこんなに熱くなるのはなぜですか?

コイルの電流がチップ内部のMOSFETを流れ、熱は電流の2乗に比例して増えます。1 Aから1.5 Aにすると2倍以上になります。1 Aを超えるならヒートシンクと風通しが必要です。チップは165 °Cで自動的に停止します。モーターがときどき止まってはまた動き出すのはそのサインです。

A4988、DRV8825、TMC2208のどれを選べばよいですか?

A4988は最も安く、学びやすいドライバで、1/16マイクロステップまで対応します。DRV8825は最大45 Vと1/32マイクロステップに対応し、ヒートシンクなしでもより大きな電流を流せます。TMC2208はほぼ無音なので3Dプリンターで人気ですが、扱える電流は小さく、A4988とは逆方向にモーターを回します。

全プロジェクトを見る
ステッピングモーターの使い方
#67中級
プレミアム

ステッピングモーターの使い方

時計の針のように、必要な分だけ正確に少しずつ回転するモーターです。Arduinoがドライバーボードを介して小さなステッピングモーターを一方向に1回転させ、1秒待ってから逆方向に1回転させます。ドア、カーテン、回転台など、正確な回転が必要なプロジェクトの基礎を学べます。

4.5(31)
42
ステッピングモーターで作る360度サーボモーター
#68中級
プレミアム

ステッピングモーターで作る360度サーボモーター

普通のステッピングモーターを、1周の範囲で好きな角度へ動かせるようにします。Arduinoが各角度に必要なステップ数を計算し、モーターは0、90、45、180、135、360度へ順番に移動します。それぞれの位置で少し止まり、最初から繰り返します。通常は半回転の範囲に限られるサーボモーターの働きを、1周全体で実現する仕組みを作れます。

4.5(22)
32
サーボモーターの使い方
#35初級
プレミアム

サーボモーターの使い方

小型サーボモーターのアームが、一方の端、中央、もう一方の端の3つの位置へ順番に回り、それぞれの位置で2秒間止まります。Arduinoが保持する角度をモーターに指示すると、モーターはその位置まで動いて止まります。ロボットアームや自動開閉するふたが動く仕組みを学べます。

4.7(48)
67
ポテンショメーターでサーボモーターを操作
#36初級
プレミアム

ポテンショメーターでサーボモーターを操作

ポテンショメーターのつまみを回すと、サーボモーターのアームもそれに合わせて回ります。つまみの一方の端が0度、もう一方の端が半回転に対応します。Arduinoがつまみの位置を常に読み取り、サーボモーターが動きにすぐ反応します。ロボットアームや回転式カメラ台などのプロジェクトへの第一歩です。

4.6(37)
52
ジョイスティックでサーボモーターを制御
#60中級
プレミアム

ジョイスティックでサーボモーターを制御

防犯カメラの向きを変えるように、ジョイスティックで2つのモーターを操作します。スティックを左右に倒すと下側のサーボモーターがゆっくり回り、上下に倒すと上側のサーボモーターが上下に傾きます。手を離すと、どちらもその位置で止まります。カメラやレーザーの台座など、2方向に動く装置の基礎を作ります。

4.7(42)
58
ESP32サーボモーター(ポテンショメーター制御)
#118中級
プレミアム

ESP32サーボモーター(ポテンショメーター制御)

このプロジェクトでは、ポテンショメーターでSG90サーボモーターを制御します。ポテンショメーターから読み取ったアナログ値を0~180度の範囲に変換し、サーボの角度を調整します。ESP32Servoライブラリは、ESP32の出力に対応した適切なGPIOでサーボ信号を生成します。このプロジェクトではGPIO 18を使います。ロボットアームやカメラ用ジンバル、自動ドアの機構に使われる基本的な制御方法です。

4.3(29)
42
L298Nで作るBluetooth操作の車
#80上級
プレミアム

L298Nで作るBluetooth操作の車

スマートフォンをリモコンにして、自作のロボットカーを操作できます。ArduinoはBluetoothモジュールを通じてスマートフォンのリモコンアプリから指令を受け取り、モータードライバーで車輪を回します。前進、後退、左右や斜めへの移動ができ、速度もスマートフォンから調整できます。停止ボタンを押すと、短いブレーキ動作でモーターがすぐに止まります。

5.0(38)
65
障害物回避ロボット
#81上級
プレミアム

障害物回避ロボット

自分で進む道を見つける、賢い車を作ってみませんか?障害物回避ロボットは、前面の超音波センサーで周囲を常に調べます。障害物を見つけると停止し、サーボモーターで左右を確認して、最も障害物の少ない方向を選んで進みます。自動運転の基礎を学ぶのにぴったりの入門プロジェクトです。

5.0(38)
49