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

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

 11月末発売予定であったKATO のチビ凸用動力ユニット(品番:11-109)が1ヵ月延期され、クリスマスプレゼントか、あるいはお年玉になるものと思っていました。 しかし、12月初めには突然発売されて驚きました。 クリスマス商戦に間に合わせたのでしょうか。

 この動力を使って早速走らせてみました。 「KATOの新動力を走らせる」(2019/12/6)  そして、今回はこのモデルが楽しめるようなレイアウトにしてみました。

 

■ 今回のレイアウト

 狭い卓上を精一杯使って、長い周回路を構成しました。 さらに欲張って待避線としてのホームを2ヶ所設けました。 このため、追い越し運転が可能となったので、これを生かす運行パターンも考えました。

 まずは、自動運転状態の動画を紹介しましょう。

 

 今回のレイアウトを上から見た状態を下に示します。 Bトレ客車4両は牽引させるために、角部にホームを持ってきて長めの駅にすることが出来ました。 その前後を周回させるループを構成するのに苦労しましたが、グルグル巻きの配置にすることで、無理やりつなげる事が出来ました。 あちこちに無理な接続があるのですが、問題無く走行可能でした。

 駅の部分は、C317、C280、C243、そして C177 のカーブレールを使って構成しています。 待避線では、PWM制御によって発進時と停止時に、加速と減速の制御を実施できるように、給電部 F1 と F2 を設けています。 TOMIX のポイントは完全選択式なので、ギャップを設ける必要はないのですが、入場時のポイント位置と減速を始める位置の関係を考慮し、安全を見て図の位置にギャップを設けています。 減速制御が後続の列車に影響しない様にと配慮したのです。 周回部は制御の必要が無いので、コントローラからの電力を給電ポイント F0 にて直接供給するようにしています。

 通過センサの位置は、停止させるための信号をチェックする sen1 と sen3 を待避線の前の方に設けています。 また、駅を通過した事を検知するために、駅の前方にもセンサーsen2 と sen4 を設けています。  これらの配置状態を下に示します。

 また、空間部には、いつもの様にあり合わせのストラクチャーを並べて賑やかにしています。

 

■ 運行ダイヤの検討

 自動運転を実施するための運行ダイヤを考えまいた。 運行ダイヤを決めて、それに従って走らせる方式の自動運転システムです。 まず、ダイヤ作成の基となる距離を測定しまいた。 と言ってもメジャーで測った訳でなく、テスト車両を走らせて動画を撮影し、その動画を動画編集ソフトを使って、各ポイントを通過する時間をチェックしていっただけです。

 この経過時間を縦軸と横軸にとって下記のようなグラフのもとを作りました。 横軸は縦軸の半分の長さにしています。 各チェックポイントを結んで基本線を引き、センサやポイントの位置を求めました。 そして、この基準線に平行して線を引いて行けば運行ダイヤが作成できるのです。 駅の両側のポイントの位置より、駅の範囲が設定できますし、センサの位置も確定できます。

 まず、二つのホームに停車している列車のうち、手前のホームの列車を発車させ、向こう側のホームで追い越し後に停車している列車を走らせます。 その後、駅を通過させたり、追い越しをさせたりして元の位置に戻った状態でこの運行ダイヤを終了させます。 もし、運行開始スイッチがON あれば、このパターンを繰り返し実行するするようにしておきます。 OFF であればスタートの位置に戻った状態で終了することができ、次回もスムースにスタートできる状態となります。

 すなわち、この運行ダイヤでは、二つのホームにそれぞれ列車が停止している状態からスタートする必要があるのです。 これが意外と面倒なのですが・・・・・・。 そして動力特性の揃った機関車を用意する必要があるのですが、今回のKATOの新動力を使う事にしています。

 

■ ハード回路の構成

 次にホード構成ですが、いままで使ってきたユニットをそのまま使用します。 今回のレイアウトは右回りの一方通行で走らせますので給電制御は簡単になります。 フィーダーから見て右方向に走行させる端子は常にゼロ、即ちGND に接続しておけばよいのです。 通過センサの入力は4本、ポイント駆動の出力も4本、給電はPWM制御端子と2ヶ所の給電のON/OFF で対応できます。

 回路構成を下に示します。  走行速度はコントローラで制御し、加速と減速時のみPWM制御とします。

 

■ プログラムの内容

 運行ダイヤに従ってスケッチを記述しました。 最初のポイントの作動チェックは、繰り返し運行を考慮して、最初の setup() 部で実施しています。

また、最終的にはプログラム実行時にその動きをチェックし、ポイント配線の方向や給電フィーダーの配線方向をチェックします。 もし、逆であれば、ユニットの配線を入れ替えれば簡単に適応できます。

 

// Takujo-8-1
// 2019.12.7

#define SEN1_PIN 19
#define SEN2_PIN 18
#define SEN3_PIN 17
#define SEN4_PIN 16
#define PWM_PIN 5
#define FE1L_PIN 6
#define FE2L_PIN 7
#define POINT1_PIN 8
#define POINT2_PIN 9
#define POINT3_PIN 10
#define POINT4_PIN 11
#define OPE_PIN 12

void setup()
{
  pinMode(SEN1_PIN,INPUT);
  pinMode(SEN2_PIN,INPUT);
  pinMode(SEN3_PIN,INPUT);
  pinMode(SEN4_PIN,INPUT);
  pinMode(PWM_PIN,OUTPUT);
  pinMode(FE1L_PIN,OUTPUT);
  pinMode(FE2L_PIN,OUTPUT);
  pinMode(POINT1_PIN,OUTPUT);
  pinMode(POINT2_PIN,OUTPUT);
  pinMode(POINT3_PIN,OUTPUT);
  pinMode(POINT4_PIN,OUTPUT); 
  pinMode(OPE_PIN,INPUT);

  digitalWrite(FE1L_PIN,LOW);
  digitalWrite(FE2L_PIN,LOW);
  analogWrite(PWM_PIN,0);
  digitalWrite(POINT1_PIN,HIGH);
  delay(500);
  digitalWrite(POINT2_PIN,HIGH);
  delay(500);
  digitalWrite(POINT3_PIN,HIGH);
  delay(500);
  digitalWrite(POINT4_PIN,HIGH);
  delay(500);
  digitalWrite(POINT1_PIN,LOW);
  delay(500);
  digitalWrite(POINT2_PIN,LOW);
  delay(500);
  digitalWrite(POINT3_PIN,LOW);
  delay(500);
  digitalWrite(POINT4_PIN,LOW);
  delay(500);
}

void loop() {
  int sen1;
  int sen2;
  int sen3;
  int sen4;
  int ope;
  int spe;

  ope = digitalRead(OPE_PIN);
  while (ope == HIGH) {       //運行スイッチを待つ
       ope = digitalRead(OPE_PIN) ;
       delay(50);
  }

//STEP1
  digitalWrite(FE1L_PIN,HIGH);  //ホーム1発車
  for(spe=0;spe<256;spe++){
    analogWrite(PWM_PIN,spe);
    delay(5);
  }
  digitalWrite(POINT2_PIN,HIGH);
  delay(500);
  sen2 = digitalRead(SEN2_PIN);
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  digitalWrite(POINT2_PIN,LOW);
  delay(500);

//STEP2
  sen4 = digitalRead(SEN4_PIN);  //列車通過待ち
  while (sen4 == HIGH) {
    sen4 = digitalRead(SEN4_PIN);
    delay(5);
  }
  delay(5000);  //5秒待ち
  digitalWrite(FE2L_PIN,HIGH);  //ホーム2発車
  for(spe=0;spe<256;spe++){
    analogWrite(PWM_PIN,spe);
    delay(5);
  }
  digitalWrite(POINT4_PIN,HIGH);
  delay(500);
  sen4 = digitalRead(SEN4_PIN);
  while (sen4 == HIGH) {
    sen4 = digitalRead(SEN4_PIN);
    delay(5);
  }
  digitalWrite(POINT4_PIN,LOW);
  delay(500);

//STEP3
  sen2 = digitalRead(SEN2_PIN);
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  digitalWrite(POINT3_PIN,HIGH);  //待避線へ
  delay(500);
  digitalWrite(FE2L_PIN,HIGH);



  sen3 = digitalRead(SEN3_PIN);  //ホーム2停車
  while (sen3 == HIGH) {
    sen3 = digitalRead(SEN3_PIN);
    delay(5);
  }
  for(spe=255;spe>-1;spe--){
      analogWrite(PWM_PIN, spe);
      delay(5);
  }
  digitalWrite(FE2L_PIN,LOW);
  digitalWrite(POINT3_PIN,LOW);  //本線設定
  delay(500);

//STEP4
  sen4 = digitalRead(SEN4_PIN);  //列車通過待ち
  while (sen4 == HIGH) {
    sen4 = digitalRead(SEN4_PIN);
    delay(5);
  }
  digitalWrite(POINT1_PIN,HIGH);  //1番ホーム待機設定
  delay(500);
  digitalWrite(FE1L_PIN,HIGH);
  delay(5000);   //5秒待ち
  digitalWrite(FE2L_PIN,HIGH);  //ホーム2発車
  for(spe=0;spe<256;spe++){
    analogWrite(PWM_PIN,spe);
    delay(5);
  }
  digitalWrite(POINT4_PIN,HIGH);
  delay(500);
  sen4 = digitalRead(SEN4_PIN);
  while (sen4 == HIGH) {
    sen4 = digitalRead(SEN4_PIN);
    delay(5);
  }
  digitalWrite(POINT4_PIN,LOW);
  delay(500);

//STEP5
  sen1 = digitalRead(SEN1_PIN);  //ホーム1停車
  while (sen1 == HIGH) {
    sen1 = digitalRead(SEN1_PIN);
    delay(5);
  }
  for(spe=255;spe>-1;spe--){
      analogWrite(PWM_PIN, spe);
      delay(5);
  }
  digitalWrite(FE1L_PIN,LOW);
  digitalWrite(POINT1_PIN,LOW);  //本線設定
  delay(500);

//STEP6
  sen2 = digitalRead(SEN2_PIN);  //列車通過待ち
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  digitalWrite(POINT1_PIN,HIGH); //1番ホーム待機設定
  delay(500);
  digitalWrite(FE1L_PIN,HIGH);
  delay(5000);   //5秒待ち
  digitalWrite(FE1L_PIN,HIGH);  //ホーム1発車
  for(spe=0;spe<256;spe++){
    analogWrite(PWM_PIN,spe);
    delay(5);
  }
  digitalWrite(POINT2_PIN,HIGH);
  delay(500);
  sen2 = digitalRead(SEN2_PIN);
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  digitalWrite(POINT2_PIN,LOW);
  delay(500);

//STEP7
  sen1 = digitalRead(SEN1_PIN);  //ホーム1停車
  while (sen1 == HIGH) {
    sen1 = digitalRead(SEN1_PIN);
    delay(5);
  }
  for(spe=255;spe>-1;spe--){
      analogWrite(PWM_PIN, spe);
      delay(5);
  }
  digitalWrite(FE1L_PIN,LOW);
  digitalWrite(POINT1_PIN,LOW);  //本線設定
  delay(500);

//STEP8
  sen2 = digitalRead(SEN2_PIN);  //列車通過待ち
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  digitalWrite(POINT3_PIN,HIGH);
  delay(500);
  digitalWrite(FE2L_PIN,HIGH);
  analogWrite(PWM_PIN, 255);
  
  sen3 = digitalRead(SEN3_PIN);
  while (sen3 == HIGH) {
    sen3 = digitalRead(SEN3_PIN);
    delay(5);
  }
  for(spe=255;spe>-1;spe--){  //ホーム2停車
    analogWrite(PWM_PIN,spe);
    delay(5);
  }
  digitalWrite(FE2L_PIN,LOW);
  digitalWrite(POINT3_PIN,LOW);  //本線設定
  delay(500);

}

 

 

 

 

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

 

■ 運行状態

 運行状態は、上で紹介した動画のとおりです。 今回も配線ミスやプログラムミスが重なり、かなり苦労しましたがやっと正常に運行させるkとができました。 装置の全体とレイアウトの全景を下に示します。 パワーユニットは N-400 を使用しています。 

 待避中の列車の位置は、外側のホームはぴったりですが、内側のホームはギリギリです。 走行速度を少し早くするとアウトですね。 減速時間を早くする必要が出てきますね。 

 配線状態は、今回もクシャクシャです。 もう少し工夫が必要ですね。

 PICマイコンも使ってみたいと思っているのですが、レイアウトのパターンのアイディアが次々と湧いてくるので、当面は Arduino ですかね。

 次回のテーマはまだ決まていません・・・・・・・・(^−^;)

 

ページトップへ戻る .


 2019/12/10 作成