名刺サイズの超小型PC「ラズパイ」で遊ぶ(第57回)
Nゲージの模型をラズパイで動かす “らずてつ”その6――センサーで模型をコントロールする
前回は線路にセンサーを設置するところまでを解説しました。今回はそのセンサーで模型を制御してみましょう。Pythonのプログラムは前回ご紹介した通り、GPIO ZeroでADコンバーターのMCP3008をコントロールする方が簡単ですので、模型本体とポイントについて、当初のRPi.GPIOによる制御からGPIO Zeroに変更して進めていきます。
なお、GPIO Zeroを使うことにより、利用している「TPR-105」の接続方法が変わります。「PWM A」「PWM B」として用意されているピンはGPIOではなく3.3Vの端子に接続しますので注意してください。
GPIO Zeroでモーターを使うためには「Motor」というAPIを使います。前後に動かす場合は「forward」と「backword」で指定します。前後に動かすプログラムは以下のようになります。
#!/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)
motor.forward(speed)
time.sleep(10)
motor.stop()
time.sleep(1)
motor.backward(speed)
time.sleep(10)
motor.stop()
motortest.py
記述したら動かしてみましょう。
$ python motortest.py
前後に模型が動いたかと思います。ここで「motor.forward(speed)」と「motor.backward(speed)」と指定していますので、9行目に定義した変数「speed」の数字を増減することでスピードが変わります。「0~1」までの間で指定します。
さて、模型を動かす手順が分かったところで、いよいよセンサーによる制御へと移っていきましょう。TPR-105は前回述べたとおり、本体の左側にある赤外線LEDから発光された光を、右側にある反射型フォトトランジスタで受信して値を返します。そこで車両の底に白い紙を貼り付けて赤外線LEDの光を反射させてセンサーで読み取るようにしました。
まずはどのような値になっているのか調べます。模型をずっと動かし、センサーの上に来たときの値の変化を見てみます。プログラムは以下のようになります。
#!/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.05)
motor.forward(speed)
except: KeyboardInterrupt
motor.stop()
movetest.py
プログラムを保存したら、以下のようにして走らせてみましょう。
$ python movetest.py
列車が右回りに動いてセンサーの上を通過したときに、以下のようにセンサーからの値が変わるのを確かめられます。なお今回は、モーターのスピードを簡単に変えられるように「speed」という変数を作りました。Ctrl+Cを押すと停止します。
8.06
8.16
8.06
8.16
8.06
8.06
8.16
8.16
8.06
8.16
8.55
9.04
10.31
13.43
19.69
15.1
33.66 ←通過しているところ
33.37 ←通過しているところ
94.24 ←通過しているところ
94.53 ←通過しているところ
34.73 ←通過しているところ
27.6
15.68
9.62
18.42
9.53
9.82
7.87
8.16
8.16
8.16
8.16
8.16
8.16
8.06
8.16
8.06
……(続く)
続いて、センサーの上を通過すると動きが変わるようにしてみましょう。その際の動作ですが、何もなければ左回りに模型が動くようにし、センサーを通ったらいったん停止して逆行するという形にしました。プログラムは以下の通りです。
#!/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
TPR-105を手で遮ったとき、Maxの状態だと100程度、何もしなければ7~9程度の値を返しましたので、センサーに捉えられるよう、50以上であれば反転して動作させるようにしてあります。ただし光センサーなので、部屋が明るすぎると反応しないことがあります。その時はフォトセンサーの返り値を大きくするなどして対応してください。
なお「time.sleep(0.01)」はセンサーの読み取り間隔です。あまり大きくしてしまうとセンサーの反応が鈍くなりますので、値を少なめにしています。
次回はこれを元に、もう一歩上の動きができるようにしてみます。
Copyright © ITmedia, Inc. All Rights Reserved.
名刺サイズの超小型PC「ラズパイ」で遊ぶ
今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。
この記事の著者
関連記事
こんなメディアも見られています
ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
SpecialPR
本日の新着記事
アクセスランキング
-
1
キオクシアに約366億円の賠償命じる判決 米特許訴訟、陪審評決に続き 「あらゆる法的手段講じる」
-
2
BASE子会社、最大885万件漏えいか カード番号の一部も ECサイト構築サービスに不正アクセス
-
3
個人情報含む約3300万件のデータ漏えいか 整体院予約など手掛けるEPARKリラク&エステ システムに不正アクセス
-
4
講談社、最大3812件の個人情報流出 社員がフィッシングメールに騙される
-
5
「コードは一行も書いていない」 アイドルの宮本佳林さん、AIで配信システムを丸ごと構築 “技術ブログ”が話題
-
6
ミャクミャク関連サイトがアダルトサイトに……大阪万博のドメイン運用終了→転用続出で物議 悪用の懸念も
-
7
Apple、大量購入品の返品に「15%の手数料」 販売条件に明記 “転売対策”か
-
8
農水省の“クソダサ”ポスター話題 「AIよりよっぽど良い」の声も 担当者に狙いを聞いた
-
9
引きこもりはゲーム内でも交流を好まない、奈良先端大が587人調査 「ゲームで社会復帰」に落とし穴?
-
10
エルヴィン団長「とりあえず再起動しろ!」──NTT東日本×「進撃の巨人」の“情シスあるある”広告が話題
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR