So-net無料ブログ作成

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

DCC最新(?)トレンド事情 [レイアウト]

日本ではあまり普及しているとはいいがたいDCCですが、海外は賑わってますね。

日本でのDCCといえば、KATOさんが扱っているデジトラックス社の製品で楽しまれてる方が多いと思います。

YouTubeを見ていて気になった動画あります。

何が気になったかというと、まるでプロが撮ったような動画なんです。(トラック撮影)

(これはトラックではないですねぇ。4K広角一発撮りみたいですね。編集でHDに落としてフレームを移動させてるような・・・)

製作者のブログを探し当て拝見すると、なかなか興味深いことをやっておられます。

Nardi Mindscape -ほぼ趣味の記録-

_vyr_12423z21-zepedu.jpg

DCCコントローラーはオーストリアのROCO社の「Z21」です。

親爺ぃが知らなかっただけで、だいぶ前に発売されていたのですね。(-_-;)

これと無線LANで繋いだiPADやスマホのタブレットで操作すのですね。

Z21_Startseitenslider_Keyvisual_allgemein_slide.jpg
(この女性がNardiさんかは未確認です)

「カメラカーを走らせれば、運転席の画像を被せて、あたかも運転士気分になれるわよ~~ん。♡♡」と、言っているようです。

海外通販は苦手とか、英語のマニュアルはどうもいう方は、日本仕様も販売もされてますね。

これからDCCを始めようかと考えてる方にはたいへん参考になるブログです。


タグ:鉄道模型
コメント(10)  トラックバック(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) 
共通テーマ:趣味・カルチャー

sumika 新アルバム「アンサーパレード」 [日々雑感]

P1060328.JPG

sumikaの4枚目の ミニアルバム「アンサーパレード」が本日発売になりました。

親爺ぃはアマゾンで予約していたので、昨日の昼にはフラゲしてましたけどね。(笑)

アルバムとしては片岡氏の休養明け第1弾になるミニアルバムです。

昨日は3ターン流して聴きましたが、素晴らしいアルバムに仕上がっています。

「新世界オリハルコン」「Vital apartment.」「I co Y」の流れからは違った印象を受けましたが、「sumika」というバンドの方向性を確立した印象を受けました。
 

キーボードの小川氏の加入は、大きな大きな武器になりましたね。

第5弾では更なる熟成を期待しています。 

 


タグ:SuMiKa
コメント(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) 
共通テーマ:趣味・カルチャー

sumika 「溶けた体温、蕩けた魔法」 [日々雑感]

親爺ぃが、前身バンド時代から応援している「sumika」の新アルバム「アンサーパレード」に収録されている曲です。

別れの切ない気持ちを、力強いボーカル、繊細なピアノで聴かせ、何年・何十年先は分かりませんが、再会できた時は「繋がれていく」ではなく「紡がれていく」で終わる、人の心の成長を歌った曲なんでしょうね。
今度は、お互い相手を思いやって行こうと「紡ぐ」であり、「繋がる」より強い絆を感じます。
男性側の気持ちの歌なのでしょうが、意外と女性側は「あんたなんか2度とごめんだわ」が多いと思います。(-_-;)

ブレークするといいなぁ~・・・・・

<追記>
ROCK IN JAPAN FES.2016」出場、おめでとうございます。

あの会場のステージで「sumika」が見られるなんて、親爺ぃは感無量です。(banbiで見たかったけどね)

初出場となると、タイムテーブルが発表になっていなのですが、ステージは「WING TENT」の可能性が大ですね。(6月18日現在)

小さいとはいえ、スタンディングで3000人のキャパがありますね。(-_-;)

スタンデュングキャパ1300人の赤坂BLITZを満員にしたとはいえ、一気に倍以上のキャパのあるステージです。

是非とも満員の「WING TENT」の光景を見てみたいものですね。

<追記2>
セットリストはどうなるのでしょうか?

持ち時間が30分となると、5曲くらいの演奏になると思います。

記念すべき1曲目はなんだろう?

時間帯が分からないのなんとも言えませんが、オーディエンスが温まっていない、入りの曲としては「ソーダ」、「雨天決行」の可能性もあるのですが、「sara」が妥当な線ではないでしょうか?

すると、2曲目に「1.2.3.4..5.6」か、「雨天決行」かも。

 3曲目か4曲目に「溶けた体温、蕩けた魔法」は来ると思うので、ラストに「伝言歌」を持ってくるのか、「復活の呪文」を持ってくるので、3曲目は「LOVERS」かも。

勝手な予想としては、

1.「sara」
2.「雨天決行」
3.「LOVERS」
4.「溶けた体温、蕩けた魔法」
5.「復活の呪文」
6.「伝言歌」

フェスなので、ラストはお祭り騒ぎの「復活の呪文」が聴きたいな。

<追記3>
タイムテーブルが発表になりました。

8月7日(日)11:25~

ステージがWING TENTではなく、なんとBUZZ STAGEではないですか!

キャパ、4500人って・・・・・(-_-;)

12:00からゲスがGRASS STAGEで始まるし、これはどうなるsumika。

この記事は随時加筆していきます。

<追記4>
親爺ぃは仕事で見に行けなくて、息子が見てきました。

BUZZ STAGEは大型テント内のステージで客の入りは満杯でした。

セットリストは、

1.ソーダ

2.ふっかつのじゅもん

3. Lovers

4.グライダースライダー

5.伝言歌

 


タグ:SuMiKa
コメント(0)  トラックバック(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) 
共通テーマ:趣味・カルチャー

単線自動閉塞 その1 ホールIC [単線自動閉塞]

 IMGP9453.jpg
「小町リンドウ」

 m_P1050405.jpg

車両を検知するため、フォトリフレクタの「TPR-105F」を使おうかと決めていましたが、アナログ扱いなので他にデジタルで扱えるものをと探していたら、ヤフオクでいいものを見つけました。

P1060286.JPG

TPR-105Fよりも小さい「ホールIC 」です。

磁気を感じてスイッチが入る、磁気センサーです。

フォトリフレクタのように強い光に晒されても誤作動は起こさないです。

製造は終わってるみたいで、在庫処分で1個15円の破格のお値段でした。

P1060284.JPG

枕木間に収まってしまう小ささです。

P1060285.JPG

GMのATC地上子に組み込めそうです。

早速ブレッドボードで組んでみました。

DN8799.jpg


磁気に反応して入力電圧と等しい電圧が1番ピンから出力されます。

オープンコレクタタイプなのでプルアップ抵抗が必要ですが、Arduinoの内臓プルアップ抵抗を使いますので、抵抗は不要です。

da8799_pullup.jpg

Arduinoのデジタル22ピンにDA8799のOutピンを接続、入力があったらデジタル23ピンに繋いだLEDが点灯するようにスケッチしました。

(DN8799の場合は、磁石を近づけなければ5V、磁石を近づけると0Vになります)

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

void setup() {
  pinMode(22, INPUT_PULLUP);
  pinMode(23, OUTPUT);
}
void loop() {
  if (digitalRead(22) == LOW)
    digitalWrite(23, HIGH);
}
*********************

 

磁石を近づけるとLEDが点灯します。

磁石を離してもLEDは消灯しません。

その後、再度磁石を近づけてもLEDは点灯したままです。

 digitalWrite(23, LOW);を実行しない限りLEDは消灯しません。

信号機を制御するには好都合ですね。

ホールICは、他に千石電商が扱っている「DN6851」もありますが、
これはホールIC内部にプルアップ抵抗を持っています。(1個84円)

P1060287.JPG
(左がDN6851、右がDN8799)

DN8799に比べて大きいのですが、安心感あります。

左の1番ピンから、Acc(3.6~16V)、GND、Outputです。

IC内部にプルアップ抵抗が入っています。

DA6851.jpg

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

void setup() {
  pinMode(22, INPUT);
  pinMode(23, OUTPUT);
}
void loop() {
  if (digitalRead(22) == HIGH)
    digitalWrite(23, HIGH);
}
*********************

DN6851は、磁石を近づけると5Vが出力されます。

P1060295.JPG

枕木をカットして組み込めばいいかもです。

P1060288.JPG

こういう風に使えるかと思ったのですが、これでは検出してくれませんでした。(-_-;)

いずれにしても、どちらのホールICもArduinoで扱えば余計な電子パーツを必要とせずに
完結されますの、使い勝手は楽です。

次回は、マグネットシートを車両の裏に付けて、実験線で閉塞信号機との
連動をしてみたいと思います。

<追記>
交番磁界.jpg
実験当初、動作が不安定で反応したり、反応しなかったりがありました。

一晩経ってから気づいたのですが、磁石を真上から近づけると
まったく反応はしません。

磁石を動作距離内(おおむね5mm)で横に動かすと
100%反応します。

交番磁界からなのか解りませんが、磁極の変化で
反応するのでしょうか・・・・(謎)

謎でもなんでも、鉄道模型には好都合ですね。

<追記>
DN6851を当レイアウトでは正式採用いたしました。

 

 

 


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