下林明正のブログ

個人的かつ雑多なブログです。

たった7000円で余ったIS-01や中華パッドとArduinoでセンサーネットワークを構築する方法

http://distilleryimage10.s3.amazonaws.com/cf1c10ac3c7311e28dc022000a1f8c21_7.jpg

元々僕はUSB温湿度計でログを取得しているのですが、USB温湿度計はサーバーマシンの近くにしか設置できないという欠点があり、騒音に敏感な僕はベッドルームにセンサーを設置できないという憂き目にあっていました。 結果としてセンサーの値と実際の値は異なるものとなってしまっており、いまいち信ぴょう性に欠けるものとなっていました。

また、気圧のデータも欲しいと考えているのですが、既成品を拡張することは困難です。

そこで、その問題を解決するためにタイトルにあるようなアプローチを取りました。 結果として、温度計の値を読み取り、Cosmというこの手のデータを共有するためのサービスにPUTするところまで成功しました。 今回は、その際の作業の内容をまとめておきたいと思います。

システム構成

[The Internet] <- [Android] <- [Arduino] <- [Sensor]

そのまんまですね。

この構成なら、AndroidとArduinoに給電できてWi-Fiがつながる場所なら、どこにでも設置できるということになります。駆動箇所も存在しないため、騒音の問題もありません。

ハードウェアに詳しい方ならワンチップマイコンなどを利用して似たようなことを実現できそうなところではありますが、残念ながら僕自身がハードウェアには疎いことと、今後の拡張性や簡便さを考慮してこのような構成を採用しました。

Arduino

今回は近所の電子部品屋で適当に買い揃えることにしたので、

[asin:B009FCU9EG:detail]

USBホストシールド

USBホストシールド

  • メディア: エレクトロニクス

  • LM35DZ-N
    • 温度に応じてリニアに電圧を出力する温度センサー

といったような構成となりました。この他にもソケットやら何やらを購入して、合計で大体7000円くらいだったと思います。若干お高いですが、ハードウェア知識が無いので受け入れました。

また、USB Host Shieldということで面食らった方もいるかも知れませんが、今回はArduinoがUSBホストとなります。理由は後述します。

USB Host Shieldですが、 このように ピンソケットを拡張するような形でハンダ付けすることをおすすめします。 なぜならば、 こういうこと ができるからです。 このようにすれば後は殆どハンダ付けをする必要がなくなるので楽ですし、ブレッドボード単位で作品を保存することも可能になると思います。

あとはまあ、素子のデータシートに合わせてブレッドボードに配線するだけです。最初、V-inとGNDを逆にしていて素子が異常加熱して焦りました。爆発しなくて良かったです。

Android

Android 1.6以降の端末ならなんでも良いですが、今回は鉄Qプリンセスというゲームをつくったときに検証機として購入して以来余らせていたArchos 32という端末を使いました。

AndroidとArduinoをつなぐ

僕も元々混同していたのですが、ADTとArduinoは一応別物であり、ADTのインターフェイスに対応しているAndroid端末は数が少ないことから、今回は取り扱いません。 そんなわけで、Arduino 1.0.2を採用しました。

そして今回は、microbridgeという仕組みを利用してAndroidとArduinoをつなぎます。

microbridge - Android Debug Bridge (ADB) implementation for microcontrollers. - Google Project Hosting

ArduinoをUSBホストとして動作させ、デバッグモードを有効にしたAndroid端末をクライアントとして接続し、Arduino側からADB経由でインテントを送信することで通信を行います(多分、そういう仕組み…)。 こう書くとかなりキワモノっぽい感じがしますが、実際に利用するのは簡単でした。

具体的な利用方法については、microbridgeのDemoスケッチとServoControlというAndroidアプリケーションのソースコードを参照して下さい。どちらもmicrobridgeのプロジェクトサイトからダウンロードできます。Arduino 1.0.2のIDEとEclipse上に構築したAndroid開発環境からでは、特に手直しなどすることなく焼き込みから実行まですることができました。 ServoControlはA0(Arduinoのアナログインプット)の値を表示するので、正常に動作していればA0に入力をしていなくても適当に動くはずです。

温度センサーを扱う具体的な話については、 こことか を参照してください。 普通にアナログインプットから読み込んでインテント経由で受け取るだけです。

センサーの値をPUTする

大体ここまでの内容でセンサーの値をAndroidで読み出すことに成功したはずなので、あとはWi-Fi経由で投稿するだけとなりました。 USB温湿度計ではGoogle Spreadsheetsにロギングしていたのですが、正直Androidから直接追記するのに簡単な方法が見つかりませんでした。

というわけで今回は、 Cosm という、RESTfulなURLにデータを投稿して良い感じにグラフとかに表示できるサービスを利用することにしました。 これなら単純にHTTPで叩けばよいだけなので楽です。

方法としては、 API Documentation - Cosm API Documentation を見れば分かるのですが、API KeyをX-ApiKeyフィールドとしてHTTP Request Headerに付与して特定のURLにJSONをPUTすれば良いです。

Androidの標準ライブラリにはPUTメソッドをサポートしたHTTPクライアントが含まれているので、特に難しいことはありません。後述のソースコードをご参照ください。

完成

というわけで、出来上がったグラフがこちらになります。

Cosm - Pip-Boy 2020

僕の部屋の状態がまるわかりになるので犯罪などに利用される可能性も考慮しましたが、まあ今のところ僕の住所情報は一応パブリックな情報では無いということになっているので公開しても良いだろうと判断しました。気が変わったらPriavteにします。この辺柔軟に運用できて、Cosmのような外部のサービスを使って良かったと感じます(その代わり、いつクローズするか分かりませんが…)。

ソフトウェア類のソースコードもgithubにあげておきました。

shimobayashi/Pip-Boy_2020

Arduinoのスケッチも入っているので、適当にどうぞ。

ちなみに、プロジェクト名の由来は言うまでもありませんが、

Fallout 3: Game of the Year PS3 the Best【CEROレーティング「Z」】

Fallout 3: Game of the Year PS3 the Best【CEROレーティング「Z」】

  • 作者:
  • 出版社/メーカー: ベセスダ・ソフトワークス
  • 発売日: 2012/04/26
  • メディア: Video Game

です。2020は、2012が既に存在していたため、適当に付けました。

今後

先ず、湿度センサーと気圧センサーを追加します。

ゆくゆくは、赤外線インターフェイスを追加して温湿度に応じてエアコンを操作したり、USBミラーボール(ゴミ)を接続してなにか危険を通知したりしようと考えています。

これまでハードウェアの製作には手を出せずにいたのですが、今回ようやくその一歩を踏み出すことができました。 ソフトウェアだけでは解決できない問題もかなり多いというのも世の中の現実ですので、より強いパワーを求める以上は避けて通れぬ道であると思います。

個人的にはかなりクールな時計をつくることができてご満悦です。 特に参考書などを参照していないため、本当はもっと簡単に実現することができるかも知れませんが。

本家Pip-Boyに準じてガイガーカウンターを実装する予定は、今のところありません。