Raspberry Pi Picoから、TB67H450というモータードライバを制御して、乾電池でブラシ付きDCモーターを動かそうとしています。タミヤのギヤーボックス、トラック&ホイールセットと組み合わせて、プログラマブルな玩具を作りたい。
モーターを動かすのに(電子回路に比べて)大電流を流すため、電圧降下やらノイズやらでだいぶ苦労しています。とりあえず動くようにはなったけど、まだ挙動が怪しくて要改善(プログラムが終了しても、勝手に最初から動き出したりする・・・)。
とりあえず、現時点の回路やプログラムを記載します。
なお、挙動が怪しいという課題は後編にて解決しました。
使用する電子部品
モータードライバにはTB67H450を使いました。コイツの使い方をネットで見てみると、VREFにPWM信号を入れるのだとか、そうじゃなくて一定電圧を入れてIN1, IN2にPWMを入れるのだとか、いろいろ言われているようです。書籍を見ると、「やさしくはじめる ラズベリー・パイ(マイナビ出版)」ではVREFにPWMを入れています。また、OUT1、OUT2をブラシ付きDCモーターに接続するのですが、上記の本ではノイズ対策としてモーター端子間に0.1μFのセラミックコンデンサを入れるとあります。ですが、私がそのようにすると、なぜかTB67H450からOUT1, OUT2に電圧が出力されなくなりました。
いろいろ試行錯誤して、後述の回路図に記載の各所に0.1μFのコンデンサを挟んで、なんとか動くようになりました。
電子部品 | 個数 | 備考 |
![]() | 1個 | Raspberry Pi Pico |
![]() | 2個 | TB67H450 秋月で売っているモータードライバモジュールです。TB67H450FNGに基板とピンヘッダが付属しています。 |
![]() | 8個 | 0.1μFセラミックコンデンサ まだ動作が怪しいので、入れる場所や個数、容量は検討が必要と思います。 |
![]() | 1個 | 低損失三端子レギュレーターTA4805S 乾電池からラズパイピコの電圧を取るのに使いました。 |
![]() | 1個 | 電池ボックス(単3電池×4個、フタ・スイッチ付き) リード線がついていますが、このリード線からモーター2個、ラズパイピコの電力を取ろうとすると、モーターが動いたり止まったりするタイミングで電圧が変動するようで、ピコの挙動が怪しくなりました。もともとついているリード線を取って、1点アースになるようにリード線を複数つけ直しました。 |
![]() | 1個 | タミヤ・楽しい工作シリーズ・ツインモーターギヤーボックス 子供と一緒に組み立てました。 |
![]() | 1個 | タミヤ・楽しい工作シリーズ・トラック&ホイールセット 子供と一緒に組み立てました。 |
![]() | 2個 | ユニバーサルプレートセット ピコやギヤーボックスを乗せるのに使いました。 |
配線図
ごちゃごちゃしててすみません。ブラシ付きDCモーターの動作に、ラズパイピコがかなり影響を受けているので、電池ボックスからの配線を1点接続にしています。単に接続しているだけでは駄目で、配線の長さや、どこから分岐しているかなど、ちゃんと動かすためには気にすべき点が多いようです。正直、まだ不安定なので改善が必要。

外観写真



MicroPythonのコード
コードは次の通りです。息子にプログラミングの勉強をさせようとしています。”#プログラム開始”以下の箇所を子供に書かせたのだけど、”print(“終了”)”の行に行かずに勝手に再始動したりする。多分、モーターの挙動で電源やグランドが安定していないためと思っています。カッコ悪いのでなんとか直したい。。。
from machine import Pin, PWM
import time
print("開始")
R_VREF = PWM(Pin(18))
R_VREF.freq(50)
R_VREF.duty_u16(int(65535*100/100))
R_IN1 = Pin(17, Pin.OUT)
R_IN2 = Pin(16, Pin.OUT)
R_IN1.low()
R_IN2.low()
L_VREF = PWM(Pin(13))
L_VREF.freq(50)
L_VREF.duty_u16(int(65535*100/100))
L_IN1 = Pin(14, Pin.OUT)
L_IN2 = Pin(15, Pin.OUT)
L_IN1.low()
L_IN2.low()
led = Pin(25, Pin.OUT)
led.low()
for num in range(5):
led.high()
time.sleep(0.3)
led.low()
time.sleep(0.3)
def turnLeft(sec):
print("左回り",sec,"秒")
L_IN1.high()
time.sleep(sec)
L_IN1.low()
led.high()
time.sleep(0.2)
led.low()
def turnRight(sec):
print("右回り",sec,"秒")
R_IN2.high()
time.sleep(sec)
R_IN2.low()
led.high()
time.sleep(0.2)
led.low()
def goStraight(sec):
print("まっすぐ進む",sec,"秒")
R_IN2.high()
L_IN1.high()
time.sleep(sec)
R_IN2.low()
L_IN1.low()
led.high()
time.sleep(0.2)
led.low()
#プログラム開始
turnRight(0.5)
goStraight(10)
turnLeft(15)
goStraight(5)
print("終了")
L_VREF.deinit()
time.sleep(1)
R_VREF.deinit()
time.sleep(1)
for num in range(10):
led.high()
time.sleep(0.1)
led.low()
time.sleep(0.1)
コメント