名刺サイズの超小型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
「Xが情報収集に役立たない……」熊本地震で不満の声続出 「Twitterを返して」
-
2
メルカリ、梨の転売疑惑に「盗品の出品は確認されず」 誹謗中傷には利用制限も
-
3
「こんなのに追われたら……」急斜面もやすやす爆走、中国製の車輪付き四足ロボのデモ動画が話題 最高時速20km超
-
4
検索結果に「詐欺ではありません」と表示させる詐欺手口、警視庁が注意喚起 AI要約も餌食に
-
5
はてな、11億円流出の調査報告書を公開 偽警察、口外禁止、残業・休出200時間超、孤立……ほころびが連鎖
-
6
Z世代に聞く次の流行、「AIイラスト」が1位に 「Claude Code」も上位
-
7
東野圭吾さん死去、Xなどで追悼相次ぐ 「ガリレオ」など数々の人気作、エンジニアから転身
-
8
NVIDIAやMicrosoftなど30社超、オープンAIの防御ツール共同開発の「Open Secure AI Alliance」設立
-
9
農水省の“クソダサ”ポスター話題 「AIよりよっぽど良い」の声も 担当者に狙いを聞いた
-
10
「あ、その情報メモしたい!」を叶えるワイヤレスイヤフォン、Nothing「Ear (3a)」
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR