« 2011年7月24日 - 2011年7月30日 | トップページ | 2011年8月14日 - 2011年8月20日 »

2011年7月31日 - 2011年8月6日の1件の記事

2011年8月 5日 (金)

SparkFunガイガーカウンターに操作ボタンをつける

USBと電池切り替え回路の改良(7/28/2011)

S_p8054061 ブログに記事を上げてから、ずっと気になっていたことがある。SparkFunのガイガーカウンターキットに手を加え、電池駆動で動くようにしたのだが、USBをつないだとき、USBバスに電池の5Vが入りこまないよう、FETで電池からの供給を止めるのは良いとしても、逆に電池の電源をレギュレーターの前のスイッチで切るとレギュレーターの入力側が0になるのに、レギュレーターの出力側はFETのソースにつながっていて、ドレインはUSBの5Vがつながったままになる(ゲートは0Vだが)。

 最初、回路が出来たときドレインからソースへ電流が流れていなかったので(誤測定だった)安心していたのだが、ウェブの記事を見ると、FETは内部的にドレインからソースに順方向の寄生ダイオード(Body Diode)が入っている。それなら、ドレインの電圧はそのままソースに反映されてしまうはずだ。電池ならさほど問題ないが、レギュレーターはまずい。本来ならもうひとつFETがいるところをさぼっている。

 ぐだぐだ言っているより、試してみたほうが早い。出来上がっているのをテストするのは、GM管の高圧が近くにあって怖いので、ブレッドボードに新しく2SJ377をブレッドボード用にハンダ付けして、テストしてみた。

S_p8054076 おお、やっぱり心配していた通りだ。ソースに何もつながないで、ドレインに5Vをかけるとソースは4.5V近くを指す。レギュレーターをつけると電圧は2Vくらいまで下がるが、電流は直結のときと同じ0.6mAが流れ込む。何だFETというのは遮断の役に立たないのか。レギュレーターをはずし、4.5Vかかっているドレインに試しにLEDの負荷をつけると、同じ程度に電圧は下がったが、電流は殆ど流れないので点灯はしない。接続されたレギュレーターは全く熱も持たないが、やっぱり心配だ。FETは電池からUSBバスに導通するのは防いでいるが逆はだめなのだ。

 本来の回路に2つFETがあったのは、この逆流を防ぐためだったのだ。この場合は、FETが対称に配置されるので、USBからの電流は、電池へ流れ込まない。しかしFETを追加するには、電源小基板のスペースはもうない。幸いダイオードくらいなら入る余地があったので、SBダイオード(1S4)を、レギュレーターとFETの間に入れた。よーし、これでレギュレーター出力での電圧は0.5V以下に下がった。ただ、レギュレーターからの電圧は、5Vから4.7Vに低下した。まあ、これは仕方がない。

 逆流電流は0.6mAくらいなので、もしかしたらレギュレーターは大丈夫(内部の逆接続防止ダイオードが必死に支えている?)なのかもしれないが、正規外の状態であることは間違いない。まあ、これで安心して眠れる。いやいやそれにしてもアナログは難しい。(前回記事の2つの回路図は、この修正が反映されています)

S_p8054084やっぱり屋外で平均値が見たい(7/30/2011)
 今日は久しぶりにテニスをやってきた。雨を覚悟していたのだが、結局、降らず。真夏にしては快適にテニスが出来た。雨模様で参加者が少なかったので、順番が早く廻り、ほとんどプレイしっぱなし。さすがに疲れた。ガイガーカウンターをテニスコートに持っていくのを忘れていた。自慢できなかったのは残念だったが、このところ、ことあるごとに持ち出しては測定の機会を増やしている。

 週2回出かける事務所は日本橋にある。ここでの平均は、ビルの3階のせいか自宅よりやや少ない放射線量である。ある政党の調査結果によると、東京都内は東部にかけてかなり高くなるという。確かに事務所近辺の地面近くでは一気に線量は増える(0.1μSv/hを常に超える)。といっても、まあ、海外旅行を1回した程度の線量だ。大騒ぎする量には程遠い。

 ある場所を測定したあとは、最寄のPCにつなぎ、蓄積値(平均値)を出しているが、やっぱり蓄積データをリセットして個別の平均値をだす操作が出先で自由に出来ないと、使い勝手が悪いことがわかる。頭で考えるより、こういうフィールドテストが操作仕様を決める最善の方法だ。ということでやはり、タクトスイッチをつけてガイガーカウンターをボタンで制御できるように改良することにした。

 そのためには、スイッチだけでなく、CPUチップからさらにI/Oピンを引き出す必要がある。引き出した線の固定やスイッチの実装も考えなければいけない。最初は今までの工作と同じスタイルで、パネルにあけたLCD固定用ねじを使って付属追加基板を固定し、そこにスイッチを実装しようとした。しかしフロントパネルにスイッチの穴を開けると、ちょっとした雨でもケース内に水が入ってしまう。

 すでにUSBのコネクターの穴が横に空いているので、防滴仕様にもなっていないが正面に穴があくのはやっぱり避けたい。ということになるとタクトスイッチはパネルにネジで固定しなければならない。あいにく部品箱にはネジで止めるタクトスイッチの在庫がないので、部品の調達が出来るまでハードの工作は一休みである。

ATMega328の全部のピンを引き出す(8/1/2011)
 仕事の帰り、久しぶりに秋葉原に出る。秋月、千石界隈は、相変わらずメイド喫茶の客引きが煩わしい。目立ったところでは、定点観測しているSDカード2GBの値段が遂に¥300を切った(¥250)ことと、安売りショップにやたらとガイガーカウンター売出しのポップが増えたことである。大抵のショップには1つや2つの案内がある。値段はウェブ上と同程度だが、一時に較べると安くなった。この分で行くと秋には、完成品でも1万を切るかもしれない。

S_p8024056

 今日の買い物の中心は、やっぱりガイガーカウンター関係である。パネルに直付けするタクトスイッチをまず探す。タクトスイッチは、ねじでパネルに固定し、しかも小型のものというと意外に種類が少ない。下の電池や基板に干渉しない、低背(ローハイト)のものを探すが、見つけられなかった(結局、千石で前と同じようなものを買う)。

 次は、1GΩのいわゆるハイメグ抵抗(これはタクマンの商標らしいが)と、秋月のDVMキットである。これはガイガーカウンターの高電圧測定が目的である。我々が取り扱える高圧は、微小電流が殆どなので(大きければ命にかかわる。こんな呑気に扱えない)、相当高い抵抗で分圧しないと正しい測定ができない。

 このSparkFunのキット、たまに長時間パルスを出さない(暫くすると何事もなく復帰)ときがあり、原因がGM管か高電圧発生回路か特定するために準備している。もともと高入力インピーダンスの電圧計は前から欲しかった計器でもある。

 ウェブの情報では、秋月のDVMキットが一番安価で手軽のようなので、電圧計の方は心配ないが、フルスケール0.2Vの電圧計で1000V近い電圧を測るのには、ギガを超える分圧抵抗が必要だ。これもウェブ情報にもとづいて、高電圧用の特殊部品専門店という山王電子というラジオデパート2階のショップに行く。

 タクマンの1GΩ(¥850、誤差1%のものは¥1000、1%のものは千石の方が安かった¥920)を手に入れる。どうせ校正しなければいけないので5%の安いほうを選ぶ。秋葉原特有の偉そうなショップの親爺だったが、感心なことに抵抗を素手では触らなかった(指紋の油でリークするらしい)。

 家に帰って、高電圧測定はあとにして、タクトスイッチのハードウエアを準備する。キットのMega328はLCD用に6本I/Oピンを出したが、さらに2本は余計に必要になった。この際なので、使うあてはないが、いっそのこと残っている全部のピンを引き出すことにする。

 空いているI/Oピンは6本である。受け側も用意しなければいけない。これまでの2ミリピッチのピンヘッダーの小基板を作り直す。0.8ミリピッチCPUチップからの引き出しは大分慣れてきて、ほどなく全部引き出し終えたが、問題はこの小基板への接続である。

S_p8024049 これまでのLCDの8本(Vcc、GNDを含む)に加えて6本、あわせて14本のソケットへのハンダ付けは、欲張ってこの小基板にタクトスイッチ用のプルアップ抵抗までつけたものだから、ちょっとした手品のしかけを作るような気分である。2段になったピンソケットへのハンダ付けの手順をあらかじめ確認し、ピンセットで慎重に0.2ミリのUEW線を、2段になったソケットピンの位置に合わせて切りそろえ、先端をハンダあげする。 

 始める前は、本当にこれで全部ハンダ付けできるか自信がなかったが、やってみると意外にうまく行った。こういうときのハンダは、みんなが推奨する日本アルミットのKR-19ではハンダの流動性が高すぎて、むしろ以前まで使っていたGootの普通の糸ハンダの方が仕上げが綺麗に出来る気がする(これに慣れているだけかもしれないが)。

 全部の配線を終わった。恐る恐るソケットを定位置に戻し、テストする。良かった。LCDがちゃんと動いた。新たにつないだ線も、チップのピンとソケットの導通テストでちゃんとつながっていることが確認できた。全部出来たとなるとすっかり気が抜けて次のステップに進む気力を失う。

タクトスイッチをつけてハードは完成。残りはソフトの開発(8/2/2011)
 自分は左利きだが、タクトスイッチは右利き用にLCDの右側につける。5ミリの穴2つである。念のため養生テープをつけたので、気楽に3.3ミリのバイトで大きなドリルを使って開けたら、しっかりずれてしまった(キリで下穴をあけていたのに)。気を抜くとろくなことがない。リーマーで何とか揃える。

S_p8054082

 スイッチのプルアップ抵抗はソケット基板に既につけてあるので、3本のコードをハンダ付けするだけで、スイッチをつけてしまえば、ハードウエアの作業はあっけなく終わりである。次はソフトである。スイッチ制御は、何度もやってきているので簡単に考えていたが、仕様を確定するのに少々手間がかかった。

 ボタンだけのユーザーインターフェースは電化製品では珍しいことではないが、使いやすいボタンのインターフェースというのには中々お目にかからないものだ。マニュアルを見直さなければ時刻合わせも出来ないデジタル腕時計や、何度やってもやり方を覚えられないPCビデオモニターの設定スイッチ、押しているうちに、何故か必要もないのに必ず統計ページが印刷されてしまうレーザープリンターなど、使いにくい例をあげだせばきりがない。

 使いにくいボタンインターフェースに共通することは、個別のボタン(スイッチ)の機能がフェーズによって変わってしまい、固有のシーケンスを覚えていないと操作が出来ないというやつである。何とか使えるのは、それぞれのボタンの機能が整理され、しかも個別のボタンの役割が固定されていて、全体の機能が階層的に整理されているインターフェースである。

 今度の場合はボタンは2つしか使わない。うまく機能を配分しないとわけがわからない操作になってしまう。ユーザーインターフェースの設計は所長のかっての専門分野でもある。これまでの経験を生かして使いやすいものにしないと笑われる。色々考えた結果、ガイガーカウンターのボタン設定は次のように決まった。

Aボタン(セレクト機能)  ボタンを押すたびに、表示が移動平均値->累積平均値
               ->累積データ消去選択-> と循環する。

Bボタン(決定機能)  Aボタンで選択する局面ごとに、その局面で行う処理を決定
              するボタン。
              この機械では、Aボタンで累積データ消去選択を選んだとき
              だけ機能する。
               ただし、消去のような重要イベントの時は、確認を促す
              表示が出て、再度Bボタンを押すことで、それが実行
              されるものとする。

               このとき、Aボタンを押せばキャンセルとなる。

      なお、Aボタンで表示するだけのフェーズのときは、Bボタンは機能
      させない(ここで欲張って何か機能を持たせると操作性が悪くなる)

 こういう仕様を決めるまでが、本来一番時間をかけるべきところである。良い加減な仕様でプログラムを書き始めてから、プログラムに合わせて仕様をいじると大抵使いにくいものが出来上がる。と、能書きを垂れながら、コーディングを開始する。

 こうして宣言しているのは、ともすると安易に流れて仕様をいじることをやらないよう自分に言い聞かせるためでもある(何度も失敗している)。

擬似コーディングの勧め、再び(8/3/2011)
 コーディングは例によって、擬似コーディングから始める。擬似コーディング(Pseud Coding)が何度も当ブログに登場するのは、電子工作の世界で、ソフト開発の不得意な人が意外に多いことに気づいたからである。上から目線でちょっと僭越だが、みなさんソフトウエアを少し気楽に考えすぎていると思う。

 LEDの点滅とか、"Hello World"のLCD出力くらいなら、いきなりコーディングして何の問題もないが、C言語でステップ数が200を越えるあたりからは、周到な準備を事前にやって開発にかからないと完全な動きをするプログラムを完成させることは難しい。

 もちろんこの世界にも向き不向きがある。1000ステップを越すプログラムを楽々とドキュメントもなしに完成(バグなしということ)させる人がいるが、こういう人と自分を一緒にしてはいけない。

 今はもう別の会社に吸収されたが、Delphiや、Turboシリーズで有名なボーランド社のフィリップカーン社長は、Pascalコンパイラーのソースを全部記憶していて、何かエラーが起きるとたちどころに修正点を指摘できたそうである。ここまでいかなくても、いわゆるハッカーと呼ばれる人たちは大抵常人を超えた能力を持っている人たちである。この人たちを真似ようと思ってはいけない。

 こうした名人達に、我々凡人が対抗できる数少ない手段が擬似コーディングだと思っている。プログラムの動きを普通の自然語(我々なら日本語)で徹底的に記述し、矛盾点を洗い出す。

 矛盾するところがなくなったら、これを少しづつコンピューター言語に移していく。この手順を踏むことで、プログラムがどれだけ複雑になってもメンテナンスが可能になる。もちろんプログラム開発には、言語に特有の文法や、モジュール構成とか、構造化するとか専門的なテクニックを多々求められるが、これは必要に応じて身に着けていけばよい話だ。

 肝腎なところは、バグのない(論理矛盾のない)プログラムをいかに作るかで、それは自然語である日本語でも、プログラム言語でも基本的には変りはない。このあたりをおろそかにして開発をコーディングから始めると、大抵の人はバグを取りきれずに挫折してしまう。

S_p8054073 擬似コーディングの例は、これまでにいくつか(ここや、ここに)お示ししているが、ただ形や決まりにこだわることは無意味である。自分が納得するまで紙の上で何度も書き直して(アートワークと同じで、ボールペンより鉛筆、消しゴムがおすすめ)、ロジックを整理することである。

 開発したソフトウエアが思ったとおりの動きをするのを見ることは、もの言わぬ小さな部品を集めて特定のハードウエアを作り上げるのと全く同じ喜びである。電子工作の醍醐味のひとつだ。これを読んだ方々が、擬似コーディングの手法でソフトウエア開発のレベルを少しでも上げられることを願っている。

操作ボタンをつけたガイガーカウンター完成(8/5/2011)
 てなことを書きつつ操作ボタンの開発である。擬似コーディング数枚を費やして、ガイガーカウンターの操作ボタンのソフト開発は終わった。タクトスイッチの制御は、ピンチェンジ割込みをトリガーとして、ボタン処理ルーチンで一手に行う。ここではチャタリングの待ち時間を入れたあと、スイッチの押下でディスプレイモードを切り替え、そのあとの表示ルーチンで、モードに応じたLCDの画面を用意する。

 表示タイミングは1秒ごとか、状態が変わったときなのだが、今度は、スイッチで表示モードが変わるというタイミングでも表示しなければならない。最初の擬似コーディングでは、このことを考慮していなかったので、1秒ごとにLCDがチラチラし見にくい。

 本来はもっと前に戻るべきなのだろうが、ずるをしてフラグ(表示モード変更フラグ)を追加し誤魔化す。ちょっとフラグが多すぎるなあ。UARTも残してあるので7ヶもある。余り褒められたコードではない。

Photo それに誤算がもうひとつあった。AVRのピンチェンジ割込みは、立下りや立ち上がり、レベルなどの割込みのモードが指定できない。ロジアナで見ると、このタクトスイッチは押すときも離す時も派手なチャタリングが出るので普通のロジックではまともに動かない。

 仕方がないので、チャタリングを待つ時間は割込み禁止にして割込みフラグをクリアしてから割込み許可にする苦肉の策をとった(main.cの239行付近)。やっとこれでボタン操作が落ち着く。それまでは、いきなり確認ボタンを2つ連続して押すようなときがあって使い物にならなかった。

 まあ、それはともかく、SparkFunのガイガーカウンターは、ほぼこれで完成形に近づいた。ピンは余っているし、フラッシュはまだ10KB以下なので、RTCでも何でもつけられるが、こればっかりやっているわけにもいかない。それより、このガイガーカウンター時々、高圧が出なくなるのかGM管そのものなのか、時々計測不能になる。デジタル電圧計(DVM)の開発を急ごう。

ここにボタンで制御するSparkFunガイガーカウンターのソース一式を置きます。回路図は前回のものに、PD4、PD5にタクトスイッチを追加しただけなので省略しました。
8/5/2011に公開したソースにバグがあったので修正した版を以下に掲載します(EEPROMをボタンで消去するとデータが蓄積されない)  8/7/2011

「SparkGeiger807_2011.zip」をダウンロード

| | コメント (0) | トラックバック (0)

« 2011年7月24日 - 2011年7月30日 | トップページ | 2011年8月14日 - 2011年8月20日 »