ラズパイ&ブレッドボードで遊ぶ(2)~12VのPWM制御
ブレッドボードに配置したタクトスイッチやロータリーディップスイッチを使って、Raspberry Pi PicoからLEDを制御した話を書きました。
今回は、Raspberry Pi が直接扱えない12VのPWM制御をやってみたいと思います。
目的は、あれです。やっぱり。
L298N モータードライブコントローラーボードモジュール
前回、Raspberry Pi Pico の GPIOからの出力でLEDを点灯/点滅/調光制御しましたが、直接12Vのモーターを駆動させることはできません。
3.3Vで動作するRaspberry Pi Pico 等で12VのPWM制御を行うには、モータードライバーと呼ばれる駆動・制御するためのデバイスが必要となります。
モータードライバーICだけを購入して導入しても良かったんですが、コンデンサーなどがパッケージされたモジュールが便利そうなので、こちらを利用します。
ヒートシンクに守られたL298というフルブリッジドライバを据えた2系統のモーターを制御できるこのモジュール。1個当たり500円弱で購入できました。
このモジュールに接続するのは、これら(実施した一例で、端子を特定するものではありません)。
機能 | ボード上のラベル | 接続先 |
---|---|---|
12V入力 | +12V | 12V電源(ACアダプタ)の+ |
GND | GND | 12V電源(ACアダプタ)のGND |
PWM制御入力 | ENA | Raspberry Pi Pico GP18 |
モーター1側制御1入力 | IN1 | Raspberry Pi Pico GP21 |
モーター1側制御2入力 | IN2 | Raspberry Pi Pico GP20 |
モーター1出力1 | OUT1 | (モーター) |
モーター1出力2 | OUT2 | (モーター) |
ENAはジャンパが付いていますが、PWMとして使用する場合はジャンパを外します。
IN1とIN2の用途ですが、この2つで出力の方向を決めるそうです。
IN1 | IN2 | モーター制御 |
---|---|---|
H | H | ブレーキ |
H | L | 正転 |
L | H | 逆転 |
L | L | ブレーキ |
Raspberry Pi Pico 観点での接続はこうなります。既出のスイッチ類は省略しています。
PIN番号 | 機能 | 備考 |
---|---|---|
24 | GP18 | モータードライブコントローラーモジュールのENA端子 |
26 | GP20 | モータードライブコントローラーモジュールのIN2端子 |
27 | GP21 | モータードライブコントローラーモジュールのIN1端子 |
実は、写真を見て上の表を記載したのですが、モジュールのIN1は、ラズパイのGP20に接続しているつもりでした。実際にはGP21だったんですね。
なので、OUT1/OUT2の出力が「実際には+/-逆」でした。そういうもの、と思ってしまったんですね。。
ちなみに、写真に写っているモジュールから下側に伸びる3線、左から12V(入力)、GND、5V(出力)です。Raspberry Pi Picoは、USB経由でPCから給電されているんですが、USBを外した状態でも、この5VをラズパイのVSYS端子に接続することで稼働させることができます。
import machine
import time
# DIP SW制御用
dipsw1_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw2_pin = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw4_pin = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)
dipsw8_pin = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
# PWN制御用
pwm_pin = machine.Pin(18, machine.Pin.OUT)
pwm = machine.PWM(pwm_pin) # PWMオブジェクトを作成
# 方向制御用
dir1_pin = machine.Pin(20, machine.Pin.OUT)
dir2_pin = machine.Pin(21, machine.Pin.OUT)
# LED制御用
led_pin = machine.Pin(19, machine.Pin.OUT)
pwm.freq(1000) # PWM周波数を設定
pwm.duty_u16(0) # 初期状態では0%の出力
presw = 0
# 制御開始
dir1_pin.value(1)
led_pin.value(0)
while True:
dipsw = dipsw1_pin.value() + dipsw2_pin.value()*2 + dipsw4_pin.value()*4 + dipsw8_pin.value()*8
print( dipsw , presw )
if presw != dipsw:
if dipsw == 0:
break
else:
pwmval = dipsw * 2048
pwm.duty_u16( pwmval )
print( pwmval )
presw = dipsw
time.sleep(0.1) # 0.1秒待つ
dir1_pin.value(0)
dir2_pin.value(0)
led_pin.value(1)
LEDでのPWM制御と同じように、
pwm.duty_u16( pwmval )
この引数に 0~65535 を渡すことで0~100%のデューティー比を設定します。
このサンプルプログラムでは、0(=2048×0) ~ 30720(=2048×15)を渡しますので、0~46.9%の制御ですね。
OUT1/OUT2での電圧をテスターで測ってみました。
ロータリーディップスイッチの変化に合わせて電圧が変わってますね。
よしよし、と思ったものの、「ん?7.29V?」12Vの46.9%なら6V弱なんじゃないの?と。
このときのグラフをとってみました。
ポジション0(0%)なら0Vなのは良いとして、それ以降は3.125%(2048/65536)ごとに3.9V増えてます。
3.9V÷12V=3.25%なので、全体に1.5V程度、上乗せされていると思えば納得です。そういうもの、なんですかね。。
PWM制御の目的は?
やっぱり、鉄道模型好きとしては、PWMといえばこれですよね。
レールにPWM制御のパルスを流し、トレインマークとテールライトの明るさが変わることを確認します。
もう、この時点で頭の中では、列車が走ってました。
というわけで、このセットを用い、単純なオーバルの線路を敷いて EF66+14系15形2両を走らせてみます。
ここまで、生活音などを排除するために音声はカットしていましたが、この動画は音声付き。PWM制御でのモーターから発せられる音の存在を聞いて頂くためです。
PWM出力OFFのときはもちろん無音ですが、PWM出力が始まるとモーターから音が漏れ聞こえてきます。
問題なのか問題ではないのか、よく分かりません。。
というわけで、自作パワーパックのときにも書きましたが、あくまでも自己責任でお願いします。モーターの寿命が短くなっても、自己責任で。
とはいえ、モータードライブ と Raspberry Pi と ロータリーディップスイッチで、なんとなくパワーパックっぽいものが出来ました。
ロータリーディップスイッチは、あくまでも段階的(比例的)にデューティー比を上げていっているだけで、マスコンのような機能を持たせているわけではありません。
なので、これを今のパワーパック代わりに使うつもりはありません(笑) 微調整の効かないカクカクの制御しかできないですからね。
これ、正常?異常?
何となく、「面白いことができそうだ」というのが見えてきたところで、非常に気になる問題も見えてきました。
それが、これ。
PWMがONになると、進行方向逆側、テール側のヘッドライトが点灯しています。
写真を撮ってなかったので動画からのキャプチャですが、
進行方向側のトレインマークが(見えにくいですがテールライトも)点灯しています。
これ、左右のレールに+と-の両方が流れている状態、ということですよね。
このときに書いた、
この、非常によろしくない状況と同じです。
PWM制御(モータードライバー)側の問題かと思ってみたものの、基本的には制御の方向(モーター1/2の正転/逆転)とPWMの周波数・デューティー比を決めるだけ。モーター1の方向を決めるIN1/IN2のいずれかをHIにすれば正転/逆転となりますが、同時にHIにするとブレーキとなります。というか、ソースコード的にそれはあり得ません。
それに、スハネフ15だけを線路に置いてPWM制御を開始してもテールライトは点灯せず、機関車(モーター車)を同時に置くことで発生します。
つまりは、機関車が逆方向の電流に起因している? と。
上に挙げた記事でヘッドライト・テールライト同時点灯をワーワー言っておきながら、こちらを黙認するのは筋が通らないんですが、解決法が判らないので、一旦保留。対策を考えてみます。
というわけで、問題は残しながらも Raspberry Pi Pico で、なんとなくパワーパック的な動作が出来る状態となりました。
最終的にはマスコンに近いパワーパックの作成を目指したいのですが、その前に、やっておきたいことがあります。次回は、その寄り道的なところを書いてみたいと思います。