ラズパイでステッピングモータの制御

 

こんなこと、やります。

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

ラズパイではじめてのステッピングモータ制御【TB6674PG】
ラズパイではじめてのステッピングモータ制御【TB6674PG】

つかうもの

この記事で「つかうもの」について説明します。

Raspberry Pi

お好きなラズパイでどうぞ。

ラズパイのセットアップはキーボードなしのラズパイをMacで初期設定、SSH環境構築をご参考になさってみてください。

ステッピングモータ

バイポーラ駆動のステッピングモータの選択肢はあまり多くなく、比較的安く買えるSM-42BYG011を使用しました。

3DプリンタやCNC工作機械ならセットがお得

バイポーラ駆動のステッピングモータは高価です。3DプリンタやCNC工作機械を作りたい方は、こちらのようなレール部品などがセットになったキットがオススメです。

モータドライバ

ステッピングモータ用のドライバとしてTB6674PGを使います。

その他の電子部品

ブレッドボードやジャンプワイヤをお持ちでない方は揃えておきましょう。

ステッピングモータ

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

ステッピングモータとは

ステッピングモータとは、時計の針のように細かな刻みで1ステップづつ動かすことができるモータです。

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

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

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

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

ユニポーラ型のステッピングモータを使いたい場合は、Arduinoでステッピングモータの制御(ユニポーラ編)をご参考になさってみてください。

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

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

SM-42BYG011の特性

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

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

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

モータドライバ

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

モータドライバの選定

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

TB6674PGの端子の役割

ラズパイとTB6674PGとの配線図
ラズパイとTB6674PGとの配線図

TB6674PGの端子の役割と意味は次のとおりです。

端子番号記号動作
1VS2A低電圧電源端子
2Vcc制御電源端子
3IN AA-ch正転/逆転信号入力
4GNDグランド
5GNDグランド
6IN BB-ch正転/逆転信号入力
7PSパワーセーブ信号入力
8VS2Bスタンバイ信号入力
9VS1B高電圧電源端子
10φBB出力
11Φ bar BB bar出力
12GNDグランド
13GNDグランド
14Φ bar AA bar出力
15φAA出力
16VS1A高電圧電源端子

真理値表

VS2Bの真理値表は次のとおりです。VS2A は、低電圧電源端子として5Vを接続しないと動作しないので注意が必要です。

VS2B 動作
L POWER OFF
H OPERATION

PSとINの入力信号により出力が制御されます。基本的に PS はLowにセットし、IN AIN B の入力信号でステッピングモータを制御します。

TB6674PGの真理値表
TB6674PGの真理値表

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

モータドライバのIN AIN Bの入力に、次の順序で信号を送ることでステッピングモータを1ステップずつ動かすことができます。

IN A IN B
HH
LH
LL
HL

入力信号と出力信号の関係は次のとおりです。

IN A IN BAA barBB bar
HHHLHL
LHLHHL
LLLHLH
HLHLLH

モータドライバの出力を観察してみた

実際に、モータドライバにの出力に4つのLEDをつないで、入力信号を上の表の通り順番に変化させ、点灯を確認してみました。映像のように、LEDが順番に点灯を繰り返されています。

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

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

オシロスコープでTB6674PGの出力を確認
オシロスコープでTB6674PGの出力を確認

準備

ラズパイでステッピングモータを制御するための準備を説明します。

ラズパイとモータドライバ、ステッピングモータの配線

ラズパイとモータドライバ、ステッピングモータをそれぞれ図のように配線します。

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

GNDはすべてラズパイと共通の状態にします。

モータドライバTB6674PGの5V電源はラズベリーパイの電源を利用しました。一方で、ステッピングモータの電源は別途に用意した9V電源で供給します。

モータドライバのIN A、IN B、PS (Power Save)は、ラズベリーパイのデジタルGPIOピンに接続します。

ステッピングモータの配線コードの色

ステッピングモータSM-42BYG011では、図のように赤緑、黄青のペアになっています。それぞれのペアを、モータドライバーのA-ch、B-chに接続します。

ステッピングモータのコードの色と役割
ステッピングモータのコードの色と役割

ラズパイでステッピングモータを制御

ラズパイでステッピングモータを制御していきましょう。

ソースコード

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

# -*- coding: utf-8 -*-
# Created by Toshihiko Arai.
# https://101010.fun/iot/step-motor.html

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

リレーの使い方はラズパイとリレーモジュールをご参考になさってみてください。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
人気のラズパイ
人気のラズパイ周辺機器
Raspberry Piのオススメ入門書
関連記事