はじめに

本シリーズでは、PythonとRaspberry Piを使った「自作XYテーブル」の製作をゴールに設定しています。第1回のLチカでGPIOの基本を学んだ次は、いよいよ「物理的な動き」を作るステップです。
今回はモータードライバー「A4988」を使用し、ステッピングモーターを1軸分制御する方法を解説します。これができるようになれば、XYテーブル完成への道が一気に開けます!
使用する主な部品:



ステッピングモーターとは?
ステッピングモーターは
一定角度ずつ正確に回転するモーターです。
一般的なNEMA17の場合:
- 1ステップ = 1.8°
- 1回転 = 200ステップ
つまり、200回パルスを送れば1回転します。
ハードウェア結線図(A4988 + Raspberry Pi)

画像の一部は raspberrypi.zyx さんより引用させて頂きました。
| Raspberry Pi(BCM) | A4988 | 説明 |
|---|---|---|
| GPIO21 | STEP | ステップ信号 |
| GPIO20 | DIR | 回転方向 |
| GPIO16 | ENABLE | LOWで有効 |
| GPIO17 | MS1 | マイクロステップ設定 |
| GPIO27 | MS2 | マイクロステップ設定 |
| GPIO22 | MS3 | マイクロステップ設定 |
| GPIO5 | RESET | HIGHで有効 |
| GPIO6 | SLEEP | HIGHで有効 |
| GND | GND | 必ず共通にする |
🔹 モーター接続
- A4988の 1A / 1B / 2A / 2B に
NEMA17のコイルを接続
※テスターでコイルの組を確認すると確実です。
🔹 電源接続
| 接続 | 内容 |
|---|---|
| VMOT | 12V電源+ |
| GND(VMOT横) | 12V電源− |
| VDD | Raspberry Pi 3.3V |
| GND | Raspberry Pi GND |
GPIOピン設定(BCMモード)
X_STEP = 21
X_DIR = 20
X_EN = 16
X_MS1 = 17
X_MS2 = 27
X_MS3 = 22
X_RESET = 5
X_SLEEP = 6
A4988の基本動作
| ピン | 役割 |
|---|---|
| STEP | パルスで1ステップ進む |
| DIR | 回転方向 |
| EN | LOWで有効 |
| MS1〜3 | マイクロステップ設定 |
| RESET/SLEEP | HIGHで動作 |
今回はフルステップ動作です。
プログラムの前にVref調整(重要)
A4988を購入状態で使用すると焼損のリスクがあります。
※A4988を壊さないために、必ず先にこちらの設定を確認してください。
Pythonプログラム
stepper.py を作成します。
Radpberry Pi側でコンソールを開き、下記コマンドを実行
nano stepper.py
→stepper.pyという名前のファイルを作成
stepper.pyを新規作成され開かれたら、以下のコードを入力してください。
import RPi.GPIO as GPIO
import time
# --- PIN定義 ---
X_STEP = 21
X_DIR = 20
X_EN = 16
X_MS1 = 17
X_MS2 = 27
X_MS3 = 22
X_RESET = 5
X_SLEEP = 6
GPIO.setmode(GPIO.BCM)
pins = [X_STEP, X_DIR, X_EN, X_MS1, X_MS2, X_MS3, X_RESET, X_SLEEP]
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
# ドライバ有効化
GPIO.output(X_EN, GPIO.LOW)
GPIO.output(X_RESET, GPIO.HIGH)
GPIO.output(X_SLEEP, GPIO.HIGH)
# ステップ設定
GPIO.output(X_MS1, GPIO.LOW)
GPIO.output(X_MS2, GPIO.LOW)
GPIO.output(X_MS3, GPIO.LOW)
def move_motor(steps, direction, delay=0.01): # delayの値で速度調整 値が大きいと遅くなる
GPIO.output(X_DIR, direction)
for _ in range(steps):
GPIO.output(X_STEP, GPIO.HIGH)
time.sleep(delay)
GPIO.output(X_STEP, GPIO.LOW)
time.sleep(delay)
try:
print("正転")
move_motor(50, GPIO.LOW) # 50=移動量(ステップ数) GPIO.LOW=正転
time.sleep(1)
print("逆転")
move_motor(50, GPIO.HIGH) # 50=移動量(ステップ数) GPIO.HIGH=逆転
time.sleep(1)
finally:
GPIO.cleanup()
この記事で使用したコードはこちらからダウンロードできます。
led.py をダウンロード(ZIP)実行
Raspberry Piのターミナルで以下を入力しEnterを押す
python3 stepper.py
正転 → 停止 → 逆転
と動けば成功です。
なぜ200ステップで1回転?
NEMA17は1.8°/step。
1.8° × 200 = 360°
だから200パルスで1回転します。
改善案:初心者救済!トラブルシューティング・チェックリスト
もし動かない場合は、以下の3点を上から順番に確認してみてください。
- 1. モーターが「ガガガ」と震えるだけで回らない
- 原因: ステッピングモーターの「コイルの組」が間違っている可能性が高いです。
- 対策: テスターを使って、導通がある2本(1組)を確認してください。A4988の「1A/1B」に1組、「2A/2B」にもう1組を接続します。色が同じでもメーカーによって配列が違うことがあるので注意!
- 2. 全く反応しない(軸が手でスルスル回る)
- 原因: ドライバーが「無効(スリープ)」状態になっています。
- 対策: プログラムで
X_ENを LOW にしているか再確認してください。また、RESETとSLEEPピンが正しく HIGH(または物理的にジャンパで接続)されているかも重要です。
- 3. モーターやドライバーが異常に熱い/異音がする
- 原因: A4988の電流制限(Vref)が適切に調整されていません。
- 対策: そのまま放置するとチップが焼損します! すぐに電源を切り、こちらのVref調整記事を参考にボリュームを調整してください。
- 4. 動くけど途中で止まる(脱調)
- 原因: Pythonコード内の
delay(パルス間隔)が短すぎます。 - 対策: 最初は
delay=0.05くらいまで数値を大きくして、ゆっくり確実に回るか試してみましょう。
- 原因: Pythonコード内の
ここまでできればOK
✅ パルス制御
✅ 方向制御
✅ ドライバ制御
今回使用したモーター等はこちらです。
次回予告
次はいよいよ
✔ ベルトピッチ計算
✔ ステップ数変換式
✔ XYテーブル設計への布石
いよいよ「装置」になります。
XYテーブル製作シリーズはこちらから
- 【第0回】Raspberry PiのOSインストール完全ガイド|初心者向けにゼロから解説
- 【第1回】PythonでLEDを光らせる|GPIOの基本をやさしく解説
- 【第2回】ラズパイ+A4988でステッピングモーターを回す
- 【第3回】ステッピングモーターをmm単位で動かす|ベルト駆動の計算方法まで解説
- 【第1.5回】 A4988のVref調整手順(XYテーブル製作シリーズ)
- 【番外編】L6470が動かない?A4988と同じ感覚で使ってハマった話
- 【第4回】XYテーブル化の第一歩|X軸とY軸を2台動かす
- 【第5回】Pythonでステッピングモーターの加減速制御を実装する
- 【第6回】Pythonでステッピングモーターを2軸同時に動かす
- 【第7回】Raspberry PiでXYテーブル制御|リミットスイッチと原点復帰(Homing)の実装
- 【第8回】【Python × Raspberry Pi】XYテーブルをGUI操作する(Tkinter)
- 【第9回】Python×Raspberry PiでXYテーブルを制御するGUIを作る(原点復帰・位置表示・ソフトリミット実装)


コメント