hogehoge, world.

米国カリフォルニアから日本に一時帰国中のソフトウェアエンジニアがIT・自転車・音楽・天体写真・語学などについて書く予定。

LED積層信号灯のアプリケーション

今回は前回紹介したパトライト社のLED積層信号灯(12V改造済み)のアプリケーションを説明しよう。

WiFi経由HTTPでON/OFFを制御するESP8266版と、PCとUSBで接続しシリアル通信を使うArduino Nano版とを作ってみた。下記はESP8266版の方の実物写真である。

f:id:tomoto335:20160901025122j:plain

さらに、HubotとRedisを用いたチャットシステムとの連携(あるコマンドがポストされると信号灯が光る)もやってみたので、これも説明する。

ESP8266版ハードウェア

IO信号でMOSFETを開閉する何の変哲もない回路である。

  • いつもの基本回路から出発し、IO12~15をN-ch MOSFETのゲートに突っ込む。
  • 信号灯は都合のいいことに極性がない(どちら向きにつないでも動作する)ので、黒の共通線をプラス側として電源に、各色個別の線をマイナス側としてMOSFETのドレインに、それぞれ配線する。
  • 最後に、ゲートに溜まった電荷を逃がすためと、起動時のモード指定としてIO15をLOWに保つため、IO12~15は抵抗を介してGNDにつなぐ。

f:id:tomoto335:20160901025645p:plain

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秒間点滅ののち連続点灯」のようなこともできるようにした。

チャットシステムとの連携

今回はHubotRedisを使って、チャットシステムに "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をサポートしているピンを選ぶ、といったあたりか。

f:id:tomoto335:20160901033430p:plain

こちらは生憎写真がないのでブレッドボード図を。実物とはレイアウトが違うがだいたいの雰囲気がわかればよし。

f:id:tomoto335:20160901033726p:plain

Arduino Nano版ソフトウェア

こちらを参照。ESP8266版と同じJSONをシリアル通信で受け取って動く。

https://github.com/tomoto/ArduinoPlayGround/tree/master/SignalTowerSerial

チャットシステムとの連携スクリプトも同じくdefcon_example以下に置いてある。HubotスクリプトはESP8266版と変わらず、デバイス制御用のRubyスクリプトはHTTPの代わりにシリアル通信を投げるという違いがあるのみである。