前回の「Pocket Geiger Type6をFreeBSDで使う(動作確認編)」に続いて、もう少し深堀をしていきたいと思います。
最終的には、24時間365日稼働のFreeBSDサーバーにPocket Geiger Type6を接続し、定期的に測定した結果をWebサーバで表示するところまで持っていければと思います。
前回の動作確認で記載した通り、Pocket Geiger Type6自体はシリアルデバイスとして利用可能なので、新たにドライバ等を書いてやる必要はありません。
とりあえず、一番手軽なシェルスクリプトで実装してみます。
#!/bin/sh device_file='/dev/cuaU0' result='./result.csv' trial_limit=6000 lock_file='/var/run/measure_radiation' if [ `whoami` != 'root' ] then echo 'This shellscript must be run by user "root".' exit fi if [ -f ${lock_file} ] then echo 'This shellscript is being executed, operation aborted.' exit fi touch ${lock_file} if [ ! -e ${device_file} ] then echo 'DeviceFile is not found, operation aborted.' exit fi trial_count=0 success_count=0 radiation_count=0 start_date=`date "+%Y%m%d%H%M%S"` echo 'S' > ${device_file} while read line < ${device_file} do radiation_count_incremental=`echo ${line} | tr -d ">" | cut -d ',' -f 1` error_count=`echo ${line} | tr -d ">" | cut -d ',' -f 2` if [ 0 == ${error_count} ] then radiation_count=$(( radiation_count + radiation_count_incremental )) success_count=$(( success_count + 1 )) fi trial_count=$(( trial_count + 1 )) if [ ${trial_limit} == ${trial_count} ] then break fi done echo 'E' > ${device_file} microsv_per_hour=`echo "scale=3; ${radiation_count} *${trial_limit} / ${success_count} * 600 / ${trial_limit} / 53.032" | bc | sed -e 's/^\./0./g'` echo "${start_date},${trial_limit},${success_count},${radiation_count},${microsv_per_hour}" >> ${result} rm ${lock_file}
実装にあたって、不明な点があったので、販売元に確認してみました。
まず1点目、返却されてくる
> (Signal),(Noise)
のそれぞれの値(Signal、Noise)については、ともに100msの間に観測されたカウントで、CPMではないのではないかと聞いてみましたが、そのとおりでした。
ですので、Signalの値を600スロット分(10msec×600=60sec=1min分)足し合わせればCPMになります。
続いて2点目、Noiseが観測された場合には、その値をどうするべきか(その値を捨てるのか、Noise分を除いたSignalをカウントするのか)を聞いてみましたが、Androidアプリでは、Noiseが観測された場合、その前後1秒間(合計2秒間,21スロット分?)のSignalを捨てているそうです。
つまり、Noiseが検出されたらそのスロット分の測定結果は捨てるべきで、Androidアプリでは更にその前後のスロットの観測結果についても捨てているわけです。
私が試した範囲では、Pocket Geiger Type6に衝撃を与えない限りは、Noiseが観測されることはほぼないので、上のシェルスクリプトではNoiseが観測されたスロット分のみ捨てるようにしています。(実装が簡単なので…)
最後に3点目、CPMからuSV/hへの換算式を聞いてしましたが、Pocket Geiger Type6ではCPMを53.032で割った値をuSV/hとすればよいとのことです。(実際に公開されているAndroidアプリのコードを追っていくと、この変換を行なっています。)
やや脇道にそれてしまいましたが、このシェルスクリプトを実際に実行すると、10分間の計測の後、変数resultで指定したファイルにCSV形式で測定結果を追記していきます。
20170518233414,6000,6000,28,0.052
測定毎に上記のような行が追加されていきます。
各値の意味は、左から順番に測定開始日時 測定スロット数 有効スロット数(Noiseが観測されなかったスロット数) カウント数 uSV/h換算値
となっています。
あとは、このスクリプトを定期的に動かし、測定した結果をcsvに蓄積していけばよいです。
ローカルに蓄積するのではなく、値そのものをどこかのサーバに定期的に通知したい場合は、wgetやfetchなどを使って、
wget "http://foo.bar/upload_radiation.cgi?start_date=${start_date}&trial_limit=${trial_limit}&success_count=${success_count}&radiation_count=${radiation_count}µsv_per_hour=${microsv_per_hour}"
とかやればよいと思います。
実際にサーバ間のI/Fを構築する際は、悪意のあるユーザがサーバ側に偽の測定値を送りつける可能性があるため、
・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。
まだ評価がありません |
表示できるメッセージはありません。