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

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

 自動運転 その7の2のレイアウトでは運行状態を紹介しましたが、今回はその運行パターンとプログラムを紹介しましょう。、

 

■ 1編成前進走行の運行モデルの検討

 幾つかの走行パターンを組み合わせて運行パターンを構成しました。 その組み合わせを下の表に示します。 そして、その走行パターンを実施する場合の、給電条件、ポイントの制御、さらにその区切りを検知するためのセンサ信号について、一覧表にまとめてみました。

 最初にポイント駆動の作動チェックを兼ねて、ON/OFF操作を入れていますが、作動不良の早期発見にもなります。 また、中間チェックも無駄の様ですが、一つの安心感なのです。 こうして検討した結果を Step としてまとめ、プログラムに記述して行けばプログラムが完成するのです。 シーケンス制御のフローチャートですね。

 このチャートをもとに、Arduino のスケッチに落し込む場合の注意として、Arduino のI/Oと周辺機器の関係付け、および信号レベルを整理しておく必要があります。 そして、センサ系は負論理で構成していますので、スタンバイ時は HIGH で、信号がONの場合は LOW になる事や、ポイント駆動は定位状態はLOW で反位はHIGHで制御することに注意しましょう。 さらに、ここでは給電はフィーダーを差込んだ側から見て、左方向に進む場合には“左”と示しており、FE1L_PINをON させます。 左方向に進む場合はその逆です。

 こうして作成したスケッチを下に示します。 ポイントを操作する場合には、確実な作動を確保するために、時間遅れを挿入しています。 

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

 

// Takujo-7-1
// 2019.12.1

#define SEN1_PIN 19
#define SEN2_PIN 18
#define SEN3_PIN 17
#define SEN4_PIN 16
#define PWM_PIN 5
#define FE1R_PIN 3
#define FE1L_PIN 4
#define FE2R_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(FE1R_PIN,OUTPUT);
  pinMode(FE1L_PIN,OUTPUT);
  pinMode(FE2R_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);
  Serial.begin(9600);
}

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

  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(1000);
  digitalWrite(POINT2_PIN,LOW);
  delay(1000);
  digitalWrite(POINT3_PIN,LOW);
  delay(1000);
  digitalWrite(POINT4_PIN,LOW);
  delay(1000);
  digitalWrite(FE1L_PIN,LOW);
  digitalWrite(FE1R_PIN,LOW);
  digitalWrite(FE2L_PIN,LOW);
  digitalWrite(FE2R_PIN,LOW);
  analogWrite(PWM_PIN,0);
  
  ope = digitalRead(OPE_PIN);
  while (ope == HIGH) {       //運行スイッチを待つ
       ope = digitalRead(OPE_PIN) ;
       delay(50);
  }

  digitalWrite(FE1L_PIN,HIGH);
  digitalWrite(FE2L_PIN,HIGH);
  for(spe=0;spe<256;spe++){
    analogWrite(PWM_PIN,spe);
    delay(5);
  }

  sen3 = digitalRead(SEN3_PIN);
  while (sen3 == HIGH) {
    sen3 = digitalRead(SEN3_PIN);
    delay(5);
  }
  sen1 = digitalRead(SEN1_PIN);
  while (sen1 == HIGH) {
    sen1 = digitalRead(SEN1_PIN);
    delay(5);
  }
   digitalWrite(FE2L_PIN,LOW);
  digitalWrite(POINT1_PIN,HIGH);
  delay(500);
  digitalWrite(POINT4_PIN,HIGH);
  delay(500);
  digitalWrite(FE2R_PIN,HIGH);
  


  sen4 = digitalRead(SEN4_PIN);
  while (sen4 == HIGH) {
    sen4 = digitalRead(SEN4_PIN);
    delay(5);
  }
  sen3 = digitalRead(SEN3_PIN);
  while (sen3 == HIGH) {
    sen3 = digitalRead(SEN3_PIN);
    delay(5);
  }

  digitalWrite(FE1L_PIN,LOW);
  digitalWrite(POINT2_PIN,HIGH);
  delay(500);
  digitalWrite(POINT1_PIN,LOW);
  delay(1000);
  digitalWrite(POINT3_PIN,HIGH);
  delay(50);
  sen4 = digitalRead(SEN4_PIN);
  while (sen4 == HIGH) {
    sen4 = digitalRead(SEN4_PIN);
    delay(5);
  }
  digitalWrite(FE1R_PIN,HIGH);
  delay(50);
  sen2 = digitalRead(SEN2_PIN);
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  digitalWrite(POINT2_PIN,LOW);
  delay(1000);
   
  sen1 = digitalRead(SEN1_PIN);
  while (sen1 == HIGH) {
    sen1 = digitalRead(SEN1_PIN);
    delay(5);
  }
  for(spe=255;spe>-1;spe--){
      analogWrite(PWM_PIN, spe);
      delay(5);
  }
  delay(3000);

  digitalWrite(FE1R_PIN,HIGH);
  digitalWrite(POINT4_PIN,LOW);
  delay(1000);
  digitalWrite(POINT3_PIN,LOW);
  delay(1000);
  for(spe=0;spe<256;spe++){
    analogWrite(PWM_PIN,spe);
    delay(5);
  }
  sen3 = digitalRead(SEN3_PIN);
  while (sen3 == HIGH) {
    sen3 = digitalRead(SEN3_PIN);
    delay(5);
  }
  sen1 = digitalRead(SEN1_PIN);
  while (sen1 == HIGH) {
    sen1 = digitalRead(SEN1_PIN);
    delay(5);
  }

   digitalWrite(POINT3_PIN,HIGH);
  delay(500);
  digitalWrite(FE2R_PIN,LOW);
  digitalWrite(POINT2_PIN,HIGH);
  delay(500);
  digitalWrite(FE2L_PIN,HIGH);
  sen2 = digitalRead(SEN2_PIN);
  while (sen2 == HIGH) {
    sen2 = digitalRead(SEN2_PIN);
    delay(5);
  }
  sen3 = digitalRead(SEN3_PIN);
  while (sen3 == HIGH) {
    sen3 = digitalRead(SEN3_PIN);
    delay(5);
  }
  digitalWrite(FE1R_PIN,LOW);
  digitalWrite(POINT3_PIN,LOW);
  delay(1000);
  digitalWrite(POINT2_PIN,LOW);
  delay(1000);
  digitalWrite(FE1L_PIN,HIGH);
  sen1 = digitalRead(SEN1_PIN);
  while (sen1 == HIGH) {
    sen1 = digitalRead(SEN1_PIN);
    delay(1);
  }
  for(spe=255;spe>-1;spe--){
      analogWrite(PWM_PIN, spe);
      delay(5);
  }
  delay(3000);
}

 

 次に紹介する動画は、KATO のC12を使ってS系客車を牽引させたものです。 このようなミニレイアウトには持ってこいのモデルですね。

 いくつかのトラブルがありましたが、無事に運行できようになりました。 組合せを変えたり2列車での運行などの検討も面白そうですね。 次回は、ハードについて報告することにします。

ページトップへ戻る .


 2019/12/3 作成