ラズパイで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さんです。お誕生日だそうです。おめでとうございます!

 

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

コメントを残す

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