製品レビュー|電子機器2:モータードライバー (TB6643KQ)
1.概要
購入した製品の使い方および感想用記事です。
今回はモータードライバー:TB6643KQ(350円/個(税込))をレビューしました。
1-1.製品の仕様:TB6643KQ
出力トランジスタにMOS構造を採用したDCモータ駆動用フルブリッジドライバICです。低ON抵抗のMOSプロセス及びPWM駆動方式の採用により高熱効率駆動が可能です。
【仕様】
仕様は下記の通りです。
4パターンの運転(制御)が可能:制御信号入力端子が2つ(IN1, IN2)あり、DI(Digital Input:電圧の有無による接点ON/OFF)で制御を$${2^2=4}$$パターン動作可能
原理的には4つのトランジスタを使用して回路を切り替えている(出典:モータードライバ(TB6643KQ)を使ってモータを動かす)
可能な制御は下記の通り
IN1(High)/IN2(High):ショートブレーキ
IN1(Low)/IN2(High):正転/逆転
IN1(High)/IN2(Low):逆転/正転
IN1(Low)/IN2(Low):ストップ機能
複数の保護機構を設置(破損防止までは保証はしていない):
低下電圧検出回路(UVLO):電圧(8V)以下の場合は出力がOFF
過電圧検出回路(VSD):故障防止機能(VM=53V)
熱遮断回路(TSD):ジャンクション温度($${T_j}$$≧170℃で出力OFF
過電流検出回路(ISD):検出電流(4.5A~8A)が5.1μsを超えると出力OFF
PWM制御対応:サーボモーターも制御可能
【参考:MOS(Metal Oxide Semiconductor)構造とは】
MOSあるいは一般的に MIS(Metal Insulator Semiconductor)構造は、現在最も大量に使われている半導体デバイス構造である。特徴は低消費電力、かつ高速に動作することができる。
1-2.製品原理
細かい部分は専門外のため理解できませんが、概要は下記の通り。
4つのトランジスタで4パターンの制御を可能
入力電源(Raspberry Pi等)と電源電圧VM(電池など)は別ライン
いわゆるリレーと同じであり小さな電流(入力電源)と大きな電流(モーター)は別回路で動作
電源VMがOFFでIN1, IN2に電圧がかかってもICは動作しないようになっている。
2.部材の購入
2-1.購入品
今回は秋月電子よりで下記購入しました。
モータードライバー TB6643KQ:Raspberry PiのGPIOで直接制御するのではなく、制御装置としてTB6643KQからDCモーターを制御
モーターは大量に電流を消費するため直接DCモーターをマイコンなどに接続するのは非推奨(出典:DCモータードライバの使い方)
DCモーター FA-130RA-2270L:直流電源(DC)で動くモーター
型式「DCモーター FA-130RA-2270」はケーブル無しだが安く購入可能
ケーブルには「E506915 1007 24AWG 80℃ 300V VW-」と記載あり
10V以上の直流(DC)電源:TB6643KQ用の電源
DCモーターは1.5Vで動作するが、モータードライバーTB6643KQ経由で動かす場合は最低10Vは必要(TB6643KQの動作範囲の電源電圧$${VM_{opr}=10~45V}$$)
直流(DC)電源の作り方は下記の通り:初学者は「単3×8 の電池ボックス」が一番楽だと思います。
2-2.準備必須品
その他必需品は下記の通りです。
Raspberry Pi4
ブレッドボード
ジャンピングワイヤー
3.環境構築
Raspberry Pi環境を準備します。詳細は下記記事の通りです。
Raspberry PiのGPIOを制御するためのライブラリが無い場合はインストールしておきます。
[Terminal]
pip install rpi.gpio
4.使用前の準備
4-1.部品の組付け
部品を下記要領で組付けました。10V以上の直流(DC)電源はUSB+昇圧モジュールを利用しました。ポイントとして(ちゃんと理解できていないのですが)、GNDは電源側とRaspberry Pi側の2か所に接続しています。
モータードライバーのTB6643KQの端子番号はロゴがある面の窪みがある部分が1(IN1)となります。
【参考:Raspberry Pi4のGPIO配置】
Raspberry Pi4のGPIO配置は下図の通りです。
【参考:ブレッドボードの使い方】
はんだ付け不要で部品やリード線を差すだけで回路が組み立てられます。特定のラインが電気的に繋がるため、ジャンパー線接続の手間が省けます。
4-2.詳細な仕様確認
各種仕様を確認していきます。まとめは下記の通りです。
必要な電源電圧:10~45V(出典:アプリケーションノート)
PWM動作も対応可能
【必要電圧:10~45V】
下図の通りDCモーターは電池1本(1.2~1.5V)でも動作します。ただし、回路図より電流はモータードライバーを経由するため電圧の仕様はモータードライバー側に設定する必要があります。仕様書の動作範囲を確認すると「電源電圧$${VM_{opr}=10~45V}$$」であり、最低でも10Vは必要となります。
【PWM周波数】
IN1, IN2 端子の片方をスイッチング入力して PWM 動作することも可能
【モータードライバーの消費電力】
$$
P = V_M \times I_{CC} + I_O^2 \times R_{ON} (U + L)
$$
$$
P_{標準} = 24V\times \frac{2.5 mA}{1000}+(0.5)^2\times 0.55 \Omega=0.1975W \\
P_{Max} = 24V\times \frac{8.0 mA}{1000}+(0.5)^2\times 0.9 \Omega=0.417W
$$
$$
V_M:モーター電圧[V]\\
I_{CC}:電源電流[mA]\\
I_O :出力電流[A]\\
R_{ON} (U + L):出力ON抵抗[Ω]
$$
なお消費電力Pに応じて周囲温度も高くなるため注意が必要です。
【DCモーターの特性】
電圧範囲は1.5~3.0Vであり、モーター特性図は下記の通り。
電流$${I [A]}$$:トルクが増えるほど電流が必要
回転速度$${N [rpm]}$$:トルクに反比例して回転数が下がる
トルク=0(負荷がかかっていない)時が最大回転速度
出力(電力)$${P [W]}$$:出力最大値は上に凸のカーブ
負荷効率$${\eta [%]}$$:効率も上に凸のカーブ
5.Pythonスクリプトの作成
5-1.任意:デバイス接続の確認
TB6643KQは通信で接続されていないため、接続確認の方法は物理的な目視確認となります。
5-2.コード作成(実装)
TB6643.pyを作成しました。設計思想は下記の通りです。
モータードライバの初期設定は動作確認+安全考慮でストップに設定
GPIOピンを割り当て時にGPIO21(IN2)の出力がHighだった
入力(IN1, IN2)の入力(電圧の有無)の状態を確認できるように可視化関数を作成
全モード確認するループを作成
[TB6643.py]
import RPi.GPIO as GPIO
import time
#TB6643KQ(モータードライバ)によるDCモータ制御
##GPIO20をIN1, GPIO21をIN2に接続
#GPIOの初期設定
GPIO.setmode(GPIO.BCM) #GPIOのピン番号をGPIO番号で指定
GPIO.setup(20, GPIO.OUT) #GPIO20を出力に設定
GPIO.setup(21, GPIO.OUT) #GPIO21を出力に設定
# 状態表示用の関数
def print_mode(mode):
modes_operation = {
(0, 0): 'ストップ(TSD, ISD解除)',
(0, 1): '正転(正転)',
(1, 0): '逆転(逆転)',
(1, 1): 'ブレーキ(ブレーキ)'
}
print(f'モード:{modes_operation[mode]}, 入力(IN1, IN2):({mode[0]}, {mode[1]}->{"H" if mode[0] else "L"}, {"H" if mode[1] else "L"})')
#初期条件を設定
GPIO.output(20, GPIO.LOW) #GPIO20をLOWに設定
GPIO.output(21, GPIO.LOW) #GPIO21をLOWに設定
print('初期条件')
print_mode((GPIO.input(20), GPIO.input(21)))
time.sleep(1) #1秒待つ
print(f'{"#"*20}\n')
# モード切替と状態出力
try:
while True:
# 正転モード
GPIO.output(20, GPIO.HIGH)
GPIO.output(21, GPIO.LOW)
print_mode((GPIO.input(20), GPIO.input(21)))
time.sleep(3)
# ストップモード
GPIO.output(20, GPIO.LOW)
GPIO.output(21, GPIO.LOW)
print_mode((GPIO.input(20), GPIO.input(21)))
time.sleep(1)
# 逆転モード
GPIO.output(20, GPIO.LOW)
GPIO.output(21, GPIO.HIGH)
print_mode((GPIO.input(20), GPIO.input(21)))
time.sleep(3)
# ブレーキモード
GPIO.output(20, GPIO.HIGH)
GPIO.output(21, GPIO.HIGH)
print_mode((GPIO.input(20), GPIO.input(21)))
time.sleep(2)
except KeyboardInterrupt:
pass
GPIO.cleanup() #GPIOの終了処理
5-3.実行
下記の通り「逆転->ストップ->正転->ブレーキ」を繰り返す動作を確認できました。
[Terminal]
Python3 TB6643
[OUT]
初期条件
モード:ストップ(TSD, ISD解除), 入力(IN1, IN2):(0, 0->L, L)
####################
モード:逆転(逆転), 入力(IN1, IN2):(1, 0->H, L)
モード:ストップ(TSD, ISD解除), 入力(IN1, IN2):(0, 0->L, L)
モード:正転(正転), 入力(IN1, IN2):(0, 1->L, H)
モード:ブレーキ(ブレーキ), 入力(IN1, IN2):(1, 1->H, H)
モード:逆転(逆転), 入力(IN1, IN2):(1, 0->H, L)
モード:ストップ(TSD, ISD解除), 入力(IN1, IN2):(0, 0->L, L)
モード:正転(正転), 入力(IN1, IN2):(0, 1->L, H)
モード:ブレーキ(ブレーキ), 入力(IN1, IN2):(1, 1->H, H)
6.所感
簡単な所感は下記の通り
DCモーターは電流の流す向きを変えることで回転方向を変えることができる。
Raspberry Piでは、プラントでいうDO(Digital Output)を制御しており、電圧0 or 3.3Vで出力0, 1を出している。(有電圧接点ってことかな?)
Raspberry Pi側からも制御信号を出しているからGNDに繋いで電流の流れを作らないといけないということだと思う・・・
ミニ四駆で触って以来なのでめっちゃ懐かしい。案外DCモーターの音がうるさいので防音性能がない部屋だとできないかな。
PWM制御で出力電圧変化による回転数制御もできそうですが、これは追って
参考資料
別添1:Rasberry Pi関係
別添2:Python関係
別添3:通信関係
別添4:電子機器
あとがき
子供のころにミニ四駆でモーターのコイルの巻き数を変えてウェイ!ってやってた頃が懐かしい。