サイトロゴ

Raspberry Piでステッピングモータの制御

著者画像
Toshihiko Arai

こんなこと、やります。 - Raspberry Piを使って、モータドライバTB6674PGの使い方を学ぶ - バイポーラ型ステッピングモータSM-42BYG011の使い方を学ぶ - Raspberry Piでステッピングモータを1ステップづつ動かしてみる

ステッピングモータ

ステッピングモータについて説明します。

ステッピングモータとは

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

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

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

  • ユニポーラは、1つの巻線に対し、一定方向の電流しか流さない
  • バイポーラは、1つの巻線に対し、双方向へ電流を流す

SM-42BYG011の特性

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

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

モータドライバ

モータドライバについて説明します。

モータドライバの選定

2相のバイポーラ駆動方式のステッピングモータに対応している、TB6674PGをモータドライバとして選びました。ステッピングモータを正逆転させらます。また、ステッピングモータへの供給電圧は22Vまで対応してます。

http://akizukidenshi.com/download/ds/toshiba/TB6674_ja.pdf

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

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

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

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

準備

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でステッピングモータを制御

Raspberry Piでステッピングモータを制御していきましょう。

ソースコード

ステッピングモータをドライバーICに接続して、動作確認をした。使用したPythonプログラムは次の通り。


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



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でもご覧いただけます。 https://www.youtube.com/watch?v=4B31SX4euEQ&ab_channel=ToshihikoArai

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

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

関連記事