ガイガーカウンターを作る
- 2011/06/07 11:52
- カテゴリー:make:
秋月の出物でD3372というガイガーミューラー管が手に入ったことは先日書きました。先々週の土日に少し動かしてみようといろいろ検討をしたのですが,いやー,どうも勘が鈍っていけません。結局その後1週間ほど検討に集中して,先週金曜日には一応形にまとまったので,これで完成としました。
AVRtiny2313を使った作例がソース付きで見つかったので,最初はこれをそのまま頂いて,最小限の変更を行うだけににしたのですが,きちんと理解をしないままにいじくり回したため,なかなか上手く動かず手こずりました。
やはり全部をきちんと理解しておかないとダメですね。結局ほぼすべてを書き直しました。
(1)高圧の発生
ガイガーミューラー管には,500V程度の直流電圧が必要です。D3372の場合,350V位から放射線の検出が始まります。電圧が高くなるほどに検出率は上がっていきますが,550Vくらいになると検出率が平坦になり,電圧を上げてもほとんど増えなくなります。この平坦な部分の電圧をプラトー電圧といいます。ガイガーミューラー管は,このプラトー電圧で使うのです。
ガイガーミューラー管は,放射線が検出されたときに電流が流れるだけで,普段はほとんど電力を消費しません。ですので高圧の電源回路には電力を供給する力は必要がありません。
プラトー電圧の発生にはいろいろな方法があります。秋月のキットではCMOS版の555を使って間欠発振させ,本当に必要なエネルギーだけ作るようになっています。おかげで消費電流が大変に小さく,優秀です。ただ欠点があって,なにせエネルギーが小さいので,その電圧を測定するには入力インピーダンスが10MΩ程度のテスタやオシロスコープではあっという間に「消費」されてしまい,真の値がわかりません。
一方で,LCDバックライトによく使われた冷陰極管のインバータを流用することも行われていますが,供給エネルギーがGM管よりもずっと大きいものですから,インバータも常時発振しています。電池の電圧を100倍以上に昇圧する回路ですので,その効率の悪さを考えると,数十mA(あるいはそれ以上)の消費電流が常に流れていることはやむを得ません。
カメラのストロボの駆動回路を改造する方法もあります。これは割合現実的で,よく行われている方法のようです。
今回私がデッドコピーを試みた作例では,AVRで555の代わりをさせた省エネ方法がされています。周波数やパルス幅もプログラムで調整が自在なので,マイコンが使えるなら便利でしょうが,CMOSの555の消費電力にはかないませんので,結局数mAの消費電流は覚悟しないといけません。
先の連休中,ペンタックスのMZ-10が壊れてしまい,それを部品取りに残しておきましたが,ここからストロボ用の部品をいくつかとります。MZ-10は6Vの電源電圧ですので,昇圧比はあまり期待できないのですが,小型のトランスと高圧用のダイオードを確保します。本当は低圧側のスイッチングトランジスタも確保したかったのですが,結構VCE(sat)の大きなトランジスタが使われていたので,手持ちのMOS-FETを使うことにします。ちょっと贅沢に,2SK703です。
このトランスを使って100倍ほど昇圧,そしてダイオードで整流し直流を作るわけですが,実は高圧を貯めるコンデンサが最大の問題です。ストロボでは大きなエネルギーが必要ですので電解コンデンサを用いますが,GM管ではほんの一瞬ですので470pFから1000pF程度あればよいとされています。
しかし,前述の通り,これでは電圧の測定が難しいので,あえて大きめにしたのです。2.2uFで400Vのフィルムコンデンサがあったので,これを直列にし,1uFで800V相当にします。
とりあえず高圧発生部だけ組み立て,AVRにプログラムを書き込んだところ,どうも電圧が上がってきません。いくらなんでも100V以下というのはおかしいです。クロックが低いのではとか,パルス幅を広げようとか,いろいろやってはショートに近い状態になってあわてたりしましたが,冷静に考えてみるとこんな大きなコンデンサを十分にチャージできるような回路になっていないので,電圧が上がらないのは当然のことです。
そこで,部品箱をあさって,小学生の時に分解したテレビから取り出した,390pFで1kVのセラミックコンデンサを2つ並列に繋いで,800pF相当にしました。これで電源電圧を6.5V位にすれば,ちょうど650V程度が作れるようです。
これが,レンズ付きフィルムのストロボから取り出したトランスだったら,もっと低い電圧から昇圧できたでしょう。おかげで高圧発生用の電源とAVRの駆動用電源を分けることになってしまいました。
(2)パルス検出
GM管から得られたパルスは,2SC1815で受けてAVRの割り込み端子に入れます。これはトラブルもなく,あっさりOK。
(3)カウント
問題はここからです。パルスの数を数え,1分あたりのカウント数と,それをuSv/hに換算した値をLCDに表示する部分です。繰り返しになりますが,この部分はAVRtiny2313を使います。
ソースをよく読まずに作り始めたものですから,おかしな動作をしても原因がわからず,試行錯誤を行うとさらに混乱するという,まるで初心者のような状態になりました。
これではいかんと,ちゃんとソースを読むわけですが,この作例では1分間あたりのカウント数は内部で持っているのみで,表示はuSv/hに換算したものを出しているだけです。
ロシアのGM管に合わせた係数をD3372用の係数に置き換え,内部で持っている1分間あたりのカウント数も表示させます。LCDも手持ちの16文字x2行のものに交換です。しかし,どうもワークエリアをこわしているようで,文字化けはするわ,暴走するわで散々です。tiny2313でも暴走するのかと,当たり前のことに感動しました。
(4)改良
1分あたりのカウント数を持つ事は,ガイガーカウンターとして基礎的な機能です。しかし定義に従うと,値の確定には1分かかることになり,それまで全く表示が出ないというのはちょっとまずいです。一応,カウントされるときにはLEDとブザーが動作するようになっていますが,やっぱり表示にはそれなりの更新頻度が欲しいものです。
作例では,3秒ごとにカウントした数を20倍してずっとその値が続いたと仮定して値を求め,,それまでの平均値との平均を取って,3秒ごとに値を更新しています。この方法は非常によいやり方に見えるのですが,私には問題が多いように思います。
例えば,ある3秒間で2カウントあったとします。その後ずっと0カウントだったという場合を考えると,最初は40と表示され,次には20,その次は10,そして5,2,1となり,結局0になります。実際には2cpmなのに,この表示だといきなり40と出た後,21秒後には0となってしまうのです。常に一定のカウント数があるような測定には有効な手段ではあっても,カウント数が変動する場合,正確な値は全然わかりません。
かといって,本当に1分間の間数えて表示するには,時間がかかりすぎます。
そこで考えたのは,3秒ごとのカウント数を1分間記憶しておき,その総和を1分あたりのカウント数として使うことです。3秒ごとに新しいカウント数が得られますので,これを総和に加えると同時に,一番古いカウント数を引き算することで,常に直近の1分間のカウントの合計が得られることになります。
過去の値の総和から,過去の値を引き算するだけですので,総和が最終的に負の数になることはありえません。そして平均を取る場合の問題点であった,最初の3秒で2カウント,それ以後ずっと0カウント言う場合の表示は,最初の1分間の間は常に2と表示され,1分を越えると0になります。
バックグラウンドのような,1から3カウント程度の場合でも,直近の1分間の総カウント数がちゃんと表示されます。平均を用いる方法では,1カウント程度なら数秒で0になってしまいます。
ただ,やはり欠点はあって,常に一定の線量を放出する放射線源の測定を行うと,その値が安定するのに1分かかってしまうのです。例えば1分間で200カウントの放射線源があった場合,3秒ごとに10カウント,1分間で200カウントとなります。
しかし,平均を用いる方法では即座に200と出てくれます。急激な放射線を即座に知らせる能力に長けてはいても,それが本当の値である保証がないことは私には大問題に思えて,この方法は使わないことにしたのです。
それに,値が安定するまでに1分間かかるとはいえ,増え方を見ていれば大体想像も付きますし,突発的な変動でも一定の場合でも,癖を掴めばそれなりの値を知る事が出来そうです。
さらに,カウント数をゼロにしてカウントし直すボタンを取り付けてみましたが,変数を初期化した後の計数値がおかしく,どうも負の数を取ってしまう場合があるようなのです。初期化の関係か,割り込みの関係かといろいろ追いかけてはいるのですが,さっぱり理由がつかめません。
実は,今回のプログラムはなかなか手こずってしまいました。uSv/hへの換算のために文字列操作を行っていますが,そこで確保した配列の影響もあってか,明らかにRAMを壊しているような挙動が起こっていました。
配列のサイズを調整してなんとか動くようになったり,プログラムの最適化を行ったりしてなんとか3秒おきの更新には問題がなくなったものの,なにか機能を追加すると問題が出てくるような状態で,落ち着いてくれません。
やむなくgoogle先生に聞いてみると,特にtiny2313ではこういう,コンパイラを使った場合の原因不明の挙動不審が話題になることがあるらしいのです。かつてGPSクロックを作ったときは,割り込みで使う変数にvolatile宣言をしなかったために動かなかったので,今回も自分の間違いを徹底的に疑っては見たもの,やっぱりよくわかりません。
確実にAVRとコンパイラのせいだとは言えませんが,配列を使う時などは要注意のようで,配列を小さくすると正常に動いたりする今回のケースでは,やはりAVRとコンパイラの限界と考えた方がいいかもしれません。
冷静に考えてみると,tiny2313のRAMはわずか128バイト。割り込みを使うとレジスタの待避などで数十バイト使うということですから,残り100バイト弱です。ここに配列を含む様々なワークエリアを置けば,そりゃ何かの拍子にあふれることもあるでしょう。
AVRは確かに高機能だし,制約の少ないごく普通のC言語ですらすら書けてしまうワンチップマイコンですが,ハードウェアのリソースをソフトウェアは越える事が出来ないという,ごく当たり前の事を忘れていました。
アセンブラならこういう問題は起きないはずで,C言語を使ってプログラムを作ることの窮屈さを,10年ぶりに感じました。
結局有効な対策が見つからず,値のクリア機能は断念しました。負の数になって明らかにおかしい数値になっているならまだよいのですが,もっともらしい数字が出ている場合に,それが正しいのか誤りなのか判断出来ないことは最悪といってよいと思います。
代わりに,このスイッチはAVRのリセット端子に繋げて,完全なリセットとすることにしました。入力ピンが1つ空いてしまいましたが,別になにか機能を付けることもしませんし,メモリもカツカツなので,もうこれでいいです。
最終的に,流用したコードはほぼなくなり,ほとんど書き直してしまいました。
(5)完成に向けて
まず,高圧発生回路への電源と,AVRへの電源を別の電圧で供給する問題を解決しないといけません。高圧発生側は約7V,AVRへは5Vです。
ところで高圧側はそのエネルギーが小さく,手持ちの機材では直接電圧を測定出来ないため,実験用の電源器で高圧発生回路への電源電圧を可変し,レンズの放射線の測定値がばらつかないような電圧を選びました。この電圧を与えたとき高圧側にプラトー電圧が発生しているはずという根拠によって,6.5Vから7.0Vを最適値としました。
その高圧発生回路への供給電圧の生成は,手持ちの関係でトレックスのXC9119Dを使いました。OLEDや白色LEDの駆動用に作られた昇圧コンバータICですが,効率も高く,小さく,また使いやすいよいICだと思います。入手がもっと簡単ならいう事ないのですが・・・
これを使って作ったのは,3Vから7Vに昇圧する回路です。実際には6.8V位に調整をしました。これを高圧発生回路に入れると同時に,LDOで5Vに落とし,AVRに供給します。LDOはこれまた手持ちの関係で,NJM2387Aを使いました。1.5Aクラスの大型LDOですので明らかにオーバースペック,しかもバイポーラですのでIC自身の消費電力が結構あるため,今回のような用途には向いていませんが,CMOSの小型LDOの手持ちがなく,やむを得ません。
昇圧回路への入力は,3.0Vで27mA,4.5Vで18mAです。81mWですね。1600mA位のNiHM電池だと45時間ほど使える計算でしょうか。昇圧回路の出力は6.8Vで10.2mAです。約70mWですので,その効率は約86.5%程度。なにも考えずに組み立てただけでこれだけの効率ですから,XC9119Dは優秀です。
次にクロックです。内蔵RC発振では温度や電圧への依存が大きいので,水晶発振子を使いたいところです。しかし手持ちで小型の水晶発振子がないので,セラミック振動子で代用します。精度は水晶よりもずっと落ちますが,RC発振よりは断然有利ですので,これでいきましょう。
AVRの場合,クロックソースの切り替えはプログラムで行うのではなく,デバイスのヒューズビットをライタで直接書き込みます。ソースを修正しビルドと書き込みをやり直す必要がないので楽なように思いますが,周波数の変更を伴うとどうせソースも変更が必要ですし,ヒューズビットの設定は忘れやすいので,私は非常に面倒だと思います。
(6)組み上げてみて
手持ちのプラケースにさっと組み込みました。消費電流を測定中に過電流でXC9119Dを1つ燃やしてしまいましたし,テスターのヒューズも飛ばしてしまいました。鈍くさいことこの上なしです。
そうそう,電流の測定ですが,手軽で使いやすい秋月のP-10というテスタでは,正確な測定が出来ず困りました。テスタの内部抵抗が結構大きくて,随分電圧が落ちるようなのです。その分を稼ごうと電源器を調整する途中でミスがあって,XC9119を燃やしたのです。
これを,STA55で測定すると,電圧降下もほとんどなく,良い値が測定出来るようになりました。
さて,動作試験です。まず平常時のカウント数,いわゆるバックグラウンドが2から3CPM程度であることを確認しますが,これは問題なしです。
次になにか放射線源を使って,そのカウント数が「それらしい」ものになっているかをみます。以前も書いたように,私の手元には「放射能レンズ」がありますので,これを近づけます。いやー,やってみたかったんですよね。
写真にあるように,164CPMという表示です。SuperTakumar50mm/F1.4の場合,D3372で大体200CPMくらいということですので,まあこのくらいで妥当でしょう。1分経過すると,大体この値で落ち着きます。1秒間に2.5回ほどのカウントになりますので,ブザーとLEDが結構うるさく,びびります。(嫁さんの目がすごい怒ってました)
ただし,左上にあるガイガーミューラー管とレンズとの距離にカウント数が大きく左右されます。もっと近い距離に置けば250から300CPMくらいでが出てきますし,もう10mmもはなすと,数分の一まで値が下がります。15cmも離してしまえば,もう全然カウントしません。
164CPMというのは,D3372の場合13.8uSv/hという高い線量に相当するようです。内部被曝すると洒落にならないのですが,15cmも離れればほとんど影響がないからこそ,こんな民生品に多用されたのだと思います。(とはいえ今なら絶対に世に出せないでしょうね)
ここまでで,とりあえず放射線を検出できる事がわかりました。uSv/hへの換算は全然あてにならないのですが,そもそもガイガーミューラー管は放射線の検出器と考えた方が無難で,普段から1分あたりのカウント数をおおよそ覚えておき,それに対して多いか少ないかで危険度を見る指標とすべきでしょう。
測定値の絶対的な値は,校正も行っていませんし,GM管の特性や放射線源にもよりますし,きちんとした線量計でも測定方法によって値が大きく異なるものなので,参考にさえならないと思います。
ただし,普段より大きいか小さいか,そのくらいの情報でも,あるのとないのとでは大きな違いです。今から洗濯物を干そう,布団は大丈夫か,外に出ても良いかどうか,これをその場でさっと確かめることが出来るのは心強いです。なにか事故が起こっても,それがニュースで我々に届くには,数時間はかかるものです。
そもそもガイガーカウンターというのは,ガイガーミューラー管の機能がそのまま使われているもので,これがなくては話になりません。それゆえ,回路の工夫で性能を高めることも出来ませんし,代用品もありません。
それほど複雑な構造のデバイスではないですし,できる事なら数百円で簡単に手に入るようになって欲しいと思うのですが,冷戦終了後の需要の減少は想像に易く,それが平和利用の花形だった原子力発電の危機的状況から再び注目されるようになるとは,なんともやりきれません。
さてさて,そんな大した製作ではなかったのですが,久々のAVRということもあって,いい頭の体操になりました。AVRも面白かったのですが,近頃は昇圧回路があっさりできてしまうので,スマートにまとまって,ホントに良い時代になりました。

