ESP-8266でBトレ(第3回 ハードウェア編その3 在線検知)

在線情報

システムに鉄道模型の制御を任せる場合には「車両がある区間にいるかどうか」という「状態」を知ることが必要になります。 また、このほかに「ある地点をいま通過したよ」という「イベント」の情報が必要な場面もあります。 これらを実現する場合、車両が区間の出入り口を通過したこと(イベント)を検知してその値を保持して在線の有無(状態)を把握する方法と、ある区間に車両がいるかどうか(状態)を実際に調べ、その値が変化したことで、ある区間の境界を通過したこと(イベント)を知るという二とおりの方法とが考えられます、ちょうど微分積分の関係みたいですね。

どっちでやるか

実際の鉄道では車輪によって2本のレールが短絡されているかどうかの「状態」を検出しているそうです。一方、模型の信号(といってもおじさんが知っているのはエンドウの40年くらい前の製品ですが)は、レールの途中にある接点の上を車輪が通過したことを検知してラッチリレーを動作させ信号を変えるイベント検知型ものでした。 f:id:cacao1:20151202192949j:plain

カチッという音がかっこよかったです(エンドウのカタログより)

イベントベースだと、何かの理由でイベントを取りこぼす心配があります。実際、模型の信号も、接点付近が汚れていたりすると、車両が通過してもまれに緑のままだったりしていました。線路わきの飾りならこれでも許せますが、制御の根拠にするにはちょっとココロモトないです。 というわけで、状態検知、具体的にはモーターに流れる電流を検出する方法にしました。

具体的には

次に、どこでどうやって電流を検出するかです。フィーダー線の途中で検知できそうですが、方向を切り替えた後だと両極性に対応する必要があります。フォトカプラやホールセンサーなどで絶縁するか電源をくふうすればできるかも(検討してない)ですが、部品が増えるので気が進みません、複雑なのはトラブルの元です。そこで、1フィーダー1ドライバであることを活用し、フィーダー線ではなく、モータードライバに流れる電流を見ることにしました。ここは極性反転より前段なので、電流の向きは常に同じです。また、コンパレータ(2903D)がロジック回路と同一の電源で動かせるよう、ローサイド検出にしました。この部分の回路図がこちらです。 f:id:cacao1:20151202183025j:plain

シャント抵抗は0.47オームにしてあります(もっと小さくてもいいかもしれません)。BD6231Fの定格の1Aが流れても電圧降下は0.47Vで、損失は0.47Wなので1W型を使っています。また、0.47V<3.3Vなのでロジック用の電源で動き、出力はそのままデジタル回路につなげます。基準電圧用の抵抗(R1)はカットアンドトライで10kオームになりました(試作基板ではとりかえられるようにしています)。 コンパレータの2903Dはオープンドレインなので外付け10kでプルアップしていますがMCP23017のIOピンがプルアップ設定できるので、実は不要かもしれません。 f:id:cacao1:20151202183408j:plain

R1(手前から2個め)はピンソケットにさしてあります。

実際に動かしてみたビデオがこちらです。

youtu.be

表示はWebブラウザです。サーバーとブラウザの間の通信はSignalR(≒WebSocket+アルファ)でおこない、表示はSVG要素をjQueryで操作しています。WebサーバーはWindowsのNancyです。状態情報をそのままブラウザまで垂れ流している疎通確認レベルの作りですが、使用技術の組み合わせは本番も同じでいけるんじゃないかと思ってます(状態情報垂れ流しではなく、Rxを使ってイベントストリームに構成しなおして渡す予定です)。ソフトウェア編でもうちょっと詳しく書こうと思います。