ここまでの連載で、鉄道模型をラズパイでコントロールする方法についてイメージがつかめてきたかと思います。そこで最終目標の「トミックスレイアウトベースキット」に似た形で線路を配置し、シミュレーションしていきたいと思います。
まずセンサーですが、2つある引き込み線にそれぞれ1個ずつ、またポイントの近くに1個ずつの計4個を配置します。センサーは以前工作した「TPR-105」です。以前は「S280」の長いレールに取り付けていましたが、短い「S140」のほうが取り回しが効きますので、こちらに変更しました。また「D.C.フィーダーN」の取り付け箇所にTPR-105を通す形で作りましたが、リード線の穴を開けた方がよいと思い、変更しました。
これらを組み込んだのがこちらのレイアウトです。レイアウトベースキットではループを描いていますが省略し、カーブも「280-45」から半径が小さい「C343-45」にしてあります。
また、センサーがしっかりと動作しているのかを知るためにLEDをセンサーの抵抗と並列に入れました。センサー上を模型が通過して反応すると点灯する仕組みです。
さてレイアウトですが、ボタンを押したら模型が走り出すようにしてみたいと思います。ボタンの入力についてはgpiozero「Button」というクラスで扱えます。ボタンが押されたらLEDが点灯する、という仕組みは以下のプログラムで実行できます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gpiozero import Button, LED
button = Button(13)
led = LED(26)
try:
while True:
if button.is_pressed:
led.on()
else:
led.off()
except: KeyboardInterrupt
led.off()
button.py
ここではラズパイのGPIO26(37番ピン)にLEDを接続し、ボタンスイッチをGPIO13(33番ピン)とGNDに接続しています。ボタンを押すとLEDが点灯し、Ctrl+Cでプログラムを終了します。
このプログラムを「button.py」として保存しましょう。
$ python3 button.py
と入力すると、ボタンを押すとLEDが光ります。
クラスButtonにはこの他、ボタンが押されるまで入力を待つ「button.wait_for_press()」があります。これを使うことで、ボタンを押したら模型が発車する仕組みを作ることができます。gpiozeroのチュートリアルにあるサンプルプログラムを使うことで、この仕組みを知ることができます。
#!/usr/bin/env python # -*- coding: utf-8 -*- from gpiozero import Button button = Button(13) button.wait_for_press() print "ボタンが押されました" buttonpush.py
$ python3 button.py
では実際に模型が発車するようにしましょう。前回、センサーで模型を動かしたものを改造して使います。プログラムは以下のようになります。4つ取り付けたセンサーのうち、引き込み線にある3と4のセンサーを使って反転させています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gpiozero import Motor, Button, MCP3008
import time
motor = Motor(forward=20, backward=21)
button = Button(13)
sen03 = MCP3008(channel=2)
sen04 = MCP3008(channel=3)
speed = 0.25 # 模型のスピード
button.wait_for_press()
try:
motor.forward(speed)
while True:
rail3 = round(sen03.value * 100,2)
rail4 = round(sen04.value * 100,2)
print (rail3, rail4)
time.sleep(0.01) #センサーの読み取り間隔
if rail3 >= 50: # フォトセンサーの返り値が50以上であれば反転
motor.stop()
time.sleep(1)
print("sensor1 detected")
motor.backward(speed)
time.sleep(15)
motor.stop()
time.sleep(1)
if rail4 >= 50:
motor.stop()
time.sleep(1)
print("sensor2 detected")
motor.backward(speed)
time.sleep(15)
motor.stop()
time.sleep(1)
else:
motor.forward(speed)
except: KeyboardInterrupt
print ("\nStop")
motor.stop()
movetest3.py
これを「movetest3.py」として保存し、以下を実行してみましょう。引き込み線から発車した列車が、反対の引き込み線で反転して戻ります。
$ python3 movetest3.py
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の構築編〜Copyright © ITmedia, Inc. All Rights Reserved.
Special
PR