2013年8月29日木曜日

RaspberryPIでJuliusによる音声認識

例によって参考サイト「今日もRaspberry PiでJuliusを動かしてみた」を参考にJuliusによる音声認識を試してみた。

参考サイトにあったように認識率は非常によろしくない。

というかほぼ認識しない。ごくまれに「おはよう」とか「こんにちは」といった簡単な単語がとれる。

Juliusのログ(一部)
pass1_best:  こんばんは 。            
sentence1:  こんばんは 。 
pass1_best: 
pass1_best:  さようなら 。            
sentence1:  さようなら 。 
pass1_best:  ら 実行 。               
sentence1:  ら 実行 。 
pass1_best:  競馬 コーン              
WARNING: 00 _default: hypothesis stack exhausted, terminate search now
STAT: 00 _default: 2 sentences have been found
sentence1:  毛 が 被る 。 
pass1_best:  へ か 交換               
sentence1:  変化 を 交換 。 
pass1_best:  誰 か ?                 
sentence1:  だ ね 。 
pass1_best:  って ん                  
sentence1:  です 。 
pass1_best:  ダメ です ね 。           
sentence1:  ダメ です ね 。 
pass1_best:                            
sentence1:  。 

語彙をしぼって自前のコマンドのディクテーションを作成しないとダメなようだ。

2013年8月28日水曜日

USBラジオ RDPC-101(5) カスタムカーネル作成・・・コンパイルエラー

Raspberry Pi(Raspbian)用カーネルをクロスコンパイルを参考にカスタムカーネルを作成してみた。

詳細は参考を見てもらうとして、最終的にカーネルのビルドで以下のエラーが発生。
途方に暮れる。


$ DEB_HOST_ARCH=armhf fakeroot make-kpkg --arch arm --subarch armhf  --cross_compile arm-unknown-linux-gnueabi- --revision 0.1 --us --uc kernel_image modules_image


... 略 ...

  LD      drivers/staging/vt6656/built-in.o
  LD      drivers/staging/winbond/built-in.o
  LD      drivers/staging/wlan-ng/built-in.o
  LD      drivers/staging/zram/built-in.o
  LD      drivers/staging/zsmalloc/built-in.o
  LD      drivers/staging/built-in.o
  CC      drivers/thermal/thermal_sys.o
  CC      drivers/thermal/bcm2835-thermal.o
drivers/thermal/bcm2835-thermal.c:21:23: fatal error: mach/vcio.h: No such file or directory
compilation terminated.
make[3]: *** [drivers/thermal/bcm2835-thermal.o] エラー 1
make[2]: *** [drivers/thermal] エラー 2
make[1]: *** [drivers] エラー 2
make[1]: ディレクトリ `/home/mihara/raspberrypi-cross/linux' から出ます
make: *** [debian/stamp/build/kernel] エラー 2


なんだろう。
Raspbianのgithubのソースコードそのままではビルドできないのか。

それともなにか間違えているのだろうか。うーん。

RaspberryPI+mplayer+lameでNHKラジオ第2を録音してDropBoxにアップロード(2)

SDカードからやり直したせいかサイマルラジオ録音スクリプトが動作しなくなっていた。 

調べたところmplayerで以下のようなエラーがでていた。


size_confirm mismatch!: 22611 20047
Error while parsing chunk header
Failed, exiting.
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

connect error: Connection refused


コンソールからmplayer単独で動かすとエラーはでない。

詳しい原因はわからないけどRubyスクリプトからmplayerを呼ぶシェルスクリプトを実行するとダメなようだ。

プロセス関係の問題と思われるがよくわからない。

mplayerをシェルスクリプトを使わずに直接実行するよう変更したら動作した。

ソース(radiorec2.rb)
https://gist.github.com/izumogeiger/6366082#file-radiorec2-rb

2013年8月27日火曜日

RaspberryPIにUSBマイクで音声入力

例によって橋本商会さんに習って以下を使用。



挿したらすぐ認識して以下のコマンドで使用できた。


$ arecord -D plughw:1,0 -d 10 -f cd test.wav
$ aplay test.wav


ただしその前にalsamixierでマイク入力のゲインを上げておく必要があった。

橋本商会さんにあったようにマイクから1mくらい離れるとかなり音量小さくなる。
ううむ。

「AquesTalk Pi」でRaspberryPIに喋らせてみる

【β版公開】Raspberry Piで音声合成する「AquesTalk Pi」で音声合成をためしてみた。

いかにも音声合成って感じだけどインターフェースには十分でしょう。

漢字も一般的な文字列ならしゃべってくれる様子。

人名とか固有名詞はさすがに無理なようだけど。

2013年8月26日月曜日

RaspberryPI(2台目)到着

2台目到着〜


あと発注済みで未到着なのはUSBマイクだけだな。

赤外線リモコンモジュールはブレッドボード状に回路組んでGPIOで制御ってのをやりたい。

電子回路は正直さっぱりわからんので躊躇中。

この機会に抵抗とか必要そうな部品をひと揃え買っとくのが良いかも知れない。

うー財布がどんどん軽くなってくwワハハハは

2013年8月25日日曜日

本日の戦利品(購入品到着)


あとはRaspberryPIとUSBマイクが来れば全部かな。

追記

早速、USB電源スピーカーRaspberryPIにつないでみたが必要にして十分な音量音質。

mplayerでサイマルラジオも流してみたけど旧式ラジオより確実に高音質(ほぼ受信方式の違いだろうけど)。

2013年8月24日土曜日

RaspberryPI家電コントローラ計画

RaspberryPI + mplayerでサイマルラジオが実用的であることがわかったので、
キッチンにある旧式ラジオ(買ったのは最近)を置き換えることを思いついた。

現ラジオはダイアルチューンでチャンネル変更がかなりしづらく、ほぼNHKニュース一択状態。

RaspberryPIならチャンネル変更は容易、しかもサイマルラジオで高音質。

さらに赤外線リモコン機能をつけて電灯、エアコン(、テレビ・・・はキッチンにない)を制御できれば
立派な家電コントローラと言えよう。

入力は基本WEBアプリ、
マイクによる音声入力と音声合成ソフトによる返答とかやると楽しそう。

機能
  • サイマルラジオ
  • 赤外線リモコン(電灯、エアコン)
  • 音声認識によるコマンド入力
  • 音声合成によるコマンド応答
  • WEBアプリによるコマンド入力


ぐらいが目標か。

いずれは部屋ごとにRaspberryPIを置いて相互に制御とか妄想が止まらない。

というわけでRDPC-101は当分後回し。
普通にamd64なマシンに繋げて使おうかなー。

2013年8月23日金曜日

RaspberryPI+GC-10復旧

RDPC-101用モジュール作成失敗によりカーネルモジュールを一切読み込まなくなったので、

結局、SDカード作成からやり直し。

スクリプトのバックアップはとってあったので短期間で復旧できた。

・・・RDPC-101はどうしたものか。


素直に組み込みカーネルパッケージ作成した方が良いのかも。
ヤレヤレ。

2013年8月22日木曜日

USBラジオ RDPC-101(4) RaspberryPIでのカーネルモジュール作成・・・失敗

前回の記事で作成したカーネルモジュールの動作を確かめるべくRDPC-101をつないで見たところ、

[   48.873982] usb 1-1.3.3.4: new full-speed USB device number 7 using dwc_otg
[   48.976675] usb 1-1.3.3.4: New USB device found, idVendor=10c4, idProduct=818a
[   48.976707] usb 1-1.3.3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   48.976724] usb 1-1.3.3.4: Product: FM Radio
[   48.976737] usb 1-1.3.3.4: Manufacturer: SILICON LABORATORIES INC.
[   49.058014] radio_rdpc101: disagrees about version of symbol module_layout

のようなログがでた。どうも認識はしたらしい。

しかし/dev/を確かめてみたところ、/dev/radio0がない。

[   49.058014] radio_rdpc101: disagrees about version of symbol module_layout

のところからして何か間違えたらしい。

ヤレヤレと思いつつひょっとしたらと再起動してみたら、
一切のモジュールを読み込めなくなった。

lsmodしてもひとつもモジュールが表示されない。

ネットワークなどはカーネル組み込みなので動作するもののGC-10のシリアルモジュールのデバイスが作成されない。

うーむ。困った。

とりあえずバックアップをとったけど、最悪SDカードの作り直しになるかも

2013年8月21日水曜日

USBラジオ RDPC-101(3) RaspberryPIでのカーネルモジュール作成

警告

以下の手順で再起動後にRaspbianのカーネルモジュールが一切読み込まれなくなりました。

きっと何か間違っています。


USBラジオ RDPC-101(2)と同様にdkmsであっさりビルドできると思っていたのだが、Raspbianだと動作しているカーネルのヘッダーパッケージがないらしくモジュールがビルドできない様子。

どうも自分でカーネルソースを取得して展開する必要があるらしい。

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=71&t=17666

フォーラムの記事を参考にやってみたらカーネルモジュールのビルドができたので手順をのっけとく。

(1) カーネルソースの取得

https://github.com/raspberrypi/linux/の3.6.yブランチの右サイドバーの「Download Zip」からlinux-rpi-3.6.y.zipをダウンロードする。



(2) カーネルソースの展開

# cd /usr/src
# unzip linux-rpi-3.6.y.zip


(3) make oldconfigとmake module_prepare

# cd linux-rpi-3.6.y
# zcat /proc/config.gz > .config
# make oldconfig
# make modules_prepare

8
(4) Module.symversの取得(必要?)

wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers


(5) symlink作成

# mkdir /lib/modules/`uname -r`
# pushd /lib/modules/`uname -r`
# ln -s ${KSRC} source
# ln -s ${KSRC} build
# popd

# pushd /usr/src
# ln -s ${KSRC} linux-`uname -r`
# ln -s ${KSRC} linux
# popd

これでradio_rdpc101-0.0.1のMakefileが通るようになる。
dkmsでのモジュールビルドも可能(カーネルパッケージをアップグレードするとカーネルソースがなくなってdkmsコケるかも知れないけど)。

とりあえあえずここまで。
あとで追記します。

2013年8月20日火曜日

磁気嵐による宇宙線増加の検出(2)

18日のフレアによるCMEで磁気嵐発生 -> 今日あたり宇宙放射線増加!?

ということでcpmグラフに注目していたのだけど、

むしろ微妙に下がっとる


宇宙放射線はたいして増加しなかったのか、SBM-20の精度では検出できなかったのか不明。

ということでより高感度高価パンケーキ型GM管が欲しくなったり


・・・よくかんがえてみるとxivelyに上げてるのは1分間の移動平均を秒ごとに出力したものを、さらに60点で平均とったものだから、かなり丸められてるかも。

1分間の移動平均の秒ごとの出力の60点の最大値を出すべきだったのかも。スパイクが見たければ。

60点の平均と中間値ではどんな違いがあるかよくわからんが、外れ値を回避できるから中間値の方が良い?

うむ。わからん。




追記

1秒毎のcpmを記録したデータファイルから30cpmを超えた行数をカウントしてみた。

やっぱ減ってた

ついでにこのグラフのgnuplotのコマンドとデータをメモがわりに公開しとく。

2013年8月19日月曜日

USBラジオ RDPC-101(2) カーネルモジュール作成

例によって検索エンジン宜しく大作戦によって以下の参考サイトを取得。

いずれも2009年の記事でLinuxカーネルのバージョンが2.6.29,2.6.32と古い。

Ubuntu-13.04の3.8.0でビルドできるか・・・

「だふめも」の方法でビルドしたものの当然エラー発生。以下の2つをやるとビルドが通った。

  1. 「#include <media/rds.h>」の行を削除
  2. lock_kernel()とunlock_kernel()を削除
できたradio_rdpc101.koを以下のコマンドでロードすると

% sudo insmod radio_rdpc101.ko

% dmesg
...

[ 3825.180109] usb 3-1: new full-speed USB device number 3 using ohci_hcd
[ 3825.347111] usb 3-1: New USB device found, idVendor=10c4, idProduct=818a
[ 3825.347127] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3825.347141] usb 3-1: Product: FM Radio
[ 3825.347152] usb 3-1: Manufacturer: SILICON LABORATORIES INC.
[ 3825.381464] USB radio driver for SUNTAC RDPC-101, Version 0.0.1
[ 3825.544140] rdpc101: freq set value = 8000
[ 3825.626581] usbcore: registered new interface driver radio-rdpc101


のようにデバイスを認識できた。

ただし「だふめも」にあるようにradio_usb_si470xというモジュールをアンロードしないと動作しない模様。

そこで/etc/modprobe.d/nosi470x.confを以下の内容で作成しておく。

blacklist radio_usb_si470x

さらに毎回insmodするのも面倒なのと、カーネルが変わった時に備えてdkmsを利用する。
dkmsにすると
  • カーネルをアップグレードした時でも自動でモジュールをビルドしてくれる
  • insmodしなくてもロードしてくれる
  • カーネルモジュールのパッケージも作れる

といいことづくめ。
dkmsについてはUbuntuTips/Others/DkmsHowToが詳しい。

dkms作成?手順を以下に示す。
  1. ディレクトリ/usr/src/radio_rdpc101-0.0.1を作成する
  2. gistからMakefile、dkms.conf、radio_rdpc101.cを1.のディレクトリにダウンロードする
  3. % sudo dkms add -m radio_rdpc101 -v 0.0.1
  4. % sudo dkms build -m radio_rdpc101 -v 0.0.1
  5. % sudo dkms install -m radio_rdpc101 -v 0.0.1
rdpc-101を接続してdmesgで認識されれば成功。たぶん。

この状態でxubuntuのミキサーツールpavucontrolを起動すると入力装置にSilicon Labs FM Radioうんにゃらと表示される。
下部の出力のバーが上下して受信してるっぽいのがわかる。


本当に受信できてるのかどうか確認するため、mplayerコマンドを色々試すが音が出力されない。

mplayer -rawaudio rate=48000  radio://77.4/capture  -radio device=/dev/radio0 volume=100  adevice=hw=2:arate=48000

alsamixerコマンドで調べたところデバイスは認識しているものの音量コントロールができない。

うーむ。どうやらalsaでは使えないっぽい雰囲気。
古いカーネルのカーネルモジュールをそのまま持ってきたせいかも知れないが原因追求しきれず。

正直alsaとかpulseaudioとかイマイチよくわかってない。

そのまま悶々と数日悩んでいたのだけどpavucontrolでは受信できてるっぽいからpulseaudioでなら出力できるんでないかと思いついた。

% parec > /tmp/moge.raw
Ctrl-C
% pacat -p /tmp/moge.raw

または

% parec | pacat


とすると録音再生できた。

あ、ちなみに周波数変更は以下のコマンドでできる。


% fm -d /dev/radio0  77.4 on 100
Radio tuned to 77.40 MHz at 0.00% volume

とりあえずここまで。

2013年8月18日日曜日

磁気嵐による宇宙線増加の検出

ということなので、明後日5時頃にGC-10(SBM-20)で宇宙放射線の増加を検出できるかもしれない。

2013年8月14日水曜日

RaspberryPI+mplayer+lameでNHKラジオ第2を録音してDropBoxにアップロード

NHKラジオ第2の英語講座を録音したい。録音してどうするか。通勤中聞くのだ。
ちなみにリスンしたい番組は以下。

1年間ほぼ毎朝聴き続けた結果、読み書き発音の進歩はないが、聞き取りは若干上達したような気がする。
通勤時間長い人にはおすすめだ。

で、本題。


例によって参考サイト「Ubuntu に関する個人的メモ  > mplayer でらじる★らじるを聴く」を参考にRubyで実装。

と、実装の前にRaspberryPIでlameによるmp3エンコードとか大丈夫なのか。ということで試してみた。

mplayer -playlist http://mfile.akamai.com/129932/live/reflector:46056.asx -vo null -ao  pcm:waveheader:fast:file=>(lame -q 4 - /tmp/hoge.mp3)

数分、録音してみたけどきちんと録音できてエンコードできる。
やはりCPUを使うらしく、CPU温度は上昇。録音停止と共に下降。



で、確認できたところで、実装。

方針は以下

  • 録音対象はNHKラジオ第2のみ
  • スクリプト実行時から録音開始して与えられた秒数で録音終了
  • 録音終了後mp3ファイルをDropBoxにアップロード
  • cronで番組開始時にスクリプト起動
  • mplayerによる録音は終了タイマーとかできないっぽいのでforkして一定時間経過したらkillすることで録音終了させる(とっても乱暴だが)
シェルスクリプトベースのが正解っぽいのだがファイル名の生成とか面倒なのとDropBoxへのアップロードにRubyライブラリを使うのでRubyベースで。

mplayerの実行にシェルスクリプト(mplayer.sh)を使用。

詳細はソース読んでね。

あとDropBoxライブラリの使用方法とか、アクセストークンの取得とか割愛。

あとは聞きたい番組に合わせてcronを設定。

いやあUnixというかLinuxのcron最高。
もっともWindowsにもatコマンドてのがあるらしいけど。

GC-10 twitterボット変更(1時間平均、1時間最大)

1時間に1回平均線量と最大線量をツィートするよう変更。



3時間グラフや1分ログアップデートとほぼ同様でcronキック。

ソース

2013年8月13日火曜日

USBラジオ RDPC-101(1)

GC-10 + RaspberryPIネタも早くも尽きたのでUSBラジオ RDPC-101なるものに手を出してみた。



一応やりたいことは以下。

  1. RaspberryPIに繋げて番組を録音
  2. AMラジオの遠距離受信の統計作成
1.はNHKラジオ第2の英語講座をCaptureStreamというソフトで取得してたのが、著作権の関係か何かでCaptureStream自体が終了してまったため自分で録音したいという動機。

2.は単なる興味本位で、地震の前兆として普段は入らない遠距離のAMラジオ電波が受信できることがあるという現象の確認。
本当に地震と関係あるかは疑問だが電離層の変化を掴むことぐらいはできるかなと。

だったのだけど1.に関してはサイマルラジオで簡単にネットワーク経由で番組受信ができることがわかったのでそちらでやることに。

というわけで当面は2.AMラジオの遠距離受信がターゲット

2013年8月9日金曜日

SOEKS01M、エアカウンターのマントルテスト

SOEKS01Mとエアカウンターもマントルでテストしてみた。
それぞれマントル直置きで計測。

SOEKS01Mは直置きで13uSv/h!



アルミ遮蔽するとかなり下がって2.22uSv/h
ちなみに遮蔽に使用したのはペットの避暑用アルミ冷却板
ホームセンターで\1,700円程度で購入

人間やノートPCの冷却に使おうと思って買ったのだけど、アルミ遮蔽にも使えるとは。




エアカウンターは1.7uSv/h程度。

マントルはガンマ線だけなら2uSv/h程度なのかもしれない。


福島原発事故のホットスポットはそこらじゅうにマントルが転がってるようなものと考えると非常に恐ろしい・・・

2013年8月8日木曜日

エアカウンター

せっかくなので!?フォトダイオード式のエアカウンターも買ってみた。


例によって在庫数1で\2,980なり。↑値上げした?


測定に10分が長い。中途表示はしてくれるけど。。。

ラックの上に置いて、0.08uSv/h



まあこんなものか。

2013年8月7日水曜日

マントルによるGC-10動作テストとツイッター警告追加

GM管が動作しているか不安なのでマントルを購入してテストしてみた。



マントルには微量のトリウムが含まれているためガイガーカウンターが激しく反応するのでよくテストに使われるのです。

早速ラックの上に置いてみたところLEDが激しく明滅!!





マントルとGC-10との距離は5cm程度。5cmも離れてこの反応

さすがはマントル。


GC-10のデータファイル上では400CPMを超えてた(サイトでは60秒平均で丸められて270CPM)。


20130807211504  431
20130807211505  438
20130807211506  438
20130807211507  439
20130807211508  443
20130807211509  441
20130807211510  442
20130807211511  441
20130807211512  439
20130807211513  438
20130807211514  430
20130807211515  430
20130807211516  427
20130807211517  414



というわけで結論。

GC-10は正しく動いている。

校正してないから絶対値としては怪しいけど。。。

あ、あと60秒平均で50CPMを超えたらツイートするようにしてみた。


2013年8月4日日曜日

SOEKS01-MをWebカメラで撮影

100円ショップで買った合板を加工してWebカメラマウンタを作成。



RaspberryPIに繋げて画像を取得。


fswebcam -d /dev/video0 -D 2 -r 400 --png 0 --set brightness=100% /tmp/soeks.png


若干斜めになってるのはご愛嬌。
WEBカメラが丸型で調整が非常にムズカシイ。

できればライブカメラ化までしたかったのだが、自前のサーバがないとさすがに無理っぽい。

flickrとかに定時アップロードでもいいのだけど、間隔を短くするとサービスの容量すぐなくなるし、
長くするとSOEKSの面白さがないし。

考えた結果、SOEKSの接続はやめることにした。

一応picasaへアップロードするスクリプトをのせとく。
https://gist.github.com/izumogeiger/6150160#file-picasa-rb

2013年8月3日土曜日

xively.comにRaspberryPIのCPU温度を追加

以下のコマンドでRaspberyPIのCPU温度が取得できる。

% vcgencmd measure_temp

エアコンをつけたらどんどん温度下がってく。
追記

西日の指す閉めきった部屋に置いても最大で57度程度の様子。
さすがは低消費電力マシン。

例によってgistでソース公開。



ラック設置

100円ショップで買ったラックにRaspberryPIとGC-10を設置。
かなりいい加減。
SOEKS-01MとWebカメラも置きたいのだがスペースが。。。


gnuplotでグラフを作成してbloggerへアップロード


  • 3時間分のグラフをgnuplotで作成する(cpmと5分の移動平均)
  • pony + gmailでbloggerにメール投稿する
ソースはgistで。

2013年8月2日金曜日

ログファイルをgoogleドライブにアップロード

「スクリプトまたはコマンドラインでGoogleドライブにファイルをアップロードする」を参考にgoogle-docs-uploadを利用してログファイルをgoogleドライブにアップロードする。
  • cronで1日1回実行
  • 現在時間から前日のログファイル名を決定してgoogleドライブにアップロード
スクリプトは例によってgistで公開。

2013年8月1日木曜日

1分毎にcpmと線量をtwitterとxively.comに送信

というわけでスクリプト作成。

スクリプト中のXMLがBloggerにエスケープされてしまうようなのでgistで提供。
https://gist.github.com/izumogeiger/6131907#file-avcpm-rb

よくわからない解説

  • 現在時間からログファイルを決める
  • ログファイルの最後60行の平均cpmを求める
  • cpmを線量に換算する 換算係数は150らしぃ
  • tweetする
  • xively.comする


cron設置。

ミッション完了。

モニタリングポスト仕様/cpmロガー作成

さて材料が揃ったのでいよいよモニタリングポストを構築しよう。
例によって先人の記録(ガイガーカウンターキット GC10 データをグラフ化)を参考にして以下のようにしよう。

  1. GC10のcpmをログファイルに記録
  2. 1分間隔でcpmと線量をtweet
  3. 1分間隔でxively.comにcpmと線量をアップロード
  4. 1時間隔でgnuplotでグラフ作成してブログにアップロード
  5. 1日間隔でログファイルをgoogleドライブにアップロード
時間間隔での動作はcronで動作させる。
というわけでまずは1.のロガー作成。

バージョン1

# coding:utf-8
 
require 'pp'
require 'fileutils'
#require 'serialport'
 
class GC10Logger
  def initialize
     @sp = SerialPort.new('/dev/ttyUSB0',9600,8,1,0)
  end
 
  def get_cpm
    line = @sp.gets("\n")
    if /^\d+/ =~ line
      return line.to_i
    else
      return nil
    end
  end
 
  def run
    loop do
      cpm = get_cpm
      now = Time.now
      next unless cpm
 
      dir = File.join(ENV["HOME"],"gc10",now.strftime("%Y"),now.strftime("%m"))
      file = File.join(dir,now.strftime("%d")+".txt")
      FileUtils.mkdir_p(dir)
      mode = File.exists?(file) ? "a" : "w"
      File.open(file,mode) do |io|
        out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{cpm}"
        io.puts out
      end
    end
  end
end
 
gc10 = GC10Logger.new
gc10.run

これで$HOME/gc10/2013/08/01.txtのようなファイルが延々とできる。
内容は

20130801212453 25
20130801212454 24
20130801212455 24
20130801212456 24
20130801212457 23
20130801212458 23
20130801212459 23
20130801212500 22

みたいな感じ。

さらに自動起動するようにしたいのでロックファイルを確認して既に実行中だったら終了するよう改造してcronで定時起動する作戦。

で、バージョン2

# coding:utf-8
 
require 'pp'
require 'fileutils'
require 'serialport'

class Locked < StandardError
end

def lock(lock_file_path='/tmp/gc10lock')
  File.open(lock_file_path, 'w') do |lock_file|
    if lock_file.flock(File::LOCK_EX|File::LOCK_NB)
      yield
    else
      raise Locked
    end
  end
end

class GC10Logger
  def initialize
     @sp = SerialPort.new('/dev/ttyUSB0',9600,8,1,0)
  end
 
  def get_cpm
    line = @sp.gets("\n")
    if /^\d+/ =~ line
      return line.to_i
    else
      return nil
    end
  end

  def run
    loop do
      cpm = get_cpm
      now = Time.now
      next unless cpm
 
      dir = File.join(ENV["HOME"],"gc10",now.strftime("%Y"),now.strftime("%m"))
      file = File.join(dir,now.strftime("%d")+".txt")
      FileUtils.mkdir_p(dir)
      mode = File.exists?(file) ? "a" : "w"
      File.open(file,mode) do |io|
        out = "#{now.strftime("%Y%m%d%H%M%S")}\t#{cpm}"
        io.puts out
      end
    end
  end
end

begin 
  lock do
    gc10 = GC10Logger.new
    gc10.run
  end
rescue Locked
  puts "already running..."
  exit 0
end

あとはcronの設定。

cronからrvmのrubyを実行するのに若干手間取ったができた。
/etc/cron.d/gc10loggerを以下の内容で作成。


* * * * * pi /home/pi/.rvm/bin/ruby /home/pi/scripts/gc10logger.rb

みっしょんこんぷりーと

amazonアソシエイト