HOME >> 鉄道模型自動運転システム >  ローカル線の自動運転 スケッチの記述

ローカル線の自動運転 スケッチの記述

 物置部屋のレイアウトにて、そのローカル線の改造工事を実施しています。 先回、プログラム記述のための工夫を紹介しましたが、この方法を使って実施したスケッチの記述方法を紹介します。

 

void kasoku(){           //加速処理
   int i;
    for (i=0;i<20;i++){
      duty = analogRead(VOL)/4*i/20;
      analogWrite(F12PWM,duty);
      analogWrite(F3PWM,duty);
      delay(200);
    }
    return;
}

void gensoku(){           //減速処理
    int i;
    vol = analogRead(VOL)/4;
    gen = analogRead(GEN)/4;
    for (i=0;i<20;i++){
      duty =vol - (vol-gen)*i/20;
      analogWrite(F12PWM,duty);
      analogWrite(F3PWM,duty);
      delay(50);
    }
    return;
}

void kyuden_zero(){          //全給電停止
    digitalWrite(F11,LOW);
    digitalWrite(F12,LOW);
    digitalWrite(F21,LOW);
    digitalWrite(F22,LOW);
    digitalWrite(F31,LOW);
    digitalWrite(F32,LOW);
    return;
}

void point_teii(){            //全ポイント定位
    digitalWrite(POUT1,LOW); delay(100);
    digitalWrite(POUT2,LOW); delay(100);
    digitalWrite(POUT3,LOW); delay(100);
    digitalWrite(POUT4,LOW); delay(100);
    return;
}

void senser_check(char TS){       //通過センサのチェック
  while(digitalRead(TS)==LOW){
      duty = analogRead(VOL)/4;
      analogWrite(F12PWM,duty);
      analogWrite(F3PWM,duty);
      delay(50);
    }
    return;
}

void senser_check_g(char TS){    //減速走行中の通過センサ
    while(digitalRead(TS)==LOW){
      duty = analogRead(GEN)/4;
      analogWrite(F12PWM,duty);
      analogWrite(F3PWM,duty);
      delay(50);
    }
    return;
}

■ 定型処理の関数化

 処理の多くは決まった処理ですので、これらを関数化しておくと、スケッチの記述が簡単になり、かつ、ミスも防止できます。 常套手段ですね。

 今回、関数化した定型処理の一覧を下に示します。 記述内容は右に示しましたので、参考にしてください。

 

kasoku()
加速処理
  停止状態から指定の速度まで順次加速しする。
そのステップは20ステップとする。
指定の速度はVOL から読取って、その1/4の値を duty 値とする。
加速中でも速度調整が出来るように、常にボリュームの値をチェックする。
gensoku()
減速処理
  通常速度から指定の速度まで順次減速する。
そのステップは20ステップとする
減速速度はGEN から読取って、その1/4の値を duty 値とする。
減速中でも速度調整が出来るように、常にボリュームの値をチェックする。
kyuden_zero()
全給電停止
  停止させる場合、PWM 信号のduty値をセロにしても、速度をゼロに落とすことが出来なかったので、方向指定ポートをLOW に落として、速度ゼロを確保する。
速度をゼロにできなかったのは、モータドライバの特性と思われるが理由は不明です。
point_teii()
全ポイント定位
  シーケンス完了後は、全てのポイントを定位に戻しておき、コンデンサに貯めていた電気を放電させておきます。
これは、次の操作が不明であるため、誤動作の防止や安全性の確保のために実施しています。
senser_check()
通過センサのチェック
  通常速度で走行中において、次のチェックポイントに到達するまで走行を維持している状態です。
この状態でも速度調整が可能なように、つねにボリュームを監視して、duty 値を出力させています。
文字情報のセンサ記号を関数の引数としています。 即ちセンサ記号のTS1とか、TS6とかの記号を使って該当するセンサを指定しています。
senser_check_g()
減速走行時の通過センサのチェック
  減速速度で走行中において、次のチェックポイントに到達するまで減速走行を維持している状態です。
この状態でも速度調整が可能なように、つねにボリュームを監視して、duty 値を出力させています。
文字情報のセンサ記号を関数の引数としています。 即ちセンサ記号のTS1とか、TS6とかの記号を使って該当するセンサを指定しています。

 

■ スケッチ記述の例1

 この関数類を活用して記述した例を紹介します。 取り上げた例は、mode5 の 2番ホームから左方向に出発して元の位置に戻ってくる連続運転モードです。

 モード図は次のようになります。

  .

  この場合は、クロス部分でリバースしてから元の位置に戻ってくる必要があるので、パターン図は二つ使用します。 2番ホームから左方向に発車する 21-1番パターン図と、2番ホームに左向きに停車する 32番パターン図を使います。

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

 このパターン図に示された、ポイントとフィーダの設定条件を確認し、モード設定表に書き込みます。

void mode5(){
    digitalWrite(POUT1,HIGH); delay(100);
    digitalWrite(POUT2,LOW); delay(100);
    digitalWrite(POUT3,LOW); delay(100);
    digitalWrite(POUT4,LOW); delay(100);
    digitalWrite(F11,HIGH);
    digitalWrite(F12,LOW);
    digitalWrite(F21,LOW);
    digitalWrite(F22,HIGH);
    digitalWrite(F31,LOW);
    digitalWrite(F32,HIGH);
    kasoku();
    senser_check(TS6);
    digitalWrite(POUT2,HIGH); delay(100);
    digitalWrite(POUT3,HIGH); delay(100);
    digitalWrite(F21,HIGH);
    digitalWrite(F22,LOW);
    senser_check(TS4);   
    gensoku();
    senser_check_g(TS3);
    kyuden_zero();
    point_teii();
    delay(2000);
    return;
}

 そして、パターン図の切り替え点は6番センサの S6 としています。 また、減速開始は2番ホームの入口である S4 とし、停車位置を S3 としました。

 あー! 表は間違えていますね。 S4とS3は逆です! 従って、スケッチの記述も間違えています。 実際に確かめてみなくちゃー!

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

 これだけの準備をしてスケッチの記述作業を始めます。 その内容を右に示しますので参照しながら見て下さい。

  1. モード記述の関数として、void mode5() と宣言する。
  2. ポイントとフィーダー線の設定内容を指定する。
  3. 加速処理関数を呼び出す。
  4. ループ部分の通過センサチェック関数を引数 TS6 で呼び出し走行を維持する。
  5. 次のパターン図に移行したので、変更部分を指定する。
  6. ホーム入場の通過センサチェック関数を引数 TS4 で呼び出し走行を維持する。
  7. ホームに入場したので減速処理関数を呼び出す。
  8. 停止位置のセンサチェックの関数 TS3 を呼び出し、減速速度を維持走行する。
  9. 停止位置に来ると給電を中止する。
  10. 全てのポイントを定位に戻し、2秒待機する。

 注意する点は、採用するモード毎に変化するポイントとフィーダー線の設定内容なので、ここに注目すれば良いのです。

void mode7(){
    digitalWrite(POUT1,LOW); delay(100);
    digitalWrite(POUT2,HIGH); delay(100);
    digitalWrite(POUT3,LOW); delay(100);
    digitalWrite(POUT4,LOW); delay(100);
    digitalWrite(F11,HIGH);
    digitalWrite(F12,LOW);
    digitalWrite(F21,HIGH);
    digitalWrite(F22,LOW);
    digitalWrite(F31,HIGH);
    digitalWrite(F32,LOW);
    kasoku();                  //加速開始
    senser_check(TS6);         //通過点のチェック
    digitalWrite(POUT2,LOW); delay(100);
    digitalWrite(POUT1,HIGH); delay(100);
    digitalWrite(F11,LOW);
    digitalWrite(F12,HIGH);
    senser_check(TS4);       //減速点チェック   
    gensoku();               //減速開始
    senser_check_g(TS3);     //停止点チェック
    kyuden_zero();           //全給電停止
    point_teii();            //全ポイント定位
    delay(2000);

    digitalWrite(POUT1,HIGH); delay(100);
    digitalWrite(POUT2,HIGH); delay(100);
    digitalWrite(F12,HIGH);
    digitalWrite(F22,HIGH);
    digitalWrite(F32,HIGH);
    kasoku();
    senser_check(TS6);
    digitalWrite(POUT1,LOW); delay(100);
    digitalWrite(POUT3,HIGH); delay(100);
    digitalWrite(F12,LOW);
    digitalWrite(F11,HIGH);
    digitalWrite(F22,LOW);
    digitalWrite(F21,HIGH);
    senser_check(TS2);   
    gensoku();
    senser_check_g(TS1);
    kyuden_zero();
    point_teii();
    delay(2000);
    return;
}

 

■ スケッチの記述例2

 今度は、mode7 の場合を紹介します。 このモードでは、1番ホームを発車して2番ホームに停車する。 そして元の1番ホームに戻るというもので、連続運転可能なシーケンスです。

 モード図やモード設定表は、先回の報告の中に示しているので省略しますが、4枚のパターン図を使って構成しています。

 記述したスケッチの関数部分を右にしめします。 途中で2番ホームに停車して一旦給電を停止します。 2秒後に再び発車し、もとの1番ホームに戻ってきます。

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

 この様子を動画で紹介しましょう。

 

 各シーケンスは正常に作動しています。 シメシメです。 また、Bトレの室内灯もいいですね。

 

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

 今、バラバラにしてしまった建物の配置変えや、レイアウトの追加工作を実施していますので、次回はその様子を報告しょう。

 

ページトップへ戻る .


 2023/3/11 作成