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を使ってイベントストリームに構成しなおして渡す予定です)。ソフトウェア編でもうちょっと詳しく書こうと思います。

ESP-8266でBトレ(第2回 ハードウェア編その2)

さっそく作ってみました

前回載せた回路図をもとにさっそく一台作ってみました。秋月の両面スルーホール基板にラッピングワイヤで配線しましたが、ポリウレタン銅線のほうが被覆をむく手間がなくてよさげです。ESP-8266(ESP-WROOM-02)はスイッチサイエンスの基板付きのものを使いましたので、基板にピンソケットを立ててそこにさしました。ピンソケットの高さだけ隙間ができますので、ここにプルアップ/プルダウン用の抵抗を配置しています。ロジックICやIOエクスパンダなどは、基板直付けです。モータードライバは変換基板に取り付けてICソケットにさしています。 f:id:cacao1:20151129150853j:plain

試作基板1号です 抵抗が並んでいる別付け基板部分は次回以降説明します。

少しずつ配線しながら動作確認しましたが、このようにするときは、ロジック未配線のICに給電しないように注意してください(CMOSなので入力オープンのまま動かすと壊れる恐れがあります)。 で、うごかしてみたのがこちら

youtu.be

一緒に映っているのは駅長見習いなんですが、どちらかというと列車妨害の常習犯です。止まるとだいたい手を出すので、コイツがいる間は停車できません。まるで「新幹線大爆破」ですね(若い人ゴメンナサイ)。

ESP-8266でBトレ(第1回 ハードウェア編その1)

まずはESP-8266でPWMの動作を確認する

いきなりですが、ESP-8266を動かすための丁寧な解説はネット上にすでにたくさんありますので省略します。注意点としては、

  1. ちゃんと電流がとれる電源を用意すること(いろいろ試すつもりなら 5V1A 6V1AくらいのACアダプタと3.3Vレギュレータで電源を用意しておくと安心です)

  2. USB-シリアル変換は信頼できるチップがついたもので、かつロジックレベルが3.3Vのものを使うこと

  3. プルアップ、プルダウンの抵抗はまじめにつなぐこと

  4. パソコンのシリアルコンソールのボーレートは115200bpsにすること

  5. シリアルコンソールはエンターキーで送信するように設定すること

  6. ボーレートがあっていても、ESP-8266の起動時にシリアルコンソールへ謎の文字が出力されるが気にしないこと

くらいです(おじさんは1,2以外に全部はまりました(^^;)。

Hello world

ESP8266とBD6231Fは、たとえばこんなふうに直結すれば簡単に動作させることができます(試す場合はESP8266のプラス側とBD6231Fのプラス側を接触させないように注意してくださいね、私はうっかりやってしまいESP8266を一つ壊しました)

f:id:cacao1:20151129113335j:plain

アナログポートを節約する

でも、これだと1つのモータードライバに2つのGPIOを使用します。ESP8266のPWMが可能なGPIOは10本で、うち2本はシリアルポート、2本はIO拡張用のI2cに使いますので、残りは6本となり、セクション3つ分ということになります。これではちょっと寂しいので、モータドライバ1つを1つのGPIOと1つのデジタルポートで動かすようにしました、こんな感じ(このままではダメ、理由は少し下に)。

f:id:cacao1:20151129113550j:plain

これで一つのESP8266で6つのセクションをコントロールできます。デジタルポートは入手が容易なIOエクスパンダMCP23017を利用しました。ポイントマシンの切り替えや在線検知、信号の点灯などにも使う予定です。1個で16個の入出力が増設でき、最大8個までつなげます。

f:id:cacao1:20151129115844j:plain

ただ、この構成にすると、プログラムが暴走した場合などに、列車も暴走する(PWMがONになりっぱなしになる)恐れがありますので、IOエクスパンダの1ポートをプログラムから短いサイクルでOn/Offするようにし(HeartBeat信号)、この出力をワンショットマルチで引き延ばして、HEARTBEATが出続けている間はONになる信号(ALIVE信号)を作りました。これとPWM信号のANDをとったものをBD6231Fに入れることにより、万一プログラムが暴走したらHEATBEATが途切れてALIVEがOffになり、列車がとまります。

f:id:cacao1:20151129120042j:plain

ここまでで、回路は次のようなものになりました(クリックで拡大します...にしても、また手描きかよ)。

f:id:cacao1:20151129114854j:plain

プログラムはGitにでも上げようと思いますが、まだssidipアドレスが直書きなのと、デバッグ用のSerial.Println()だらけなのでしばらくお待ちくださいね。

おまけ(部品について)

使っている部品についてちょっとメモ書きします

  • USB-シリアル変換はツール工房さんのUSB-234X(リンク)にピンヘッダを取り付けて使っています。 f:id:cacao1:20151129113922j:plain

  • 3.3Vレギュレータは秋月電子(リンク)で買いました。コンデンサも付属している親切商品です。値段が同じなら大きいほうがオトク?ACアダプタからの降圧幅が大きい場合は放熱板もあったほうがよさげです。 f:id:cacao1:20151129114059j:plain

  • ACアダプタも秋月で買いました。Bトレなら走行電源と合わせても1Aで十分ですが、ESP-8266は200mAくらいは使うと見ておいたほうがよく、その他の回路やLEDの分も考慮するともう少し大きめでもいいかもしれません。 f:id:cacao1:20151129114338j:plain

ESP-8266でBトレ(第0回 はじめまして)

ごあいさつ

みなさんこんにちはけろけろです、猫に遊ばれてるおじさんです。鉄道模型が好きで、学生の頃は組み立て式や固定式のレイアウトを作って遊んでました。でも、社会人になってからは、時間も気持ちも(そしてお金も)余裕がなくてずいぶん長いこと離れてました。f:id:cacao1:20151128225231j:plain

ただ、おじさんはある遊び方をやってみたいなとずっと思いつづけていたのです。

それは「鉄道運行の模型化」です。

ダイヤに従って大手私鉄のように通勤電車をウジャウジャ走らせたり、明け方の一番列車からはじまって、通学列車、長距離特急(もちろん食堂車つき)、荷扱いしながらゆっくりはしる各駅停車、締めの夜行急行と、国鉄の亜幹線の一日を再現したりできたらいいな、通り過ぎる列車をぼーっと眺めたり、運転手になったり、運転指令になったり自由にできたらいいな、と思い続けていたのです。

最近になって、必要な構成要素が私のレベルでも扱えそうな程度に整ってきたので、気力のあるうちにチャレンジしてみることにしました。


鉄道模型の運転方法について(ちょっとおさらい)

もしかすると模鉄じゃない方も読んでくださるかもしれないので鉄道模型の主な制御方法についてちょっと説明します。

  1. ブロックコントロール

    線路をいくつかの電気的な区間に分けて、それぞれにパワーパックを接続して列車に給電するf:id:cacao1:20151128224503j:plain

  2. キャブコントロール

    線路をいくつかの電気的な区間に分けて、それぞれを制御盤の選択スイッチに接続し、それぞれの区間に給電するパワーパックを選択できるようにするf:id:cacao1:20151128224536j:plain

  3. DCC

    線路に電気のほかに魔法も流し、車両に乗った小人を操って列車を動かす...f:id:cacao1:20151128224658j:plain

    あ、魔法じゃなくてデジタルデータですね、それに小人さんではなくてマイコンでした。

それぞれ一長一短がありますが、走行する列車を眺めて楽しんだり、少数の列車を同時運転するには十分です。 でも、そのままでは「ウジャウジャ」するのはちょっと難しいんです。一日のストーリーに沿って列車を走らせるのも、忙しく手を動かせばできないことはなさそうですが、なんか違います。

おじさんの夢の実現を阻んでいたもの

しばらく(30年近く)鉄道模型から離れてますので、現在は少し違うのかもしれませんが、おじさんが思うような遊び方をするためには、次のような点をなんとかする必要があると感じていました。

  1. 制御盤から各セクションまで動力線をひく必要がある(DCC以外)

    組み立て式レイアウトやお座敷運転では、給電が大きな悩みです。まじめに閉塞を切ろうとすると電線の数が膨大になります。走行用電力以外にポイント用、信号用なども含めると、気が遠くなります。いきおい、駅は1、2か所、駅間は一セクションのようなプランになり、うじゃうじゃの夢は遠のきます。

  2. フィードバック情報がほとんどない

    列車をたくさん走らせるには、少なくとも「どの列車がどこを走っているか」という情報を制御側が知る必要がありますが「電線を少なく済ませる」という観点でセクションを区切っていると、電流を検知する方式では制御に必要なだけの情報が得られません。かといって線路にセンサーをとりつけると、その信号線が必要になります。結局、フィードバックは人間の目視でということになり、その結果、制御も人間がということになります。

どうやるつもりか

今回は上記の1と2を解決するために、次のような方法をとることにしました。

  1. 閉塞区間の数だけ電気的なセクションを作る。セクションごとにモータードライバを配置してそれらを個別に制御する。

  2. モータードライバに流れる電流を検知して、在線(速度)情報として使用する。

  3. 1 2のセット何個分かごとにコントローラ(以下「ゾーンコントローラ」と書きます)が取りまとめてサーバーとWiFiでやりとりする。

  4. サーバーは「3の情報」を「ユーザーインターフェイス」とやりとりする。

  5. サーバーはゾーンコントローラ用のサーバー、UI用のサーバー、のほかに管制サーバー、ダイヤサーバーを用意する(といっても1台のパソコンで全部動かすつもりですけど)

1~3はマイコンの世界で、4~5はPCの領域ですね。全体の構成は下の図のような感じです。 f:id:cacao1:20151128235918p:plain

必要な構成要素って何?

前項の方法を実現するために、次のようなハード、ソフト、サービスを使うことにしました。

  1. WiFi内蔵マイコン ESP-8266(ESP-WROOM-02)

    WiFiを使えば、遠く離れたセクションまで動力線や信号線をひっぱる必要がありません。 近くにACコンセントさえあればOKです。ESP-8266はこれまでにない、たくさん買ってもお財布にやさしいWiFiマイコンで、しかもArduinoC++で開発できます。Arduinoだとサーバーとの通信も簡単で、ipアドレスルーターssidを指定して「WiFi.begin();」などと書くだけでつながります。PWM出力は標準でできますし、IO拡張用のI2C通信もライブラリがあります。f:id:cacao1:20151128224600j:plain

    真ん中がESP-8266 (ESP-WROOM-02)本体です、右はピッチ変換基板付のスイッチサイエンスの製品です。
  2. PWMモータードライバBD6231F

    わずか3ミリ角くらいのチップですが1A流せます。耐圧が半分(18V)のBD6221Fでもいけそうですが、6231のほうが入手しやすい(秋月電子で売ってる)ので、これにしました。ポイントマシン(ユニトラック)が極性反転型なので、これの駆動にも使用します。でも、部品の金額構成比ではこれがいちばん大きいので、利用可能なもっと安い製品があれば乗り換えるかもしれません。f:id:cacao1:20151128224907j:plain

    BD6231Fです。そのままでは小さいので秋月のピッチ変換基板にはんだ付けしてあります。
  3. Bトレ

    フルスケールの模型をウジャウジャ走らせるのは予算的にもスペース的にも大変なので、Bトレにしました。子供の頃はEB45とかED58で遊んでいたので、その頃に戻った感じです。すでに何種類か集めましたけど、デフォルメのセンスが良くて好きです。f:id:cacao1:20151128224844j:plain

  4. SignalR,Nancy,Rx...

    サーバー側をシンプルに書くために使用を考えているフレームワークです。すべてMicrosoft製です(無料で使えます)。別に信者ではないのですが、MSの開発環境に慣れているので。f:id:cacao1:20151128232103p:plain

  5. プリント基板製造サービス

    ゾーンコントローラは同じものがたくさん必要なので、手配線では大変です。図面の電子データをもとに作ってくれる製造サービスがいろいろありますのでそれを利用するつもりです。

それでは始めます。これを書き始めた時点ではまだ動作を検証している段階ですので、途中で挫折するかもしれませんが...

Visual MicroでArduinoのお勉強(Windows上でArduinoのソースを読み書きしやすい環境を作る話)

今週のお題「いま学んでみたいこと」

 最近話題のESP8266を触り始めて、みなさんが公開されている情報などをもとにHello World段階までは到達したのですが、次に進むのに情報が見つけられなくて困りました。普段「十分こなれて豊富なサンプルがあって、コピペで事足りるようなヌルい環境」にいるせいですね。で、先達の方に「どうやって調べるの?」と訊いたところ「ソース読むんだよ~」と言われました、そりゃそうだ。Google先生に飼いならされたせいでその筋は無意識に避けてました。
というわけで、久しぶりにライブラリのソースを読もうと決心しました。

続きを読む