- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2022-06-08T02:03:53+09:00","","")
#author("2022-06-25T17:28:51+09:00","","")
その1:ガイガーカウンタにZigBeeを接続する
■はじめに
#contents
*はじめに [#d24b349a]
今後も放射線の継続的なチェックが必要と思われる中で、放射線量の測定と収集をもっと効率よく行う手段はないかと思い、ガイガーカウンタのセンサネットワーク化にチャンレジしてみました。最終目標はこんなイメージです。
Geigernet
&ref(geigernet.jpg,nolink);
いろいろな場所に設置したガイガーカウンタから広範囲に「面」で測定値を集めて最終的にインターネットのWebサービスへ蓄積します。これによってホットスポットの検出や風向きの影響などがもっとダイナミックに把握できるのではないかと期待してます。無線はPAN(短距離無線)を使いますので運用時の通信料金はかかりません。また将来的には950MHz帯などサブ1Gバンドへの移行も想定しています。
■ガイガーカウンタ
*ガイガーカウンタ [#b2ecea09]
とりあえず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
■ZigBeeデバイスとの接続
*ZigBeeデバイスとの接続 [#zdc84e65]
当初、ガイガーカウンタの測定値をどうやって外部ホストに取り込めばいのか、かなり悩みました。いろいろ調べてみますと多くのガイガーカウンタは放射線を検出すると、それをパルス信号として特定のIOへ出力します。今回入手した2台もこのタイプになります。したがって、これを外部ホスト側から割り込みでひろってカウントすればCPMが取れます。
ZigbeeデバイスはTK-AD1321+SBを選択しました。
http://www.tessera.co.jp/product5.html
10mW出力なのでZigBeeでも数百メートルの飛距離が期待できます。電池ケースが裏に用意されていて電池駆動時に取り回しがすっきりするのも嬉しいです。
SEN-09298はパルス出力端子があるので素直に接続。検出するとSEN-09298本体のLEDが明滅するので、うまく取れてるか確認しやすいです。
spark-zigbee
*)2011/08/10 SEN-09298ですが、その後 1)LEDがまったく明滅しなくなった 2)PCにUSBで接続してもUSBを認識してくれない 3)OUTからでてくるパルスが異常に多い ということでどうやらMCU (Atmel)が壊れてしまったようです。 [#k9d41f36]
&ref(sparkfun.jpg,nolink);
**2011/08/10 [#t1f90d6f]
SEN-09298ですが、その後 1)LEDがまったく明滅しなくなった 2)PCにUSBで接続してもUSBを認識してくれない 3)OUTからでてくるパルスが異常に多い ということでどうやらMCU (Atmel)が壊れてしまったようです。
Images SI 社の製品はオーディオアナログ出力端子がついているので、モノラルのオーディオジャックを工作して接続。
imagesi-zigbee
&ref(imagesi.jpg,nolink);
■実行画面
*実行画面 [#pc760be2]
次にZigBeeアプリケーションをプログラムしまして、以下のようなコマンド追加のカスタマイズを施しました。
CPM, nSv/h, nGr/hの表示切り替え機能
CPMから各単位へ変換するための係数をあらかじめセットしてあとから変更できるように(接続するガイガーカウンタによって係数を調整するため)
パルスのカウント単位を1分間隔で任意に設定できるように
-CPM, nSv/h, nGr/hの表示切り替え機能
-CPMから各単位へ変換するための係数をあらかじめセットしてあとから変更できるように(接続するガイガーカウンタによって係数を調整するため)
-パルスのカウント単位を1分間隔で任意に設定できるように
ZigBeeデバイスはUSBシリアルIFでパソコンにつながりますので、TeraTermで 接続してみます。
実行画面の例:
*実行画面の例: [#t9c09d69]
terminal
&ref(command.jpg,nolink);
当社のオフィスがある新横浜の屋内で16-30CPMくらい・・・でしょうか。この値にはバックグラウンドも含みますが、ここからおなじみのマイクロシーベルトへ変換するにはガイガーカウンタが使っているGM管の特性にしたがって係数をかけてやる必要があります。今回はコマンドで係数を設定できるようにして、自動的に換算して画面表示するようにしました。
■プロファイル
*プロファイル [#da74548b]
ガイガーカウンタの放射線測定値が割と簡単に取れることがわかったので、今度はこれをコーディネータへ送信する部分を考える必要があります。ZigBeeを使うのなら勝手なデータフォーマットで送りあうのでなくプロファイルを定義するのが筋かと思いましたので、以下のように定義してみました。
測定対象 クラスター番号 属性ID レンジ
放射線量 0xXXXX 0x0000 測定値 符号なし64ビット整数
0x000A 単位 符号なし8ビット整数
01:CPM
02:グレイ (nGy/h)
03:シーベルト(nSv/h)
2, 3の単位時間は毎時、桁はナノ
0x000B 線種
&ref(ガイガー.png,nolink);
01:α線
02:β線
04:γ線
00:区別不可能
Bitmap型、複数線種はANDを取る
0x0010 機種 利用しているガイガーカウンタの機種、メーカー、品番
4桁でメーカー名と品番をリスト化して接続機種を明示する
これはクラスタライブラリを利用して実装すれば割りと簡単に作れます。あとは属性読み出し要求、属性レポート要求といった標準的なプロファイル機能を使えば、他メーカーのZigBee機器からでも値を取り出せるようになります。
■ゲートウェイ
*ゲートウェイ [#t81de9c3]
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の使い方 (2011/8/8更新)
*Pachubeの使い方 (2011/8/8更新) [#d496a288]
Pachubeは、蓄積したデータからグラフを生成して、ウェブページに自由な縮尺で張れたりするので、使ってみるとなかなか便利です。一般的にはいろいろな言語で用意されているラッパーライブラリを使うようですが、組み込みだとそうもいかないので、生ソケットを使ったサンプルコードを紹介します。Pachubeが受け入れるデータ形式は3種類(JSON, XML, CSV)ありますが、CSVが一番楽です。
ソケットの擬似コード:
## ソケットを生成してポート80番に接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((site,80))
## ソケットを生成してポート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)
## 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パラメータをカンマ区切りで送るだけです。
■Androir用ビューワ
*Androir用ビューワ [#l6e4ee63]
AndroidからいつでもPachubeのストリームがチェックできる簡単なアプリ「Pachube Viewer」を公開しています。
■今後の予定
*今後の予定 [#u3a7c532]
一通りの要素機能がそろいましたので、もう少し色々なタイプのガイガーカウンタを追加で入手して、身の回りに設置して運用を開始してみたいと思います。ある程度の安定動作と設置場所の確保ができたらPachubeへの投稿を開始する予定です。
またホストマイコン側で自由にプログラムが作れますので、もっとスマートなガイガーカウンタもできるのではないかと考えています。
RTCを使って毎日定刻に起床して計測してまた寝る
内蔵フラッシュの空き領域に計測値を記録しておいてあとでまとめて回収する
閾値を設定してアラートを発する
-RTCを使って毎日定刻に起床して計測してまた寝る
-内蔵フラッシュの空き領域に計測値を記録しておいてあとでまとめて回収する
-閾値を設定してアラートを発する
などなど。いろいろアイデアを出して進化させていく予定です。
その他の記事はこちらからご覧頂けます。