ラズパイでIoT鉄道模型をつくってみる

はじめに

「IoTLT Advent Calendar 2018 Mitzめ」 の記事になります。

2日目の@vui_rie さんの「YES NOライトの歩みを止めるな!」に続いて3日目を担当する山添 @zoe6120 です。

IoTの第1歩はラズパイでLチカをすることが良くありますが、それでは満足できなくなってくると何かモノを動かしたい要求が沸き上がってきます。
サーボモータを動かしたりするのもアリですが、IoTLTや展示会でも見せられるようなそこそこの大きさのモノを探すと

「そうだ!鉄道模型があるじゃないか!」

そんな訳でラズパイで鉄道模型を動かしてみます。

Nゲージ鉄道模型の動力

国内ではNゲージと呼ばれるサイズが一般に普及しています。KATO製やTOMIX製が有名です。いずれも列車はDCモータで駆動されています。
レールから0~12VのDC電圧を印加することにより、電圧に比例して速度が変わります。極性を反転させると反対方向に走行します。
DCモータ判りやすいです。子供のころ乾電池でマブチモーターを回した記憶が蘇ります。

つまり、
線路に印加するDC電圧を可変することで鉄道模型の速度を変えて走らせることができます。

モータードライバ

ではどうやって0~12VDCの電圧を発生させられるのでしょうか。ラズパイのGPIOはデジタルI/Oで、3.3VのOn/Offしかできませんし出力できる電流も限られています。

そこで使用するのがモータドライバICです。

モータドライバICで検索するといくつか見つかります。ここではTA7291Pを使用しました。

東芝 TA7291P (今見ると生産終了予定!になっています)

秋月で2個300円です。 モータドライバTA7291P

このモータドライバは入力端子IN1, IN2にPWMで制御信号を与えることで、Vrefに入力した電圧を基にOUT1, OUT2間の出力電圧を可変できます。
PWMならラズパイから出力できます。

外部電源

それからそもそも最大でDC12Vを出力するので別電源が必要です。DC12VのACアダプターを使っています。容量はDC12V 1A以上あればで大丈夫です600~1000円ぐらいです。
モータドライバにはACアダプタからDC12Vを供給します。

制御回路

OUT1, OUT2を線路へ接続します。

こちらの写真はポイントも制御するためにリレーもついているのでごちゃごちゃしていますが、速度制御用のモータドライバIC回路は黄色の丸部分です。

ラズパイのGPIOからIN1, IN2, GNDを接続しています。

ラズパイからPWM出力

ラズパイのGPIO端子はPWM出力が可能です。GPIOを2個使用してモータドライバのIN1, IN2に直接入力します。

GPIOからのPWM出力

PWM出力にはGPIO.PWM()を使用します。周波数は初期化時に GPIO.PWM(pin, frequency) で指定します。

デューティ比を.ChangeDutyCycle()で指定することで任意のデューティの出力を得ることができます。これをモータドライバに入力するとモータドライバの出力が可変します。
今回GPIO17とGPIO27を使用しています。

pythonのコードはこちら。0%から10刻みで加速して70%で走行した後に10刻みで0%まで減速して停止します。次に走行方向の反転させて同じ動作を繰り返します。
PWM1とPWM2をそれぞれ片方のみ出力するとモータドライバの正転、逆転ができます。

import os, time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO17 = 17  # pin11
GPIO27 = 27  # pin13
GPIO.setup(GPIO17, GPIO.OUT)
GPIO.setup(GPIO27, GPIO.OUT)

pwm1 = GPIO.PWM(GPIO17, 60)
pwm2 = GPIO.PWM(GPIO27, 60)
pwm1.start(0)
pwm2.start(0)

# 走行
for dc in range(0, 71, 10):
    pwm1.ChangeDutyCycle(dc)
    print(dc)
    time.sleep(1)
time.sleep(5)
for dc in range(70, -1, -10):
    pwm1.ChangeDutyCycle(dc)
    print(dc)
    time.sleep(1)

# 休止
time.sleep(3)

# 反転走行
for dc in range(0, 71, 10):
    pwm2.ChangeDutyCycle(dc)
    print(dc)
    time.sleep(1)
time.sleep(5)
for dc in range(70, -1, -10):
    pwm2.ChangeDutyCycle(dc)
    print(dc)
    time.sleep(1)

pwm1.stop()
pwm2.stop()
GPIO.cleanup()
print("done")

走行させる

こんな感じです。上のコードとタイミングは変えています。制御回路はユニバーサル基板で作ったと同じのをKiCadで基板デザインしてSeeed FusionPCB で作りました。1枚1ドルです。

おわりに

ポイントもDC12V制御が可能です。ポイントの場合はモータドライバでなくリレーと電解コンデンサを使用します。また別の機会に書きます。

鉄道模型は正しい使い方を守って使用しましょう。何か手を加える際は自己責任でお願いします。

明日は @MuraMasa2764さんです。お誕生日だそうです。おめでとうございます!

関連記事

2019-03-12 ラズパイでIoT鉄道模型をつくってみる(2) 電動ポイントを切替える
2019-05-07 ラズパイでIoT鉄道模型をつくってみる(3) 車載カメラ

“ラズパイでIoT鉄道模型をつくってみる” への11件の返信

  1. 鉄道模型への応用について興味深く拝見しました。
    ポイント駆動と連動されているとのことですが、機関車の位置検出方法も合わせて、是非発表していただけたらと願っています。
    よろしくお願いします。

    1. コメントありがとうございます!そういえばポイントの駆動方法についてはまだ書いていませんでした。
      簡単に言えば電解コンデンサの充放電で瞬間的な電圧を電動ポイントの切り替え用コイルに印加して切り替えるのですが、
      文章ではあまりに分かりにくいので、また追って記事にします。
      それから列車の位置検出は、線路に光センサーを取り付け列車が遮ることによる明るさの変化をA/D変換して検出しています。
      こちらももう少し具体的に記事にします。

      1. さっそくご返事いただきありがとうございます。
        小生のポイントの切り替え装置はAC駆動なので、リレーを使う必要があると思っています。もし情報をお持ちでしたら紹介願います。
        現在の最大の課題は自動加減速や、位置検出、ポイント駆動などの個別のプログラムをどうやって1本のプログラムに統合すればよいのかということです。よろしければ簡単に説明していただけないでしょうか?よろしくお願いします。

        1. 鉄道模型にはそれほど詳しくないのでAC駆動のポイントがあるのは知りませんでした。私が使用しているのはTOMIXの電動ポイントで、本来はTOMIXのパワーパックからDC12Vが給電されたコントロールボックスが(内部で恐らくコンデンサの充放電により)電動ポイントのコイルへ電圧を印加しているはずです。
          私の場合も、ラズパイのGPIOへのOn/Off出力によりリレーを駆動してコンデンサへのDC12Vの充放電を切替えています。

          プログラムの統合ですが、IoT鉄道模型では状態遷移により速度制御を行うシーケンスをプログラムしています。即ち列車の位置を検出することにより列車の走行区間を特定し、その区間に所定の速度をモータドライバICへのPWM制御で送信します。例えば、区間1では15%、区間2では30%といった具合です。これをループしておけば列車の周回にあわせて制御が行われます。
          なお、2019-02-21記事「Control IoTLT Vol.3 でエッジ制御によるIoT鉄道模型の自動運転について発表しました」で発表資料をリンクしています。p8に簡単にLambdaで実装した制御シーケンスを示しています。ご参考まで。

          1. 早速、ご返事いただき感謝いたします。区間ごとの制御を繰り返すということですね。BASICみたいにサブルーチンとかGOTO命令などがあれば便利なんですが。
            これまでは自作のセレン整流器によるコントローラ5組を使い、区間方式により5階段で自動加減速させる方法などを楽しんでいました。(ちなみにN,HO,Oゲージすべてを同じコントローラで運転しています。従ってOは直流モータに乗せ換えしています)ラズパイには無限の可能性がありそうなので、今後ラズパイによるコントローラを自作して、旧コントーラと互換性を持たせつつ完全スケジュール運転に挑戦しようと思っています。今後とも情報交換を願えれば幸いです。

          2. 本欄の前進増速減速、逆転増速減速のプログラムをOゲージ機関車向けに、実際にトライしたところ、数値の調整のみで首尾よく命令通りに動かすことができました。
            ありがとうございます。
            ところで、これまでは下記のような教科書的なプログラムで駆動しようとしたところ、前進と逆進の増速部分は問題ないものの、減速部分が(エラー表示はない)前進逆進とも完全にスルーされるという状態でした。どの部分に不具合があるのでしょうか?
            python 初心者ですのでよろしくお願いします。
            ーーー
            以下にPythonのプログラムを記載して送付しようとしたのですが、Forbidden のアラームがでて送信できませんでした。いろいろな形式でトライしたのですがダメでした。プログラムのみをどういう方法で送付できますか?

          3. HO,Oゲージにセレン整流器のコントローラと本格的に鉄道模型を楽しんでおられるのですね。参考にして頂いて恐れ入ります。
            こちらこそ色々ご教示頂ければ幸いです。
            プログラムが動作したとのこと大変嬉しいです。Oゲージが命令通りに走行すると迫力がありそうですね。
            プログラムの送付ですが、入力いただいているメールアドレスにメール差し上げますので、返信にてpythonプログラムを添付頂ければと思います。どうぞよろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です