HOME >> 鉄道模型自動運転システム > 往復運転モデルを作る その3
■ はじめに
システムを制御する電気回路について、ハード回路を制作する前に各要素の機能をそれぞれ検証していく事にする。 今回は速度設定処理回路を検証する。
.
■ 速度設定処理回路の検証
速度設定処理回路もコントロールパネルの裏側に設けることにした。 これは配線を少しでも減らすことを考えたからであるが、今回はとりあえずひとつのチャネルだけ作って検証するので、応急的な配線状態としている。 ボリューム周りの配線具合を下に示す。
.
ボリュームはスイッチ付のもので、スイッチをONにするとLED が点灯するようにして、スイッチの状態を表示するようにしている。
また、ボリュームのGND側にLEDを設けた理由は、ボリュームがmin 状態であってもスイッチがON状態である事を明らかに判別するために、いわゆるゲタを履かせているのである。 そして、このボリュームで設定した電圧値をADコンバータを使用してアナログ値をデジタル値に変更し、ラズパイ本体にはシリアル通信を使って取り込むのである。
まず、そのデジタル値の値を把握するために簡単な実験を実施した。 3.3ボルトを掛けている状態でボリュームの出力電圧を測定した。 測定には、我が教科書とした金丸隆志著の 「カラー図鑑 最新 RaspberryPi で学ぶ電子工作」 に記載されている 06-01-print.py のAD変換された値を読み込むプログラムを活用した。
モニターに表示された結果は、
であった。 スイッチがOFFの状態では、ゼロ近くの値を示すものと思っていたので、少し疑問であるが上記の値を参考にして、Duyt 比を指定することにする。 おおよその計算式として、 duty = ( readadc(...) - 2200 )/20 として計算することにした。 そんなに厳密である必要はないのである。
● ブレッドボードの組み替え
今まで、小さいブレッドボードを何個も使用していたが配線がゴチャゴチャになってきたことと、配線が不足して来たのでラズパイのセットに付属していた大きなブレッドボードやエクステンショウンボードとケーブルを使って配線をし直した。
それでもクシャクシャの状態ですね。 机の上の全体も少しはスッキリした状態になりました。
import RPi.GPIO as GPIO
from time import sleep
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if adcnum > 7 or adcnum < 0:
return -1
GPIO.output(cspin, GPIO.HIGH)
GPIO.output(clockpin, GPIO.LOW)
GPIO.output(cspin, GPIO.LOW)
commandout = adcnum
commandout |= 0x18
commandout <<= 3
for i in range(5):
if commandout & 0x80:
GPIO.output(mosipin, GPIO.HIGH)
else:
GPIO.output(mosipin, GPIO.LOW)
commandout <<= 1
GPIO.output(clockpin, GPIO.HIGH)
GPIO.output(clockpin, GPIO.LOW)
adcout = 0
for i in range(13):
GPIO.output(clockpin, GPIO.HIGH)
GPIO.output(clockpin, GPIO.LOW)
adcout <<= 1
if i>0 and GPIO.input(misopin)==GPIO.HIGH:
adcout |= 0x1
GPIO.output(cspin, GPIO.HIGH)
return adcout
GPIO.setmode(GPIO.BCM)
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)
******* 省略 ******
def direction1(): 運転モード1の関数
while GPIO.input(2) == GPIO.LOW: 出口までスロー運転
duty = (readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)-2200)/20
v2.ChangeDutyCycle(0)
v1.ChangeDutyCycle(duty*2/3)
sleep(0.2)
while GPIO.input(3) == GPIO.LOW: 到着まで全速運転
duty = (readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)-2200)/20
v1.ChangeDutyCycle(duty)
sleep(0.2)
duty = (readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)-2200)/20
v1.ChangeDutyCycle(duty*2/3) 到着するとスロー運転
sleep(2) じっくり時間を取ってから
while GPIO.input(6) == GPIO.HIGH: 停止信号をチェック
sleep(0.2)
while GPIO.input(6) == GPIO.HIGH: 2重チェック
sleep(0.2)
return
def direction2(): 運転モード2の関数
********* 省略 ************
try: メイン部分。走行ダイヤを記述していく。
while True:
direction1() 運転モード1を実行せよ
sleep(1)
direction2() 運転モード2を実行せよ
sleep(1)
except KeyboardInterrupt: プログラム終了 Ctrl+c
pass
v1.stop() PWMの終了
v2.stop()
GPIO.cleanup() ポートのリセット
■ 制御プログラムの検討
今回のハード回路も簡単であったので、さっそく制御プログラムを修正することにした。 新しく追加した速度設定ボリュームを使って電車の速度が調整できるようにする。
AD変換値の読み込みは、readadc と言う関数を使用していますが、その内容は教科書に紹介されている記述をそのままそっくり活用しています。 そして、その値を逐次読み込みながらduty値を計算して運転指令を出す様にしています。 これは、走行途中でも速度を変更できるようにするためです。
また、スロー運転は全速運転の 2/3 に変更しています。 先回の設定の 1/2 では変化が大きすぎたからです。
● プラグラムの自動実行とシャットダウン処理の確認
レイアウトに組み込む場合、ラズパイにモニタやマウス、あるいはキーボードを接続させるのは困難です。 これでは組込型のコンピュータにはなりません。 そこで、電源投入時やスイッチ操作によって、コンピュータと指定のプログラムを操作しなければなりません。 これらの仕掛けは我が教科書に紹介されていましたのでその方法を応用してみました。
まず、指定のプログラムを自動的に起動して実行させる方法として、rc.local ファイル内に、
sudo python /home/pi/TozanTetudo/Goback-model31.pi &
の記述を追加しました。 アァー! 最後の & の記述を忘れていた!
また、シャットダウンの方法は、いろいろ考えていますが、とりあえず、走行ダイヤ記述の最後に命令を追加して、シャットダウンできるかどうかを検証してみました。 即ち、
try: while True: direction1() sleep(2) direction2() sleep(2) direction1() sleep(2) direction2() sleep(2) v1.stop() 後から追記 v2.stop() args = ['sudo','poweroff'] シャットダウン命令 subprocess.Popen(args)
のように、最後の2行にシャットダウン命令を追加したのです。
■ 動画の紹介
これらの検討途中での様子を、今回も動画で紹介します。
登山電車を使用して走行させ、速度調整ツマミを使って調整している様子です。
プログラムの自動実行とシャットダウンを仕組んだ状態です。ラズパイが立ち上がってくるより前に、電車は既に動き出しています。
また、シャットダウンの処理がモタモタしている間に次のステップとして電車が動き出していますね。 これは改良する必要があります。 上記に示す様にPWMのストップ命令を追記することにしました。 全体のON/OFF は足元にあるコンセントのスイッチを使って実施しています。 また、ラズパイをシャットダウンしても3.3V の電源は有効なのですね。 やはり全体をON/OFF するためにスイッチ付コンセントが必要ですな。
■ 今後の進め方
今回の検討で、基本的な要素の機能確認は出来たと判断している。 そして、心配していたプログラムの自動実行とシャットダウンの仕組も確認できた。 そこで、電子回路のハード工作を始めるにあたって、使用するコンピュータをラズパイで進める事に決めた。
ラズパイが無理ならポート数の多い Arduino モデルを使ってもみようとも考えていたのであるが、やっとラズパイで行く決心が付いたのである。 スマホとの連携の可能性もありそうなので・・・・。
● 追記: プログラムの停止方法
ここで、幾つかあるプログラムの停止方法を考えておこう。 停止方法として
などが考えられる。
上記の2は必要ないとして、残りの3っつ場合を実現したいと考えているが、この停止処理に使用出来る入力ポートは二つしか残っていないのである。 まず、強制終了ボタンは必要と判断して、教科書に記述されたいた方法で実施することにする。
昨晩、お風呂の中で思いついた方法として、12V 電源にON/OFF スイッチを設ける案を思いついた。 この12V 電源を一時的に切っておくと電車は停止したままである。 さらに、プログラム開始時にも切って置き、通過センサの明るさ調整を実施するなど初期設定を実施する時間を確保することも出来る。 ただし、センサ類は生きているので誤って操作するとプログラムが進行してしまう恐れがあるが、良しとすることにしよう。
すると、もう一つのポートを上記の4のために使用できることになる。 この機能は、プログラム終了後に電車類がスタート位置に戻っているので、次に使用する場合にはスムースにスタート出来るのである。 実行方法として、走行ダイヤ記述部分にスイッチのON/OFF 状態を判断しながら運転を続けさせ、もしスイッチが入っていればダイヤの繰り返しを中止すれば良いのである。
2017/5/20 作成 M.T.