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

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

 今回は、自動運転その14にて紹介したレイアウトに、信号機を組込むことにしましょう。 その信号機は、TOMIX製の信号機と同じように、通過センサの機能も組み込むことにしました。 でも、今回もプログラム部分で、四苦八苦したうえでやっと順調に作動させることが出来ました。 簡単なシステムと言えども、素人には勉強になります。

 

  .

■ 信号機を作る

 最近はNゲージ用のリアルな信号機があちこちで販売されるようになっていますので、あえて手作りする必要はないのですが、ホビーとしてはやはり工作が楽しいので、作ることにしました。 手作り信号機は、過去にも作った事があります。 「システムの構成要素 信号機を作ろう」(2019/8/15)など。 これらの改良を含めて再度挑戦しました。

 まず、信号機の顔となる背板から作りました。 今回は0.3mm の真鍮板から工作して、ひさしも取付けました。 背板を支柱に取り付けるための足もハンダ付けし、ここにチップLEDのマイナス側をハンダ付けするようにしました。

 支柱は外径が 1.4mm、内径が 1.0mm の真鍮パイプを使用し、さらに通過センサとして使用する光センサの投光器も取り付けることにしました。 LEDの取付けなどは先回と同じように工作しています。 ハンダ付けと配線工作の完了した状態を下に示します。

 

■ 光通過センサを組込む

 この信号機に光方式の通過センサも一体的に組み込むことにします。 光方式のセンサについては、「システムの構成要素 車両検知センサ」(2019/8/16)と同じ構成なので、回路等の説明は省略します。 正論理LED付き回路を採用しました。 

 信号線は、電源の 5volt、GND、センサのOUT信号、そして、信号機の赤、橙、緑の点灯用の6本必要となりましたが、ユニバーサル基板の裏側に揃えて配線しました。

 TOMIX製の70mm 直線路を使用して光センサを取り付けることにし、ベースは0.5mm のプラ板を用いました。 上の写真。 これらは、ネジ止めや接着剤を使って組付ければよいのですが、今回はMTテープを使って気楽に固定することにしました。 絶縁やゴミよけにもなるし、また容易に分解出来るのです。 梯子は少し大きくてグロテスクですがフェンス用の部品を切り取って接着しました。

 配線は、制御ボックスまでの距離があるので、途中にコネクタを設けて接続するようにしましたが、コネクタが卓上から消える位置に設定しています。

 完成したセンサ付き信号機を下左に示します。 信号機の裏側や配線部分はパテで覆って固定と絶縁を実施し、支柱と土台部分や背板部などにアクリル絵の具を塗って完成です。 センサ用の投光器がグロテスクになってしまいましたが機能優先として許容することにしましょう。

 

■ 回路図

 電気回路は大きな変更はありませんが、センサと信号機のための配線を追加しました。

 通過センサの信号入力は、PICマイコンへのRB7 のポートを使用しました。 また、赤信号出力はRB4 のポート橙信号出力はRB5 のポート緑信号出力はRB6 のポートに設定しています。 これでPICマイコンのポートがほとんど埋まってしまいました。 予定通りですかね。 制御箱の中もだんだん混んで来ました。 上右の写真。

 

■ プログラムの作成

 今回の変更は信号機の表示命令を追加するだけなので、気楽に考えて、各ステップ毎に while命令文を追加して記述していきました。 そして、鉄コレの12m級電車を走らせましたが、見事に期待を裏切られてしまいました。 信号機の表示順番が狂ったたり、さらに運行シーケンスもおかしくなっていました。

◆ 信号波形の観察

 運行シーケンスが狂っていたので、てっきりセンサ類がおかしくなったと思い、信号制御のないプログラムに変えて走らせる正常でした。 即ち、信号制御を加えた事が原因と考えて、まず、信号機のセンサを疑いました。 正論理の回路にノイズが乗っかかったのかと・・・・・・・・・! そこで、オシロを持ち出してセンサ信号を観察しました。

     

 PICマイコンの入力ポート部に、ホーム内のセンサS1と(チャネル1)、新しく追加した信号機のセンサ(チャネル2)の波形を観察しました。 上の写真。 左が発車時の信号で、右側が駅を通過して行く時の信号波形です。

 チャネル1(CH1、黄色)は負論理で、チャネル2(CH2、青色)は正論理の様子が分かります。 左側の画面の出発時では、最後の車輪がセンサに引っかかっているため反応しており、信号は一つの谷だけで、時間が掛かっています。 そして、車両の先端が信号機のセンサに引っかかり、通り過ぎるまで綺麗なパルス波形を示しています。

 一方、通過時は、4個の車輪がセンサに応答している事が分かります。 信号処理回路に 10μFのコンデンサを追加しているにも関わらず、かなりの不整形な波形を示していますが、さらに、その反応時間が短い事が気になりました。 実はセンサの信号を検知する部分の while命令文は、下のように 50msec で回しています。

113         while(RB2 == 1){        //列車が来るまで待つ
114             __delay_ms(50);
115         }
116         RB5 = 0;
117         RB4 = 1;

 この 50msec 毎に回すチェック時にセンサ信号が引っかか内場合が発生する恐れがあり、チェックをパスしてしまうかも知れません。 すると、シーケンスがそこで停滞してしまいます。 そこで、 10msec に変更しました。

 最初に心配した信号機センサのノイズは観察されませんでしたので、正論理でも問題無いと判断しましたが、でも心配です。 負論理回路に変更するか、プログラム処理で対応するか迷いましたが、まずプログラム処理で対応することにしました。 方法として、

  1. センサのダブルチェックを実施する。
  2. シーケンスを停滞させる while命令文の使用を極力させる。

などを検討することにしました。

◆ C言語では GOTO 命令を使わない?

 まず、アッセンブラで多用していたセンサのダブルチェック方法を検討しましたが、 C言語の説明には、GOTO文の説明がほとんどありません。 今まで気にもしてなかったのですが、改めて不思議の思ってネット調べてみると、やはり使用しないようにとのアドバイスが多数見つかりました。

 C言語ではGOTOは使ってはいけないという暗黙の約束があるそうです。 便利そうなGOTOステートメントですが、多用するとプログラムに一貫性がなくなりプログラムの流れがクシャクシャになって構造が崩れ、スパゲティソースといわれているそうです。

 では、どうやってダブルチェックをすればよいのだろうかと参考になるプログラムを探しましたが、見つかりませんでした。 後から、スイッチのチャタリング対策を参考にすれば良いと気が付きましたが、今回は上記(2)の方法を使いました。

 信号機の表示は、間違えてもシーケンスに影響しないので、次のステップのwhile命令文の中に if 文をいれて、点灯処理を実施するようにしました。 

107         while(RB3 == 1){        //S4ON? 列車が来るまで待つ
108             if(RB7 == 0){
109                 RB4 = 0;
110                 RB5 = 1;        //橙点灯
111             }
112             __delay_ms(10);
113         }

 全部の信号処理文とは行きませんでしたが、幾つかのwhile命令文を減らすことが出来ました。 信号処理をミスってもwhile命令文の条件が揃えば飛ばして行ってしまうので、処理を続行する事ができると考えました。

 この他に、各命令間のタイミングを調整して(適切な遅れを挿入するなど)、やっとシーケンスが回るようになりました。

 作成したプログラムを下に示す。

 

◆ミニポイントでの脱線

 鉄コレの12m級電車での運行が問題無く実施出来るようになりましたので、当初走らせていたKATOのチビ凸用動力ユニット(品番:11-109)を用いたBトレ電気機関車を走らせました。 すると、下左の写真に示すミニポイントの分岐側に分岐する時に、殆どの場合、脱線してしまいました。 2軸動力車のケースではうまく回れないものと判断し、ポイントに入る前に、33mm の直線路を挿入して対応しました。 この対策は効果てきめんでしたね! 下左の写真。

 長さ合わせのために、反対側のYポイント側にも33mm の直線路を挿入しました。 下右の写真。

 

■ 完成した状態

 C言語の初心者にとっては学ぶことが多くあり、勉強になりました。 なんとか無事に運行出来るようになりましたのでその様子を紹介します。

 信号機を組込んだ位置は、外回りは下左の写真に示す位置で、内回りは、下右の写真の位置です。

 信号機の点灯状態を紹介しましょう。 部屋を少し暗くしてみました。

 通常の明るさの場合です。

 走行状態の動画を紹介しましょう。

 

 次回のテーマは何にするのか決まっていません・・・・・・。 そろそろネタ切れかな?

 

ページトップへ戻る .


 2020/1/28 作成