ラズパイ&ブレッドボードで遊ぶ(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入力+12V12V電源(ACアダプタ)の+
GNDGND12V電源(ACアダプタ)のGND
PWM制御入力ENARaspberry Pi Pico GP18
モーター1側制御1入力IN1Raspberry Pi Pico GP21
モーター1側制御2入力IN2Raspberry Pi Pico GP20
モーター1出力1OUT1(モーター)
モーター1出力2OUT2(モーター)

ENAはジャンパが付いていますが、PWMとして使用する場合はジャンパを外します。

IN1とIN2の用途ですが、この2つで出力の方向を決めるそうです。

IN1IN2モーター制御
HHブレーキ
HL正転
LH逆転
LLブレーキ

Raspberry Pi Pico 観点での接続はこうなります。既出のスイッチ類は省略しています。

PIN番号機能備考
24GP18モータードライブコントローラーモジュールのENA端子
26GP20モータードライブコントローラーモジュールのIN2端子
27GP21モータードライブコントローラーモジュールの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になると、進行方向逆側、テール側のヘッドライトが点灯しています。

写真を撮ってなかったので動画からのキャプチャですが、

進行方向側のトレインマークが(見えにくいですがテールライトも)点灯しています。

これ、左右のレールに+と-の両方が流れている状態、ということですよね。

このときに書いた、

https://try-widely.com/tomix_point_rail/ より再掲

この、非常によろしくない状況と同じです。

PWM制御(モータードライバー)側の問題かと思ってみたものの、基本的には制御の方向(モーター1/2の正転/逆転)とPWMの周波数・デューティー比を決めるだけ。モーター1の方向を決めるIN1/IN2のいずれかをHIにすれば正転/逆転となりますが、同時にHIにするとブレーキとなります。というか、ソースコード的にそれはあり得ません。

それに、スハネフ15だけを線路に置いてPWM制御を開始してもテールライトは点灯せず、機関車(モーター車)を同時に置くことで発生します。

つまりは、機関車が逆方向の電流に起因している? と。

上に挙げた記事でヘッドライト・テールライト同時点灯をワーワー言っておきながら、こちらを黙認するのは筋が通らないんですが、解決法が判らないので、一旦保留。対策を考えてみます。

というわけで、問題は残しながらも Raspberry Pi Pico で、なんとなくパワーパック的な動作が出来る状態となりました。

最終的にはマスコンに近いパワーパックの作成を目指したいのですが、その前に、やっておきたいことがあります。次回は、その寄り道的なところを書いてみたいと思います。