【ラズパイ】Raspberry pi4とモータドライバ(TB6612FNG)で2輪駆動車を作る。
こんにちは。alohaです。
Raspberry pi4でモータを回せる様になると、作れる物の幅が広がって色々な物が作れる様になります。
前回は、トランジスタを使ったマブチモータの回転にトライしましたが、この方法だとモータを回すことはできても、正回転、逆回転の切替えはできませんでした。
creators-small-room.hatenablog.com
今回は、モータドライバICとしてTB6612FNGを使用して、モータ2個の正回転、逆回転を試します。
また、応用例として、モータ2個の回転をコントロールし、独立した2個の車輪を回して走行する2輪駆動車を作成します。
それでは、早速作ってみましょう。
<部品一覧 (Raspberry pi4以外に必要な部品)>
- モータドライバIC(TB6612FNG) 1 個
- 抵抗(4.7 [Ω]) 2 個
- TAMIYA 楽しい工作シリーズ NO.168 ダブルギヤボックス 1 個
- TAMIYA 楽しい工作シリーズ ナロータイヤセット 1 個
- TAMIYA 楽しい工作シリーズ NO.144 ボールキャスタ 1 個
- バッテリボックス (3.0 [V]用) 1 個
- ブレッドボード 1 個
- 配線用ワイヤ 数本
<回路図>
Qt-BSchで回路図を書くと下図の様になります。
① モータドライバIC(TB6612FNG)
モータドライバIC(TB6612FNG)は、電源電圧3.0 [V]で動作可能で、モータ2個を動かせる小型モータドライバICとしてお馴染みです。モータ1個につき4つの信号線(IN1, IN2, PWM, STBY)を使ってRaspberry pi4側から信号を出力すると、モータの正回転、逆回転、速度制御を行う事ができます。
モータドライバICが載ったプリント板とピンヘッダが分かれた状態で送られて来るので、半田付けしてブレッドボードで使える様にする必要があります。
データシートから、Raspberry pi4側から出力する信号パターンは以下の通りです。
② TAMIYA ダブルギヤボックスとタイヤセット
TAMIYAのダブルギヤボックスは、モータ2個とモータ回転を減速するギヤボックスがセットになった工作用のキットで、ギヤボックスの出力シャフトを左右独立して回す事ができるので、2輪駆動車を作るのに向いています。左右の出力シャフトにタイヤを取り付けて、左タイヤと右タイヤの回転をそれぞれコントロールすれば、2輪駆動車を前進、後進、右回転、左回転させる事ができます。
③ 電流制限抵抗
ダブルギヤボックスキットに付属のモータはFA-130で、データシートによると定格電流はIm=0.66 [A]、電源電圧はVcc=3.0 [V]なので、電流制限抵抗R1, R2は以下の通りになります。
今回は、手持ちの抵抗から4.7 [Ω]を採用します。
ブレッドボード上に配線すると、下の写真の様になります。
ダブルギヤボックスとタイヤの2輪だけだと車としてバランスが悪いので、3Dプリンタでベースプレートを作成し、ダブルギヤボックスとタイヤ、ボールキャスタを付ければ、ハードウェアとしては完成です。
<動作プログラム>
動作プログラムは、下記の通りです。
プログラムを実行すると、2輪車が『前進 → 右回転 → 左回転 → 右回転 → 後進』します。
#coding:utf-8 #GPIOライブラリをインポート import RPi.GPIO as GPIO #timeライブラリをインポート import time #ピン番号の割り当て方式を「コネクタのピン番号」に設定 GPIO.setmode(GPIO.BOARD) #使用するピン番号を代入 AIN1 = 8 AIN2 = 10 PWMA = 12 BIN1 = 22 BIN2 = 24 PWMB = 26 #各ピンを出力ピンに設定 GPIO.setup(AIN1, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(AIN2, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(PWMA, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(BIN1, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(BIN2, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(PWMB, GPIO.OUT, initial = GPIO.LOW) #PWMオブジェクトのインスタンスを作成 #出力ピン:12,26 周波数:100Hz p_a = GPIO.PWM(PWMA,100) p_b = GPIO.PWM(PWMB,100) #PWM信号を出力 p_a.start(0) p_b.start(0) #デューティを設定(0~100の範囲で指定) #速度は80%で走行する。 val = 80 #デューティ比を設定 p_a.ChangeDutyCycle(val) p_b.ChangeDutyCycle(val) #ブレーキする関数 def func_brake(): GPIO.output(AIN1, GPIO.HIGH) GPIO.output(AIN2, GPIO.HIGH) GPIO.output(BIN1, GPIO.HIGH) GPIO.output(BIN2, GPIO.HIGH) #前進する関数 def func_forward(): GPIO.output(AIN1, GPIO.LOW) GPIO.output(AIN2, GPIO.HIGH) GPIO.output(BIN1, GPIO.LOW) GPIO.output(BIN2, GPIO.HIGH) #後進する関数 def func_back(): GPIO.output(AIN1, GPIO.HIGH) GPIO.output(AIN2, GPIO.LOW) GPIO.output(BIN1, GPIO.HIGH) GPIO.output(BIN2, GPIO.LOW) #右回転する関数 def func_right(): GPIO.output(AIN1, GPIO.LOW) GPIO.output(AIN2, GPIO.HIGH) GPIO.output(BIN1, GPIO.HIGH) GPIO.output(BIN2, GPIO.LOW) #左回転する関数 def func_left(): GPIO.output(AIN1, GPIO.HIGH) GPIO.output(AIN2, GPIO.LOW) GPIO.output(BIN1, GPIO.LOW) GPIO.output(BIN2, GPIO.HIGH) #メインプログラム while True: #3秒前進する func_forward() time.sleep(3.0) #3秒ブレーキ func_brake() time.sleep(3.0) #1.5秒右回転する func_right() time.sleep(1.5) #3秒ブレーキ func_brake() time.sleep(3.0) #2.8秒左回転する func_left() time.sleep(2.8) #3秒ブレーキ func_brake() time.sleep(3.0) #1.5秒右回転する func_right() time.sleep(1.5) #3秒ブレーキ func_brake() time.sleep(3.0) #3秒後進する func_back() time.sleep(3.0) #3秒ブレーキ func_brake() time.sleep(3.0) break #PWM信号を停止 p_a.stop() p_b.stop() #GPIOを開放 GPIO.cleanup() #プログラム終了 print("End of program")
今回のプログラムでは、左右のモータのデューティ比を共通にしましたが、前進、後進の際に左右のモータの回転速度に少し差があり、2輪車がまっすぐに進まないという問題も見つかりました。テストとしてはOKだと思いますが、左右のモータのデューティ比を別々に設定したり、モータをステッピングモータに変更する等で改善できそうなので、試してみたいと思います。
<まとめ>
という訳で、Raspberry pi4とモータドライバ(TB6612FNG)で2輪駆動車を作ってみました。
モータドライバのテストとしてはOKですが、問題もいろいろ見つかったので、今後改善していきたいと思います。
まずは、2輪車を有線で動かしていると動ける範囲が制限されて大したことはできないので、この部分から改善していきます。
それでは、また。