HOME >> 鉄道模型自動運転システム >  往復運転モデル2の制御

登山鉄道自動運転システム  往復運転モデル2の制御

■ はじめに

 作成した制御回路を使用して少し複雑な往復運転モデルを作った。 今度のモデルには、基本となるいろいろな動作をプログラムに組み込んで、その動作確認をしようとするものである。 その内容を紹介しよう。

 

 ********** 省略 ********************

 def direction1(densha):   運行ルート関数を定義
    GPIO.output(12,GPIO.LOW)  ポイントを設定
    GPIO.output(20,GPIO.LOW)
    if readadc(densha, SPICLK, SPIMOSI, SPIMISO, SPICS) < 1000:
        sleep(0.2) 電車の設定をチェックし、OFFならこの運行を中止
        return
    while readadc(4, SPICLK, SPIMOSI, SPIMISO, SPICS) < 1000 :
        duty = (readadc(densha, SPICLK, SPIMOSI, SPIMISO, SPICS)-2200)/20
        v2.ChangeDutyCycle(0)   最初の通過センサまで減速走行
        v1.ChangeDutyCycle(duty*2/3)
        sleep(0.2)
    sleep(0.2)
    if  GPIO.input(23) == GPIO.LOW:
        alarm()  入線先のホームに電車が停止しているならアラーム関数へ
    while readadc(6, SPICLK, SPIMOSI, SPIMISO, SPICS) < 1000 :
        duty = (readadc(densha, SPICLK, SPIMOSI, SPIMISO, SPICS)-2200)/20
        v1.ChangeDutyCycle(duty) 入線前の通過センサまで全速走行
        sleep(0.2)
    duty = (readadc(densha, SPICLK, SPIMOSI, SPIMISO, SPICS)-2200)/20
    v1.ChangeDutyCycle(duty*2/3) 入線前の通過センサからは減速走行
    sleep(0.2)
    while GPIO.input(23) == GPIO.HIGH: 停止信号をチェック
        sleep(0.2)
        while GPIO.input(23) == GPIO.HIGH: もう一度チェックして完了
            sleep(0.2)
    return
 ********** 省略 ********************
 def alarm() :        アラーム関数を定義
    v1.ChangeDutyCycle(0)   まず、電車を停止
    v2.ChangeDutyCycle(0)
    while GPIO.input(25) == GPIO.LOW:リセットボタンが押されるまで待つ
        sleep(0.2)
    return

 try:          運行ダイヤを記述
    while True:
        direction1(0)   電車0をdirection1 のルートで運行
        sleep(2)
        direction2(0)   電車0をdirection2 のルートで運行
        sleep(2)
        direction3(1)   電車1をdirection13のルートで運行
        sleep(2)
        direction4(1)   電車1をdirection4 のルートで運行
        sleep(2)
 ********** 省略 ********************

■ 制御回路の内容

 往復運転モデル2を検討中のレイアウトを下に再掲載する。

 記述内容を説明しよう。

  1. 運行ダイヤの記述を簡素にするために、面倒でも各運行ルートごとに関数を作ることにした。 その運行関数は、 directionX(dennsha) 定義して、速度設定ボリュームで指定された電車番号を引数で受け渡す。 運行ルートが決まっているので、ポイントの設定と進行方向、さらにチェックするセンサの位置も各ルートごとに決まってしまう。 逆に、各運行ルート関数ごとに設定して置く必要があるのだ。
  2. 、メインプログラムの運行ダイヤの記述部分にて、走行する電車番号を引数にした運行ルート関数を指定しているので、最初のダイヤを実行するためにその運行ルート関数を実行する。
  3. 運行ルート関数の頭で、必要なポイントの設定を行う。
  4. 走行前に、その電車番号の速度設定値をチェックする。 もし、ボリュームのスイッチがOFFであれば、この電車の運行は設定されていないので、この運行をパスさせる。 即ち運行関数を実行せずにリターンさせる。 これによって、4台の電車で運行させるダイヤにおいても、ダイヤの変更なしに少ない電車でも走行させることが出来るはずである。
  5. 次に、最初の通過センサを通過するまで減速走行させる。
  6. 最初の通過センサを通過すると、進行先の入線予定のホームが空いているかチェックする。 もし、電車が停止していると追突するので、アラーム関数を実行させる。
  7. アラーム関数では、まず電車を止めて、設置予定の警告灯を点滅させる予定である。 そして、入線している電車と取り除くなどの処理をしてリセットボタンを押して、この関数を抜ける。 すると元の部分に戻っていくので、運行が再開される。
  8. 運行が再開されると指定された速度で全速走行を実施する。
  9. 入線前の通過センサを過ぎると、再び減速走行させる。
  10. 電車がレールエンドのエンドブロックを押すと、停止信号が発せられるので、この運行を完了する。
  11. 運行が完了すると、メインプログラムの運行ダイヤの記述部分にもどるので、次の運行ルートを実行する。

 進行先の入線予定のホームが空いているかチェックするタイミングは、走行前では停止信号がチェックできないのである。 レールへの電力が供給されていないので、停止しているかどうか判別できないのだ。 また、入線前の通過信号でチェックすると遅すぎると判断してこのタイミングでチェックするようにした。

 このチェックポイントは、複数の電車を走らせようとする場合に生じるいろいろなフェール状態のひとつであり、そのためのフェールセーフ対策である。 そして、その処置方法も決めておく必要があるのだ。 システムを複雑にすればするほどフェールセーフ対策は必要となるが、ほどほどにしておくことにする。 あくまで、個人が楽しむホビーの範疇なのだ。

 

■ テスト走行モード 2-3

 上記の機能を盛り込んだプログラムを走らせてみた。

 

 だんだんプログラムの形が出来上がって来たので、さらに前に進むことにしよう。

ページトップへ戻る .


 2017/6/2 作成  M.T.