HOME >> 鉄道模型自動運転システム > 卓上レイアウトで楽しもう その30
先回の「スケッチの構成に関する一考察」(2021/1/15)で少し紹介した新しいレイアウトでの自動運転の作業を進めています。 そして、やっとのことでテスト走行までたどり着きましたので、その様子を紹介します。
■ 新しいレイアウトの紹介
今回設置したレイアウは、「卓上レイアウトで楽しもう その29」(2021/1/6)のレイアウトを変形させていたのですが、リバース線を含んでいるので、色々な運行モードが考えられました。 そのモード選択をダイヤル方式のロータリスイッチで実施し、スケッチの全体構成を「もぐらたたき方式」で実施してみようと考えたのです。
まずは、概要を紹介するには、テスト走行の様子を見て頂くのが一番だと思います。
まだ、リバース運行は未設定であるが、テスト走行の動画を紹介します。
.
■ レイアウト構成と運行モード
当初考えていたレイアウトとは、少し修正しています。 リバース運行を手前のホームから発車した場合でも可能なように、右の写真のように変更しました。
***************************************************
そして、どの様な運行パターンが可能なのか、メモ用紙に書きながら検討した結果基本パターンとして次に示す4個のパターンを設定する事にしました。
それぞれの運行モードは、手前の1番ホーム、あるいは2番ホームを出発点とし、どちらかのホームに到着して運行を終了させる。 即ち、
ここで、列車が1編成で運行される場合は問題無いのであるが、2編での運行の場合、リバース運行では、到着すべきホームの列車を追い出す操作が必要となるのだ。 その方策は有りそうなので、リバース走行は後回しにしてモード1と2の運行を確立することにした。 その結果を上のテスト走行の動画で紹介した。
ここで示したパターンの応用として、モード1とモード2を同じ方向に走らせ、駅のホームで追い抜きさせる手もあります。 また、後ろから追い立てるあおり運転なども楽しめそうです・・・・・!
■ ハード構成の検討
操作方法は、次のように考えているので、操作スイッチの構成を検討した。
個別/連続運転モードの選択は、今まで使用していた運転スイッチを活用する。 これはトグルスイッチなので、ON/OFF 状態が保持されているので、連続モードの時は常にスイッチがON状態となり、自動的に運行を繰り返すことが出来る。 一方、スタートボタンは押しボタンスイッチを新設しており、押している時だけON になるので操作している時だけON状態である。 この二つのスイッチをORで構成すれば運行のスタート条件を構成することが出来、それもハード回路上で実施出来るのでI/Oポートが節約できます。 選択ダイヤルは先回検討した工作をそのまま採用する。
ポイントの構成は上記のイラストに示す運行モード1の状態を定位として設定して置く。 合計6個のポイントがあるが、ArduinoのI/Oポートを節約するため、P1とP2、およびP3とP4は、まとめて制御する事にする。 このためには、「卓上レイアウトで楽しもう その26 再開する」(2020/11/7)で追加したポイント駆動ユニットを活用する。
列車の通過センサは、列車の到着を検知するセンサS1とS2を設けるるが、運行を始める前に、そこに列車が存在するのかどうかを判断させるため、光センサを使用するのが必須である。 もし、列車がいない場合にはその運行をパスさせる必要があるのだ。 また、周回路には、リバースタイミングを検知する必要があるので、S3とS4の二つのセンサを設置した。
*******************************************************************
問題なのは、ギャップの位置と給電ポイントなのである。
外周路走行中にリバース走行をスムースに切替えるため、中央部にギャップを設けて給電回路のショートを防止する。 こうすると片方のゾーンを走行中に他方のゾーンの切替が実施できるのだ。
そして、当初は各ホームの線路もギャップを設けて外周路とは遮断するつもりであった。 到着すべきホームの列車を追い出す操作や、後から来た列車を停車させる制御のためには、独立した回路が必要なのである。
すると、給電ポイントは外周路を含めて4箇所となり、外周路の両方向進行のためには、2×2個のPWM制御は必要となり、ホーム分を含めると合計6個のPWM制御端子が必要となる。 それも、PWMパルスのタイミングが揃った出力が必要なのである。 その理由は、「卓上レイアウトで楽しもう 自動運転の制御手段」(2020/3/28)で解説しています。 ギャップを跨ぐ時のビックリ/シャックリを避けるためには、タイミングを揃えるのが必要なのです。 すると、
5個のポートしかない Arduino Nano Every では、対応できない・・・・・・・・・・・・・。
ではどうするか?
こうしてホーム線路でのギャップを中止し、ホームへの給電を止めたので、給電ポイントは外周路の2ヶ所だけとなった。 実施した電子回路を下に示します。 余ったのはD2ポートと、RX(D0)およびTX(D1)ポートです。 しかし、テスト中にD13ポートの様子がおかしかったので、D13→D2 に変更しています。 また、いままでのレイアウトでは信号機を設置してきましたが、使用出来るポート数が足りなかったことと、適切な設置場所(直線区間)が無かったため、今回は信号機を設置していません。 少し寂しいな・・・・・・・・。
こうして構成したレイアウトを下に示します。
また、制御箱の内部の配線の状態を下に示す。 もうゴチャゴチャの状態です。
■ スケッチの記述
スケッチの全体構成を下に示します。 その骨子は、各運行モードを関数として記述しておきます。 そして、その内容は今までどうりに while()文を多用した駅伝方式で記述します。 次に、メインループは選択ダイヤルに反応するもぐらたたき方式で記述し、処理の実行部分は運行モードの関数を呼び出すことにします。
呼び出された関数の実行後は、呼び出し元に戻って来て次の命令を実行しますので、何度も関数を呼び出ことができ繰返し運行が可能となります。 例え、同じ関数を呼び出せば同じ運行を何度でも指定できます。
また、運転開始をチェックする UNTEN ポートは、二つのスイッチのOR で構成されているので、連続運転モードが選択されている場合は、メインループをグルグルと継続してまわしていく事になり、連続運転状態を実施することになります。
************************ スケッチの概要 *************************************************
// Every-16-4 #define VOL A6 文字の定義 ---------- void setup() { 初期設定の記述 pinMode(VOL,INPUT); ----------- } void mode1(){ 関数modo1の記述 if (digitalRead(SEN1)==LOW){ //ホームに列車はいるか?負論理 digitalWrite(P12,LOW); 運行内容を駅伝方式で記述 delay(8000); --------- for(i=50;i<255;i++){ //加速する vol=analogRead(VOL)/4; delay(200); analogWrite(F11,vol*i/255); analogWrite(F21,vol*i/255); } while (digitalRead(SEN3) == HIGH) { //S3を待つ vol=analogRead(VOL)/4; delay(100); analogWrite(F11,vol); analogWrite(F21,vol); } ---------- } return; } void mode2() { 関数mode2の記述 if (digitalRead(SEN2)==LOW){ digitalWrite(P12,HIGH); ----------- } return; } void loop(){ メインループ
if (digitalRead(UNTEN)==HIGH){ 運転開始を判断する if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH){ 以下、もぐらたたき方式で記述 mode1(); } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH){ mode2(); } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH){ mode1(); mode1(); } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH){ mode2(); mode2(); } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW){ mode1(); mode2(); } delay (8000); } }
**********************************************************************************************
このスケッチをもとに、最初はモード1とモード2のみのループで実行しましたが、すぐにはOKとはなりませんでした。 あちこちのバグを修正しながら実施した結果、バージョウンが4まで進みました。 修正した部分は、関数の呼び出し方、ホームのセンサの位置、減速度合い設定などいろいろ有りまいた。 減速度の設定ではループの中の analogWrite() の記述が一つ増えたため、今までの設定条件が狂ってきました。
修正してスケッチの内容は次の通りです。
最初に紹介した動画の状態のスケッチ ⇒ Every-16-4.html
選択ダイヤルと運行パターンは、
ダイヤル1: 右回り1回
ダイヤル2: 左回り1回
ダイヤル3: 右回り2回 (同じ関数を2回呼び出している。)
ダイヤル4: 左回り2回 (同じ関数を2回呼び出している。)
ダイヤル5: 右回り1回、続いて左回り1回
のパターンに設定していますが、その内容は、呼び出す関数を順番に記述しているだけなので、簡単に実施できます。
走行させた電車を下に示す。 変更したセンサの位置は、ホームのほぼ中央となりました。
ダイヤル周りに番号ラベルを張って見やすくしました。
■ まとめ
新しいレイアウトともぐらたたき方式によるテスト走行は、問題なく運用できることが確認出来ました。 次はいよいよリバース運行に取り掛かる事にします。
2021/1/23 作成