ESP8266でBトレ(第9回 ハードウェア編その9)先行試作版完成?

3月以降少し忙しくて中断していましたが、先月からぼちぼち再開しました。まだまだ続きますがスローペースで申し訳ないです。

今回の内容

5月~6月上旬にかけては次のようなことをやりましたのでその報告です。

(図や写真などはあとで追加します)

ハードウェアの落穂ひろい

早くPC側ソフトウェアを書き始めたいのですが、それにはハードがちゃんと動く必要があります。前回まででだいたい動くことまで確認したのですが、位相同期の動作確認と昇圧回路の組み込みと動作確認がまだでした。ですのでこのあたりをやりました。

ソフトウェアの作成

今までゾーンコントローラと通信するパソコン側ソフトはコマンドラインで操作するものでしたが(検証だけはWebサーバーまで連動させてみましたが)、これをもとにして本格的に試すにための拡張をするには、つくりに難がありました。また、複数枚のゾーンコントローラへの対応も考慮していませんでした。そこで、複数枚のゾーンコントローラに対応するパソコン側ソフトの作成と、それに合わせたコマンド体系(ソフトウェアレベルのプロトコル)を定義し、あわせてゾーンコントローラ側ソフトも改修(というか作り直し)をしました。

ハードウェアの落穂ひろい

位相同期機能

どうせ一発では動かないだろうなという予感がしていたのですが、やっぱり動きませんでした。上流側から順にオシロのプローブをあてていったところ、検出信号の論理が逆でした。インバータがいらないようにコンパレータの+と-入れ替えたのに、ロジック側を書くときにそれを忘れてました。そこを直したら、今度は信号を引き延ばすためのワンショットマルチの出力部分で、notQを取り出すべきところをQを取り出していたがわかりました。というわけで、プリント基板オーダー初体験の次は、さっそくパターンカットとジャンパの引き回しを初体験しました。

これで回路的には設計どおりなったので、調整しようと思っていた部分にとりかかりました。課題は2つあり、一つはフィーダーの境界をまたぐときに割り込みが数十回以上発生すること、もう一つは、同期している側のフィーダー内を動力車が走るとノイズ(逆起電力か空走中の発電電圧?)でパラパラと割り込みが発生する点です。ですが、前者は特に悪影響はないようでしたので今のところ未対応です。後者は、走りに影響するのでちゃんと対策したかったのですが、うまいアイデアが思いつきませんでしたので、コンパレータの基準電圧側を半固定抵抗にして、PWMのON電圧以下かつ逆起電力や発電電圧以上のところに閾値が来るように調整してお茶を濁しました。これでは、動力車の特性によって調整が必要になりそうですが...。

昇圧回路

6VのACアダプタを使うことにしたため、ポイントマシン用の12Vは昇圧回路で生成することにしました。基板の端に信号用にと思って残してあったユニバーサル基板状の部分に昇圧回路を組み込みます。FETへのスイッチング信号供給も昇圧回路のON/OFF判定もCPUでやればよさそうですが、プログラムミスなどで出力が過電圧になったり電源を短絡したりすると困るので、両方とも回路を組みました。ただ、十分に充電されたことを確認してからポイント転換を行うために、出力側コンデンサの電圧を分圧したものをESP8266のTOUTに引き込んA/D変換して使用しています(タイマーなどで見当をつけるよりスマートでしょ?)。これでESP8266の全ピンを完食しました。

ソフトウェアの作成

ゾーンコントローラ側のソフトウェア(開発環境)

ZoneControllerのソフトはArduinoで書きました。Arduinoは今回初めて使ったのですが、loop()とsetup()と割り込みルーチンに処理を書けばいいのでわかりやすくていいですね。開発環境はVisualStudio2015にVisualMicroのプラグインを入れて使っています(どちらも無料版です)。ZoneControllerは大きなプログラムではありませんが、このくらいの規模でもArduinoIDEよりはかなり楽にコーディングできます。このブログの一番古いエントリに導入方法などをまとめてありますので、興味のある方はご覧ください。 ソフト本体については次回以降に書こうと思いますが、次のような点が特徴といえば特徴です。

  1. 機能をクラス化して外出しし、Arduinoでは骨格だけを書きました。
  2. 起動時のピン(GPIO14)の状態を見て通常モードか設定モードのいずれかで立ち上がるようにし、設定モードの場合はシリアルで対話入力した値をEEP-ROMに設定を書き込むようにしました。

サーバー側ソフトウェア

サーバー側はC#で書きました。開発環境はこちらもVisualStudio2015(無料版)です。プログラム本体についてですが、これまではコンソールと通信が一体化した掘立小屋みたいなコードでしたが、今回は少し役割分担を考えて作り始めました。これまたさわりだけ説明を書くと次のような感じです。

  1. ゾーンコントローラとの通信部分だけをクラスライブラリにしました。
  2. 通信方式はUDPとし、データの到達保証はアプリケーションレイヤで考えることにしました。
  3. クラスライブラリは、アプリケーション側からはゾーンコントローラのプロキシとして見えるようにしました(ハードウェアを意識しなくてもいいようにしました)。
  4. クラスライブラリとゾーンコントローラハードウェアのテストのために簡単なWindowsFormsアプリケーションを作りました。

これからの予定

6月中旬以降、ZoneController方式での鉄道運行が可能かどうかを検証するために、ZoneControllerの量産(といっても4、5台ですが)にとりかかってます。最初の1台は楽しかったですが、2台目は普通でした。これから作る3台め以降のことを考えるとちょっと気が重いです。電車の模型を作るときの窓抜き作業みたいな気分です。あと、レールにフィーダーをつけるのとフィーダやポイントのケーブルに端子をはんだ付けするのも考えるとウンザリしますね。昔は全然平気だったのに...