その1:ガイガーカウンタにZigBeeを接続する
今後も放射線の継続的なチェックが必要と思われる中で、放射線量の測定と収集をもっと効率よく行う手段はないかと思い、ガイガーカウンタのセンサネットワーク化にチャンレジしてみました。最終目標はこんなイメージです。
いろいろな場所に設置したガイガーカウンタから広範囲に「面」で測定値を集めて最終的にインターネットのWebサービスへ蓄積します。これによってホットスポットの検出や風向きの影響などがもっとダイナミックに把握できるのではないかと期待してます。無線はPAN(短距離無線)を使いますので運用時の通信料金はかかりません。また将来的には950MHz帯などサブ1Gバンドへの移行も想定しています。
とりあえずSparkfunのSEN-09298をようやく入手しました。4月にオーダーを入れてやっと先日、届きました。納期はいつなんだという問い合わせに丁寧に応対してくれたサポートの方、ありがとうございました。
http://www.sparkfun.com/products/9298
またImages SI 社のAnalog Meter Geiger Counter Kitsも同じ時期に入手できました。
http://www.imagesco.com/geiger/geiger-counter-kits.html
当初、ガイガーカウンタの測定値をどうやって外部ホストに取り込めばいのか、かなり悩みました。いろいろ調べてみますと多くのガイガーカウンタは放射線を検出すると、それをパルス信号として特定のIOへ出力します。今回入手した2台もこのタイプになります。したがって、これを外部ホスト側から割り込みでひろってカウントすればCPMが取れます。
ZigbeeデバイスはTK-AD1321+SBを選択しました。
http://www.tessera.co.jp/product5.html
10mW出力なのでZigBeeでも数百メートルの飛距離が期待できます。電池ケースが裏に用意されていて電池駆動時に取り回しがすっきりするのも嬉しいです。
SEN-09298はパルス出力端子があるので素直に接続。検出するとSEN-09298本体のLEDが明滅するので、うまく取れてるか確認しやすいです。
SEN-09298ですが、その後 1)LEDがまったく明滅しなくなった 2)PCにUSBで接続してもUSBを認識してくれない 3)OUTからでてくるパルスが異常に多い ということでどうやらMCU (Atmel)が壊れてしまったようです。
Images SI 社の製品はオーディオアナログ出力端子がついているので、モノラルのオーディオジャックを工作して接続。
次にZigBeeアプリケーションをプログラムしまして、以下のようなコマンド追加のカスタマイズを施しました。
ZigBeeデバイスはUSBシリアルIFでパソコンにつながりますので、TeraTermで 接続してみます。
当社のオフィスがある新横浜の屋内で16-30CPMくらい・・・でしょうか。この値にはバックグラウンドも含みますが、ここからおなじみのマイクロシーベルトへ変換するにはガイガーカウンタが使っているGM管の特性にしたがって係数をかけてやる必要があります。今回はコマンドで係数を設定できるようにして、自動的に換算して画面表示するようにしました。
ガイガーカウンタの放射線測定値が割と簡単に取れることがわかったので、今度はこれをコーディネータへ送信する部分を考える必要があります。ZigBeeを使うのなら勝手なデータフォーマットで送りあうのでなくプロファイルを定義するのが筋かと思いましたので、以下のように定義してみました。
これはクラスタライブラリを利用して実装すれば割りと簡単に作れます。あとは属性読み出し要求、属性レポート要求といった標準的なプロファイル機能を使えば、他メーカーのZigBee機器からでも値を取り出せるようになります。
ZigBeeとインターネットのゲートウェイは ディジ インターナショナル社のConnectPort® X4が便利です。
http://www.digi-intl.co.jp/products/wireless-routers-gateways/routing-gateways/connectportx4h.html
動作をPythonのスクリプトで記述できるのがポイントで、Zigbeeで集めたデータをPachubeなどのWeb APIが要求するJSON形式へフォーマットして特定のURLへポストするといった処理が簡単にできます。
Pachubeは、蓄積したデータからグラフを生成して、ウェブページに自由な縮尺で張れたりするので、使ってみるとなかなか便利です。一般的にはいろいろな言語で用意されているラッパーライブラリを使うようですが、組み込みだとそうもいかないので、生ソケットを使ったサンプルコードを紹介します。Pachubeが受け入れるデータ形式は3種類(JSON, XML, CSV)ありますが、CSVが一番楽です。
ソケットの擬似コード:
## ソケットを生成してポート80番に接続 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((site,80)) ## PUTメソッドでデータ形式は CSV ## api_keyはデータを登録する際に必要なMaster API Key sock.send("PUT http://api.pachube.com/v2/feeds/29765.csv HTTP/1.0\r\n") sock.send("X-PachubeApiKey+: "+api_key+"\r\n") sock.send("Content-length: " + "%d" % len(body_content)) sock.send("\r\n\r\n") sock.send(body_content)
29765というのは今回我々が取得したアカウントのFeed番号で、ここはアカウント毎にそれぞれ異なる数値を指定します。
データを送る際は、「29765.csv」のように ID+形式 で末尾を修飾します。これでサーバ側がPUTされるデータのフォーマットを判断してるようです。
生ソケットを使う場合のポイントはContent-Lengthヘッダで、ここにメッセージボディ部のデータバイト数を指定しないとサーバからエラーが戻ります。逆にいうと、クライアント側のHTTPヘッダで必要なのはX-PachubeApiKeyとContent-LengthだけでOKです。Hostヘッダはなくても通りますが、もし HTTP/1.1 と名乗るなら付加する必要があるでしょう。
ボディ部のデータ形式は、CSVなら非常に簡単で
Stream ID, データ
と2パラメータをカンマ区切りで送るだけです。
AndroidからいつでもPachubeのストリームがチェックできる簡単なアプリ「Pachube Viewer」を公開しています。
一通りの要素機能がそろいましたので、もう少し色々なタイプのガイガーカウンタを追加で入手して、身の回りに設置して運用を開始してみたいと思います。ある程度の安定動作と設置場所の確保ができたらPachubeへの投稿を開始する予定です。
またホストマイコン側で自由にプログラムが作れますので、もっとスマートなガイガーカウンタもできるのではないかと考えています。
などなど。いろいろアイデアを出して進化させていく予定です。