PICで気圧、温度、湿度計 by 24FJ64GA002 
たかが押しボタン、されど押しボタン


パソコンの入力装置の最も一般的なものと云えば、押しボタンスイッチです。押していない時と、押している時の2つの状態しか無いのですが、この2つの状態を的確にパソコンで判断する事は、実は大変厄介な事なのです。

実は、私はこの押しボタンの処理が一番苦手で、考え出すと頭の中で堂々巡りが始まってしまい気がめいります。「押しボタンスイッチを出来る限り避けて通りたい」といつも思っています。そうはいっても、押しボタンが無くて頭の中で念じるだけで動作状況や設定を変えられる電子装置等有るはずがなく、やっぱり絶対に押しボタン避けては通れません。

この押しボタンで厄介な事とは、先ず次の2点です。

1.押しボタンからの入力配線が長いとの電磁誘導等によるノイズが混入しやすい。(誘導ノイズ)

2. 押しボタンスイッチによる、パソコンへの「0」や「1」の信号の変化には、チャタリングが発生する。

この、誘導ノイズやチャタリングは、ハードウエアやソフトウエアで上手く除去する方法がありますが、さらに、

3. 人が日常的に「押しボタンスイッチを押した」、「押しボタンスイッチから手を離した」と感じている時間感覚と、パソコンが入力を「0」や「1」と判断する為の処理時間の間に、あまりにもスケールの違いがある。



たとえば、押しボタンで押した回数を「正しくカウント」しなくてはならない様な場合や、一回づつ押した毎に別の動作に切り替わる様な場合には、この時にノイズやチャタリングと云う比較的高速で不規則な現象を除去しながら、動作時間が比較的ゆっくりで連続操作時間間隔の不規則な人間が「押した」、「離した」という動作を検出して1回、2回と間違える事無くカウントすると云う、2つの問題を同時に処理しなければならないからです。

ディップスイッチや、トグルスイッチ等の様な一定の状態をキープする様な目的で使用する入力機器は、途中がどうであれ、最終的な動作の切替えが目的であり、変化の正確な回数をカウントするという使い方は普通はしません。

時計等の日時の設定をする方法を思い浮かべて下さい。

モード変更ボタンか何かで、時刻の設定モードにします。そして、目的の時間に設定するのですが、押しボタンを1回押せば、数字は正確に+1、あるいは-1され、長押しすると連続的に変化したり、さらに長押しを続けていると、増減のリピート時間が加速したりします。そして、目的の時間に合わせたら、設定ボタンを押して時刻をセットします。複数のボタンを同時に押した場合は、特殊な使い方を除いて、通常は思わぬ動作をしない様に、複数ボタンの同時押し操作が無効になる様になっています。

この中で、一番重要なのは「1回押した事を、1回と検出する」部分なのです。

この「1回押した」という非常に曖昧な動作は、高速に動作しているパソコンに取ってはものすごく長い時間の現象を検出して認識しなければならないのです。

しかも、押すタイミングは人によって異なり、高橋名人(かつてのゲーム機ファミコンの名人で現在はナムコの社員)は、特技としてゲーム機のコントローラのボタンを1秒間に16回押すという16連打があり、日本で初めて『チャンピオンシップロードランナー』を全面クリアした実績を持っています。私にはとてもこんな連打は出来ません。1秒間に4〜5回が限度です。 ゆっくり押す人は1秒間に1回なんて事も有りますね。

それでも、1回は1回でなくてはなりません。

1回が2回になったり、時々カウントできなかったりすれば、「この装置は故障している!」とクレームをつけられてしまいます。

例え遊び半分にいろいろなボタンを同時に押されても、突然異常な動作をしたり、操作不能な状態になって電源を抜かなければいけない様な状態に陥ったリすれば、「これは危険だ!」とか、「こんなの使い物にならない!」という評価が下されるわけです。

また、押しボタンを押している間、パソコンが押しボタンの処理に集中してしまい、平行して処理しなければならない動作が中断してしまってもいけません。

例えば、7SegのLED表示をPICでダイナミック点灯するには、回路の部品点数や表示の為の制御用I/O数をなるべく減らす為に、LEDの各桁を1つ1つ順番に切換えながら全体を60Hz(1/60sec=17msec周期)位で順次点灯させて、その残像効果であたかも全ての桁が同時に点灯している様に見せています。この時、その時刻を合わせようとして、押しボタンを押している間中LEDのダイナミック点灯表示処理が止まって、表示が1桁だけになってしまったり、消えてしまっては困ります。

つまり、単にスイッチの処理に集中して良い場合と、周期的なサイクル処理に紛れ込んで処理しなくてはならない場合と、あるいはタイマー等の定期的な割り込み処理でスイッチ処理をすれば良い場合、割り込み処理が許されない場合等様々であり、それぞれの場合に合致した処理の方法を考える必要があるのです。

では、Air3-24GSについては、押しボタン処理はどうする場良いのでしょうか?

Air3-24GSでは、
1.気圧センサーを0.56sec毎の自動計測モードにして使用している。

2.気圧センサーの計測開始から計測完了までの空き時間(560msec)を利用して、日時の表示、気圧値、気温値のデーターを気圧センサーから通信でPICに取り込み、さらに湿度値を湿度センサーから通信でPICに取り込み、それらの3種の数値を変換して表示し、プロットし、シリアルデータ通信で外部へ送信している。

3.次の計測完了信号が発生するまでの空き時間はPIC自身をスリープさせて、積極的に省電力させている。(アウトドアーでバッテリー駆動運転する場合に、無駄な電力を消費させず、電池の寿命を長くできるため、EEPROMが無いPIC24Fのメモリー上で観測データーをオフラインで一時記憶できる)

4.Air3-24GSで、計測完了後に気圧センサーユニットからデーターを読み出さないで無視しても、何も問題は無い。

通常の計測&表示運転では560msecという決まった周期の中で、上記の全ての処理が完了していなければならないのですが、押しボタンの処理を0.56sec毎に行うのはあまりにも応答が緩慢になってしまいます。

高橋名人程ではないとしても、5回/秒(200msec)位の押しボタンの応答が普通であろうと私は思います。これは、ON、OFFの2つの状態で考えれば、10判断/秒(100msec)で着実に判定が出来なければ、「押しボタンの応答が遅い」と思われてしまう事になります。


そこで、上記の様な実験用回路をブレッドボード上にPIC24Fで組み、自分なりに押しボタンの入力の為のソフトウエアを考えて実験してみることにしました。

この回路は、Air3-24GSの回路の押しボタン入力だけを残して他のI/Oを全て取り去り、チェック用の3個のLED出力を付け加えたものです。

この、押しボタン入力実験回路を、Air3-24GSと同様に、PIC24FJ64GA002 を内蔵の副クロック発振の8MHzで動作させて、PIC内部のプルアップ機能使って4ボタンの入力を確認して、チャタリング除去 & 押しボタン状態認識ソフトを作ってみました。

この回路の押しボタンは通常は開(open)状態にあり、PICへは内蔵のプルアップ機能を有効

CNPU1 = 0x0030;     // CN4(RB0)、CN5(RB1)プルアップ有効
CNPU2 = 0x6000;     // CN30(RA2)、CN29(RA3)プルアップ有効

にする事によって通常は「1」(High)の状態に有ります。押しボタンを押すと閉(close)となり、Vssと同電位の0Vへ接地されて「0」(Low)の状態になります。この時プルアップ機能を有効にする対応表がCN番号で記載されていますが、CN番号とポートのRA番号、RB番号と何ら関連性が無く、順序もバラバラなので、チップのピン番号図をたよりに注意して2つの表を見比べて、正しいCN番号のビットをONにして下さい。

 

今回は、4つの押しボタンのチャタリング処理と、状態チェックをC言語の関数として作ってみました。

2464002swio04.zip

このサンプルプログラムは、集中的に繰り返し呼び出される事が条件です。

青、黄色、緑、灰色の4つのボタンを独立にチェックし、各ボタン毎に、
「現在、押されているのか(閉)いないのか(開)」、
「一回前のチェックで、押され続けているのか(閉)いないのか(開)」、
「開から閉へ状態が変化」、
「閉から開へ状態が変化」、
「ボタンが2つ以上同時に押された」
の、5つの状態フラグをチェック毎に調べて変化させます。

過去の状態判断結果と、現在の状態判断結果をチェックする事で、チャタリングや誘導ノイズを除去した上での押しボタンの状態の変化を捕らええて、押した回数を正確にカウントする事が出来ます。

また、押している状態が一定時間続いていれば、自動でカウント行い、さらに長く押していると、自動カウントを高速で行う様な処理をしてみました。長押しと、長長押しの検出です。

LEDのダイナミック点灯等の処理時間の短いものへの応用は可能です。Air3-24GS(気象観測ユニット)は、日時の設定や、プロットサンプリング時間の変更等、センサーからの定期的な測定完了信号を無視して別の処理を行ってもシステムに問題が発生しませんので、この方法が使えます。比較的処理時間が長いものへの応用はできません。

なお、例によってこのソースプログラムは、
Windows XP Pro v2002 SP3上で、
現時点において最新で無償の、
MPLAB-IDE v8.60、
MPLAB C30 C Compiler [pic30-gcc.exe] v3.24
にてコンパイルしています。

今回のプロジェクトファイルでは、PIC24F用のライブラリーを使用していませんが、念のためにMPLAB C30 のご利用のバージョンに合ったライブラリーを正しくリンクさせる為に、その都度MicroChipのディレクトリー内のファイルをリンクさせてください。配布用のサンプルプロジェクト内にはそのライブラリーの実体が含まれません。

また、単純にインクルード宣言をするだけでは正しくライブラリーを参照する事が出来ません。

まず、PIC24FJ64GA002用のライブラリーを正しくリンクさせるには、
C:¥Program Files¥Microhip¥MPLAB C30¥lib¥PIC24F¥libpPIC24Fxxx-coff.a
を、プロジェクトファイルのLibrary Files に登録してください。

また、プロジェクトファイルのLinker Scriptに、
C:¥Program Files¥Microhip¥MPLAB C30¥support¥PIC24F¥gld¥p24FJ64GA002.gld
を登録してください。

なお、PIC24F用のHI-TECH C は、現在は残念ながら対応していません。今回のプロジェクトは MPLAB C30 用なのでお間違え無い様にして下さい。

プログラミングは、秋月電子通商のPICkit2互換機を使っています。MPLAB C30 コンパイラーから直接秋月PICkit2互換機を通じてICSP接続で書込みをしています。

またヘッダーファイル「_AtrDef24f.h」は、パレットソフトさんの HI-Tech C 用ソースプログラムからPIC24FJ C30コンパイラ用に変更して流用しています。

プログラムの構成方法を、パレットソフトさんのプログミング形式を利用し、ソースリストのデバッグや、再利用がしやすい様にしています。

今回の押しボタン処理方法がベストとは思いませんが、自分で押しボタンスイッチの処理を考えてみる事は、いろいろな意味で大変面白い事です。

さて、この処理方法をAir3-24GSへ組込む為には、装置の処理モードをもう一度分析しなおして見る事が必要です。またしても、いつになることやら!(Dec. the 9th 2010)


注意事項
General disclaimer
トッ プページへ

なお、当ホームページで公開しているデーター(写真、音声)等を個人の枠を超えて複製・転用する事はご遠慮下さいませ。
ご意見/苦情/ご感想はこちらまで