前回に引き続き、ラズパイで鉄道模型をコントロールする連載の第3回目はポイントの制御です。鉄道模型のポイントを切り替える方法はさまざまあるようですが、筆者が持っているトミックス製の電動ポイントの場合は、電磁石に電流を流し、ポイントを動作させる部品に付いている磁石を瞬間的に移動させて切り替えています。特にアナログ的な動作は必要ないので、GPIOのHighとLowで信号を出せば切り替えられそうです。
では実際にどのようにして切り替えの指示を出せばいいのでしょうか。電圧や電流量が高い場合はリレーなどを使う必要がありますが、今回はそれほど大電流を必要としていないので、モーターを動かすのにも使った、秋月電子通商で販売されている「TB6612使用 Dual DCモータードライブキット」(以下、TB6612)を使用します。TB6612には制御する端子が2つ付いていますので、それぞれをGPIOにつないで短時間だけ電流を流し、ポイントを切り替えるようにします。
ポイントに電流を流すのは同じくPWMを使います。模型を走らせるときはハードウェアPWMを使いましたが、ポイントの制御はそれほど精度が必要ないので、RPi.GPIOに用意されているソフトウェアPWMを使います。ソフトウェアPWMを使うと、GPIOのどのピンでもPWMが使えます。
具体的な操作方法ですが、デューティー比を100にして電流を流したあと、0.05秒の間隔を置いてデューティー比を0にして電流を止めます。瞬時に切り替わるためこの程度の秒数で問題ありません。あまり長くすると電磁石が熱せられてしまいますので気をつけましょう。
テストとして2本のポイントを接続します。これを踏まえて作ったプログラムが以下のようになります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# ポイント1
straight_1 = 27 # pin11
curve_1 = 22 # pin13
pwm_1 = 17
# ポイント2
straight_2 = 24 # pin11
curve_2 = 25 # pin13
pwm_2 = 23
# ポイント1
GPIO.setup(straight_1, GPIO.OUT)
GPIO.setup(curve_1, GPIO.OUT)
GPIO.setup(pwm_1, GPIO.OUT)
pwm1 = GPIO.PWM(pwm_1, 100)
pwm1.start(0)
# ポイント2
GPIO.setup(straight_2, GPIO.OUT)
GPIO.setup(curve_2, GPIO.OUT)
GPIO.setup(pwm_2, GPIO.OUT)
pwm2 = GPIO.PWM(pwm_2, 100)
pwm2.start(0)
# 初期設定
GPIO.output(straight_1,0)
GPIO.output(curve_1,0)
GPIO.output(straight_2,0)
GPIO.output(curve_2,0)
time.sleep(1)
# ポイント1の切換え
GPIO.output(straight_1,1)
GPIO.output(curve_1,0)
print("Point1 Straight")
pwm1.ChangeDutyCycle(100)
time.sleep(0.05)
pwm1.ChangeDutyCycle(0)
time.sleep(2)
# ポイント1の切換え逆方向
GPIO.output(straight_1,0)
GPIO.output(curve_1,1)
print("Point1 Curve")
pwm1.ChangeDutyCycle(100)
time.sleep(0.05)
pwm1.ChangeDutyCycle(0)
time.sleep(2)
# ポイント2の切換え
GPIO.output(straight_2,1)
GPIO.output(curve_2,0)
print("Point2 Straight")
pwm2.ChangeDutyCycle(100)
time.sleep(0.05)
pwm2.ChangeDutyCycle(0)
time.sleep(2)
# ポイント1の切換え逆方向
GPIO.output(straight_2,0)
GPIO.output(curve_2,1)
print("Point2 Curve")
pwm2.ChangeDutyCycle(100)
time.sleep(0.05)
pwm2.ChangeDutyCycle(0)
time.sleep(2)
pwm1.stop()
pwm2.stop()
print("End")
time.sleep(1)
GPIO.output(straight_1,0)
GPIO.output(curve_1,0)
GPIO.output(straight_2,0)
GPIO.output(curve_2,0)
GPIO.cleanup()
プログラムを走らせると、1つのポイントが切り替わったあと、もう1つのポイントが切り替わります。これでポイントの操作ができるようになりました。次回はこれまでのやり方を応用して、ポイントを切り替えながら線路を回って走るようにしてみます。
Nゲージの模型をラズパイで動かす “らずてつ”その2――制御の準備
Nゲージの模型をラズパイで動かす “らずてつ”その1――鉄道模型とラズパイをつなぐ
部屋の二酸化炭素濃度を測定しよう ラズパイでCO2センサーを作る
550円の「Raspberry Pi Pico」でIoT その1:気温と湿度、気圧を測定する
ラズパイで「Windows 10 on ARM64」を動かす(オーバークロック編)
ラズパイで「Windows 10 on ARM64」を動かす(インストール編)
ラズパイで「Windows 10 on ARM64」を動かす(事前準備編)
ラズパイ一体型キーボード「Raspberry Pi 400」レビュー 特例制度のWeb申請で“技適なし”を回避した
ラズパイ一体型キーボード「Raspberry Pi 400」の性能は? ベンチマークテストで従来モデルと比べた
ラズパイで気温と湿度を測定、LINEで通知を受け取る 〜前編〜
ラズパイを無線LANルーター化する 〜アクセスポイント編〜
本格的な撮影が楽しめる公式カメラモジュール「Raspberry Pi High Quality Camera」を試す
ラズパイで新型コロナウイルス解析に参加する 〜Ubuntu Serverの構築編〜
ラズパイでスマートスピーカーを作る 「アレクサ!あしたの天気は?」 〜ソフトウェア準備編〜
これが“らずキャン△”だ! キャンプ場で役立つ「気温・湿度・気圧センサー」の作り方
ラズパイで「YouTube」と「Amazon プライムビデオ」を見るCopyright © ITmedia, Inc. All Rights Reserved.
Special
PR