HOME >> 鉄道模型自動運転システム >  卓上レイアウトで楽しもう その30−1

卓上レイアウトで楽しもう 自動運転 その30ー1

 先回の続きとして、リーバース走行を含む運転モード3と4について検討を実施した。 今回はその応用として、1番と2番ホームに列車が停車している場合を主に紹介しよう。

 

 

 .

■ レイアウト構成と運行モード

 レイアウト構成と電気回路の構成は先回のままである。 そして、運転モード3と4についてスケッチを記述後にテスト走行を実施し、問題無いことを確認した。 そこで、その応用として、1番と2番ホームに列車が停車している場合を運行モード5として検討した。

 その運行内容は、

  1. 1番ホームを出発して外周路を右回りに走行し、途中からリバース走行に入り左回りで、2番ホームをめざす。
  2. 2番ホームに近づくと、2番ホームの列車を発車させる。 この操作はポイントの切り替えで実施する。
  3. 2番ホームに入線すると列車を停車させる。 この操作もポイントの切り替えで実施する。
  4. 2番ホームを出発した列車は、外周路を左回りに走行し、途中からリバース線を走行して方向点検し、右回りの状態で1番ホームに入線する。
  5. 1番ホームに入線した列車を減速させて停止させる。

 ここで、2番ホームでの発車と停車を独立して制御させたいのであるが、給電のための出力ポートや、ポイント切り替えの出力ポートが不足しているため、両側のポインの同時操作が強いられるので、上記の様なシーケンスとなっている。

 

■ スケッチの記述

 上記のシーケンスを具体化するスケッチを記述した。 全体構成は先回と同じであるが、運転モード関数として、 mode3()、mode4()、mode5() を追加した。 mode5() の構成とメインループの構成を要約すると、下記の様になる。

 運転モード関数のシケンスの記述は、主に while() 文を使用した駅伝方式で記述している。 while() 文と for() 文以外は省略せずに示しているが、ポイント操作と給電制御のタイミングについては、給電状態のショート防止を配慮しながら設定している。 その順番を間違えると、線路を通して給電電圧のプラスとマイナスが連通してしまう恐れがあるのである。 リバース走行での注意点なのである。

 また、ポイント操作の後は、操作時間を考慮して delay(8000) を挿入しているが、8000ミリ秒ではありません。 PWN キャリヤ周波数を 20KHz にアップしているので、同じタイマーを使用している関係上、秒刻みが20倍になっています。 即ち、実際の時間は、8000÷20=400 ミリ秒なのです。

 また、ホームに列車が居ない場合はこの運行モードが実施出来ませんので、メインループに戻るようにしていますが、下にしめすように今回は最初の部分で return を掛けるようにしました。

      スケッチの詳細  ⇒ Every-16-6.html

  ************************ スケッチの要約 *************************************************

// Every-16-6

・・・・・・・・・・・・・・・・・・
void mode5(){    関数 mode5 の記述
    if (digitalRead(SEN1)==HIGH){    1番ホームに列車が居ない場合は中止。負論理
          return;
    }
    if (digitalRead(SEN2)==HIGH){    2番ホームに列車が居ない場合も中止。負論理
          return;
    }
    digitalWrite(P12,LOW);    各ポイントを定位にしておく
    delay(8000);
    ・・・・・・・・・
   for(i=50;i<255;i++){      1番ホームに列車を加速する
      ・・・・・・・・・
    }   while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      ・・・・・・・・;
    }
    digitalWrite(P6,HIGH);        //リバースを設定する
    delay(8000);
    digitalWrite(P34,HIGH);
    delay(8000);
    digitalWrite(P12,HIGH);
    delay(8000);
    analogWrite(F21,0);
    analogWrite(F22,vol);

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
     ・・・・・・・・・
    }
    digitalWrite(P6,LOW);        //リバース設定を戻す
    delay(8000);
    analogWrite(F11,0);
    analogWrite(F12,vol);
    analogWrite(F22,vol);

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      ・・・・・・
    }
    digitalWrite(P34,LOW);    //ポイントをつないで2番ホームの列車を発車させる。
    delay(30000);             //ホームの列車が出ていくまで待つ。
 
    while (digitalRead(SEN2) == HIGH) {     //停車センサS2を待つ
      ・・・・・・・
    }
    delay(8000);
    digitalWrite(P34,HIGH);     //2番ホームを遮断して列車を停止させる。
    delay(8000);

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      ・・・・・・・
    }
    digitalWrite(P5,HIGH);       //リバースを設定する
    delay(8000);
    analogWrite(F22,0);
    analogWrite(F21,vol);
    delay(8000);

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      ・・・・・・・・
    }
    analogWrite(F12,0);
    analogWrite(F11,vol);
    digitalWrite(P12,LOW);     //1番ホームに入線させる
    delay(8000);
    
    while (digitalRead(SEN1) == HIGH) {     //S1を待つ
      ・・・・・・・・・
    }

    for(i=255;i>50;i--){     //減速
     ・・・・・・・・・
    }
    delay(8000);
    analogWrite(F11,0);    //停車
    analogWrite(F21,0);
    delay(8000);
    return;
}

void loop(){  メインループ
  if (digitalRead(UNTEN)==HIGH){    運転開始を判断する。以下、もぐらたたき方式で記述 
    if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode1();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode2();
    } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode1();
      mode1();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode2();
      mode2();
    } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode1();
      mode2();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode3();
    } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode4();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode5();
    }
    delay (8000);
  }  
}

   **********************************************************************************************

 選択ダイヤルと運行パターンは、

ダイヤル1:  右回り1回
ダイヤル2:  左回り1回
ダイヤル3:  右回り2回 (同じ関数を2回呼び出している。)
ダイヤル4:  左回り2回 (同じ関数を2回呼び出している。)
ダイヤル5:  右回り1回、続いて左回り1回
ダイヤル6:  1番ホームからリバース走行して2番ホームへ
ダイヤル7:  2番ホームからリバース走行して1番ホームへ
ダイヤル8:  1番ホームから2番ホームの列車を追い出してそのホームへ、追い出されて列車はリバース走行して1番ホームへ。

のパターンに設定しています。 今回はダイヤル6以降を追加しました。

 

■ テスト走行の実施

 このスケッチをもとに、テスト走行を実施しました。 Arduino への書込みは、何時もの様に(下左の写真)USBケーブルをつないで実施しています。 今回もI/Oポートが不足していたのでD11とD12ポートを使用していまので、書込みは、下右の写真のように、電源入力端子VIN線を取り外した状態で書込みを実施しています。 D11とD12ポートを使用していない時はこの様な面倒な操作は必要ないのですが・・・・。

 でもいくつものトラブルがやはり発生しました。 まず、6個のミニポイントと小さなS字カーブがあるため、脱線事故が多発しました。 手持ちのBトレ電車を持ち出してあれこれ走行させたいり、重りを追加して車体を重くして見ました。 そして、名鉄の2000系と2200系の下右の写真のような車両に落ち着きました。 

 レイアウト側でも、センサ検知の不安定さによるシーケンス不良が発生し、不良が多発したS4センサぶは、ダブルセンサとしました。 下左の写真。

 やはり無理のあるレイアウトなのでしょうかね。 それでもなんとか走行出来るようになりましたので、運行状況を紹介します。

 

 PWM制御のキャリヤ周波数を20KHzにしていますので、キーンと言う独特の音はしていません。 ただシャーという車輪の走行音と、ポイント切替えじ発するガシャンという音しか聞こえない静かな環境で楽しんでいます。 また、最後のダイヤル8では、連続運転スイッチをONにしているため、同じ運行を繰り返しています。

     **************************************************************************

 昨日、I/Oポートの多い Arduino MEGA を注文しましたので、このマイコンに挑戦してみたいと思います。 駅構内での独立制御、信号機の追加、あるいは操作ミスを知らせる警告音などのアイディアを考えています。

 

ページトップへ戻る .


 2021/1/26 作成