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

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

こんなこと、やります。

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

つかうもの

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

Raspberry Pi

お好きなRaspberry Piでどうぞ。

Raspberry Piのセットアップは Raspberry Pi zero WHをモニター・キーボードなしでSSH接続するまで をご覧ください。

ステッピングモータ

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

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

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

▼ CNCシールドを使ったステッピングモータの動かし方は、こちらの記事をご覧ください。

▼ ステッピングモータを使って、XYペンプロッターをつくってみました。

モータドライバ

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

その他の電子部品

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

ステッピングモータ

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

ステッピングモータとは

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

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

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

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

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

SM-42BYG011の特性

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

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

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

モータドライバ

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

モータドライバの選定

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

TB6674PGデータシート - 秋月電子通商

TB6674PGの端子の役割

Raspberry PiとTB6674PGとの配線図
Raspberry Piと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動作
LPOWER OFF
HOPERATION

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

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

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

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

IN AIN B
HH
LH
LL
HL

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

IN AIN BAA barBB bar
HHHLHL
LHLHHL
LLLHLH
HLHLLH

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

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

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

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

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

準備

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

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

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

ラズパイ、TB6674PG、ステッピングモータの配線図fritzing
ラズパイ、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でステッピングモータを制御

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

ソースコード

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

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

Raspberry Piでステッピングモータを制御しているようす
Raspberry Piでステッピングモータを制御しているようす
こちらの映像はYouTubeでもご覧いただけます。 はじめてのステッピングモータ制御【Raspberry Pi 】 - YouTube

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

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

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

この記事で紹介した商品

関連記事