So-net無料ブログ作成
検索選択

単線自動閉塞 その5 [単線自動閉塞]

P1060317.JPG

往復の信号機制御のスケッチを考えていきます。

「単線自動閉塞 その2」のスケッチでは、センサーが反応したら信号機が切り替わるというスケッチを書きましたが、考え方を変えて「各信号機がどのような条件の時に、どのLEDを点灯させるのか?」というふうに個別にスケッチしていきます。

1.初めに「てこ」と連動する信号機のスケッチです。

閉塞区間A.jpg

車両が存在しない場合「てこ」を上り側にすると、「SIG_1」から「SIG_4」の上り信号機は「G」になります。
(「てこ」を下り側にすれば、上り信号は「R」下り信号は「G」ですね)

それをスケッチすると、

void loop() {
  if (digitalRead(TEKO) == HIGH) {    //てこ上り
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_3R, LOW);
    digitalWrite(SIG_4R, LOW);
    digitalWrite(SIG_1G, HIGH);
    digitalWrite(SIG_2G, HIGH);
    digitalWrite(SIG_3G, HIGH);
    digitalWrite(SIG_4G, HIGH);


    digitalWrite(SIG_5G, LOW);
    digitalWrite(SIG_6G, LOW);
    digitalWrite(SIG_7G, LOW);
    digitalWrite(SIG_8G, LOW);
    digitalWrite(SIG_5R, HIGH);
    digitalWrite(SIG_6R, HIGH);
    digitalWrite(SIG_7R, HIGH);
    digitalWrite(SIG_8R, HIGH);
  }
  if (digitalRead(TEKO) == LOW) {    //てこ下り
    digitalWrite(SIG_1G, LOW);
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_3G, LOW);
    digitalWrite(SIG_4G, LOW);
    digitalWrite(SIG_1R, HIGH);
    digitalWrite(SIG_2R, HIGH);
    digitalWrite(SIG_3R, HIGH);
    digitalWrite(SIG_4R, HIGH);

    digitalWrite(SIG_5R, LOW);
    digitalWrite(SIG_6R, LOW);
    digitalWrite(SIG_7R, LOW);
    digitalWrite(SIG_8R, LOW);
    digitalWrite(SIG_5G, HIGH);
    digitalWrite(SIG_6G, HIGH);
    digitalWrite(SIG_7G, HIGH);
    digitalWrite(SIG_8G, HIGH);
  }

動作は、

トグルスイッチの切り替えで、上りと下りの切り替えができます。

次に、信号機を1基づつ片づけていきます。

まずは、「SIG_2」から、

2.車両が「SEN_2」を通過したら、「G」を消灯してから「R」点灯にする。
(「SEN_2」が反応するのは「上り」しかないので「G」→「R」以外ない)

閉塞区間B.jpg

  //SIG_2
  if (digitalRead (SEN_2) == HIGH) {
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_2R, HIGH);    //R現示
  }

3.車両が「SEN_3」を通過したら、「R」を消灯してから「Y」点灯にする。


  閉塞区間C.jpg

 if (digitalRead(SEN_3) == HIGH) {
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_2Y, HIGH);    //Y現示
  }

4.車両が「SEN_4」を通過したら、「Y」を消灯してから「G」点灯にする。

閉塞区間D.jpg

  if (digitalRead(SEN_4) == HIGH) {
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_2G, HIGH);    //G現示
  }

以上が、「SIG_2」の動きです。

これまでのスケッチです。

*****************************
#define TEKO 54

#define SEN_1 22
#define SEN_2 23
#define SEN_3 24
#define SEN_4 25
#define SEN_5 38
#define SEN_6 39
#define SEN_7 40
#define SEN_8 41

#define SIG_1G 26
#define SIG_1Y 27
#define SIG_1R 28
#define SIG_2G 29
#define SIG_2Y 30
#define SIG_2R 31
#define SIG_3G 32
#define SIG_3Y 33
#define SIG_3R 34
#define SIG_4G 35
#define SIG_4Y 36
#define SIG_4R 37
#define SIG_5G 42
#define SIG_5Y 43
#define SIG_5R 44
#define SIG_6G 45
#define SIG_6Y 46
#define SIG_6R 47
#define SIG_7G 48
#define SIG_7Y 49
#define SIG_7R 50
#define SIG_8G 51
#define SIG_8Y 52
#define SIG_8R 53

void setup() {
  pinMode(TEKO, INPUT);    //DN6851使用

  pinMode(SEN_1, INPUT);
  pinMode(SEN_2, INPUT);
  pinMode(SEN_3, INPUT);
  pinMode(SEN_4, INPUT);
  pinMode(SEN_5, INPUT);
  pinMode(SEN_6, INPUT);
  pinMode(SEN_7, INPUT);
  pinMode(SEN_8, INPUT);

  pinMode(SIG_1G, OUTPUT);
  pinMode(SIG_1Y, OUTPUT);
  pinMode(SIG_1R, OUTPUT);
  pinMode(SIG_2G, OUTPUT);
  pinMode(SIG_2Y, OUTPUT);
  pinMode(SIG_2R, OUTPUT);
  pinMode(SIG_3G, OUTPUT);
  pinMode(SIG_3Y, OUTPUT);
  pinMode(SIG_3R, OUTPUT);
  pinMode(SIG_4G, OUTPUT);
  pinMode(SIG_4Y, OUTPUT);
  pinMode(SIG_4R, OUTPUT);
  pinMode(SIG_5G, OUTPUT);
  pinMode(SIG_5Y, OUTPUT);
  pinMode(SIG_5R, OUTPUT);
  pinMode(SIG_6G, OUTPUT);
  pinMode(SIG_6Y, OUTPUT);
  pinMode(SIG_6R, OUTPUT);
  pinMode(SIG_7G, OUTPUT);
  pinMode(SIG_7Y, OUTPUT);
  pinMode(SIG_7R, OUTPUT);
  pinMode(SIG_8G, OUTPUT);
  pinMode(SIG_8Y, OUTPUT);
  pinMode(SIG_8R, OUTPUT);

}

void loop() {
  if (digitalRead(TEKO) == HIGH) {    //てこ上り
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_3R, LOW);
    digitalWrite(SIG_4R, LOW);
    digitalWrite(SIG_1G, HIGH);
    digitalWrite(SIG_2G, HIGH);
    digitalWrite(SIG_3G, HIGH);
    digitalWrite(SIG_4G, HIGH);


    digitalWrite(SIG_5G, LOW);
    digitalWrite(SIG_6G, LOW);
    digitalWrite(SIG_7G, LOW);
    digitalWrite(SIG_8G, LOW);
    digitalWrite(SIG_5R, HIGH);
    digitalWrite(SIG_6R, HIGH);
    digitalWrite(SIG_7R, HIGH);
    digitalWrite(SIG_8R, HIGH);
  }
  if (digitalRead(TEKO) == LOW) {    //てこ下り
    digitalWrite(SIG_1G, LOW);
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_3G, LOW);
    digitalWrite(SIG_4G, LOW);
    digitalWrite(SIG_1R, HIGH);
    digitalWrite(SIG_2R, HIGH);
    digitalWrite(SIG_3R, HIGH);
    digitalWrite(SIG_4R, HIGH);

    digitalWrite(SIG_5R, LOW);
    digitalWrite(SIG_6R, LOW);
    digitalWrite(SIG_7R, LOW);
    digitalWrite(SIG_8R, LOW);
    digitalWrite(SIG_5G, HIGH);
    digitalWrite(SIG_6G, HIGH);
    digitalWrite(SIG_7G, HIGH);
    digitalWrite(SIG_8G, HIGH);
  }

  //SIG_2
  if (digitalRead (SEN_2) == HIGH) {
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_2R, HIGH);    //R現示
  }
  if (digitalRead(SEN_3) == HIGH) {
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_2Y, HIGH);    //Y現示
  }
  if (digitalRead(SEN_4) == HIGH) {
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_2G, HIGH);    //G現示
  }
}
****************************

動かしてみます。

世の中、事はそううまくは運びません。(-_-;)

スケッチが間違ってるわけではありません。

「G」が点灯しっぱなしなだけなんです。

void loop() {
  if (digitalRead(TEKO) == HIGH) {    //てこ上り
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_3R, LOW);
    digitalWrite(SIG_4R, LOW);
    digitalWrite(SIG_1G, HIGH);
  digitalWrite(SIG_2G, HIGH);  ←これが原因です

Arduinoのループプログラムが原因なのです。

ちゃんと「SEN_2」を通過したら「G」を消して「R」は点いています。

「SEN_3」も「SEN_4」も働いているのですが、プログラムの最終行が終わるとvoid loop() の先頭行から目にも止まらぬは速さで処理を繰り返しているのです。

「てこ」が上りに入っている限り「G」は消えてくれません。

いろいろ手を尽くしたのですが、親爺ぃの頭ではお手上げ状態です。

まるで函谷関の城壁のような分厚い壁に拒まれました。

親爺ぃの性格から、この単線自動閉塞が未完で終わることはレイアウト製作はヤル気がなくなり、プログの終焉となってしまいます。

P1060324.JPG

そんなことをトグルスイッチを見つめながら考えていると・・・・・・。

閃いた!

正確には思い出したのです。(最近物忘れが・・・(-_-;)

あれだ!あれを使えばこの境地を打開することができそうです。

早速過去記事を探してみると、行けそうです。

って、ことで今回はここまで。

次回につづく。

このプログラムって要約すると非常に簡単なことをさせるだけです。

問題にしましたので、我こそはと思う方はコメント欄に答えをお願いします。

<問題>
問題.jpg

図のようにD22ピンに繋いだLEDを点灯後消灯させてください。

なお、スケッチはviod loop()内で書くこと。

スイッチとか付け足してはいけません。

derayも使ってはいけません。


タグ:Arduino
コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0