【Raspberry Pi】ステッピングモータを制御する
ステッピングモータとは、時計の針のように細かな刻みで1ステップづつ動かすことができるモータです。モータ内部にはたくさんのコイルと回転軸部のギアの形をした磁石で構成されます。コイルへ電流を交互に流すことで、1ステップずつ動き、回転方向を変えることができます。

ステッピングモータの種類
ステッピングモータの種類には、バイポーラとユニポーラがあります。バイポーラのほうがトルクを高くでき高性能です。その代わり、値段もユニポーラより高くなります。バイポーラ駆動のステッピングモータは、3DプリンタやCNC工作機械などに使われます。
- ユニポーラは、1つの巻線に対し、一定方向の電流しか流さない
- バイポーラは、1つの巻線に対し、双方向へ電流を流す
SM-42BYG011の特性
こちらのグラフは、秋月電子通商のバイポーラステッピングモーターの特性図より参考させて頂きました。

実は、バイポーラ駆動型のステッピングモータは、回転速度が高いとトルクが下がっていきます。バイポーラでは電流を双方向に流すため、周波数が高くなるにつれコイルのインダクタンスが大きくなってしまうのが原因のようです。
モータドライバ
ここでは2相バイポーラ駆動方式対応のTB6674PG
をモータドライバとして選びました。ステッピングモータへの供給電圧は22Vまでです。

TB6674PG
の端子の役割と意味は次のとおり。
端子番号 | 記号 | 動作 |
---|---|---|
1 | VS2A | 低電圧電源端子 |
2 | Vcc | 制御電源端子 |
3 | IN A | A-ch正転/逆転信号入力 |
4 | GND | グランド |
5 | GND | グランド |
6 | IN B | B-ch正転/逆転信号入力 |
7 | PS | パワーセーブ信号入力 |
8 | VS2B | スタンバイ信号入力 |
9 | VS1B | 高電圧電源端子 |
10 | φB | B出力 |
11 | Φ bar B | B bar出力 |
12 | GND | グランド |
13 | GND | グランド |
14 | Φ bar A | A bar出力 |
15 | φA | A出力 |
16 | VS1A | 高電圧電源端子 |
真理値表
VS2Bの真理値表は次のとおりです。VS2A は、低電圧電源端子として5Vを接続しないと動作しないので注意が必要です。
VS2B | 動作 |
---|---|
L | POWER OFF |
H | OPERATION |
PSとINの入力信号により出力が制御されます。基本的に PS
はLowにセットし、IN A
と IN B
の入力信号でステッピングモータを制御します。

モータドライバの入力と出力
モータドライバのIN A
とIN B
の入力に、次の順序で信号を送ることでステッピングモータを1ステップずつ動かすことができます。
IN A | IN B |
---|---|
H | H |
L | H |
L | L |
H | L |
入力信号と出力信号の関係は次のとおりです。
IN A | IN B | A | A bar | B | B bar |
---|---|---|---|---|---|
H | H | H | L | H | L |
L | H | L | H | H | L |
L | L | L | H | L | H |
H | L | H | L | L | H |
モータドライバの出力を観察してみた
実際に、モータドライバにの出力に4つのLEDをつないで、入力信号を上の表の通り順番に変化させ、点灯を確認してみました。映像のように、LEDが順番に点灯を繰り返されてます。

さらに、モータドライバーの出力をオシロスコープで観察してみました。
Raspberry Piで動かす
ここからは Raspberry Pi でステッピングモータを動かしてみます。Raspberry Piとモータドライバ、ステッピングモータをそれぞれ図のように配線します。

GNDはすべてRaspberry Piと共通の状態にします。
モータドライバTB6674PG
の5V電源はラズベリーパイの電源を利用しました。一方で、ステッピングモータの電源は別途に用意した9V電源で供給します。
モータドライバのIN A、IN B、PS (Power
Save)は、ラズベリーパイのデジタルGPIOピンに接続します。
ステッピングモータの配線コードの色
ステッピングモータSM-42BYG011
では、図のように赤緑、黄青のペアになってます。それぞれのペアを、モータドライバーのA-ch、B-chに接続します。

ステッピングモータの配線色は規格統一されていません。SM-42BYG011
以外のステッピングモータを使う場合は、データシートをよく確認してから配線してください。
ソースコード
Raspberry Piでステッピングモータを制御していきましょう。
ステッピングモータをドライバーICに接続して、動作確認をした。使用したPythonプログラムは次の通り。
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep
PS_PIN = 19 # -> 7
IN_A_PIN = 20 # -> 3
IN_B_PIN = 21 # -> 6
STEP_ANGLE = 1.8
# Clockwise Rotation
# speed > 0.003
def rotateCw(speed, degree):
d = int(degree / STEP_ANGLE / 4)
for i in range(d):
GPIO.output(IN_A_PIN, True)
GPIO.output(IN_B_PIN, True)
sleep(speed)
GPIO.output(IN_A_PIN, False)
GPIO.output(IN_B_PIN, True)
sleep(speed)
GPIO.output(IN_A_PIN, False)
GPIO.output(IN_B_PIN, False)
sleep(speed)
GPIO.output(IN_A_PIN, True)
GPIO.output(IN_B_PIN, False)
sleep(speed)
def rotateCcw(speed, degree): # Counter Clockwise Rotation
d = int(degree / STEP_ANGLE / 4)
for i in range(d):
GPIO.output(IN_A_PIN, True)
GPIO.output(IN_B_PIN, True)
sleep(speed)
GPIO.output(IN_A_PIN, True)
GPIO.output(IN_B_PIN, False)
sleep(speed)
GPIO.output(IN_A_PIN, False)
GPIO.output(IN_B_PIN, False)
sleep(speed)
GPIO.output(IN_A_PIN, False)
GPIO.output(IN_B_PIN, True)
sleep(speed)
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN_A_PIN, GPIO.OUT)
GPIO.setup(IN_B_PIN, GPIO.OUT)
GPIO.setup(PS_PIN, GPIO.OUT)
# Vs2d
# L -> POWER OFF
# H -> OPERATION
GPIO.output(PS_PIN, False)
GPIO.output(IN_A_PIN, False)
GPIO.output(IN_B_PIN, False)
sleep(0.5)
def main():
while True:
rotateCw(0.1, 90)
sleep(0.5)
rotateCcw(0.003, 90)
sleep(0.5)
rotateCw(0.01, 180)
sleep(0.5)
rotateCcw(0.003, 180)
sleep(0.5)
rotateCw(0.003, 720)
sleep(0.5)
rotateCcw(0.003, 720)
sleep(0.5)
if __name__ == '__main__':
try:
setup()
main()
# Stop on Ctrl+C and clean up
except KeyboardInterrupt:
GPIO.cleanup()
GPIO.cleanup()
ソースコードの解説
ステッピングモータSM-42BYG011
では、1ステップで移動される角度が1.8度です。ですから、動かしたい角度を1.8で割り、その回数分だけステップさせます。ただし、上記のプログラムでは4ステップが1単位になってます。1ステップずつ動かす場合はプログラムを改良して使ってください。

こちらの映像はYouTubeでもご覧いただけます。
動いてなくても電流が流れる
モータドライバTB6674PG
では、プログラムを走らせていないときでも常にステッピングモータに電流が流れます。そのため、ステッピングモータが発熱してしまいバッテリーの消耗もはやくなります。ステッピングモータを長時間動かさない場合は、リレーなどを使ってモータドライバーの電源をオフにするとよいかもです。