So-net無料ブログ作成
検索選択
単線自動閉塞 ブログトップ
前の10件 | -

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

4灯式の「かっこいい」の言葉にひかれて、このまま続けていこうと思います。

単線自動閉塞ブロック9.jpg
(センサーと出発反応標識を追加)

引き続き、中間駅側「JONAI_3」です。

「R」の現示の条件。

1.「てこ」が上り。

2.ポイントが「反位」。

3.「SEN_D7」がON。(在線あり)

「YG」(減速)の条件。

1.「てこ」が下り。

2.ポイントが定位。

3.「SEN_D7」がOFF。(在線なし)

4.次のブロックの信号が「Y」現示。

「G」(進行)の条件。

1.「てこ」が下り。

2.ポイントが定位。

3.「SEN_D7」がOFF。(在線なし)

4.次のブロックの信号が「G」現示。

最後に、「SPATU_1」です。

「R」の現示の条件。

1.「てこ」が下り。

2.ポイントが「反位」。

3.「SIG_2」がR現示。

4.「SEN_D7」がON。

「YG」現示の条件。

1.「てこ」が上り。

2.ポイントが「定位」。

3.「SIG_2」がY現示。

4.「SEN_U10」がON

「G」現示の条件。

1.「てこ」が上り。

2.ポイントが「定位」。

3.「SIG_2」がG現示。

4.「SEN_U10」がON

「SEN_U10」は、イラスト右端から車両が進入して、在線を検知。

これにより、在線が無いときは、「R」を現示したままになります。

とは書いてはみたものの、1番線は特急通過があるので、これでは間に合いません。(-_-;)

「SPATU_1」は、在線が無くても条件が揃えば「Y」なり「G」を現示するようにします。

「SPATU_2」は、停車車両があるので「SEN_U9」がONの条件を付けます。

各出発反応標識は、出発信号機に連動して、出発信号が「G」か「Y」の時に「Y(橙?)」点灯させます。

以上で、見落としがあるかもしれませんが、各信号機の現示条件が出揃いました。

さて、実験線の増設工事をしてプログラムを組んでいきます。


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

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

前記事は忘れてください?

センサーが足りませんでした。(-_-;)

話が複雑になるので、イラストを印刷して見比べながら読むと、分かりやすいかもしれません。

単線自動閉塞ブロック7.jpg

仕切り直しです。

始めに、B駅(終着駅)側の信号機、「JONAI_1」から。

「R」の現示の条件。

1.「てこ」が下り。

2.ポイントが反位。

3.「SEN_U7」がON。(在線あり)

「Y」の現示の条件。

1.「てこ」が上り。

2.ポイントが定位。

3.「SEN_U7」がOFF。(在線なし)

次に、「JONAI_2」です。

「R」の現示の条件。

1.「てこ」が下り。

2.ポイントが定位。

3.「SEN_U7」がON。(在線あり)

「Y」の現示の条件。

1.「てこ」が上り。

2.ポイントが反位。

3.「SEN_U8」がOFF。(在線なし)

次に、「SPATU_3」です。

「R」の現示の条件。

 1.「てこ」が上り。

2.ポイントが反位。

3.「SIG_7」が「R」現示

4.「SEN_D1」がON。

「Y」の現示の条件。

1.「てこ」が下り。

2.ポイントが定位。

3.「SIG_7」が「Y」現示。

4.「SEN_D1」がON。(ホームに在線がなければ「R」現示)

「G」の現示の条件。

1.「てこ」が下り。

2.ポイントが定位。

3.「SIG_7」が「G」現示。

4.「SEN_D1」がON。(ホームに在線がなければ「R」現示)

次に、「SPATU_4」です。

「R」の現示の条件。

 1.「てこ」が上り。

2.ポイントが定位。

3.「SIG_7」が「R」現示

4.「SEN_D2」がON。

「Y」の現示の条件。

1.「てこ」が下り。

2.ポイントが反位。

3.「SIG_7」が「Y」現示。

4.「SIG_7」が「G」現示。

4.「SEN_D2」がON。(ホームに在線がなければ「R」現示)

A駅(中間駅)側の信号機です。

こちらの1番線は、特急通過を考慮して4灯式信号機を配置しています。

「JONAI_4」と「SPATU_2」は、B駅側「JONAI_2」と「SPATU_4」に準拠します。

4灯式信号の「SPATU_1」から。

4灯式信号機.jpg

むむ?

「減速」と「注意」はどうすればいいのでしょうか?

「SIG_2」が「G」なら、「進行」は分かるのですが、

「SIG_2」が「Y」なら、「減速」なのか「注意」なのか、どっちなんでしょ?

「SIG_3」まで見ればいいのかな?

いっそ、3灯式にしてしまおうか、悩んでいます。


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

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

「単線自動閉塞」ファンの皆さま、ご無沙汰しています。 

A駅を中間駅、B駅を終着駅にしてみることにしました。

単線自動閉塞ブロック6.jpg 

これでやって行こうと思います。

 新しく加わった信号機の点灯条件を考えていきます。

始めに、B駅(終着駅)側の信号機、「JONAI_1」から。

1.「てこ」が下りなら「R」現示。

2.1番線に在線があるなら「R」現示。

3.「てこ」が上り&ポイントが定位&1番線に在線無しなら「Y]現示。

G現示は条件が無いので、無点灯です。

次に、「JONAI_2」です。

1.「てこ」が下りなら「R」現示。

2.2番線に在線があるなら「R」現示。

3.「てこ」が上り&ポイントが反位&2番線に在線なしなら「Y]現示。

G現示は条件が無いので、無点灯です。

「JONAI_1」と「JONAI_2」の違いはポイントが定位か反位の違いだけ

次に、「SPATU_3」です。

1.「てこ」が上りなら「R」現示。

2.「てこ」が下り&ポイントが定位&「SIG_7」が「Y」なら「Y」現示。

3.「てこ」が下り&ポイントが定位&「SIG_7」が「G」なら「G」現示。

1.「てこ」が上りなら「R」現示。

2.「てこ」が下り&ポイントが定位&「SIG_7」が「Y」なら「Y」現示。

3.「てこ」が下り&ポイントが定位&「SIG_7」が「G」なら「G」現示。

次に、「SPATU_4」です。

1.「てこ」が上りなら「R」現示。

2.「てこ」が下り&ポイントが反位&「SIG_7」が「Y」なら「Y」現示。

3.「てこ」が下り&ポイントが反位&「SIG_7」が「G」でも「Y」現示。

ところで、出発信号って、本物では指令所からダイヤに合わせて指示を出すと思うのですが、手動運転では、出発出来る条件が揃ったところで、押しボタンで「G」なり「Y」を現示したほうがいいのでしょうか?

それとも1番線、2番線に車両の在線が無くても、出発出来る条件が揃ったら「G」なり「Y」を現示しちゃっていいのでしょうか?

ホームに車両が居ないのに「G」とかって変でしょうか?

どうなんでしょうね?

<追記>
出発信号は、sinさんのアドバイスで、

>”司令所”=”運輸指令”は制作者である貴方です!

って、ことなので、ホームに在線が無くても、出発出来る条件が揃ったら「G」なり「Y」を現示しちゃいます。


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

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

閉塞信号機の制御が出来ましたので、いよいよ場内信号機・出発信号機の登場です。 


単線自動閉塞ブロック3.jpg
(作業机の上に並べ切れるのかが、最大の問題のような(-_-;))


A駅・B駅ともに、普通列車は後続の特急列車の通過待ち合わせをする駅です。

作業机のスペースの都合上どちらも終着駅に見えますが中間駅です。

こないだ内、レイアウトを解体してジオラマ化していた土佐北川駅はこの手の駅とは違います。
(後続の通過待ち合わせは無し)

あっ!そうそう、土佐北川駅ファンの方々に朗報です。

ジオラマ化は止めて、新レイアウトに組み込むことになりました。

「1駅作る手間を省いたのだろう」というツッコミは正解ですけどね。 

新レイアウトの妄想の中にもこのタイプの駅はありませんが、お勉強のためにあえてハードルを上げてみました。(-_-;)

(間違って買ってしまった、GMの4灯式信号機を使いたい気持ちもありました。)

 前置きが長くなりましたが、本題に入ります。

ブログを書いてる今気づいたのですが・・・・(またかよ) 

どちらも同じタイプの駅では芸がない(ゲイではない)ので、B駅は終着駅(注射液ではない)に変えようかな?

と、なると場内信号機が違ってくるのかな?

ちと、考えますので、本日はこれにて失礼します。 


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

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

このシリーズもいつのまにか7回目、ラッキー7という縁起のいい回になりました。

P1060330.JPG

ヤフオクで落札したPECOのPL-26も到着しました。

暗闇の中からの脱出を図りましょう。

はじまり、はじまり。

行き詰ったときは神頼みに限ります。(そっちかい)

千日回峰行、滝行、丑の刻参り、お遍路さん、ついでに、こっくりさんまでやったのですが、一向に答えは出てきません。

日頃の信心の無さを見抜かれてしまっているのでしょうか、仕方ないので自分で考えますか。

単線自動閉塞2.jpg

そもそも、「てこ」の上り下りの判定を、ケチってD54ピンのみでやったのが間違いの元だったのではないでしょうか?

単線自動閉塞6.png
(起動時はPECOポイントスイッチが「OFF」状態ですので、信号機は全消灯状態です。「てこ」を切り替えると点灯します)

そこで、上りはD54ピン、下りはD55ピンと別々に受け持ってもらいます。

スケッチも変更します。

#define TEKO_NOBORI 54  //上り
#define TEKO_KUDARI 55 //下り
を、追加&変更。

void setup()内、
  
pinMode(TEKO_NOBORI, INPUT);    //DN6851使用
pinMode(TEKO_KUDARI, INPUT);    //DN6851使用
を、追加&変更。

void loop() 内の、
 if (digitalRead(TEKO_KUDARI) == HIGH) {    //てこ下り
の、追加。

今度はどうでしょうか?

うまく行く予感がします。(ぬか喜びかも)


(SIG_2のみに注目してください)

U\(●~▽~●)Уイェーイ!

Arduinoのループ沼から脱出することが出来ました。

後は各信号機を条件に沿って書いていけばいいのですが、、、、、、その前に。

ローカル単線とはいっても、泣く子も黙る「土讃線」です。

閉塞区間後続11.jpg
<イラスト1>

後続列車の「南風太郎」が「おじゃまします~ぅ」と第2閉塞区間まで進入してくることが想定されます。

(それを言うなら、「南洲太郎」だろ?ってツッコミを入れたあなた、歳がバレますぜ)

前回の「SIG_2」のスケッチです。

  //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現示
  }

このスケッチは後続列車は無しのときのスケッチです。

「SEN_2」を通過したときに、「G」を消して「R」を点灯しただけです。

<イラスト1>を見てください?

「Y」のときにも、後続に「SEN_2」は通過されることもあるのです。

そこで、

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

「Y」も消すスケッチを追加します。

「R」のときはそのままです。

「SEN_3」は、

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

ここまで来ると各センサーの反応と「SIG_2」の点灯の関連性が解ると思います。

3灯式信号機は、かならずどれか1つの色が点灯します。

「SIG_2」は「SEN_2」が反応したら、必ず「R」、「SEN_3」が反応したら、必ず「Y」です。

それ以外の2色はすべて消してしましょう。

さて、次はいよいよ両端に通過待ちの出来る駅を設置して(ポイントも)「場内信号」「出発信号」の制御をして単線自動閉塞の完成を目指します。

最後に、単線自動閉塞の閉塞区間の完成動画とスケッチをご覧いただき、本日はこれにてお別れです。

(「SIG_8」は「SEN_8」を踏んでいないので「G」のままになっています。)

#define TEKO_NOBORI 54  //上り
#define TEKO_KUDARI 55  //下り

#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_NOBORI, INPUT);    //DN6851使用
  pinMode(TEKO_KUDARI, 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_NOBORI) == HIGH) {    //てこ上り
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_3R, LOW);
    digitalWrite(SIG_4R, LOW);
    digitalWrite(SIG_1Y, LOW);
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_3Y, LOW);
    digitalWrite(SIG_4Y, 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_5Y, LOW);
    digitalWrite(SIG_6Y, LOW);
    digitalWrite(SIG_7Y, LOW);
    digitalWrite(SIG_8Y, LOW);
    digitalWrite(SIG_5R, HIGH);
    digitalWrite(SIG_6R, HIGH);
    digitalWrite(SIG_7R, HIGH);
    digitalWrite(SIG_8R, HIGH);
  }
  if (digitalRead(TEKO_KUDARI) == HIGH) {    //てこ下り
    digitalWrite(SIG_1G, LOW);
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_3G, LOW);
    digitalWrite(SIG_4G, LOW);
    digitalWrite(SIG_1Y, LOW);
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_3Y, LOW);
    digitalWrite(SIG_4Y, 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_5Y, LOW);
    digitalWrite(SIG_6Y, LOW);
    digitalWrite(SIG_7Y, LOW);
    digitalWrite(SIG_8Y, LOW);
    digitalWrite(SIG_5G, HIGH);
    digitalWrite(SIG_6G, HIGH);
    digitalWrite(SIG_7G, HIGH);
    digitalWrite(SIG_8G, HIGH);
  }

  //SIG_1
  if (digitalRead (SEN_1) == HIGH) {
    digitalWrite(SIG_1Y, LOW);
    digitalWrite(SIG_1G, LOW);
    digitalWrite(SIG_1R, HIGH);    //R現示
  }
  if (digitalRead(SEN_2) == HIGH) {
    digitalWrite(SIG_1G, LOW);
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_1Y, HIGH);    //Y現示
  }
  if (digitalRead(SEN_3) == HIGH) {
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_1Y, LOW);
    digitalWrite(SIG_1G, HIGH);    //G現示
  }

  //SIG_2
  if (digitalRead (SEN_2) == HIGH) {
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_2R, HIGH);    //R現示
  }
  if (digitalRead(SEN_3) == HIGH) {
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_2Y, HIGH);    //Y現示
  }
  if (digitalRead(SEN_4) == HIGH) {
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_2G, HIGH);    //G現示
  }
  //SIG_3
  if (digitalRead (SEN_3) == HIGH) {
    digitalWrite(SIG_3Y, LOW);
    digitalWrite(SIG_3G, LOW);
    digitalWrite(SIG_3R, HIGH);    //R現示
  }
  if (digitalRead(SEN_4) == HIGH) {
    digitalWrite(SIG_3G, LOW);
    digitalWrite(SIG_3R, LOW);
    digitalWrite(SIG_3Y, HIGH);    //Y現示
  }
  //SIG_4
  if (digitalRead (SEN_4) == HIGH) {
    digitalWrite(SIG_4Y, LOW);
    digitalWrite(SIG_4G, LOW);
    digitalWrite(SIG_4R, HIGH);    //R現示
  }
  //SIG_8
  if (digitalRead (SEN_8) == HIGH) {
    digitalWrite(SIG_8Y, LOW);
    digitalWrite(SIG_8G, LOW);
    digitalWrite(SIG_8R, HIGH);    //R現示
  }
  if (digitalRead(SEN_7) == HIGH) {
    digitalWrite(SIG_8G, LOW);
    digitalWrite(SIG_8R, LOW);
    digitalWrite(SIG_8Y, HIGH);    //Y現示
  }
  if (digitalRead(SEN_6) == HIGH) {
    digitalWrite(SIG_8R, LOW);
    digitalWrite(SIG_8Y, LOW);
    digitalWrite(SIG_8G, HIGH);    //G現示
  }
  //SIG_7
  if (digitalRead (SEN_7) == HIGH) {
    digitalWrite(SIG_7Y, LOW);
    digitalWrite(SIG_7G, LOW);
    digitalWrite(SIG_7R, HIGH);    //R現示
  }
  if (digitalRead(SEN_6) == HIGH) {
    digitalWrite(SIG_7G, LOW);
    digitalWrite(SIG_7R, LOW);
    digitalWrite(SIG_7Y, HIGH);    //Y現示
  }
  if (digitalRead(SEN_5) == HIGH) {
    digitalWrite(SIG_7R, LOW);
    digitalWrite(SIG_7Y, LOW);
    digitalWrite(SIG_7G, HIGH);    //G現示
  }
  //SIG_6
  if (digitalRead (SEN_6) == HIGH) {
    digitalWrite(SIG_6Y, LOW);
    digitalWrite(SIG_6G, LOW);
    digitalWrite(SIG_6R, HIGH);    //R現示
  }
  if (digitalRead(SEN_5) == HIGH) {
    digitalWrite(SIG_6G, LOW);
    digitalWrite(SIG_6R, LOW);
    digitalWrite(SIG_6Y, HIGH);    //Y現示
  }
  //SIG_5
  if (digitalRead (SEN_5) == HIGH) {
    digitalWrite(SIG_5Y, LOW);
    digitalWrite(SIG_5G, LOW);
    digitalWrite(SIG_5R, HIGH);    //R現示
  }
}

注)「てこ」の切り替えのスケッチでは、「G」と「R」の切り替えしかしないのですが、切り替えた時に「Y現示」の信号機が「Y」点灯したまま残ってしまうので、「Y」も消すスケッチを追加しています。

マグネット_シングル.jpg

単線とはいえ往復運転をしますので、長編成の場合は先頭車両と最後尾車両にマグネットを付けると思われます。

その場合でも、編成が1閉塞区間に収まれば誤作動は起こしません。

マグネット_ダブル.jpg

これは無理ですけどね。(-_-;)


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

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

前回の問題に多くの方の回答をいただき、ありがとうございました。
(誰もいませんでしたけどね。)(笑)

所詮無理な難題でしたね。 

さて、苦境に立たされた親爺ぃの起死回生の解決策です。

P1060324.JPG

ON-ONタイプ(オルタネイト)のトグルスイッチではループから抜け出すことはできません。

そこで閃いたのが、(ON)-OFF-(ON)タイプ(モーメンタリ)のトグルスイッチなら行けるのではないかと思いつきました。

ただこのタイプのトグルスイッチは、どちらかにレバーを倒しても手を離せば中立の位置に戻ってしまいます。

トレンディーな鉄道模型レイアウトを目指す親爺ぃとしては、納得いくものではありません。(斎藤さんかよ~)

一瞬だけスイッチが入って、レバーも倒れたままのトグルスイッチは無いものかと考えていたら、さらに閃きがあったのです。(思い出しただけです。)

「あれだ!!」

過去記事の「総括」に登場したスイッチがあるではありませんか。

teko.jpg

PECO PL-26 ポイント切り替えスイッチです。

これならトレンディー親爺ぃも納得の洒落乙なスイッチです。

早速入手をしようとしたら、まともに買ったのでは高過ぎます。(安いところでも1,300円台)

ほんとに作る気があるのか分からない新レイアウトでは3駅を予定しています。

すると閉塞区間が3区間になるわけで、このスイッチは3個必要になるのです。

試しにヤフオクで検索すると、3個で1,200円開始のものがあるではないですか。(お~!神よ!あなたはなんて慈悲深いお方なの)

終了まで3日、誰にも気づかれぬこと祈って待ちました。(南無阿弥陀仏、色即是空、酒池肉林・・・)

結局入札したのは私だけ、無事落札して到着待ちの状態です。(ホッ!)

現在、スイッチが到着しないことには作業は止まったまま、暇なんでブログを書いてる訳なのです。

 このスイッチを使うとArduinoへの入力は問題ないのですが、各センサーへの電源供給に問題が出てしまいます。

そこで、センサーへはラッチングリレーを介して電源供給をするようにします。

回路図は、

単線自動閉塞2.jpg

Arduinoに「てこ」からの入力は一瞬で事足りるわけです。

「LOW」を命令しない限りGは点灯したままになります。

2回目以降のループでは、

if (digitalRead(TEKO) == HIGH) {    //てこ上り
digitalWrite(SIG_2G, HIGH);

は、無効になり、後は好きな時に「LOW」すれば「G」は消えるということです。

Arduinoから見れば、TEKOはLOW状態なっていますのでね。(わっはっは~)











ここまでブログを書いてきて気づいたのですが・・・・・

もしかして?

今度は、2回目のループで

if (digitalRead(TEKO) == LOW) {    //てこ下り
digitalWrite(SIG_2R, HIGH);

が、効いてしまうのではないかとね!

「てこ」を上りにすると、一瞬「G」になって素早く「R」になってしまうんじゃね?

(オー・マイ・ゴット!神よ?あなたはどこまで私に試練を与えれば気が済むの。)

光明が射したのもつかの間、再び暗雲が垂れ込めたのであった。

次回の更新は、あるのかないのかそれは誰にも解らない・・・

神のみぞ知るってことです。

とは言っても、今の悩みに悩んでいる時が楽しいのですけどね。(笑)


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

単線自動閉塞 その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) 
共通テーマ:趣味・カルチャー

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

松下奈緒と西内まりやの区別が付かない親爺ぃです。

そういえば、宮崎あおいと蒼井優の区別もなかなか付かなかったなぁ。(-_-;)

さて、単線自動閉塞 その2の往路のスケッチを覚えているでしょうか?

スケッチ.jpg

あの動きだけで1,682バイト、プログラムメモリを消費しています。

Arduino MEGA 2560は256KB(内ブートローダーに8KB使用)のプログラムメモリを搭載していますが、このサイズを大きいと思うのか、まだまだ楽勝と思うのか・・・・
(PC-88時代のROM-BASIC64KBに比べれば4倍もありますけどね。)

そこで、プログラムメモリの消費を抑えるために、ポートレジスタを直接操作する方法を覚書として書いておきます。

PinMap2560sma_.jpg

Arduino MEGA 2560に搭載されているマイコンチップのATmega2560のピンマッピング図です。

各ピンが個別に割り当てられています。

Digital22ピンを探してみてください?

78番端子に、PA0(AD0)と書かれたピンですね。

Digital23ピンは、お隣のPA1(AD1)と書かれています。

ATmega2560の内部では、個別に管理するのではなく、ポートと呼ばれるレジスタに8ピンごとまとめて管理しています。
(8bit AVRマイコンだからね)

PAレジスタには、下位から22ピン~29ピンが割り当てられています。

Arduino MEGA 2560は、A~Kポート(Iポートは無し)の10ポートあります。

下記のスケッチは今まで通りの書き方で、D22に繋いだLEDを1秒おきに点滅させるスケッチです。

*****************
void setup() {
  pinMode(22, OUTPUT);
}
void loop() {
  digitalWrite(22, HIGH);  
  delay(1000);             
  digitalWrite(22, LOW);  
  delay(1000);             
}
*****************

次に同じ動作をする、ポートレジスタを操作したスケッチです。

*****************
void setup() {
  DDRA = DDRA | B00000001;
}
void loop() {
  PORTA = B00000001;
  delay(1000);
  PORTA = B00000000;
  delay(1000);
}
*****************

あれれ?変わりませんねぇ。(-_-;)

サンプルに問題があったみたいです。

これならどうでしょう?

***************
void setup() {
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
pinMode(28, OUTPUT);
pinMode(29, OUTPUT);

void loop() {
digitalWrite(22, HIGH );
digitalWrite(23, HIGH );
digitalWrite(24, HIGH );
digitalWrite(25, HIGH );
digitalWrite(26, HIGH );
digitalWrite(27, HIGH );
digitalWrite(28, HIGH );
digitalWrite(29, HIGH );
}
***************

ビフォー.jpg
(1,430バイト使用)

デジタル22ピンから29ピンまでを出力に設定して、各ピンに繋いだLEDを全点灯させるスケッチです。

これを書き換えると、

***************
void setup() {
 DDRA = DDRA | B11111111;
}
void loop() {
PORTA = B11111111;
}
***************

after.jpg
(652バイト使用)

おお!スケッチは超~短くなったのですが、サイズは思ったほど小さくなっていません。

これは、void setup() とvoid loop() の関数がメモリを喰っています。

setup()内のDDRA = DDRA | B11111111;で、「B」の後に続く「11111111」がデジタルピンの「29」「28」「27」「26」「25」「24」「23」「22」ピンに対応していて、「1」とビットを立てると「出力」と設定されるのです。(「0」なら入力です)

注)DDRA=の「A」がポートAということです。

void()内のPORTA = B11111111;で、ポートAに繋がれた22ピンから29ピンをHIGH(5V出力)にします。(LOW(0V)にしたければ「0」です)

これらはポート単位で一気にセットする場合はいいのですが、22ピンだけHIGHにしたい場合は不都合です。

その場合は、

PORTA |=_BV(0);  //digitalWrite(22, HIGH );と同じ

と書きます。

LOWにするなら、

PORTA &=~_BV(0);  //digitalWrite(22, LOW );と同じ

ポートAの22ピンと25ピンのみHIGHにしたければ、

PORTA |=_BV(0) | BV(3);

と、書きます。

とはいえ、書いている本人も途中から解らなくなるほどですし、他人には到底理解し難いコードになってしまいます。

また、ATmega 2560チップ搭載の専用プログラムになってしまいますので汎用性が無くなります。

プログラムを書くときは、通常の書き方で書き、動作を確認後、この書き方に改めるほうがいいのかもしれません。

処理スピードもアップしますしね。

最後にデジタルピンとアナログピンの対応早見表だけ載せておきます。

対応表.jpg

誰の役にも立たないと思いますけどね。(爆)


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

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

閉塞区間往復.jpg 

 前回の実験線を発展させ往復運転に信号機を対応させます。

 その前に、前回の実験線のまま、折り返し運転をさせてみました。

上り用センサーが下りにも反応してしまって、おかしなことになってしまいます。

上り用センサーは上りの時だけ、下り用センサーは下りの時だけ、反応するようにしないといけません。

さて、どうしましょうか?

この方の、単線自動閉塞の解説を読むと、「単線ながらも、駅間にいくつかの閉塞が置かれます。また、「てこ」という列車をどちらの方向に走らせるのかを指示するものがあります。これにより、列車の単線区間での衝突を防止します。」と書かれています。(勝手にリンクしてしまってごめんなさい)

「てこ」でそこの閉塞区間を上りにするのか、下りにするのか指令所あたりから出すのでしょうね。

なるほど、「てこ」を利用してセンサーを分けてしまえばいいことです。

トグルスイッチ.jpg

「てこ」です。

トグルスイッチを制御ボックスに横向きに付けて、センサーの電源ラインを上り用下り用と切り替え、レバーの傾きで方向を判断すればいいでしょう。

<回路図>
単線自動閉塞3.jpg

デジタルピンを使い果たしてしまいました。

P1060312.JPG

心が折れそうな配線数ですね。(-_-;)

それでも間違えずに配線は済んだのですが、問題はこの先にありました。

Arduinoのプログラムのループ沼にハマっています。(-_-;)(-_-;)(-_-;)


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

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

今回は鉄道模型ブログらしく、車両の走行シーンが登場する珍しい記事です。

単線自動閉塞の実現に向けて実験を始めます。

P1060307.JPG

車両の裏にマグネットシートを貼り付けます。

P1060298.JPG

センサーは、ホールIC DN6851-Aを使用しました。

閉塞区間.jpg

図のように、ギャップ(白)で4区間に分かれています。

各区間の入口にはセンサー(黄)を埋め込んでいます。 

発車前、信号機はSIG_1が「R」、他は「G」です。

車両が発車して、第1閉塞区間から第2閉塞区間のSEN_2を通過すると、SIG_1が「R→Y」、SIG_2が「G→R」になります。

車両が、第2閉塞区間から第3閉塞区間のSEN_3を通過すると、SIG_1が「Y→G」、SIG_2が「R→Y」SIG_3が「G→R」になります。

車両が、第3閉塞区間から第4閉塞区間のSEN_4を通過すると、SIG_1は「Gのまま」、SIG_2が「Y→G」、SIG_3が「R→Y」、SIG_4が「G→R」になって停止です。

この動きをスケッチします。

#define SEN_1 22
#define SEN_2 23
#define SEN_3 24
#define SEN_4 25

#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

void setup() {
  pinMode(SEN_1, INPUT);
  pinMode(SEN_2, INPUT);
  pinMode(SEN_3, INPUT);
  pinMode(SEN_4, 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);

  digitalWrite(SIG_1R, HIGH);
  digitalWrite(SIG_2G, HIGH);
  digitalWrite(SIG_3G, HIGH);
  digitalWrite(SIG_4G, HIGH);
}

void loop() {
  if (digitalRead(SEN_2) == HIGH) {
    digitalWrite(SIG_1R, LOW);
    digitalWrite(SIG_1Y, HIGH);
    digitalWrite(SIG_2G, LOW);
    digitalWrite(SIG_2R, HIGH);
  }
  if (digitalRead(SEN_3) == HIGH) {
    digitalWrite(SIG_1Y, LOW);
    digitalWrite(SIG_1G, HIGH);
    digitalWrite(SIG_2R, LOW);
    digitalWrite(SIG_2Y, HIGH);
    digitalWrite(SIG_3G, LOW);
    digitalWrite(SIG_3R, HIGH);
  }
  if (digitalRead(SEN_4) == HIGH) {
    digitalWrite(SIG_2Y, LOW);
    digitalWrite(SIG_2G, HIGH);
    digitalWrite(SIG_3R, LOW);
    digitalWrite(SIG_3Y, HIGH);
    digitalWrite(SIG_4G, LOW);
    digitalWrite(SIG_4R, HIGH);
  }

}

走行はパワーパックによる手動運転です。


(たったこれだけでも、配線が凄いことになってます。(-_-;))

複線ならばこれでいいのですが、土讃線は単線です。

さて、復路をどういたしましょうか・・・・

つづく


タグ:鉄度模型
コメント(2)  トラックバック(0) 
共通テーマ:趣味・カルチャー
前の10件 | - 単線自動閉塞 ブログトップ