【Raspberry Pi】ステッピングモータを制御する

著者画像
Toshihiko Arai

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

ステッピングモータ(SM-42BYG011)の内部のようす

ステッピングモータの種類

ステッピングモータの種類には、バイポーラとユニポーラがあります。バイポーラのほうがトルクを高くでき高性能です。その代わり、値段もユニポーラより高くなります。バイポーラ駆動のステッピングモータは、3DプリンタやCNC工作機械などに使われます。

SM-42BYG011の特性

こちらのグラフは、秋月電子通商のバイポーラステッピングモーターの特性図より参考させて頂きました。

バイポーラステッピングモータSM-42BYG011の特性図

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

モータドライバ

ここでは2相バイポーラ駆動方式対応のTB6674PGをモータドライバとして選びました。ステッピングモータへの供給電圧は22Vまでです。

Raspberry PiとTB6674PGとの配線図

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 AIN B の入力信号でステッピングモータを制御します。

TB6674PGの真理値表

モータドライバの入力と出力

モータドライバのIN AIN 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が順番に点灯を繰り返されてます。

モータドライバの出力をLEDで確認

さらに、モータドライバーの出力をオシロスコープで観察してみました。 オシロスコープでTB6674PGの出力を確認

Raspberry Piで動かす

ここからは Raspberry Pi でステッピングモータを動かしてみます。Raspberry Piとモータドライバ、ステッピングモータをそれぞれ図のように配線します。

ラズパイ、TB6674PG、ステッピングモータの配線図fritzing

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ステップずつ動かす場合はプログラムを改良して使ってください。

Raspberry Piでステッピングモータを制御しているようす

こちらの映像はYouTubeでもご覧いただけます。

動いてなくても電流が流れる

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

Amazonで探す