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ステップずつ動き、また回転方向も変えることができます。
ステッピングモータの種類
ステッピングモータの種類には、バイポーラとユニポーラがありますが、バイポーラのほうがトルクを高くでき高性能です。その代わり、値段もユニポーラより高くなります。バイポーラ駆動のステッピングモータは、3DプリンタやCNC工作機械などに使われます。 ユニポーラ型のステッピングモータを使いたい場合は、 Arduinoでステッピングモータの制御|ユニポーラ型「28BYJ-48」と「ULN2003」ドライバ をご覧ください。
- ユニポーラは、1つの巻線に対し、一定方向の電流しか流さない
- バイポーラは、1つの巻線に対し、双方向へ電流を流す
SM-42BYG011の特性
こちらのグラフは、 秋月電子通商のバイポーラステッピングモーターの特性図 より参考させて頂きました。
実は、バイポーラ駆動型のステッピングモータは、回転速度が高いとトルクが下がっていきます。バイポーラでは電流を双方向に流すため、周波数が高くなるにつれコイルのインダクタンスが大きくなってしまうのが原因のようです。
モータドライバ
モータドライバについて説明します。
モータドライバの選定
2相のバイポーラ駆動方式のステッピングモータに対応している、TB6674PGをモータドライバとして選びました。ステッピングモータを正逆転させらます。また、ステッピングモータへの供給電圧は22Vまで対応してます。
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 A と IN B の入力信号でステッピングモータを制御します。
モータドライバの入力と出力
モータドライバのIN AとIN 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に接続します。
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ステップずつ動かす場合はプログラムを改良して使ってください。
こちらの映像はYouTubeでもご覧いただけます。 はじめてのステッピングモータ制御【Raspberry Pi 】 - YouTube
動いてなくても電流が流れる
モータドライバTB6674PGでは、プログラムを走らせていないときでも常にステッピングモータに電流が流れます。そのため、ステッピングモータが発熱してしまいバッテリーの消耗もはやくなります。ステッピングモータを長時間動かさない場合は、リレーなどを使ってモータドライバーの電源をオフにするとよいかもです。 リレーの使い方は リレーモジュールの使い方|Raspberry Pi・Arduino(ESP32) をご覧ください。