Gm-10
GM-10はBlack Cat Systemsが販売しているガイガーミュラーカウンタ.
計測結果は60分ごとにTwitter botが呟き中.
オーダーから入手まで
- 2011年5月4日: 製品ページの"Buy Now"ボタンを押してオーダーを試みると,在庫切れの表示.入荷待ちしたい人はメールしろというので,メールしてみる.すぐに backorder list に入れたという返事が来る.
- 2011年5月18日: メールで若干の在庫があるからオーダーできるという連絡が届く.メールに添付されていたURLからUSBモデルのGM-10をオーダー.PayPal決済で本体価格 $249.00,送料が $39.13.
- 2011年5月20日: 出荷したとのメールが届く.
- 2011年5月25日: 航空郵便で物が届く.関税 500円と通関手数料200円を郵便配達員に支払って受け取る.
Install
ハードウェアの設定は本体にシリアル-USB変換ケーブルを取り付け,USBをPCにつなぐだけ.今回はLinux (Ubuntu Server 10.04.4) に接続. 2個目のシリアルデバイスなので,/dev/ttyUSB1 として認識される.
稼働確認のためkermitでつないでみる.
$ kermit C-Kermit> set line /dev/ttyUSB1 C-Kermit> set speed 57600 C-Kermit> set stop-bits 1 C-Kermit> connect
すると画面に読めない文字が表示される.動作しているようだ.
もしつながらなかったら /dev/ttyUSB1のパーミッションを調べる.
準備
GM-10を読むデーモンを動かすUnixユーザを作成する.
$ sudo adduser --system gm10
デバイス
デバイスがttyUSB0になるかttyUSB1になるかはタイミング依存で,ブートするたびに変わってしまう可能性がある. それでは不便なので,udevを使って固有の名前がアサインされるようにすべき.
/etc/udev/rules.d に 80-ttyUSB.rules というファイルを作り,そこにルールを記述する.ルールの書き方はここを参照し,ルールに使える条件は以下のコマンドで調べる.
$ udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB1) | less
ここで /dev/ttyUSB1 は調べたいデバイスの名前.
あくまで例だが,USB物理ポート番号で識別する場合は以下のようになる.
SUBSYSTEM=="tty",KERNELS=="4-2",SUBSYSTEMS=="usb",SYMLINK+="nas04-console" SUBSYSTEM=="tty",KERNELS=="7-2",SUBSYSTEMS=="usb",SYMLINK+="gm10-1",OWNER="gm10",MODE="0660"
ここで
- 1行目は(GM-10とは関係ない)シリアルデバイス.ポート4-2につながっているデバイスを選択して,
- /dev/nas04-consoleというシンボリックリンクを作っている.
- 2行目がGM-10のシリアルデバイス.ポート7-2につながっているデバイスを選択して,
- /dev/gm10-1というシンボリックリンクを作り,
- オーナーを"gm10"というユーザに変更し,
- パーミッションを 0660 (-rw-rw----) に設定している.
物理アドレスだとUSBの配線に依存するので,ATTRS{modalias}とかを使って選択すべきかもしれない.
実は "/dev/gm10-1" というようなお尻が数字で終わるネーミングは重要.下で設定するドライバがそういう名前でないとだめなようにできているから.
Linux Driver
Linuxサーバーにつないで使うので,Linux用ドライバを準備.
必要そうな前提ソフトをゲット
$ sudo apt-get install mysql-client libmysql++-dev
- http://mathias.bavay.free.fr/software/gm4lin/ から最新版のtarballをゲット
- 適当なディレクトリで展開
- バイナリが同梱されていてそのまま動くが,MySQLサポートがdisableされているので,Makefileに以下のパッチを当てる
*** Makefile.orig 2011-04-14 18:07:12.000000000 +0900 --- Makefile 2011-05-26 02:30:51.000000000 +0900 *************** *** 23,33 **** #LIB_GETTEXT=-lintl #comment the following 5 lines to disable my_sql support ! #MYSQL_LIBS= -lmysqlclient -lz ! #MYSQL_CFG=/usr/bin/mysql_config ! #MYSQL_LIBS=-L'/usr/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm ! #MYSQL_INCLUDES=-I'/usr/include/mysql' ! #SQL_DECLARE=-D SQL_LIBS #for "buggy" implementations of sigaction #BUGGY_SIGACTION=-DBUGGY_SIGACTION --- 23,33 ---- #LIB_GETTEXT=-lintl #comment the following 5 lines to disable my_sql support ! MYSQL_LIBS= -lmysqlclient -lz ! MYSQL_CFG=/usr/bin/mysql_config ! MYSQL_LIBS=-L'/usr/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm ! MYSQL_INCLUDES=-I'/usr/include/mysql' ! SQL_DECLARE=-D SQL_LIBS #for "buggy" implementations of sigaction #BUGGY_SIGACTION=-DBUGGY_SIGACTION *************** *** 44,50 **** OPT_OK=-ffast-math -fomit-frame-pointer -finline-functions -fexpensive-optimizations OPTIMISATIONS=$(OPT_OK) $(OPT_TEST) #available architectures ! INTEL_PENTIUM=-march=i586 -maccumulate-outgoing-args -DCPU=586 -malign-double #this is for pentium ULTRA_SPARC=-mcpu=v8 -fdelayed-branch -m32 #-m64 #this is for Ultra Sparc POWERPC_G4=-mcpu=powerpc -mtune=7400 -maltivec -mabi=altivec ARM_XSCALE=-mcpu=xscale --- 44,50 ---- OPT_OK=-ffast-math -fomit-frame-pointer -finline-functions -fexpensive-optimizations OPTIMISATIONS=$(OPT_OK) $(OPT_TEST) #available architectures ! INTEL_PENTIUM=-maccumulate-outgoing-args #this is for pentium ULTRA_SPARC=-mcpu=v8 -fdelayed-branch -m32 #-m64 #this is for Ultra Sparc POWERPC_G4=-mcpu=powerpc -mtune=7400 -maltivec -mabi=altivec ARM_XSCALE=-mcpu=xscale
- コマンドラインで mysql のパスワードを渡すことになるのだが,それが ps コマンドや /proc から丸見えになる.それを避けるために initializations.c にパッチを当てる.
*** initializations.c.orig 2011-04-14 18:08:06.000000000 +0900 --- initializations.c 2017-01-29 12:26:00.768340144 +0900 *************** *** 278,283 **** --- 278,286 ---- return EXIT_FAILURE; } sscanf(argv[i],"%s",settings->sql_password); + /* destroy password in argv[i] */ + for (char *p = argv[i]; *p; p++) + *p = 'x'; continue; } #endif
- ビルドする
$ make clean $ make
- /usr/local/bin にコピーする
$ sudo cp -p gm4lin /usr/local/bin
MySQLの設定
- mysqlにexperimentデータベースを作成する
$ mysqladmin -u root -p create experiment
- mysqlのexperimentデータベースにradiationテーブルを作成する
$ mysql -u root -p experiment mysql> create table radiation (device tinyint, dose double, data double, dataunits varchar(3), stamp timestamp);
- mysqlにアクセスするユーザを作る
$ mysql -u root -p experiment mysql> create user 'USER'@'localhost' identified by 'PASSWORD'; mysql> grant all privileges on *.* to 'USER'@'localhost';
USER と PASSWORD は適当に指定.後で使う.
ドライバのデーモン化
- ディレクトリ /etc/gm4lin を作る.
- /etc/gm4lin/gm4lindを以下の内容で作る.必要に応じて変数定義や起動オプションを変更する.
#!/bin/bash . /lib/lsb/init-functions RETVAL=0 DRIVER=/usr/local/bin/gm4lin DAEMON_UID=$(getent passwd gm10 | cut -d : -f 3) MYSQL_HOST=localhost MYSQL_USER=`cat /etc/gm4lin/mysql.user` MYSQL_PASS=`cat /etc/gm4lin/mysql.password` MYSQL_DATA=$MYSQL_USER@localhost:experiment:radiation case "$1" in start) log_daemon_msg "Starting $DRIVER radiation detectors driver" $DRIVER --device /dev/gm10- \ --number 1 --start 1 --no-file-log \ --mysql $MYSQL_DATA --passwd $MYSQL_PASS \ --uid $DAEMON_UID \ --daemon --syslog RETVAL=$? ;; stop) log_daemon_msg "Stopping $DRIVER radiation detectors driver" kill -TERM `pidofproc $DRIVER` RETVAL=$? ;; restart) $0 stop $0 start RETVAL=$? ;; status) pidofproc $DRIVER >/dev/null RETVAL=$? if [ $RETVAL -eq 0 ]; then log_success_msg "$DRIVER is runnning" else log_failure_msg "$DRIVER is not running" fi ;; *) printf "Usage: $DRIVER {start|stop|restart|status}\n" exit 1 esac exit $RETVAL
- /etc/gm4lin/mysql.user と /etc/gm4lin/mysql.password に上で決めたMySQLのユーザ名とそのパスワードを書いてセーブする.他人に読めないようにする.
$ sudo chown root.root mysql.user mysql.password $ sudo chmod 600 mysql.user mysql.password
- /etc/gm4lin/gm4lind へ /etc/init.d からシンボリックリンクを張る
$ cd /etc/init.d $ sudo ln -s /etc/gm4lin/gm4lind .
- 最後に gm4lind をアクティブにする.
$ sudo update-rc.d gm4lind defaults 99 1
ちゃんと動いたかどうか /var/log/daemon.log で確認.
アプリケーション
グラフ化
数値はCPM (count per minute) なので,Sv/hに変換したい.Cs137でキャリブレーションされた値が http://www.blackcatsystems.com/GM/converting_CPM_mRhr.html にある.要するに CPM を 120 で割れば μSv/h になる.
時系列データなので、Cacti で Round Robin Database にしてグラフ化して 公開。
Twitter bot化
PerlによるTwitter botの作り方に従って放射線量を呟く twitter bot @machida_radを作成. その後,管理人の引越しに伴い,@mita_radに移動.
呟き方は@nihonbashi_radを真似っこ。
ビルド・デプロイ
ビルドは github から直接 HTML_ROOT/gm10 に clone するだけ。Web Server (Apache2), PHP, Cacti/rrdtool に依存している。
cron に tweet/tweet-radiation スクリプトを1時間おきに実行させる。このスクリプトに -d フラグをつけて実行すると、ツイートする内容をプリントアウトする(実際にはツイートしない)。