続-ガイガカウンタ・簡易モニタリングポスト製作日記(5)

ヒューズビットの書き込みです

ヒューズビットの書き込みです

  • Program
  • さて、作成したプログラムが良さそうなので書き込みを行います。新品のATmega168PをArduinoボードにセット、ISPコネクタにAVRISP mkIIをつなぎ、双方を通電します。さて、肝心の出来あがったhexファイルはどこにあるのでしょうか。Windowsの「プログラムとファイルの検索」から検索すると

    …\AVRStudio\プロジェクト名\プロジェクト名\Debug\プロジェクト名.hex

    このようなPATHにて作成されていました。

    先日ArduinoのBootloaderを書き込んだ時のように「Tools」-「AVR Programming」の順に進みます。[Flash]の所に先ほど検索したファイルを指定してプログラムを書き込みます。

    「Program」のボタンを押すと、Feifying Flash …OKの表示が出ました。ちゃんと書き込みできた様です。

    さて次はFuseビットの書き込みです。はっきり言って良く分かりませんでしたが、ATmega168Pは新品の時は内蔵RC発信1MHzで動いているという情報は得ていました。

    今回、私は内蔵RC発信を使用して8MHzで動かす予定です。CKDIV8にチェックが入っていましたので。ここのチェックを外し、FusesビットをProgramしました。

    高圧電源モジュールは7.5cm×4.5cmのユニバーサル基盤上に、0.26mmのジュンフロン線で配線しました。私には細すぎです。ニッパで被覆を剥がずのが大変でした。

    ここだけの話ですが、慎重にに間違えなく配線しつもりだったのですが、1か所不手際があり、最初動作しませんでした。原因を探すのにかなり手間取ってしまいました。

    2回目の製作は総額で初回製作費の倍ほどかかってしまいましが、授業料ということであきらめましょう。

    ようやく完成しました

    ようやく完成しました

    続-ガイガカウンタ・簡易モニタリングポスト製作日記(4)

    良く分かりませんが、とりあえずプロジェクトを作成します

    良く分かりませんが、とりあえずプロジェクトを作成します

  • AVR Studio 5
  • プログラムを組みましたので、次の段階にはいります。使用方法も良く分かりませんが、AVR Studio5を起動します。最初に行わねばならない動作はきっとNew Projectを作る事でしょう。「File」-「New」-「Project」の順にすすみます。するとポップアップウインドウがでてきました。分からないことだらけですが、勘を働かせドンドンドンすすんでいきます。

    [Installed Templates] の項は “AVR GCC” ,”AVR Assembler”及び”AVR Studio Solutino”の選択肢がありますが、今回は”AVR Assembler”をクリックします。プロジェクトの名前欄に任意の名前を入力し[OK]をクリックます。続いて今回使用するマイクロコントローラの型番を入力しました。今回私は”ATmega168P”です。いよいよソースコードを打ち込む段取りになりました。間違えないように打ち込んでいきます。はい、打ち終わりました。

    さて、続いてどうすればよいのでしょうか?いろいろとメニューがあって迷ってしまいそうですね。画面上はカラフルなボタンがたくさんあって、結構にぎやかです。どうせ多少の事をやってもPCが壊れることはないでしょう。適当にボタンを押しまくりましょう。今ならちょうど誰も見ていませんし。

    とは言ったものの、「適当にボタンをクリックしていたら、いつの間にか出来あがっていた」では再現性が大きく欠けてしまいますね。危ない危ない。今回はぎりぎりのところで踏みとどまる事ができました。少し冷静になって作戦を立ててから先に進むことにしましょう。

    メニューの項目を見てみると左から「File」「Edit」「View」「VAssistX」「Project」「Build」「Debug」「Tools」「window」「Help」の順になっています。まぁ、次は「Build」「Debug」あたりが妥当な所でしょう。

    「Build」を見てみますとプルダウンメニューに[BuildSolution]という項目と[Buildプロジェクト名]という項目がありました。どちらを選べば良いか全くわかりません。でも、[BuildSolution]のほうはF7キーが割り当てられているので、きっとメインストリームでしょう。私は初心者ですから、無難なこちらを選びましょう。「寄らば大樹の陰」です。F7キーを押します。

    すると下の方の画面が変わり、Error Listが出てきてしまいました。良く見るとソースコードを打ち間違えていました。タイポでした。間違えた所を訂正して再びF7キーを押すと今度は、だらだらと表示が出て最後の行に

    Build succeeded.
    ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

    やりました。succeedっては、いい響きですね。どうやら出来た様です。でも、出来あがった物がどこにあるか分かりません。どこかに16進数で記述されたATmega168Pネーティブの機械語ファイル(hex)があるはずです。まぁ、後ほど検索をかけて見つけることにしましょう。

    それよりも私はメニューの項目に「Debug」の文字があったことが気になりました。以前どこかでデバッガという言葉を聞いたことがあります、プログラム中にブレークポイントを設定したり、1ステートメントずつ実行させたりする代物でした。

    シュミレーションです

    シュミレーションです

    ちょっと試してみましょう。新たな発見があるかもしれません。「Debug」のプルダウンメニューから[Start Debugging and Break] (Alt+F5)を実行します。すると[Select Debug Tool]というタイトルのポップアップウインドウが出てきました。”下からtoolを選べ”と書いてあり、「AVR Simulator」のみ選択可能な状態です。どうやらこのAVR Studioはマイクロコントローラをシュミレートして動作確認ができるみたいです。

    その後、いろいろと探索をして次の事柄を発見しました。

  • debugのスタート、ストップ、コンテニュー、シングルステップ(2種類)がある
  • debugがスタートしていない状態の時に、各ステートメントの左端の部分をクリックするとブレークポイントを作成できる。
  • debugをスタート、又はコンテニュー、シングルステップ動作をしたときにIO view とProcessor viewを出すことができる
  • IO Viewではポートの状態を見ることができる
  • proseccor viewでは 動作スピード(Frequency)を変えることができる,Stop Watchで経過時間を測ることができる、さらにレジスタの値も見ることができる
  • CPUの状態、経過時間がわかります

    CPUの状態、経過時間がわかります

    他にも多数の機能があるみたいですが、今回はこれ位で十分です。目的とするパルスのタイミングがわかりそうです。助かりました。早速ブレークポイントを設定してシュミレートしてみましょう。設定する場所はRCALL T62uS、RCALL T938uSの2か所のステートメントで良いでしょう。

    debugをスタートすると、[Processor View]中の”Frequency(動作速度)”が1.000 MHzになっていますので、ここをクリックして8.000MHzに書き換えました。

    スタート直後は.csegの次の一番最初のステートメントで実行が止まってます。[Processor View]の”Program Counter”は0、”Stop Watch”も0.00μSを表示しています。”Registers”の前の+をクリックするとR16の状態を見ることができます。[IO View]では”PORTB”をクリックして選択しておきました。

    さて続いてF5を押すか画面上の緑右矢印ボタンを押してコンテニューさせます。最初のブレークポイントまで進んできました。このプレークポイントの命令、サブルーチンコールはまだ実行されていません。Stop Watchを見てみると0.88μSという表示です。初期設定におおむね0.88μ秒かかりました。

    同様にして時間を測り、パルスのON時間62.75μS、OFF時間939.37μSを得ました、合計で1002.12μSですから周波数に直すと0.998KHzです。出力PORTに設定したPB3もちゃんとON、OFFしています。目標とした時間からは多少誤差がありますが、ガイガー管の動作電圧範囲は広いのできっと大丈夫でしょう。

    続-ガイガカウンタ・簡易モニタリングポスト製作日記(3)

    この様な流れでしょうか


    ハードの方はめどがたちましたが、さて問題はソフトです。全ての処理を1つのマイクロコントローラに任せるプログラムを書くのは相当高度なテクニックが必要そうですが、今回は豪華に2つ使うことにしました。まるで大名のような贅沢ですね。いや、ひょっとするとそれ以上かもしれません。放射線のカウント、表示の処理は「ちびでぃ~の2」にまかせて、もう一つはパルス発生だけに専念します。これなら初心者の私でも何とかなりそうです。

    e-電子工房さんのサイトを見ると400Vの場合、1KHzの周期でパルス幅が大体62n秒であれば良いことがわかります。まったくもって貴重な情報を公開していただき本当にありがとうございます。今回はアッセンブラでプログラムを作り、秋月電子通商から仕入れた新品のATmega168Pへ書き込みます。

    当然のことながらAVRのアッセンブラも初めて触る私です。Nの電子講座・AVRマイコン編AVRマイコンで学ぶ コンピュータの仕組みのサイトに詳しく記述されていましたので勉強させていただきました。ありがとうございました。今回は特に小山さんが書かれた「AVRマイコンで学ぶ コンピュータの仕組み」から、ソフトウエアタイマー “blink.asm”の項を参考にプログラムを組ませていただきました。本当にお世話になりました。

    フローを考えると次のようになります

    スタート–>初期設定–>①–>1を出力する–>62μS待つ–>0を出力する–>938μS待つ–>①へジャンプ

    前述のBlink.asmを参考にコードを書いていきます。特に変える必要もなさそうなので、出力ポートも同じPB3にさせていただきました。

    GeigerClock.asm
    
     .include "m168Pdef.inc"
     .cseg
    	LDI	R16,0b00001000
    	OUT	DDRB,R16		;PB3は出力,他は入力
    
    	LDI	 R16,HIGH(RAMEND)	;RAM最終アドレス上位を取得
        	OUT	 SPH,R16		;スタック ポインタ上位を初期化
    	LDI	 R16,LOW(RAMEND)	;RAM最終アドレス下位を取得
        	OUT	 SPL,R16		;スタック ポインタ下位を初期化
    
    LOOP:
    	LDI	R16,0b00001000
    	OUT	PORTB,R16		;PB3は1, 他は0
    
    	RCALL	T62us			;62μ秒待つ
    
    	LDI	R16,0b00000000
    	OUT	PORTB,R16		;PB3は0, 他も0
    
    	RCALL	T938uS			;938μ秒待つ
    
    	RJMP	LOOP			;LOOPの箇所にジャンプ
    
    

    62μSと938μS待機するサブルーチンを作成します。ATMEGA168Pを8MHzのクロックで動作させて1クロックサイクル=0.125μSで計算します。62μSは50μs+12μSで、938μSは50μSを18回繰り返し、さらに+38μSとすれば大体良さそうです。コメントに書いてある数値、計算は参考にさせて頂いた「AVRマイコンで学ぶ コンピュータの仕組み」サイト中に丁寧な説明があります。

    
    ; timer subroutine
    T50US:			;((3)+1+5*78-1+4)*0.125=397*0.125=49.625μ秒
    	LDI	R20,78	;1 以下を78回繰り返す
    _TUS:
    	NOP		;1
    	NOP		;1
    	DEC	R20	;1 R20から1を減じ
    	BRNE	_TUS	;1/2 結果が0でなければ_TUSへ
    	RET		;4
    
    T62us:			;((3)+397+1+8*12-1+4)*0.125=500*0.125=62.5μ秒
    	RCALL	T50US	;397
    	LDI	R21,12	;1 以下を12回繰り返す
    _T12US:
    	NOP		;1
    	NOP		;1
    	NOP		;1
    	NOP		;1
    	NOP		;1
    	DEC	R21	;1 R21から1を減じ
    	BRNE	_T12US	;1/2 結果が0でなければ_T12USへ
    	RET		;4
    
    T938us:			;((3)+1+400*18-1+1+8*38-1+4)*0.125=7510*0.125=938.875μ秒
    	LDI	R21,18	;1 以下を18回繰り返す
    _T900US:
    	RCALL	T50US	;397
    	DEC R21		;1
    	BRNE	_T900US	;1/2 結果が0でなければ_T900USへ
    
    	LDI	R21,38	;1 以下を38回繰り返す
    _T38US:
    	NOP		;1
    	NOP		;1
    	NOP		;1
    	NOP		;1
    	NOP		;1
    	DEC	R21	;1 R21から1を減じ
    	BRNE	_T38US	;1/2 結果が0でなければ_T38USへ
    	RET		;4
    
    

    うまく動くでしょうか????

    AVRISP mkII とAVR StudioとArduinoIDE

    AVR Studio5を使って書き込みます


    Arduino初心者の私ですが、AVRISP mkIIを購入しましたので、早速、新品のATMEGA328P-PUにArduinoのブートローダーを書き込んでみました。

    まず、ATMEL社のWebよりAVR Studio5をダウンロード、そしてインストール。続いてAduinoボードから現在動作しているATMEGA328を、足を曲げないよう丁寧に取り外し、新規に購入したATMEGA328に装着し直します。AVRISP mkIIをISPコネクタにつなぎ、さらにUSBケーブルでPCに接続します。Arduinoボード本体も電源を入れます。

    AVR Studio5を起動して「Tools – AVRprograming」の順に進み [Tool]欄が”AVRISP mkII”, [Device]欄が”ATmega328P”,[Interface]欄が”ISP”になるようにセットして「Apply」ボタンをクリックします。その後表示された「Interface settings」メニューをクリックすると、書き込みスピードの設定画面になります。ここはデフォルトのまま125KHzにしておきました。

    さて次は”Arduino bootloader”の指定です。やはり左のメニューから「Memories」をクリックして、[Flash]欄に適正なHexファイルを指定します。最後に「Program」ボタンをクリックで書き込むことができます。その後メニューの 「Fuses」 をクリックしてヒューズビットを書き込みました。

    今回私は 
    arduino-1.0\hardware\arduino\bootloaderes\atmega\ATmegaBooT_168_atmega328.hex を書き込んでみました。

    書くと簡単ですが、私が上記の手順を発見するまで結構時間がかかってます。(….半日ほど)でも、実際の書き込み作業は数秒で終わり、まったくあっけないです。

    果たして生ATMEGA328はArduinoの動作をはじめました。もう、私は得意満面です。

    ところが、です。今度はAduinoIDEから同様に書き込もうとしましたが、何回やってもエラーが出てうまくいきません。原因を調べたところ。ここに回答が載っていました。

    AVR StudioとArduinoIDEは、同時にこの機能を使うことはできないみたいです。具体的にはAVR Studioが使うAVRISP mkII用のUSBドライバとArduinoIDEが使うAVRISP mkII用のUSBドライバが違う物で、共存できないとのことでした。

    そういえば、AVR Studio5をインストールするときに”USB なんたら jungo driver をインストールするか?”との表記があったような気がします。 「当然でしょう!」と悪態ついた事を思い出しました。

    ArduinoIDE用のAVRISP mkII用USBドライバは上記フォーラム中に書いてありますが、

    ..\arduino-XXXX\hardware\tools\avr\utils\libusb\bin 以下のディレクトリに入っていました。

    ArduinoIDEの1.0版では、Fileメニューに「Upload Using Programmer」の項目があります。試してみるとブートローダだけでなく、スケッチもAVRISP mkII経由で書き込みができました。すごいですね、Arduino!

    続-ガイガカウンタ・簡易モニタリングポスト製作日記(2)

    AVRIPmkII  (買ってしまった.....)

    AVRIPmkII  (買ってしまった…..)

  • お買い物
  • さて、もう1台ガイガーカウンタを製作するのですが回路をどうするか?です。一番簡単な方法は、先日の「ちっちゃいものくらぶ」さんが出しているガイガーカウンタキットの「ガイガー菅無し」のセットを購入することです。6500円と値段も手ごろですし、こちらは前回製作の実績もあります。問題が生じる余地がありません。

    しかし、私は丁度ガイガーカウンタの動作原理がわかって有頂天になっていた所でしたので「Arduino + 高電圧ユニット」という組み合わせで作る、イバラの道を選択しました。

    さっそく、これまた「ちっちゃいものくらぶ」さんのちびでぃ~の2というArduino互換キットを注文いたしました。このちびでぃ~の2は LCDまで付ているフルセット版が1500円、基本セットが1000円という低価格です。電源レギュレータICがないので7~12V電源は使えませんが、それにしてもすばらしい商品です。

    続いて、ガイガー管の高電圧ユニットですが、こちらはネットで検索してもなかなか良いものがみつかりませんでした。仕方なく部品を集めて組むことにします。検索するとタイマーICを使った回路図や特殊なトランスを使用した回路図が発表されています。しかし、いずれも電圧の調整が必要みたいです。情報では、内部抵抗の関係で、普通のテスタではガイガー管にかかる電圧を測る事ができないそうです。電圧がわからなければ、それを調整する手立てがありません。

    ものは試しに、手持ちのSBM-20の回路を測ってみることにしました。私の安物テスターの内部抵抗はわからないのですが、そんなことはかまわず実験です。測定してみるとやはり結果が変です。400V程度あるはずなのですが、一桁たりない数値です。

    WEBでは高い数値の抵抗で分圧して計測する方法もかかれていましたが、費用がかかりそうです。調整なしで400Vを発生できる方法を懸命に検索しました。その結果e電子工房さんの「ガイガーカウンタ用高電圧電源(CK1026,SBM20,J408γ用回路」に、ようやくたどりつくことができました。e-電子工房さん、大変ありがとうございます。感謝します。

    入手しやすい部品のみで構成されていて、パルス幅で電圧を制御するので、こちらに書かれている定数で部品を組み立てれば、きっと目的の電圧になるはずです。問題はパルスを発生するPICです。PICとはマイクロチップ・テクノロジー社が作っているマイクロコントローラです。秋月電子通商の広告では良く目にしますが、残念ながら私は現物を見たことがありません。PICを使って作るとなるとプログラムを焼くPIC用のプログラマをも購入せねばなりません。

    考えに考え抜いた結果、上記で使われているPICチップをAVRのATMEGA168に置き換えることにしました。2足のワラジをやめてAtmel AVR1本に絞ります。部品は秋月電子通商、千石電商、鈴商、以上3店ですべて揃いました。秋月電子では3000円という安い値段でしたので、「ATMEL AVRISPインシステム・プログラマー AVRISPmkII」 まで買ってしまいました。結局買うことになるんですね、プログラマは。

    通販で購入したのですが、いろいろと欲望がふくらんで、不必要なものまで買ってしまったようです。(勢いで秋月電子ATmega168/328マイコンボードキットまでも買ってしまった…)自宅のPC前に座っているはずなのに、なぜか気分的には鉄火場にいるように熱くなっています。あたかも何かに憑かれたようにクリックが止まりません。ショッピングカートの品物がどんどん増えていきます。知らないうちに購入金額は福沢諭吉先生一人では納まらなくなってしまいた…. もう、失敗はゆるされません。

    続-ガイガカウンタ・簡易モニタリングポスト製作日記(1)

  • ガイガーミューラ菅  SI-22G
  • SI-22Gと単三電池 でかい!♪大きい事はいいことだ♪

    SI-22Gと単三電池 でかい!♪大きい事はいいことだ♪

    ある日の事、ebayを何の気なしに眺めていたところ、(NEW) Soviet Russian Military HARD BETA and GAMMA GM DETECTOR SI-22G TYPEなる文字が目に入ってきました。値段を見るとUS$12.99でして、送料US$15を合わせてもUS$28ほどです。日本円にして約2200円。掘り出し物の価格ですね。思わずポチッとしてしまいました。

    SI-22Gガイガーミューラー管は、先日使ったSBM-20の倍ぐらいの大きさです。長さが22CM 直径が約2CMもあります。書かれているスペックを見ると、ガンマ線感度がコバルト60でSBM-20の約7倍あります。さらに推奨動作電圧が390Vとなっていまして、SBM-20とほぼ同じです。差し替えたとしても動作するでしょう。きっといい仕事をしてくれるはずです。

    ウクライナからの発送です。荷物の追跡番号がメールで送られてきたので、時々チェックしたりして楽しんでいました。e-bayでは何回か買い物をしたことがあります。国外からの購入なので仕方がないのですが、荷が届くのに時間がかかるのが難点ですね。でも、豊富な品ぞろえ、さらに円高メリットを考えると品物を調達する手段としては、素晴らしいものがあります。太陽電池セルや正弦波DC-ACコンバータなどを過去に購入いたしました。

    注文した品物は意外に早く、発注から約1週間で到着しました。箱をあけると緩衝材に包まれてSI-22Gがドッシリと鎮座しています。でも、NEW condition(新品)として売り出されていた訳なのですが、どことなく表面がくすんでいます。経年劣化でしょうか?気の弱い私なら、これを新品と言って売り出す事はできないでしょう。きっとウクライナではこれが普通なのかもしれません。

    まーぁ、動けばOKということで、早速動作テストです。先日作成してモニタリングポストとして活躍している「ガイガーカウンター Geigerduino standard」のSBM-20に並列に結線して、同時に動作させてみましょう。youtubeで同様な事を実験されている方が過去にいました。流れる電流が少ないのできっと大丈夫でしょう。

    ワニ口クリップのついた銅線で、アノード(+側)とカソード(-側)を間違えないように繋ぎました。すると今までの数倍の数値をガンガン計測しています。すごいです。やりました、ちゃんと動作するようです。

    さて、今後の方針を検討せねばなりません。新しいSI-22Gは大きいので、SBM-20と差し替えるためにはケースを新調しなくてはなりません。結局、いま動いている物はそのままにしてもう1台製作することにしました。

    ガイガカウンタ・簡易モニタリングポスト製作日記(5)

  • RRDtoolその2
  • さて、仕上げはグラフの作成です。グラフ作成については、多数のオプションがあって判断に迷いました。またまた、satospoさんのサイトや久保田 拓朗さんの書かれたRRDtoolを使うや、その他たくさんのサイトを閲覧しまくって、ようやく完成しました。ありがとうございました。

    #!/bin/sh
    RRDFILE=’/***PATH1***/radiation.rrd’
    GRAPHPATH=’/***PATH2***’
    DATE=`LANG=C date | sed ‘s/:/\\\\:/g’`

    rrdtool graph ${GRAPHPATH}/グラフ名1.png \
    --start -24h –end now \
    --vertical-label “CPM” \
    --imgformat PNG \
    --slope-mode –width 600 –height 200 \
    --title “SBM-20 Gamma Radiation Monitoring ” \
    DEF:cpm=${RRDFILE}:CPM:AVERAGE \
    VDEF:avg=cpm,AVERAGE \
    LINE1:cpm#0000FF \
    HRULE:avg#ff0000 \
    GPRINT:cpm:AVERAGE:”Average\:%7.1lf CPM ” \
    COMMENT:”Last update\: $DATE”

    5分間隔でCPM値を表示したところです

    5分間隔でCPM値を表示したところです


    さてさて、一段落です。しかしRRDtoolの機能を調べてみると保存してあるデータに計算を施し、グラフにするCDEFインストラクションという機能があるみたいです。CPMだけではなく、CPMをシーベルトに変換したグラフを書くことができそうです。さっそく挑戦です。

    最初に目に付いたRrdtool-Cdef-Tutorial-jpで勉強しました。が!・・・・・う~ん、ちょっとむずかしいようです。頭がダウンしそうです。逆ポーランド表記でつまづきました。しかしここでひるんではいられません。おとくいの”検索しまくり術”で、この難局面の打開を図ります。

    以下の事柄はrpntutorialにかかれている内容を、中学校卒業時点で止まってしまった私の英語力で解読した結果です。

    逆ポーランド表記 1,2,3,+,+ を計算します。

    1) 1,2,3,+,+ eval is 2,3,+ = 5 result is 1,5,+
    2) 1,5,+ eval is 1,5,+ = 6 result is 6
    3) 6

    1)数式は左から右へ向かって見て行き、最初の演算子に注目します。この場合1番目の+です。このプラスの計算は、その直前の2つの項を加算します。2+3=5ですから1)式の 2,3,+ の3つの項は5に置き換わります。

    置き換わった式 
     1,5,+

    2)上記で置き換わった式を同じように計算します。1)と同様+の前の2つの項を加算します。1+5=6

    3)答え6 と出ました。

    つづいて

    3,2,1,+,* を計算します。

    左から数えて最初に現れる演算子が+ですから、その前の2つの項を加算します。2+1=3ですから、それらを3に置き換えます

    3,3,*

    置き換わった式は、最初に現れる演算子が*です。加算と同様に前の2つの項を乗算します

    答え9 となります。

    いゃ~、そんなに難しくないですね。(でも、本当は私がここまで到達できるまでかなりの時間を要しています)

    さて、このチュートリアルではさらなる理論の拡張が書かれています。理論比較演算子(LT,LE,GT,GE それぞれ <,≦,>,≧)を考えます。たとえば

    2,1,GT

    この式は、2は1より大きいか?

    という表現でして、その答えは正解ですから真(true)ですね。この場合1を返すことになっています。つまり計算式 2,1,GT は、それを1に置き換えることができます。続いて

    2,1,LE

    この式は、2は1以下か?という表現ですので、その答えは偽(false)です。この場合0を返すことになっています。

    つづいてIFです。IFは次のように表現されます

    X,Y,Z,IF

    この式は、Xが真(true)ならばY,偽(false)ならばZという値になる事をあらわします。IF X then Y else Z です。では、次の式を考えてみます。

    1,10,100,IF

    Xに対応する値が1です。論理式での1は真(ture)を表し、IF true then 10 else 100 と同じですので

    答え10 となります。

    0,10,100,IF は 上記とは逆になりますので、答えは 100になります。ちなみに1だけでなく0以外の数字は全て真(true)と判断されるみたいです。

    さて、練習です。

    128,8,*,7000,GT,7000,128,8,*,IF を計算します

    左から数えて最初に現れる演算子は*ですので 128,8,* の部分は128×8=1024,1024に置き換えます。

    1024,7000,GT,7000,128,8,*,IF

    置き換えた式で最初にあらわれる演算子はGTですので、1024,7000,GT を計算します。1024 は 7000 より小さいので、この3項は0に置き換えます。

    0,7000,128,8,*,IF

    置き換えた式で最初にあらわれる演算子は*です、128,8,* を 128×8=1024 1024に置き換えます。

    0,7000,1024,IF

    IFの3つ前の項が0(false)なので、最終的な答えは1024になります。

    答え 1024

    やりました。ビクトリーです。でも,どっと疲れがでてきました。なぜこのような表記法をするのでしょうか。さきほどのWebに答えが書いてありました。

    逆ポーランド表記(RPN)は通常使われている算術表記よりプログラムするのが簡単で、バグも少なくすることが出来るそうです。数式を「( )」カッコを使わないで表現するのがポイントなんですね。「計算式を作る人が頑張ってください」と私は解釈しました。

    RRDtoolの逆ポーランド表記はさらに、「最大、最小」「並べ替え」や「平均」、「予測値」なども表現出来るみたいです。

    さて、以上をふまえてCDEFに挑戦です。SV(シーベルト)を定義してみましょう。教えていただいたようにガイガーミューラー管 SBM-20では、だいたい

    (CPM値-13)÷132=μSV値

    ですから

    CDEF:SV=cpm,13,-,132,/

    これでよさそうです。間違い無い!早速グラフを描いてみました。しかし結果は不成功でした。

    CPMが0以下の部分ができてしまいました

    CPMが0以下の部分ができてしまいました

    CPM値がかなり変動して13を下回ることもあるので、SVがマイナスになってしまう箇所ができてしましました。

    マクロ的にトータルで考えれば、これはこれで良いかもしれませんが、グラフを予備知識なしで見てくれる人に説明するのが恐ろしく厄介です。きっと私の言語能力では人を納得させられる満足な説明は出来ないでしょう。これでは失敗です。

    そこで、グラフがマイナスになった時は、強制的に0にするようにIFを使って表示し直しです。少々ズルですが、背に腹はかえられません。まぁ、善意の嘘といったところでしょう。

    SV値= IF「cpm,13,-,132,/」が 0 以下ならば 0 それ以外は 「cpm,13,-,132,/ 」

    表現はおかしいですが、考え方的には、こんな感じでしょう。先ほど勉強したIFとLEをあてはめます。

    CDEF:SV=cpm,13,-,132,/,0,LE,0,cpm,13,-,132,/,IF

    やっとできました。

    rrdtool graph ${GRAPHPATH}/グラフ名2.png \
    --start -24h –end now \
    --vertical-label “μSv/hr” \
    --imgformat PNG \
    --slope-mode –width 600 –height 200 \
    --units-exponent 0 –upper-limit 0.5 \
    --lower-limit 0 \
    --title “SBM-20 Gamma Radiation Monitoring\
    DEF:cpm=${RRDFILE}:CPM:AVERAGE \
    CDEF:SV=cpm,13,-,132,/,0,LE,0,cpm,13,-,132,/,IF \
    VDEF:avg=SV,AVERAGE \
    LINE1:SV#00FF00 \
    HRULE:avg#ff0000 \
    GPRINT:SV:AVERAGE:”Average\:%7.2lf μSv” \
    COMMENT:”Last update\: $DATE”

    20分ごとにcronでスクリプトを走らせて作成したグラフ名1(2).pngファイルをWebの公開ディレクトリーにコピーします。

    データが集まってくればスタート時間をもっと前に設定してグラフを描くことが可能です。ようやく目的のモニタリングポスト(2011/12/31現在 計測中)が完成しました。

    ガイガカウンタ・簡易モニタリングポスト製作日記(4)

  • RRDtoolその1
  • さて、続いて受け取ったデータをどのようにLinuxPCに保管するかが問題になりました。ネットで検索すると、偉大なる先人の方々がPachube(パッチベイ)を使って放射線数値の公開をされています。データの保管とグラフ化、さらに多くの人と共有を行う素晴らしいサイトだと思います。

    その後、さらに検索して見つけたのがRRDtoolというソフトです。RRDtoolではデータの保管とグラフ化ができるみたいです。私のLinuxPCのdebian squeezeでは

    #aptitude install rrdtool

    でインストールすることができます。これを使わせてもらうことにします。

    いろいろな人のサイトを参考にさせていただきましたが、渡辺 勝弘さんが書かれた“じつはかんたん!! RRDTOOL”は、とても分かり易く記述されていて、RRDtoolに入門する人の必読書のようでした。また、RRDtool チュートリアルもすごく参考になりました。自動車のスピードを例にあげて解説されていますが、表記中のコマンドをコピーして実際に打ち込んでグラフが出来てしまいます。少し感動してしまいました。

    LinuxPCのターミナルからコピペで作成

    LinuxPCのターミナルからコピペで作成

    私の入手したRRDtoolは、このチュートリアルで解説されているバージョンから改訂があったみたいで、保存されているデータの表示に関して変更がありました。データの表示が、指数表示になっています。

    さて、次の順にスクリプトを組んでいけばよいことがわかりました。

    1 データベースを作成する rrdtool create(1回のみ)
    2 データを読み込ませる rrdtool update
    3 グラフを作成する rrdtool graph

    2と3はLinuxPCで一定時間ごとに行えば良いはずです。

    データベース radiation.rrdを作成します。よく分からないので上記のサイトの記述にある通りMRTGと同じだけサンプルをとるようにしましょう。5分間隔でデータを取得して約2年間分保持します。グラフはCPMデータの平均(AVERAGE)を表示させます。こんな感じでどうでしょうか。

    /usr/bin/rrdtool create radiation.rrd –step 300 \
    DS:mx_out:GAUGE:600:U:U \
    RRA:AVERAGE:0.5:1:600 \
    RRA:AVERAGE:0.5:12:700 \
    RRA:AVERAGE:0.5:24:770 \
    RRA:AVERAGE:0.5:288:797

    さて、続いてデータを読み込ませる段取りです。Windmeadow Labsさんのサイトや、satospoさんのサイトにperlで書かれた例がありましたので大変参考になりました。

    まず、CPANのDevice::SerialPortモジュールをインストールします。

    #perl -MCPAN -e shell
    cpan> install Device::SerialPort。

    続いて、librrds-prel もインストールです

    #aptitude sintall librrds-perl

    さて、いよいよupdate.plスクリプトです。USBから送られてくるデータを読み込み、データベースに読み込ませます。

    #!/usr/bin/perl

    use Device::SerialPort;
    use RRDs;

    ### Serial port set up ###
    my $port = Device::SerialPort->new(“/dev/ttyUSB0”);
    $port->databits(8);
    $port->baudrate(9600);
    $port->parity(“none”);
    $port->stopbits(1);

    ### Read CPM ###
    my $count = 0;
    while ($count == 0) {
    # Poll to see if any data is coming in
    my $char = $port->lookfor();

    if ($char) {
    @value = split(/,/, $char);
    $count = 1;

    # value[1] に入る1分間の移動平均CPM値(–>直前1分間のCPM値)を使用することにします
    }
    }
    $port->lookclear;

    ### Get current time ###
    my $time = time;

    #---->①

    ### update ###

    my $rrdfile = “/***path***/radiation.rrd”;
    my $values = “$time:” . $value[1];

    RRDs::update(“$rrdfile”,”$values”);
    my $ERR=RRDs::error;
    die “ERROR while updating $time $ERR\n” if $ERR;

    このようなスクリプトで”現在時刻とCPM値”を読み込ませようとしました。ちなみに、現在時刻はUNIX時間、CPM値は一分間の移動平均です。cronを使って5分間隔で実行すれば、きっとうまく行くはずです。やりました。

    でも、実際行ったところ問題が発生してしました。取り込んだデータは次のコマンドで確認できます。

    $ rrdtool fetch radiation.rrd AVERAGE --start スタート時間 --end 終了時間

    ・・・
    1324389000: 1.6000000000e+01
    1324389300: 1.4026666667e+01
    1324389600: 1.9920000000e+01
    1324389900: 2.0000000000e+01
    1324390200: 1.8026666667e+01
    ・・・

    データは取り込んでいるのですが、なんか値が変です。一番上は1.6000000000e+01で、これは1.6×10の意味でしょうから16CPMでOKなのですが、2行目は14.026666667CPMになっています。整数にならなくてはいけません。どうしたことでしょう?

    いろいろと検索した結果ようやくわかりました。cronで5分間隔でアップデートするのですが、その処理にかかる数秒間の遅延が原因のようです。基準の時間からずれている分をRRDtoolが勝手に補正してしまうのですね。#---->①の部分に次の行をいれて、LinuxPCで取得した時間を5分(300秒)単位に切り捨てました。

    $time = $time – ($time % 300);

    もう一度見てみると

    ・・・
    1324543200: 1.5000000000e+01
    1324543500: 2.0000000000e+01
    1324543800: 1.4000000000e+01
    1324544100: 2.0000000000e+01
    1324544400: 1.3000000000e+01
    ・・・

    今度は大丈夫でした。

    あらかじめ設定したCPM値を超えた時に警告メールを送るルーチンも付け加えます。

    ### alert ###

    #CPM値がlimitを超えたら警告メールを送ります。#
    #私の所では普段35を超えないので limit=50 CPMにしました。#

    my $limit = 50;

    #メールの送り先等#
    my $mail_sender =’送り主@ドメイン1′;
    my $mail_receiver =’受け手1@ドメイン2;受け手2@ドメイン3;・・・’;

    my $file_name =”***path***/alert.txt”;

    if ($value[1] > $limit ){

    ### 既にalert.txt が無ければ処理を行う (1回だけ送る) ###
    if (! -e $file_name){
    open (FH, “>$file_name”);
    print FH “radiation alert CPM:” . $value[1] .”\n”;
    close (FH);

    ### メールを送信 ###
    open FH, ‘|/usr/sbin/sendmail -t ‘ or die “Can’t Open\n”;
    print FH “From: “. $mail_sender . “\n”;
    print FH “To: “. $mail_receiver . “\n”;
    print FH “Subject: Radiation Alert.\n\n”;
    print FH “CPM: “. $value[1] . “\n”;
    close FH;
    }
    }

    このメールが送られて来ない事を心から祈ります。

    ガイガカウンタ・簡易モニタリングポスト製作日記(3)

    ArduinoIDE Serial Monitor を表示させたところ

    ArduinoIDE Serial Monitor を表示させたところ

    • LinuxPCとの通信

    開発環境が整ったところで、さっそくガイガーカウンタとPCとの通信実験に移ります。ArduinoとホストPCはUSB経由でシリアル通信ができるみたいです。Takumi Funadaさんが翻訳された 日本語リファレンスを参考にさせていただきました。感謝です!

    シリアル通信の項目を見ると。どうやら

    void setup() {
    ・・・・
    ・・・・
    Serial.begin(ボーレイト);
    }

    void loop() {
    ・・・・
    ・・・・
    Serial.print(送りたいデータ); // 改行なし
    Serial.println(送りたいデータ);//改行有り
    }

    このようなステートメントを元のスケッチに追加すれば良いみたいです。構文もよくわかりませんが、スケッチを舐めるように見渡して、LCDに値を表示するステートメントを見つけました。その直後にCPM等の数値をそのままSerial.printするように改変しました。ボーレイトは9600bpsが例文として多くあげられていますが、送信側と受信側が合っていれば他の値でも良いみたいです。

    さて、改変したスケッチをアップロードし、これからPC側で受け取れるか確認です。ArduinoIDEにはシリアルモニタという機能があって、Arduinoから送られてきたデータを表示することができます。

    Selial Monitorを開いて待つこと数秒間、Geigerduinoからデータが送られてきました。やりました!見事成功です。10秒間隔で計測した値を読み取ることができます。

    さて、WindowsPCとは通信できましたが、LinuxPCとはどうでしょうか。ちなみに我が家のLinuxマシンですが、ハードはAtom330+ION、RAM 2GByte HardDisk 1TByteの構成です。OSはDebian squeezeでkernelのバージョンは2.6.32-5、Web,MailさらにはPT2録画サーバとして動いています。購入してからしばらく経ちますが、文句も言わず1日24時間働いてくれる、かわいい相棒です。

    WindousPCにはデバイスドライバを入れましたが、LinuxPCでは特にその必要はないようです。prolificのサイトに以下の記述があります。

     NOTE: No need to install drivers for following:
     Linux Kernel 2.4.31 and above already includes built-in drivers for PL-2303H, PL-2303XA/HXA and PL-2303HXD.
     NOTE: Google Android OS is also based on Linux kernel so it also supports PL2303.

    Kernel 2.4.31以降ではドライバが最初から入っているんですね。アンドロイドOSでも同様みたいです。

    さて、USBケーブルをLinuxPCに差し込んでみます。LinuxPCのターミナルからdmsgをタイプしてログを表示します。

     [1108887.812042] usb 4-2: new full speed USB device using ohci_hcd and address 9
     [1108888.024976] usb 4-2: New USB device found, idVendor=067b, idProduct=2303
     [1108888.024983] usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
     [1108888.024989] usb 4-2: Product: USB-Serial Controller
     [1108888.024994] usb 4-2: Manufacturer: Prolific Technology Inc.
     [1108888.025231] usb 4-2: configuration #1 chosen from 1 choice
     [1108888.028226] pl2303 4-2:1.0: pl2303 converter detected
     [1108888.061238] usb 4-2: pl2303 converter now attached to ttyUSB0

    上記を見ると/dev/ttyUSB0というデバイスファイルとして扱えば良いみたいです。root権限でさっそく見てみましょう。

     $ sudo cat /dev/ttyUSB0

     0,21,18,478

     18,19,18,479

     24,22,18,480

     ・・・

    OK!! ちゃんと10秒ごとに、CPM値(10秒計測×6),直前一分間のCPM値,起動してからのCPM平均値,起動してからの時間(10秒単位)が送られてきました。誠に良い調子ですLinuxPCでも通信することができました。

    /dev/ttyUSB0の所有者名とグループ名を見てみますと

    $ ls -la /dev/ttyUSB0
    crw-rw—- 1 root dialout 188, 0 2011-12-23 11:37 /dev/ttyUSB0

    グループ名がdialoutになっています。スクリプトを実行するユーザの補助グループにdialoutを追加します。

    $ sudo usermod -G dialout user名

    これでroot権限なしでアクセスすることができるようになりました。

    ガイガカウンタ・簡易モニタリングポスト製作日記(2)

  • はじめてのArduino
  • ガイガカウンタは完成しましたが、ここからが問題です。常時監視、さらには異常事態に(あってはならないですが!!)自動的にメールを打たせる予定です。試行錯誤が延々と続きました。Arduinoという名前は聞いた事がありましたが、現物を見るのは初めてです。どうすればプログラムを書き込めるかも知りませんでした。

    ちっちゃいものくらぶさんのWebに書かれていますが、このキットGeigerduino standardのArduino互換ボードをWindowsから使うためには、まずドライバソフトを入れる必要があります。prolificのサイトからPL2303用USBドライバインストーラをダウンロードしてインストールしました。

    続いてARDUINOのメインサイトを開き、ダウンロードのタブをクリックしDownload the Arduino Softwareのページから、ArduinoIDEと呼ばれるプログラム開発環境ソフトのwindows版をダウンロードします。私がダウンロードした時は022版でした。現在のバージョンは1.0となっていて、一部スケッチの書式に変更があったようです。zipファイルを展開したフォルダの中にあるarduino.exeが目的のソフトです。

    このArduino互換ガイガーカウンタ内のスケッチを書き換えてLinuxBoxと通信できるようにするのですが、いま現在動いているスケッチをあらかじめダウンロードしておきます。

    初めて使うArduinoIDEですが、あらかじめサンプルが入っているので、ちょっと試してみることにします。Geigerduino standardをUSBケーブルでPCと接続してArduinoIDEを起動します。ちなみに、話はそれますが、Windowsのデバイスマネージャーの[ポート(COMとLPT)]を見ると先ほどインストールしたUSBシリアルポートが確認できます。

    さて、起動したArduinoIDEのメニューバーから[File]を選択し「examples][Basics]と進み[Blink]をクリックします。すると別のWindowが開き、C言語風のスケッチが表示されます。一見すると尻込みしてしまいそうですが、コメント文をたよりに一行づつ見ていくと、どうやら一秒ごとにLEDを点滅させるプログラムだということがわかりました。

    メニューバーの下に右矢印のアイコン[→::]がスケッチをアップロードするボタンです。

    [Binary sketch size: 1018 bytes ・・・]

    と表示されプログラムがコンパイルされました。この時点で[Serial Port COMx not found.]というようなポップアップが出てきたときは、先ほどつなげたUSBケーブルがうまく選択されていないので、正しいPort番号に直します。

    [Done uploading]

    のメッセージで完了すると、しばらくしてからGeigerduino standard上にあるLEDが一秒ごとに点滅を始めました。なんて簡単なんでしょう。こんなに簡単にプログラムを読み込ませることが出来るとは思っていませんでした。いろいろと調べると参考になる資料も豊富で、スケッチも少し勉強すると自分にも書けそうです。私にとっては素晴らしい発見でした。

    そうそう、このままではガイガーカウンタの役をはたしませんから、元にもどしておきましょう。ダウンロードしてあった元のスケッチ(拡張子がPDE)をIDEからオープンして、先ほどと同様にアップロードしました。無論大丈夫だとは思っていましたが、ちゃんとガイガーカウンタとして動き始めたのを見て、ほっと胸をなでおろしました。

    Blinkを選択します

    Blinkを選択します