ラズパイピコでブラシ付きDCモーターを制御する(前編)

ラズパイピコ

 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点接続にしています。単に接続しているだけでは駄目で、配線の長さや、どこから分岐しているかなど、ちゃんと動かすためには気にすべき点が多いようです。正直、まだ不安定なので改善が必要。

三端子レギュレータには0.1μFと47μF、残りは全部0.1μFです。参考にした書籍ではモーターの端子間に0.1μFを挟むことでノイズを減らすと書いてありましたが、私がやってみると動きませんでした。

外観写真

電池ボックスからのリード線は、モーター2個用4本(+&-)、ラズパイピコ用2本(+&-)を半田つけしました(正しいかわからないけど)。
ギヤーボックスと電池。当然ながら電源とモーターを直接繋げば、ちゃんと動作します。
現時点の外観。子供からはかっこ悪いと不評。

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)


コメント

タイトルとURLをコピーしました