ESP8266でBトレ(第12回 ソフトウェア編その3)レイアウトプロキシの機能追加と、WebUIの作成
ちょっとだけ駅長気分が味わえました(^^)
こんにちはけろけろおじさんです またまた前回から半年以上たってしまいましたが、最近少し進んだのでその報告です。
前回記事を書いたのは秋でしたが、そのあと今まで冬眠していたわけではなく、3Dプリンタにはまったり、日曜大工に精を出したりしていたのでした。 脱線ばかりしているようですが、おじさんが的にはこれらはお互いに無関係なわけではなくて、最終的には全てがつながり、伏線もすべて回収され、遠大なストーリーが完成する予定なのです。(ひょっとすると全部中途半端に終わる可能性もあります。なにしろおじさんのおもちゃ箱には、数十年来の仕掛品が地層のように積み重なっているので...(これらも全部伏線?))
今回は何?
今回の概要は以下のようなものです。最近電子工作がないので、ちょっと物足りない感じですね。
- テストのたびに毎回配線するのが面倒なので、実験線を作りました。ただし以前に作りかけていた実験線からはかなり規模を縮小して、エンドレス+待避線だけのものです。
- レイアウトプロキシに場内信号、出発信号、およびルート設定機能を追加しました。これは自動運転のための準備です。
- 実験専用にWebUIを作成しました。これまではプロキシ類のテストや操作はWindowsFormアプリケーションでおこなっていましたが、実験専用のものはWeb+SignalRで作りました。
新実験線
机の上に都度広げていると毎回結構手間なので、木枠を組んだ上にベニヤ板をねじ止めして実験線用地とし、ユニトラックを敷設しました。エンドレスの内側にはゾーンコントローラーを置くためのくぼみを作って、ここにゾーンコントローラーをスペーサーを介してねじ止めしてあります。セクション数はエンドレスに10+待避線1で11です。ゾーンコントローラーは2台使用しています(くぼみはあと2台分あります)。 レールとゾーンコントローラーとの配線はコネクタを介して接続しています。フィーダー一か所につき、ゾーンコントローラ-アダプタケーブル間、アダプタケーブル-延長ケーブル間、延長ケーブル-フィーダー間と3つもコネクタがあります。コネクタと言っても、ピンヘッダ、ピンソケット利用の自作品です。安価にできてわりとしっかりつながるのですが、数が多いと外れる可能性も高まりますので、つないだ後でマスキングテープを巻きました。 配線後に通電したところ、配線同士の隣接のしかたによっては車両がいないのに誤検出するケースがありました。フィーダー線の誘導障害のようです(が詳しくは追ってません)。ACアダプタからの線や、異なるゾーンコントローラからのフィーダー同士はなるべく違づけないようにして回避しました。 レールは今のところ固定していません。フィーダー線とポイントマシンの線が合計で13本もあるので、固定しなくても線に支えられてなんとなくとまっています(ボード全体を立てかけても大丈夫です)。各配線はベニヤ板に穴をあけて通していますが、穴にコルク片をつめてずれにくいように固定しています。
板の上に線路をおくと、次はホームを作ったり駅舎を建てたりしたくなりますが、そっち方面に脱線すると帰ってこられなくなるのでぐっと我慢します。
レイアウトプロキシの機能追加
前回は閉塞信号しかなかったのですが、今回、場内信号と出発信号、それに進路設定の機能(※)を追加しました。これらを制御することにより、列車の入線順や出発順の制御が可能になります(前回は「前が空いている限り前進する」という機能しかありませんでした)。これで「画面をプチプチすれば、個々の列車を運転しなくても、車両を思うように走らせることができる」ようになりました。運転指令とまではいきませんが、駅長気分が味わえます。
(※)「進路設定って言ってもただのポイント切り替えじゃん」と思われるかもしれませんが、実はポイント切り替えに応じてセクションのつながりの定義も切り替えています。というか、セクション間のつながりの定義を変更するのに合わせて、その通りに進めるようにポイントを切り替えています。場内からホームまでに複数のポイントがある場合にはこの考え方がよさげです。
コントロールボード
どうも腰が上がらなくてずっと着手していなかったのですが、ようやくコントロールボードのWebアプリ(の先行試作品)を作りました。Web界隈は技術の移り変わりが激しくて、おじさんは全くフォローできていないのですが、現時点(2019年前半)でc#で作るなら、.NetCoreでRx+React(with TypeScript)+SignalRくらいが向いているような気がします。ですが、今回は.NetFramework4.7でRx+jQuery+SignalRで作りました。おじさんがReactを使えないせいでもありますが(そもそも開発環境の構築で躓いてしまいます)、特定のレイアウト専用にゴリゴリハードコーディングするならjQueryでSVGエレメントを直接いじるのが簡単です(jQueryもSVG対応が進んで、HTML要素とほぼ同じように扱えるようになっているようです)。「『なるべく汎用的に作る』という当初の目標はどこへ?」というセルフツッコミもありますが、「とにかく動くものを一回作ってみる」というのも必要です。でないと何をどうコンポーネント化していいかもわかりませんしね(半分くらい言い訳です...)。というわけで、サーバー側もレイアウトプロキシから上はゴリゴリです。 レイアウトプロキシとコントロールボードWebの接続についてですが、以前やった在線検知の動作確認のとき(第3回のとき)は、Web側とレイアウト側を別アプリにして、間をプロセス間通信でつなげたのですが、今回はWebアプリ内のタスクとしてレイアウトプロキシ以下のもろもろの処理を起動しています。安普請な感じがしないでもないですが、画面側とレイアウトプロキシ側がお互いにRxで呼び合えるお手軽さに負けてこういう作りになりました。
で、動くの?
というわけで、動作させてみます。画面上でセクションの境界付近にある丸いのが信号です。ポイントの下にある丸いのは進路選択ボタンで、その下の平たいボタンは場内、出発の許可ボタンです。場内・出発信号は、閉塞の値とこの許可ボタンの値の論理積になります。
まずは一列車をエンドレスで走行させてみます。
EPS8266でBトレを動かしてみた(その5(の1)コントロールボード)
各セクションの信号の値を4灯式の色で表しています。列車通過後の閉塞信号の変化の様子がわかりますね。
次に2列車です。
ESP8266でBトレを動かしてみた(その5(の2) 閉塞運転)
先行列車が出発を抜けたあと進路を切り替えると後続列車が出発します。場内信号を赤に変えると駅の手前で停車します。後続列車は閉塞信号をみて減速します...が、寸止めのつもりが減速しきれずに追突してますね。
次に3列車です。
ESP8266でBトレを動かしてみた(その5(の3) 3列車同時運転)
10閉塞で3列車で信号が4灯式なので、ほぼすべての区間で減速以下の信号になってます。 ダブルホーム運用をすればスムースに流れると思いますが、おじさんがやると場内を停止現示にするのをわすれて後続が同じ番線に入ってきたり、出発信号を停止にし忘れて駅を通過されたり、あげくは列車が出発セクションを抜けきる前に進路を切り替えてしまって脱線させてしまい、そこへ後発列車が突っ込んだりとさんざんです。信号を停止定位にしたり、鎖錠機能をつけたりしないとダメですね。
今後について
次は(ダイヤ運転の手前の)自動運転をやってるつもりです。今回、場内・出発信号と進路選択を手で触って動かしてみて感じたのですが、自動運転では「個々の列車を制御する」よりも、「駅にやって来る列車・駅から出ていく列車の入出場を制御する」のがよさそうです、駅長の役割のタスク化ですね。