ESP8266でBトレ(第6回 ハードウェア編その6 位相同期 後編)
年末はドタバタしていて、気がついたら年が変わってしまいました、みなさまあけましておめでとうございます。息切れしないようにボチボチ進めていきたいと思いますので今年もよろしくお願いします。
どのフィーダー(チャンネル)で割り込みをかけられるようにするか
前回は一つのPWMについて隣のゾーンコントローラーと同期をさせてみました。 しかし、今作っているゾーンコントローラーは、一個のESP8266でフィーダー(チャンネル)を6個駆動しています。線路配置によらず汎用的に使えるようにするつもりですので、使い方によっては、どのチャンネルも隣が別のゾーンコントローラー配下のフィーダーになる可能性があります。 そのため、どのチャンネルでも同期がかけられるようにしておく必要がありそうです...が、考えてみると、隣のゾーンコントローラーも同じ仕様ですので、同じように同期機能があるはずです。ということは、全6チャンネルのうち3チャンネルだけに同期機能をもたせ、残りの3チャンネルは隣のゾーンコントローラーの同期機能に依存してもいいはずです。そこで3以上でデジタル回路的にきりのいい4チャンネルに同期機能をつけることにしました。
回路はこんな感じです(前編の回路に切り替え機能をつけたものですが、一部に前回載せた回路図の間違いの修正(PWM信号はHC123のBではなくnotAに入れる)と、今回追加部分の配線ミス(コンパレータの+と-のつなぎ間違い)のための変更があります)。
フィーダーからの電圧信号と自身のPWM信号をそれぞれ4チャンネル×2のマルチプレクサHC153で選択し、そこからONLYYOU信号を作るようにしました。チャンネルの選択はMCP23017で未使用のB6~7を使い、Duty-ONの引き延ばしのためのHC123は第1回で作ったALIVE信号で使ったものの残り半分を使いました。その他のゲート用にはHC00を1個追加します。 (あとで気づいたのですが、アナログマルチプレクサにすればコンパレータを1個減らせるかもしれませんね)
センサー部 (前掲の回路図の上半分です、別基板にしました)
IOピンが足りない
当初の目論見では、PWM出力として使えないGPIO16を割込受付用に使おうと思っていたのですが、ESP8266のデータシートをよくよく見たらGPIO16は割込みにも使えないじゃないですか、が~ん。 で、どこかからGPIOを奪ってくる必要が生じました。とは言ってもフィーダー6チャンネルは譲れない線ですし、I2Cも必須です。しかたないので、シリアルから召し上げることにしました(TX,RXはそれぞれGPIO1,3としても使えます)。ただ、基板もソフトもWiFiだけで済ませらるほどの完成度には程遠いので、普段はシリアルピンとして使いつつ、必要なときのみシリアルを止めて割込み用に使うことにします。回路はこんな感じです(同期のための割込み受付用には1本でいいのですが、とりあえず2本とも切り替えるようにしました、GPIO3は現状では未使用です)。
割り込みとシリアルを3ステートバッファ(HC125)経由でGPIOにつないでおき、片方のみイネーブルにします。選択用の信号は、使えない子のGPIO16からとります(使えないのではなくて、別の用途に使うべきピンのようです)。でも、どちらか一方へつなぐ線は途中で反転する必要があるので、インバータが必要です。今までせっかくゲートを残さず食べていたのに、ここに来て1つ足りなくなりました。泣く泣くICを一個追加します。HC04にすると1/6しか使わなくてもったいないお化けが出そうですので、何かほかのことにも使えるかもしれないオールラウンダーのHC00にしておきました。 シリアル/割込みの切り替えは、プログラムからはGPIO16へのdigitalWriteするだけなので、シリアル/割込みのどっちをHIGHに決めてもいいのですが、書き込みモードで起動するとGPIO16がHIGH(ハイインピーダンスではなくHIGH)になるので、このときにシリアル側が有効になるような回路にしておく必要があります。
ボード全景(本格的にごちゃごちゃになってきました)
どうやって動かすのか
この回路を機能させるには、同期のための待機を開始・終了したり、同期するチャンネルを指定する必要があります。これはサーバーから指示するようにします。サーバーは「どの区間を列車が走っていて、次にどの区間に入るか」とか「区間の中のどのあたりを列車が走っているか(→あと何秒くらい後に次の区間に入るか)」といった情報を知っているため、この情報をもとにすればいつどこで同期が必要かがわかるはずだからです。 サーバーとゾーンコントローラーはこんな感じでやり取りさせる予定です。
サーバー:「ゾーンコントローラーさん、フィーダー1で同期待機を開始して」
ゾーンコントローラー:「あいよ~」(シリアル通信を中止して割り込み受付を開始する)
ゾ:フィーダー1で同期開始...あっ列車が進入してきた、同期しよっと
サ:(列車が次の区間への移動が完了したことを確認したのち)「ゾーンコントローラーさん、同期待機を終了して」
ゾ:「あいよ~」(割り込みを解除してシリアル通信を開始する)
動画は無いの?
スミマセン、今回は基板の動作確認以上のソフトを書いていないため、動画はありません。書かなかった理由は、サーバー側もゾーンコントローラー側も動作確認のための行き当たりばったりの書き足しを重ねて汚くなってしまったので、これ以上書き足すのはやめていったん整理しようと思っているためです(じゃないとソフトウェア編でお見せできませんし...)。
前回の修正と今回の失敗など
実質的には前回の回路に入力選択機能を2つ(3つ)追加しただけなのに、ずいぶん間違いや見落としがありました、以下にまとめまておきます。今回まででひととおりの回路はできたのですが、このくらいの仕事の精度だと、回路図をひいていきなり基板を発注するのは無謀なので、回路図をひいたらそれをもとにもう一つ組んでみて、動作を確認してから発注するようにしようと思います。
- HC123のAをプルダウンしBに信号を入れていたがこれは間違いで、notAに信号をいれてBをプルアップするのが正解でした。 前回載せた回路図が間違っていて、それをもとにしたためです。ダウンエッジを引き延ばすのが目的なので、notAに信号をいれなくてはなりません。もとの回路図が間違っていたのは、ブレッドボード上の配線を直した際に回路図を直し忘れたためです。
- HC153のY1とY2を逆につないでいた。 寝ぼけていてつなぎ間違いをしたようです。
- コンパレーターの+と-をつなぎ間違えたのでFEEDER信号が負論理になってしまった。 これまた寝ぼけていて間違えました。4回路×2か所も直すのはウンザリですし、作り直すにしても正月でパーツ屋さんもきっとお休みなので、余っていたゲートで信号をひっくり返してお茶を濁しました。
- GPIO16は書き込みモード時にHIGHになることを考慮していなかった。 てっきりハイインピーダンスになるものと思い込んで、プルダウンで回路を組んだら書き込みができませんでした。思い込みはいけませんね。
最後の一つはテスターで見つけましたが、他はオシロのおかげで発見できました。私が使っているのは中国製の激安機ですが、機能的には全く不満はなく、これが有るのと無いのとでは、ソフトでいうと紙上デバッグとステップ実行くらいの差があります。最後まで読んでくださった方の中に、よい子の皆さんがいらっしゃったら、お年玉でオシロを買ったらいいと思います。