Nゲージの模型をラズパイで動かす “らずてつ”その7――2つのセンサーを使って動きを制御してみる:名刺サイズの超小型PC「ラズパイ」で遊ぶ(第58回)
鉄道模型の運転をラズパイで制御する仕組みに挑戦。
前回は1つのセンサーを使って、センサーを通過したら方向を変えるという手法を紹介しました。今回は2つのセンサーを使って模型の動きを制御してみます。
「センサーを通過したあとに反転する」という環境に、もう1つセンサーを追加して実現します。まずは小手調べに、前回と同様に「センサーを通過したら反転する」というやり方を進めてみます。プログラムの構成は簡単で、if分による条件を加えるだけでOKです。
前回のプログラムは以下のようなものでした。
#!/usr/bin/env python # -*- coding: utf-8 -*- from gpiozero import Motor from gpiozero import MCP3008 import time motor = Motor(forward=20, backward=21) sen01 = MCP3008(channel=0) speed = 0.18 # 模型のスピード time.sleep(1) try: while True: rail1 = round(sen01.value * 100,2) print (rail1) time.sleep(0.01) #センサーの読み取り間隔 if rail1 >= 50: # フォトセンサーの返り値が50以上であれば反転 motor.stop() time.sleep(2) motor.backward(speed) time.sleep(10) motor.stop() time.sleep(2) else: motor.forward(speed) except: KeyboardInterrupt motor.stop() movetest2.py
この中の「if rail1 >= 50: # フォトセンサーの返り値が50以上であれば反転」という箇所に続いて、もう1つのセンサーを越えたら反転するプログラムを記述していきます。なおもう1つのセンサーはMCP3008の2つ目のセンサーに取り付けますので、定義を1つ追加します。
ところで、実際に走らせてみる前に、センサーが動いているかチェックしておきましょう。
#!/usr/bin/env python # -*- coding: utf-8 -*- import time from gpiozero import Motor from gpiozero import MCP3008 motor = Motor(forward=20, backward=21) sen01 = MCP3008(channel=0) sen02 = MCP3008(channel=1) speed = 0.25 #模型のスピード motor.forward(speed) try: while True: rail1 = round(sen01.value * 100,2) rail2 = round(sen02.value * 100,2) print (rail1, rail2) time.sleep(0.1) except: KeyboardInterrupt motor.stop() print("\nEnd") sensortest.py
9行目の「sen01」は前に設置してあるセンサーで、10行目の「sen02」が今回追加したセンサーです。センサーを線路へ設置する方法も、第56回で解説したものと同様です。
このプログラムを動かすと列車が走り出し、センサーの上を通過するのと同時に値が上がります。
なお、鉄道模型の種類に応じて走るスピードが違います。11行目に定義している模型のスピードを、固体に合わせて変更してください。筆者が所有しているKATOのキハ52とキハ30では異なり、キハ30がフライホイール搭載動力ユニットのためか、少し余計に負荷をかけないと動きませんでした。
これを踏まえて、2個のセンサーの間を行き来するようにしてみました。1個の時のプログラムの応用でセンサーを感知したら停止、そのあと逆に回って次のセンサーに来たらまた反転、というようにしています。
#!/usr/bin/env python # -*- coding: utf-8 -*- from gpiozero import Motor from gpiozero import MCP3008 import time motor = Motor(forward=20, backward=21) sen01 = MCP3008(channel=0) sen02 = MCP3008(channel=1) speed = 0.25 # 模型のスピード time.sleep(1) try: motor.forward(speed) while True: rail1 = round(sen01.value * 100,2) rail2 = round(sen02.value * 100,2) print (rail1, rail2) time.sleep(0.01) #センサーの読み取り間隔 if rail1 >= 50: # フォトセンサーの返り値が50以上であれば反転 motor.stop() time.sleep(1) print("sensor1 detected") motor.backward(speed) time.sleep(8) motor.stop() time.sleep(1) if rail2 >= 50: motor.stop() time.sleep(1) print("sensor2 detected") motor.backward(speed) time.sleep(8) motor.stop() time.sleep(1) else: motor.forward(speed) except: KeyboardInterrupt print ("\nStop") motor.stop() movetest2.py
ここでは周回軌道の両脇にある直線部分2つにセンサーを設置しています。前回のように反転してから10秒進むだけだと2つ目のセンサーを通り越してしまい、反転してくれません。そこで調節して8秒にしました。
次回ではポイントを利用し、センサーで感じたらスイッチバックするように動かしてみます。
関連記事
- Nゲージの模型をラズパイで動かす “らずてつ”その1――鉄道模型とラズパイをつなぐ
今回から鉄道模型の運転をラズパイで制御する仕組みに挑戦します。 - 部屋の二酸化炭素濃度を測定しよう ラズパイでCO2センサーを作る
ラズパイを使ってCO2を計測し、部屋の換気をする目安にしてみましょう。 - 550円の「Raspberry Pi Pico」でIoT その1:気温と湿度、気圧を測定する
独自開発のチップ「RP2040」を搭載したマイコンボード「Raspberry Pi Pico」でセンサーデバイスをテスト。 - ラズパイで「Windows 10 on ARM64」を動かす(オーバークロック編)
ラズパイにARMプロセッサ向けの「Windows 10 on ARM64」をインストールしてみた。今回はオーバークロックで快適動作を実現。 - ラズパイで「Windows 10 on ARM64」を動かす(インストール編)
ラズパイにARMプロセッサ向けの「Windows 10 on ARM64」をインストールしてみた。 - ラズパイで「Windows 10 on ARM64」を動かす(事前準備編)
ラズパイにARMプロセッサ向けの「Windows 10 on ARM64」をインストールしてみた。 - ラズパイ一体型キーボード「Raspberry Pi 400」レビュー 特例制度のWeb申請で“技適なし”を回避した
かつての“マイコン”を思わせるラズパイ一体型キーボード「Raspberry Pi 400」のレビューのファーストインプレッションをお届け。海外製品を日本国内で使うために気を付けるべきポイントも紹介。 - ラズパイ一体型キーボード「Raspberry Pi 400」の性能は? ベンチマークテストで従来モデルと比べた
かつての“マイコン”を思わせるラズパイ一体型キーボード「Raspberry Pi 400」でベンチマークテストを実施。その実力とは? - ラズパイで気温と湿度を測定、LINEで通知を受け取る 〜前編〜
今回は温湿度センサーモジュールとラズパイを組み合わせ、LINEと連携させる方法を紹介します。 - ラズパイを無線LANルーター化する 〜アクセスポイント編〜
家庭内で無線LANルータを使っている人は多いかと思います。今回はそのルーター機能をラズパイに持たせて、ラズパイを使った無線LANルーターの構築方法についてご紹介します。 - 本格的な撮影が楽しめる公式カメラモジュール「Raspberry Pi High Quality Camera」を試す
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。Raspberry Pi公式のカメラとして本格的な撮影が楽しめる「Raspberry Pi High Quality Camera」を紹介します。 - ラズパイで新型コロナウイルス解析に参加する 〜Ubuntu Serverの構築編〜
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。今回はラズパイで。
Copyright © ITmedia, Inc. All Rights Reserved.