LED積層信号灯のアプリケーション
今回は前回紹介したパトライト社のLED積層信号灯(12V改造済み)のアプリケーションを説明しよう。
WiFi経由HTTPでON/OFFを制御するESP8266版と、PCとUSBで接続しシリアル通信を使うArduino Nano版とを作ってみた。下記はESP8266版の方の実物写真である。
さらに、HubotとRedisを用いたチャットシステムとの連携(あるコマンドがポストされると信号灯が光る)もやってみたので、これも説明する。
ESP8266版ハードウェア
IO信号でMOSFETを開閉する何の変哲もない回路である。
- いつもの基本回路から出発し、IO12~15をN-ch MOSFETのゲートに突っ込む。
- 信号灯は都合のいいことに極性がない(どちら向きにつないでも動作する)ので、黒の共通線をプラス側として電源に、各色個別の線をマイナス側としてMOSFETのドレインに、それぞれ配線する。
- 最後に、ゲートに溜まった電荷を逃がすためと、起動時のモード指定としてIO15をLOWに保つため、IO12~15は抵抗を介してGNDにつなぐ。
ESP8266版ソフトウェア
例によってGitHubを参照。
https://github.com/tomoto/ArduinoPlayGround/tree/master/SignalTowerWiFi
いつものアプリケーションフレームワークを使って、手抜きAPIを切ってみた。
http://signaltower/states?json={"red":"on", "gree":"blink"}
のようなHTTP GETを送ると信号灯を各色ごとに制御できる。REST的にはJSONはPOSTだろって思うところだが、ブラウザからのテストが楽なのでこうしている。
また、ディレイを指定して「5秒間点滅ののち連続点灯」のようなこともできるようにした。
チャットシステムとの連携
今回はHubotとRedisを使って、チャットシステムに "defcon 1" のように書き込むと、それに反応して信号灯を光らせるクライアントも書いてみた。Hubotのスクリプトから直接信号灯をドライブするのではなく、一旦Redisにイベントをポストして、別のクライアントでそれを拾って信号灯に指示を出すようにしてみた。
こちらがHubotのスクリプト。hubot defcon <数字> という字面がチャットに書き込まれると、背後にあるRedisにdefconというキーのイベントをポストするもの。「イベントをポスト」というのは、実は単に指定された数字をリストのアイテムとして追加するだけである。Redisのチュートリアルに載っている、リスト型をキューとして用いる方法である。
そしてこちらがRedisから上記イベントを拾ってESP8266にHTTPリクエストを送るクライアントである。言語はなんでもよいのだが、Rubyで書いてみた。Redisからのデータの取得にはブロッキング操作(お目当てのキーにアイテムが追加されるまで自動的に待ってくれる)のBLPOPを使う。
これで業務中の非常事態を簡単にチームメンバーに知らせることができるようになった!
…というのはジョークだが、実際にJenkinsのビルドステータスを表示させてみるとなかなか役に立つ。ビルドの成功・失敗だとか、現在ビルドが走っているかだとかが画面を開かずに顔を上げるだけでわかるのは地味に便利である。
Arduino Nano版ハードウェア
そしてこちらはArduino Nano版。PCとUSBで接続し、USB経由のシリアル通信で指令を受け取る。特に説明は不要だろう。注意点があるとすると、Arduino Nanoの電源はPCからUSBで供給されるので不要である、IOはPWMをサポートしているピンを選ぶ、といったあたりか。
こちらは生憎写真がないのでブレッドボード図を。実物とはレイアウトが違うがだいたいの雰囲気がわかればよし。
Arduino Nano版ソフトウェア
こちらを参照。ESP8266版と同じJSONをシリアル通信で受け取って動く。
https://github.com/tomoto/ArduinoPlayGround/tree/master/SignalTowerSerial
チャットシステムとの連携スクリプトも同じくdefcon_example以下に置いてある。HubotスクリプトはESP8266版と変わらず、デバイス制御用のRubyスクリプトはHTTPの代わりにシリアル通信を投げるという違いがあるのみである。