前回は線路にセンサーを設置するところまでを解説しました。今回はそのセンサーで模型を制御してみましょう。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()
TPR-105を手で遮ったとき、Maxの状態だと100程度、何もしなければ7〜9程度の値を返しましたので、センサーに捉えられるよう、50以上であれば反転して動作させるようにしてあります。ただし光センサーなので、部屋が明るすぎると反応しないことがあります。その時はフォトセンサーの返り値を大きくするなどして対応してください。
なお「time.sleep(0.01)」はセンサーの読み取り間隔です。あまり大きくしてしまうとセンサーの反応が鈍くなりますので、値を少なめにしています。
次回はこれを元に、もう一歩上の動きができるようにしてみます。
Nゲージの模型をラズパイで動かす “らずてつ”その1――鉄道模型とラズパイをつなぐ
Nゲージの模型をラズパイで動かす “らずてつ”その2――制御の準備
Nゲージの模型をラズパイで動かす “らずてつ”その3――ポイント切り替えを操作する
Nゲージの模型をラズパイで動かす “らずてつ”その4――タイミングを合わせて車両を走らせる
部屋の二酸化炭素濃度を測定しよう ラズパイで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