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の端子の役割

Raspberry PiとTB6674PGとの配線図
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の真理値表
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で確認
モータドライバの出力を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プログラムは次の通り。

# -*- 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でもご覧いただけます。

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

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

リレーの使い方はリレーモジュールの使い方|Raspberry Pi・Arduino(ESP32)をご覧ください。

▶︎ 類似した記事を探す #Arduino #Raspberry Pi #プログラミング #電子工作
 

この記事が参考になりましたら
シェアをよろしくお願いします!

関連記事