ArduinoではじめるXBee M2Mネットワーキング

XBee ZigBee
ワイヤレス放射線量測定ガイガーカウンターの製作

by ボクにもわかる地上デジタル

XBeeメインメニューへ戻る
地デジトップへ戻る

XBee ZigBee ワイヤレス放射線量測定ガイガーカウンター
XBee ZigBee ワイヤレス放射線量測定ガイガーカウンターの製作例

このページについて

 このページでは、RADIATION WATCH 組込版ポケットガイガーType5を使ったワイヤレス放射線量測定ガイガーカウンター(Geiger Counter)の製作方法を説明しています。外などに設置したポケットガイガー(センサー)子機の測定結果を屋内のArduino XBee 親機で確認できます。
 なお、動作確認は放射能の低い(0.1μSv/h以下の)関西地区で行っております。放射線量の多い(10μSv/h以上の)地区では放射線カウント量が増大し、XBeeの通信が間に合わずに「低めの値」が観測されてしまう場合などの想定外の動作をしてしまう可能性があります。いずれの環境であっても測定結果の信頼性について当方は一切の責任を負いませんので、十分にご注意ください。

XBee ZigBee ワイヤレス放射線量測定ガイガーカウンター
ZigBee ワイヤレス放射線測定用 ArduinoベースXBee親機の製作例

RADIATION WATCH 組込版ポケットガイガーType5 とは

 radiation-watch.orgは安価な放射線測定システムを開発している非営利プロジェクトです。同団体は「ポケットガイガー(POCKET Geiger)」と呼ばれている放射線量カウンター(センサー)を発売しています。そのうちType5と呼ばれている機種は組み込み用途に向けられた製品です。Type 1〜Type 3にくらべて高感度のセンサーを搭載しつつ、ミント菓子のケースとほぼ同じ超小型サイズを実現しています。

XBee ZigBee ワイヤレス放射線量測定ガイガーカウンター
POCKET Geiger Type 5

 ここからは、(1)ポケットガイガーの組立てを行い、(2)Arduinoに接続して動作確認をし、(3)XBeeと接続してZigBee放射線量センサー子機を作成する手順について説明します。製作には若干のハンダ付けを伴いますが、キットやブレッドボードを使用することで、手軽に作成できるように配慮しています。

ポケットガイガーを組み立てる

 ポケットガイガーの「組み込み版」となっていますが、必ずしも何かに組み込むという意味では無いようです。例えば、ちゃんとしたセンサー部用のケースが付属していますので、センサー単体の機器とも言えると思います。センサー部はポケットガイガーのメイン基板と付属のアルミ板をケースに入れるだけで完成します。下図のようにアルミ板2枚をケースの内面に両面テープで張り付けて使用します。放射線のうちベータ線も含めて測定したい場合はアルミ板の取り付けずに組み立てますが、この場合は放射線量への変換係数(スケッチ中のalpha値)が変わってしまいますので、放射線量はcpm値でカウントすることになります。

XBee ZigBee ワイヤレス放射線量測定ガイガーカウンター
POCKET Geiger Type 5を組み立てる

 上の写真の中央に写っている基板がポケットガイガーのメイン基板です。コネクタも実装されていますし、センサー部もアルミで覆われています。付属のアルミ板はケースの内側の上方いっぱいのところで(上辺が接触するように)張り付けます。センサー素子が上部ギリギリまであるので、アルミ板で遮れなくなってしまうからです。また背面側のケースは、しっかりと張り付けておかないとアルミ板が下方へずれてきてしまいます。念のためにポリイミドテープなどで絶縁保護しておいた方が良いかもしれません。

ポケットガイガーをArduinoに直接接続して動作確認をする。

 ここで、動作確認のためにポケットガイガーをArduinoに接続してみます。先ほど組み立てたセンサー部から付属のケーブルを経由し、さらにケーブルを接続する接続用コネクターからArduinoへ繋ぎます。
 Type5には接続用コネクター(部品)が付属していますので、ワイヤー線(ブレッドボードジャンパー線)を本コネクターにハンダ付けして、ワイヤー線の反対側をArduinoへ接続します。なお、ワイヤー線は付属しませんので、別途、手に入れてください。
 コネクタへのハンダ付けとArduinoへの接続方法は下図を参照してください。テスト用のArduinoスケッチおよびパソコン用の表示ツールはradiation-watch.orgの「専門家向け資料」からダウンロード可能です。もしくは、ボクがテストするときに使用したAdafruit液晶表示用のスケッチ「PocketGeiger_lcd」もご利用いただけます。
 このArduinoとの接続は、あくまでポケットガイガーが正しく動作しているかどうかのテストが目的です。Arduino側にハンダ付けしたりしないようにしてください。

XBee ZigBee ワイヤレス放射線量測定ガイガーカウンター
POCKET Geiger Type 5接続用コネクタ(Type5付属品)にリード線をハンダ付けする。

XBee ZigBee ワイヤレス放射線量測定ガイガーカウンター
Arduinoを接続する。黒い部品が接続用コネクター(Type5付属品)

 これらの図に記載の放射線センサー接続用のコネクタは図の下側からケーブルを差し込み、ポケットガイガーと接続します。これら2枚の写真および当ページの製作例の写真でワイヤー線の色を統一しています。赤色が電源、青色がGND、黄色が放射線パルス信号、緑色がノイズ信号です。
 製作したら土壌の近くなど、放射能のありそうな物質に近づけて確認してみます。放射線量がカウントされることを確認してください。また、振動を検出した時の測定を破棄する動作も可能であれば確認しておいたほうが良いでしょう。
 なお、ポケットガイガー接続用のコネクターは通常のステレオジャックでは代用できません。ステレオ+マイクもしくはビデオ信号などで使用されている4極用のオーディオ用ジャックである必要があります。

ポケットガイガー用XBee子機を製作する。

 ポケットガイガーType5センサーをXBeeと接続します。XBeeは購入したままの「Router」もしくは「End Device」にします。確実にカウントするようにしたい場合は「Router」のままで使用しますが、乾電池で長時間動作させたい場合は「End Device」に設定を変更します。ただし、「End Device」の設定はXBeeの様々な知識が必要のため、始めは「Router」で実験し、実用段階で「End Device」にして十分に評価を行うのが良いでしょう。
 下図のような配線を行うことで、放射線センサー子機となり、放射線の測定パルスをArduino親機に送信します。Arduino親機は上記のテストで使ったものとは違います。混乱しないようにしてください。

XBee ZigBee ワイヤレス放射量線測定ガイガーカウンター
POCKET Geiger Type 5とArduinoを接続する。

ポケットガイガー Arduino XBee 親機を製作する。

 子機から送られた測定パルスを Arduino XBee 親機で表示します。ArduinoにWireless ShieldとXBeeモジュールを取り付けて製作します。製作方法などは「ArduinoではじめるXBee M2Mネットワーキング1.さぁ準備を始めよう」を参照してください。

Arduino + Wireless SD Shield (XBee Shield)
Arduino + Wireless SD Shield (XBee Shield)

 また、同じページに記載されている、親機用のXBee-PROモジュールの設定や、Arduino IDEへXBeeライブラリを追加する必要もあります。XBeeライブラリの追加方法は、XBee用ライブラリ(xbee_arduino.zip)をダウンロードし、ZIP圧縮されたファイルを展開して、Arduino IDEの「libraries」フォルダにコピーします。


 さらに、ポケットガイガー用 Arduino XBee 親機のスケッチを下記からダウンロードしてArduino IDEで開いてください。これをArduinoに書き込めば動作します。
 Arduino親機が起動すると放射線センサー子機を探し始めます。起動画面のまま進まない場合は、親機XBeeとのシリアル通信の不具合です。親機XBeeに「Coordinator API」のファームウェアが書かれているか、Wireless Shieldのシリアル切り替えスイッチが「MICRO側」になっているかなどを確認してください。放射線量の高い地域ではXBee子機からのデータが大量に送信されてしまい、親機XBeeの起動が出来ない場合があります。そのような場合は、放射線センサー部のコネクタからケーブルを抜いた状態で起動し、その後に再接続してください。
 まれに、Arduinoへのソフトウェア書き込み時に、XBeeが暴走してしまうこともあります。この場合は、一度、XBeeモジュールを取り外して差し込み直してみてください。
 起動後、「ATNJ=10」の表示中に子機の一つしかないボタンを押すとペアリングが行えます。このとき「gpio init」のメッセージが出なければ、再度、同じボタンを押します。一度、ペアリングを行うと、次回からは1回だけのボタン操作で「gpio init」が表示されるようになります。

スケッチ等ソフトウェアダウンロード

ポケットガイガー用のスケッチ・ソースコード
名前 内容
PocketGeiger_xbee Arduino XBee 親機 (子機=Router)のスケッチ
サンプルのうち語尾が「ed」のものは後述のEnd Device用です。
PocketGeigerPC_xbee パソコン XBee 親機 (子機=Router)のソースコード(動作確認用)
PocketGeigerPC_xbee_ed パソコン XBee 親機 (後述の子機=乾電池で動作するEnd Device)用
PocketGeiger_lcd XBeeを使用せずにArduinoで直接測定するソフト(動作確認用)

乾電池で長時間動作するEnd Deviceの製作例

 製作したままの状態で実験をし続けると、XBeeの消費電力が大きくてアルカリ乾電池で丸一日も持たないかと思います。ここでは電池の寿命を延ばすために放射線センサー側の子機XBeeにSLEEP信号を生成するための回路を追加したり、子機XBeeをZigBee End Deviceに設定したりする方法について説明します。また、1つの放射線パルスのH→Lの変化とL→Hの変化の両方を送信するのは無駄なので、1ビットのカウンタ回路を使ってパルス毎に信号レベルをトグルする(HとLを入れ替える)方式に変更します。さらに、XBee周りの平均消費電力を数mWまで下げることが出来ますが、ポケットガイガー本体の消費電力が30mWと大きいので、測定時以外は電源を切れるようにMOS FETを追加しました。

 まずはEnd Deviceで動作させるためのハードウェアについて説明します。ポケットガイガーから放射線パルス信号が発生した時にXBeeのSLEEP_RQ端子(XBee_pin 9)を一時的にLレベルに設定する必要があります。下図はD-FF(Dタイプフリップフロップ)74HC74を使った例です。


ZigBee End Device ガイガーカウンター子機

 74HC74APには2回路のD-FFが入っています。ここでは放射線パルスからSLEEP_RQ信号を生成する回路は1回路のD-FFで実現できるので、余った1回路は1ピットのカウンタ回路にしてパルス毎にトグル信号を生成する回路としました。トグルにすることで、送信パケットが半分になり、しかも、送信エラーなどでパケットが消失した場合に同じレベルが続くので、パケット消失を検出することが出来ます。
 トランジスタ(図中の「P」の表示)は2SA1015GRを使用しました。積層セラミックコンデンサは0.1uFです。74HC74の6番ピンに接続されている100kΩの抵抗と0.1uFの積層セラミックコンデンサはXBeeのスリープの解除時間を決めるためのLC回路です。抵抗を小さくするとXBeeが起動している時間が短くなり、より省電力になる可能性がある一方、動作が不安定になる懸念があります。
 ポケットガイガーからの放射線パルス入力のプルアップ抵抗は22kΩです。その他の抵抗はカラーバーを参考にしてください。
 また測定時以外の時にポケットガイガーの電源をシャットダウンするためのPch MOS-FET IRLML6402は秋月電子で入手できます。ブレッドボードや基板へはSOT23変換基板を経由して取り付けます。MOS_FETの端子は必ずしも図のとおりではありません。デバイスのデータシートを見て、ソース(S)を電源に、ドレイン(D)をポケットガイガーに、ゲート(G)は抵抗を経由してXBeeの11番ピンに接続してください。
 上図には記載していませんが、ポケットガイガーが起動時に大電流が流れますので電源に1000uFの電解コンデンサを入れています。電解コンデンサによっては1mA程度のリーク電流が生じ、電池寿命に影響する場合がありますので注意が必要です。

ZigBee End Device ガイガーカウンター 部品リスト
部品名 単価 数量 備考
XBeeZBモジュール 1700円 1個  
XBeeピッチ変換基板とソケット 400円 1個 Switch Science製
74HC74 30円 1個 放射線パルスをトグル送信します
Pch MOS-FET IRLML6402 40円 1個 ポケガの電源を制御します
SOT23変換基板(上記FET用) 20円 1個 秋月電子製
電解コンデンサ 1000uF 50円 1個 電源に入れてください
積層コンデンサ 0.1uF 10円 3個 電源用2つと遅延回路用1つ
抵抗 1kΩ 10円 1個 トランジスタ駆動用
抵抗 10kΩ 10円 2個 トランジスタ入力用
抵抗 22kΩ 10円 1個 ポケガ入力プルアップ用
抵抗 100kΩ 10円 1個 遅延回路用
電池ボックス 単3×2本用 50円 1個  
タクトスイッチ 10円 1個 ペアリング用
ブレッドボード EIC-801 250円 1個 本回路のベース基板です

 次に子機のXBeeを「END DEVICE AT」に変更します。子機XBeeをEnd Deviceへの変更するにはX-CTUを使用してファームウェアを書き換えます。また、X-CTUなどで下表のように設定を変更します。X-CTUの使い方は「ArduinoではじめるXBee-さぁ準備を始めよう」などを参照してください。

XBee ZigBee 温度・照度センサー X-CTU 設定例
AT name 初期 説明
SM Sleep Mode 0x04
Cyclic
0x05
cyc+pin
No Sleep(00)/Pin Hibernate(01)/Cyclic Sleep(04)/Cyclic Sleep Pin-Wake(05)の切り換え。Cyclic Sleep wakes on timer expiration.
ST Time before Sleep 0x1388
5000[ms]
0x03E8
1000[ms]
シリアルやRFの通信終了後、省電力モードに移行するまでの待ち時間[ms]。
SP Sleep Period 0x0020
32x10[ms]
0x07D0
20秒
ZigBeeデータ通信のための省電力モードの持続時間x10[ms]。RouterとCoordinatorは情報の最大保持期間。設定範囲は0020(320ms)〜0AF0(28sec)。
SN Sleep Number 0x0001
毎回起動
0x0003
(20×3)秒毎
外部CPUを起動するまでの起動カウンタ。SP後に通信データが無い場合は省電力モードになり、それがSN回続くと外部On/Sleep pinへON信号(H)を出力する。(SP×SNの間隔で起動)
SO Sleep Options 0x00
オフ
0x00
オフ
0x02 - Wake for ST time on each cyclic wake (after sleeping for SP*SN)
0x04 - Enable extended cyclic sleep (SP毎にポーリングしない)
DH Destination Address High 0x00000000 0x0013A200 測定結果を送信する宛先(親機)の上位アドレスを指定する
DL Destination Address Low 0x0000FFFF 0xXXXXXXXX 測定結果を送信する宛先(親機)の下位アドレスを指定する
PR Pull-up Resistor 0x1FFF 0x1FF7 ポート1以外をプルアップ。
IC IO Change Detection 0x0000 0x0003 ポート1とポート2の変化検出を有効に設定。

 上表はXBee子機End Device側の設定ですがSP値についてはXBee親機Coordinator側にも設定しておく必要があります。そうしないと親機が子機の存在を忘れてしまい、途中で通信が出来なくなります。
 End Deviceの低消費電力に関する詳細は「スリープ方法 CYCLIC SLEEP」や「XBee ZigBee End Device ボタンの製作方法」を参照してください。

 以上の改造で、本機およびXBeeのスリープ時の消費電力はほぼ0mWに、平均消費電力もおよそ2mWほどまでになります。ただし、ポケットガイガーの消費電力が30mWほどありますので、ポケットガイガは1時間毎に3分間だけ動作させるようにして平均消費電力を下げて使用します。
 放射線パルスのトグル送信や1時間に1度のポケットガイガーの電源動作を行うにはスケッチもしくはソースコードの変更も必要です。親機にPCを用いた場合の変更例は「PocketGeigerPC_xbee_ed」からダウンロードできます。以下はパルスのトグル送信による親機XBeeの変更部分です。

End Deviceにした場合の検出部の変更例
switch( xbee_result.MODE ){
  case MODE_GPIN:
    if( bytecmp( dev_sens , xbee_result.FROM ,8 ) == 0 ){  
      signCount++;
      if( xbee_result.GPI.PORT.D1 == signValue ){
        signCount++;
        printf("detected packet loss\n");
      }
      signValue = xbee_result.GPI.PORT.D1;
    }
    break;
}

 以上により、実用的なXBee放射線センサーが完成しました。なお、測定結果は6秒ごとに出力されますが、60分のうち約57分間は同じ値しか応答しません。また、アルカリ電池で何日もつかの確認はこれからです。

制約事項

実際よりも低く計測される

 XBee送信パケットの損失により、放射線量が低く計測されてしまいます。例えば、電波強度が低く通信が安定しない場合や、XBeeで使用する2.4GHz帯を使用した電子レンジなどの動作などによって、XBeeのパケットがArduino側で一時的に受信できなくなる場合などに発生します。
 したがって、測定結果によって人命や健康を損なうよう恐れがあるような用途には使用できません

測定範囲は10μSv/h以下

 放射線の検出パルス毎にXBee通信を行っていますので、1秒あたりのカウント値が大きくなると正確にカウントできなくなります。10μSv/h以上を測定したい場合は、カウンタ回路などを追加して一定のカウント量毎に送信する、もしくはカウント値を送信するといった回路の追加が必要です。最も容易な方法として、End Deviceの設定例に記載したように74HC74などのDタイプフリップフロップを使用し、パルスをクロック入力に、負論理出力をD入力に帰還することでカウンタ回路が簡単に作成できます。なお、カウンタ回路の段数に応じて、Arduino側のスケッチの変更が必要です。
 カウンタ回路の1段目はカウント精度を維持したままXBeeの送信回数を減らすことが出来ます。XBeeはGPIOの入力に変化があった時に送信を行いますので、これまでは放射線カウントパルスの立ち上がりと立下りの両方で2回のXBee送信を行っていました。しかし、1段のカウンタ回路を付加することで放射線パルス1つにつき、1度しか信号が変化しなくなり、放射線パルス1つにつき1回しかXBee送信を行わなくなるからです。

ポケットガイガーの突入電流

 ポケットガイガーの動作電圧範囲は3V〜9Vとなっています。1.5Vの乾電池×2個で動作させる場合は、ポケットガイガの電源投入時に突入電流が流れて乾電池の内部抵抗によって電圧が下がり、その結果、動作範囲の3Vを下回ってしまい大電流が流れ続けたまま起動できない問題があるようです。同時にXBeeの電源も入る場合は、さらに電圧降下が増します。
 こういった場合、外部電源などでポケットガイガーを起動しておいてから電池に切り替える、もしくは「
乾電池で長時間動作するEnd Deviceの製作例」のように電源に大きなコンデンサを追加したうえで、ポケットガイガーの電源をXBeeから制御して起動する方法があります。

より実用的なワイヤレスガイガーへ

 Arduino互換機であるseeed studuio製のSeeeduino Stalker v2.3を使用し、太陽電池、リチウムポリマー電池、防水ケースを組み合わせることで屋外で半恒久的にデータを送信し続ける子機を製作記事を「Stalking Geiger」に掲載しています。


ワイヤレス放射線量測定ガイガーカウンター 〜Stalking Geiger〜


半年間の測定結果

より安価に製作したい方へのヒント

 ここまでは簡単に製作して実験するための情報でしたがが、より安価に実験や製作を行いたいという方もいらっしゃると思います。まず、放射線量を測定するセンサー部については、RADIATION WATCHから、Type 1という旧製品が特価で1,850円で売られており、こちらを利用すれば安価に製作できるでしょう。また、秋月電子からはPINフォトダイオード使用簡易放射線量モニターキットが液晶込みで3,700円で売られています。同キットに含まれる浜松ホトニクス製の大面積SiPINフォトダイオードS6775の単品や、フォトダイオードに層化するCsI(ヨウ化セシウム結晶)固体シンチレータの単品も売られています。さらに、最近は5000円以下の簡易測定器も登場しています。しかしながら1台は放射線量の基準となるセンサーが必要です。RADIATION WATCHの製品は一定の精度が得られている点で、他社品とは値段以上の価値があるものと思います。
 次にArduino機です。秋月電子 Arduino互換ボードのような安価なものが売られています。しかし、XBeeと接続するためのXBee Shiledが、そこそこ高価です。そこで、始めからXBeeが搭載可能な中国 DF ROBOT社の製品や同じく中国 Seeed Studio社の製品を輸入する方法があります。(中国からの輸入は国内調達や米国からの輸入に比べて高いリスクを伴いますのでご注意ください。)
 市販のArduinoボードに頼らないのであれば、ATmega328PにArduino ROMを書き込んで製作すれば、大幅な節約が可能です。とくに、XBeeの信号が3.3Vであることを考えれば、始めからATmegaを3.3Vで動作させることで直結できる点でも安価になります。
 XBeeを安価に入手するのは困難です。1個1,700円が相場ですので、あきらめましょう。もし、大量に製作するのであれば、Digi社から XBee ZB SMTモジュール という表面実装タイプのXBeeモジュールが売られており、通常のXBeeモジュールに対して、コネクタが不要になるなど安価に製作できる可能性があります。但し、最小発注数量が、それなりに多いので、少量の場合は通常のXBeeモジュールの方が安価に入手できると思います。

 さらにはArduinoを使わずにパソコンでXBee親機を製作する方法もあります。パソコン代が高くなりますが動作確認用としては新たに買うものが少ないので安価だと思います。パソコンとXBee親機とはXBee USBエクスプローラで接続します。XBeeモジュールのUSB変換基板「XBee USB Fly」を自作するという方法もあります。パソコンへのXBeeライブラリのインストール方法は「センサネットワークを構築しよう」を参照してください。また、ポケットガイガー用のアプリは「PocketGeigerPC_xbee」をコンパイルして使用してください。実行時にcygwinから実行ファイル名に続いてシリアルポート番号(数字のみ)を入力して起動します。


XBeeメインメニューへ戻る

地デジトップへ戻る