名刺サイズの超小型PC「ラズパイ」で遊ぶ(第58回)
Nゲージの模型をラズパイで動かす “らずてつ”その7――2つのセンサーを使って動きを制御してみる
前回は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("
End")
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 ("
Stop")
motor.stop()
movetest2.py
ここでは周回軌道の両脇にある直線部分2つにセンサーを設置しています。前回のように反転してから10秒進むだけだと2つ目のセンサーを通り越してしまい、反転してくれません。そこで調節して8秒にしました。
次回ではポイントを利用し、センサーで感じたらスイッチバックするように動かしてみます。
Copyright © ITmedia, Inc. All Rights Reserved.
名刺サイズの超小型PC「ラズパイ」で遊ぶ
今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。
この記事の著者
関連記事
こんなメディアも見られています
ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
SpecialPR
本日の新着記事
アクセスランキング
-
1
くら寿司、10%割引の“適用漏れ”を謝罪 レシート持参で返金へ ちいかわコラボのお詫び施策
-
2
「菜の花がおかしい」――イラストレーター制作うたうマラソン大会ポスターに指摘相次ぐ 事務局がAI使用明かす【訂正あり】
-
3
「ペンギンを返して」 Suica新キャラ候補3案公開でSNSに戸惑いの声 一般投票は8日から
-
4
幻の「ちいかわ」コラボ第3弾皿、捨てちゃうの? くら寿司に聞いてみた
-
5
藤井風のリサイタル、公式サイトがインターネット老人会すぎると話題 公民館のチラシみたいだけど東京ドーム開催
-
6
Duolingoの新アイコンが「気持ち悪い」 世界のユーザーから「元に戻して」の声
-
7
農水省の“クソダサ”ポスター話題 「AIよりよっぽど良い」の声も 担当者に狙いを聞いた
-
8
大雨で「首都圏外郭放水路」稼働 濁流が“地下神殿”を満たすまでの動画公開 国交省
-
9
Suica、3つの新キャラ候補を発表 ネット投票で決定へ ペンギンは27年3月末で卒業
-
10
5年ぶりの「PEN」、OM SYSTEMロゴになって登場 EVFを搭載、初の防塵・防滴仕様に
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR