ガイガーカウンター用外部表示装置(+ CI-1G 版ガイガーカウンター)の製作 (2011/07/23〜2011/07/26)

(Last update:2011/09/20)


まずはブレッドボードで
連携実験
LCD 搭載時の外観

LCD は初期設定時のみ
接続することを想定
基板表

左半分がガイガーカウンター、
右半分が外付け表示器。

運用時は LCD は取り外す。

(写真は開発途中の 16F886 版)
基板裏

ガイガーカウンター側の配線は
かなり無理矢理かも ^^;
対基準値比表示例 回路図

製作の動機:

 管理人の自宅からは、車で1時間以内につくば市(北部は 0.1μSv/h程度)、牛久市(0.3μSv/h程度)、守谷市・取手市(0.5μSv/h程度)と放射線量がそこそこ異なる地域がある。どうせ車で通るなら放射線量をチェックしたくなるのが人情というもの(ぉぃ)。ならば車載品を作ってしまおう、というのがキッカケ。

 ただ車載となると液晶表示よりも 7セグ LED の方が圧倒的に見易い。とはいえ、わざわざ 7セグ表示版ガイガーカウンターを作ると後々ソフトウエア管理が面倒なので、RS-232C で送られてくるデータを表示させる「外付けのデータ表示機」を別途製作することにした。(その方が後々応用が効くし)


コンセプト:

 車内使用を想定した見易さと操作性、安全性を確保する。

 ・超高輝度 LED 7セグ表示
 ・ディマー回路付き
 ・表示装置側からガイガーカウンターをコントロール可能

 さすがに今回は Head Up Display (HUD) ではなくノーマル表示で ^^;


仕様:

 表示できるデータ:

 (1) 累積平均 CPM (全カウント数/全測定分)
 (2) 過去10分平均 CPM
 (3) 最新 CPM (設定サンプリング時間での単純移動平均)
 (4) 設定基準値に対する比
 (5) 総カウント数

 キー操作:

 (1) SW1:表示データ変更
 (2) SW2:ガイガーカウンター本体側ブザー音設定変更
 (3) SW3:全データクリア〜再測定開始


ハードウエア:

【PIC】

 16F886 で一度完成したのだが、上位コンパチの 16F1938 に移植完了。


【 7セグ LED 表示周り】

 ソフトウエア、ハードウエアとも前作 HUD 電波時計のものをそのまま流用。LED はハイサイドとローサイドの両方を使ってダイナミック点灯制御する。LED は降圧せずに電流を流し込むため、電流制限抵抗の代わりに CRD を使用して車の電圧変動を吸収し、輝度を一定に保つ(まぁ、普通に抵抗使ってもそれほど輝度は変わらないんだけど)。

 トランジスタアレイはソースドライブとシンクドライブの両方を使用。7 セグ LED には最大 18mA x 8 = 144mA 流れるので、アノード側を制御するソースドライブアレイをディスクリートで組む場合は Ic > 200mA のものを選ぶ必要がある( 2SA854 や 2SA950 がオススメ)。

 7 セグ LED は秋月の超高輝度・赤 4桁 LED を使用。ダイナミック接続用配線済みで極めて便利。


【RS-232C 周り】

 今回は同一ケース内にある PIC 同士の通信なので RX, TX 同士をクロス直結している。ガイガーカウンター本体と表示器との間がだいぶ離れてしまうようならちゃんとレベル変換 IC をかました方が安心。


【クロック源】

 RS-232C 通信を行うため、クロック源に外付けクリスタルを使用。車内は温度変化が大きいので精度面でセラミック発振子よりクリスタルの方が安心。


【消費電流】

 PIC まわりは数 mA だが 7 セグ LED が電気食いのため全体で最大 150mA 強必要となる。ただ 7 セグ LED は 12V から降圧せずにドライブするので三端子レギュレーターは 78L05 で十分。


【ガイガーカウンター本体側】

 ハードウエア、ソフトウエアとも前作と同じ。パルス検出はアノード抵抗を 10MΩ + 1MΩとしたアノード側検出にしたが、またもやノイズに悩まされることとなり、結果としてパルス検出トランジスタの BE 間に 200pF のコンデンサを入れるハメに(汗)。

 GM 管にはサイズ・感度的に手頃な CI-1G を使用。γ線感度が不明のため CPM と対基準値比ベースで運用する。

 また今回は実装面積(特に高さ方向)が必要な高耐圧コンデンサ(4700pF 1KV、470pF 1KV)には、チップ品をネット通販で「ポチっとな」して調達。おかげでかなり自由な部品レイアウトが可能となり、実装面積を抑えることができた ^^v

 なお、LCD は接続できるようにしてあるが設定変更時のみ接続し、通常は取り外して運用する。


ソフトウエア:

 使用している割り込みは受信割込みのみ。割り込み処理中でバッファに受信データを貯めて行き、改行コード(CRLF)が来たら必要なデータを抜き出して表示する。もともとガイガーカウンター本体側でほとんどのデータが計算済みのため、表示器側では数値演算等は一切していない。


【 7セグ LED 点灯】

 輝度確保のため、7 セグ LED は通常のダイナミック点灯(桁内スタティック点灯、桁間ダイナミック点灯)にしている。受信データの取りこぼしを防ぐため表示には割り込みは使用しない。


【データ測定開始 1分まで】

 測定開始から 1分未満は値の変動が激しく正確さに欠けるので、表示を点滅させることで 1分未満であることを知らせる。


【ディマー】

 安全運転のためにもディマー機能は必須。フォトトランジスターで明るさを検出して PWM 制御で明るさを調節する。ここらへんはハードウエア、ソフトウエアとも前作 HUD 電波時計のものをそのまま流用 ^^v


実装:

 基板サイズに余裕があったので、ガイガーカウンター本体と同居。ガイガーカウンター本体の放射線検出 LED を 7 セグ LED の隣に配置したので、あたかもガイガーカウンター単品のような仕上がりとなった ^^;

 装置はダッシュボード上に設置することを想定しているのでタカチの SW-100(W100 x D65 x H40)を使用予定。厚みがややあるが、近々計画している機能拡張用にスペースに余裕を持たせてある。


今回の失敗:

 三端子レギュレーターを逆接続して壊してしまった(爆)。ってか毎回ハマるのだが 78L05 の極性は何故に 78M05 や 7805 と逆なのか・・・orz


改良案:

 (1) 表示部を分離して小型に実装した方が便利かも。インパネ周りにはあまりスペースがない場合が多いし。また逆に大型の 7セグ LED を使えばインパクト・見易さ抜群。定点観測に便利。

 (2) ガイガーカウンター側からは計算済みデータが送られてくるため、表示データの追加・変更は容易。ハードウエア的には 8桁まで拡張できるよう PIC のポートとトランジスタアレイを空けてあるので、ソースを変更して表示桁数を増やすのもアリ。


プログラム:

 改変は自由だが、商用利用は一切禁止。

Ver 2.0 (2011/09/20)

asm & HEX ファイル
CPM_Display_v2.0.zip


謝辞:

 GM 管用高圧発生回路はこちらを、RS-232C 回りのコードはこちらを参考にさせていただきました。開発者様各位にお礼申し上げます。


おまけ: アセンブラプログラマのための 16F193x 1st impression

 今時アセンブラを使うのは少数派とは思うが、16F193x に乗り換える場合の注意点をメモしておく。

 16F193x は旧来の 16F シリーズに比べてスタックの深さが倍になっただけでも乗り換える価値はある。(今までどれだけ割り込みスタック数の制限に気を使ってきたことか!)

 が。

 ことアセンブラで使うとなると結構な落とし穴がある。

 例えば FSR 回り。FSR が 2 つになり、汎用メモリを全部まとめて仮想的にリニアアクセスができるようになったが故に、FSR 回りは地雷源(汗)

 主たる原因は FSR が 16bit になったこと。従来のように 8bit 感覚で INCF, DECF は使えず(一応使えるが思わぬバグの原因になることがミエミエ)、FSR の操作は MOVIW、MOVWI、ADDFSR を使わなければならない。

 特に ADDFSR はクセモノで、引数にマイナス値も取れるが(故に SUBFSR なんて命令はない)、その範囲は ±5bit 値まで。そのため

ADDFSR FSR0,-1

と書くとエラーになる。(MPASM ではリテラルは通常 16bit 値だから -1 と書くと 16bit の補数とみなされる)。

 解決策としては、例えば -1 したいなら

ADDFSR FSR0, D'64' -1

として 5bit の補数にしなければならない・・・が、これは面倒だし直感的ではないので後述のマクロで置き換えることにした。


 また特に悩んだのが、FSR へのアドレス値のロード。仮想アドレスは 16bit 値になるが、レジスタへの 16bit 値のロード命令なんてのはないので、8bit x 2 回に分けて書き込むわけだが、MPASM でそのための方法を探すのに半日もかかった(汗)。解決策は以下の通り。

ADDRESS = 16bit アドレス(の MPASM のラベル)とすると、

MOVLW HIGH ADDRESS
MOVWF FSR0H
MOVLW LOW ADDRESS
MOVWF FSR0L

ミソは HIGH, LOW 指定。これでラベルの値を上位 8bit、下位 8bit に分解できる。

 これらをいちいち毎回記述するのは面倒なので、やはりこれらもマクロ定義している。

 16F193x シリーズはバンクやページが残っており、旧シリーズからの移植が楽に思えるが、上述の通り FSR 回りが地雷原であるため FSR を使用したアプリケーションの移植は案外手間がかかる。新規に開発するならページもバンクも無い 18F シリーズの方が圧倒的に便利だろう(ちとお値段が高いけど)。


おまけ: 16F193x 用マクロ

(1) FSRn に 16bit アドレス値を設定するマクロ

SET_FSR0  MACRO ADDRESS
        MOVLW HIGH ADDRESS
        MOVWF FSR0H
        MOVLW LOW ADDRESS
        MOVWF FSR0L
        ENDM

SET_FSR1  MACRO ADDRESS
        MOVLW HIGH ADDRESS
        MOVWF FSR1H
        MOVLW LOW ADDRESS
        MOVWF FSR1L
        ENDM

 これで SET_FSR0 ADDRESS と記述することができる。ただし ADDRESS には計算式が使えない点に注意。(計算式までちゃんと取り込めるマクロの記述方法をご存知の方は是非ご指南ください ^^; )


(2) FSRn に -1 〜 -32 を加算するマクロ (注意:リテラル値はそのままでは16進扱いとなる。10進なら D'10' のように明示必要)

SUBFSR   MACRO REGISTER LITERAL
        ADDFSR REGISTER D'64' - LITERAL
        ENDM

 これで SUBFSR FSR0, 1 と記述することができる。


(3) プログラムページ設定マクロ

SET_PAGE  MACRO PAGE_NUM
         MOVLP PAGE_NUM * D'8'
         ENDM

 これで SET_PAGE 1 と記述することができる。


 [電子工作のページへ]