ラズパイでステッピングモータの制御
この記事では、ラズパイでステッピングモータを制御するやり方を解説していく。ステッピングモータはバイポーラ駆動のSM-42BYG011を使用した。また、ステッピングモータ用のドライバとしてTB6674PGを使った。制御信号の流れが少しややこしいが、初心者でも分かりやすいようにゆっくり手順を追って説明してく。
ステッピングモータとモータドライバ
ステッピングモータ
ステッピングモータの種類には、バイポーラ と ユニポーラ が存在する。その違いは次の通り。
- ユニポーラは、1つの巻線に対し、一定方向の電流しか流さない
- バイポーラは、1つの巻線に対し、双方向へ電流を流す
ユニポーラよりバイポーラの方が低回転時のトルクが高くなる。しかし回転速度を上げていくとユニポーラの方がバイポーラよりもトルクを高く維持できるのが特徴。これは、バイポーラでは電流を双方向に流すため、周波数が高くなるにつれコイルのインダクタンスが大きくなってしまうのが原因のよう。
バイポーラステッピングモータSM-42BYG011の特性図より
今回の用途では高速回転の必要はないので、バイポーラのステッピングモータを選んだ。バイポーラを選ぶと選択肢はある程度しぼられ、比較的安く買えるSM-42BYG011を使用した。もちろん他のバイポーラ型のステッピングモータでも、本記事と同様のやり方で動くはず。
ホットセール!高トルク 26Ncm(36.8oz.in) 保持トルク NEMA 17双極性4.19*4.19*3.4cm 4線 1.8°ステップ角度(20ステップ/rev) 定格電流0.4Aと抵抗30オム
Amazonモータドライバ
ステッピングモータ用のドライバーICは、TB6674PGを選んだ。2相のバイポーラ駆動方式のステッピングモータを正逆転させられるドライバーだ。モータの電源は22Vまで対応しているので使い勝手が良い。
TB6674は出力トランジスタにMOS構造を採用したステッピングモータ用ドライバICです。バイポーラ駆動方式で2相ステッピングモータを正逆転することができます。パワーセーブ機能、スタンバイ機能があります。
Amazonラズパイとモータドライバとの配線
配線
ラズパイとモータドライバ TB6674PG の配線は次のように行った。
ラズパイ、TB6674PG、ステッピングモータの配線図fritzing
GNDはすべてラズパイと共通につないだ。また、TB6674PG の5V電源はラズベリーパイの電源を利用し、モータを動かす電源は別途に用意した9V電池で供給した。IN A、IN B、PS (Power Save)はラズベリーパイの適当なGPIOピンに接続すれば良い。
ステッピングモータ(SM-42BYG011)の配線は図のように、赤緑、黄青のペアになっているので、それぞれをドライバーICのA-ch、B-chに接続する。
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 の入力信号でステッピングモータを制御していく。
TB6674PGの詳細はこちら
TB6674は出力トランジスタにMOS構造を採用したステッピングモータ用ドライバICです。バイポーラ駆動方式で2相ステッピングモータを正逆転することができます。パワーセーブ機能、スタンバイ機能があります。
Amazonモータドライバの入力信号と出力の関係
ステッピングモータを制御するには、モータドライバTB6674PGのIN AとIN Bの入力に次の順序で信号を送れば良い。
IN A | IN B |
---|---|
H | H |
L | H |
L | L |
H | L |
また、モータドライバの入力信号と出力の関係は次のとおり。表の上下方向のどちらかの順序で、ステッピングモータが1ステップづつ動かされる事になる。
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の点灯を確認してみた。このように2つづつ順番に点灯を繰り返す。
モータドライバーの出力をオシロスコープで観察してみると、キレイな矩形波となっている。
ラズパイでステッピングモータを動かしてみよう
ステッピングモータをドライバー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単位になっているので、精度の高い角度で動かしたい場合は改良が必要だ。
最後に一点、注意しておきたい。TB6674PGでは、プログラムを走らせていないときでも常にステッピングモータに電流が流れてしまう。よって、ステッピングモータが発熱してしまいバッテリーの消耗も早くなる。長時間動かさない場合は、電子スイッチなどでモータドライバーの電源を制御する必要があるかもしれない。
DCモータの制御はこちら
DCモータで倒立振子を作ってみたので参考に
この記事で使った関連製品はこちら
ホットセール!高トルク 26Ncm(36.8oz.in) 保持トルク NEMA 17双極性4.19*4.19*3.4cm 4線 1.8°ステップ角度(20ステップ/rev) 定格電流0.4Aと抵抗30オム
AmazonTB6674は出力トランジスタにMOS構造を採用したステッピングモータ用ドライバICです。バイポーラ駆動方式で2相ステッピングモータを正逆転することができます。パワーセーブ機能、スタンバイ機能があります。
AmazonRaspberry Piの参考書
本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。
Amazon最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓