今回は、PICマイコンでタッチ検知をするためのプログラムの基本構造を説明します。タッチ検知プログラムの基本構造タッチ検知プログラムの詳細を説明する前に、プログラムの基本構造について説明します。PICマイコンでタッチセンサを使用する場合、内蔵されているタッチセンサモジュールそのものの設定や処理をプログラムする必要がありますが、もう一つセンサ値をカウントするカウンタが必要です。このカウンタとして、タイマーモジュールを使用しています。いうことで、タッチセンサを使用する場合、タッチセンサモジュールとタイマーモジュールの設定や処理をプログラムします。プログラムではこれらを以下のように使用します。それではこれから、タッチセンサの設定、タイマーモジュールの設定、タッチ検知プログラムの基本構造を説明します。ピンの設定も必要ですので合わせて説明します。タッチセンサモジュールの設定はちょっとわかりづらいところがありますので、概略について最初に説明しておくことにします。タッチセンサモジュール設定の概略タッチセンサモジュールの設定は、どのピンをタッチセンサに使用するかなどの基本設定以外に、センサモジュールの動作設定があります。この動作設定がちょっとわかりづらいので、最初に概略を説明しておきます。繰り返しになりますが、センサに触れていないときと触れたときで静電容量が異なりますので、その静電容量を調べるために、電荷を満杯にして空にして、という動作を一定時間内に何回繰り返すことができるかをカウントする、ということを説明しました。これをバケツに置き換えると、バケツに水を満杯にして→空にして→満杯にして、という動作を一定時間内に何回繰り返すことができるかを調べることに相当します。PICマイコンのタッチセンサモジュールの設定では、バケツに例えた場合、以下の設定があります。水を供給するホースの太さの設定(1)の設定では、通常は「100%が満杯・で0%が空」という判断ですが、例えば「80%溜まったら満杯・20%まで減ったら空」と判断する、というような設定ができます。このように満杯・空を80%・20%と判断するようにすると、実質的なバケツの容量は少なくなりますので、一定時間のカウント値は増えることになります。同様に(2)の設定では、ホースの太さを調整、つまり水の供給量を変えることができます。水の供給量を増やすと、一定時間のカウントは増えることになります。ところで、なぜこのようにカウント値を増やしたり減らしたりする設定があるのでしょうか。今回カウンタとして使用するTIMER1レジスタは16ビット、つまり65535までカウントできます。製作したセンサを動作させてみたところ、人が触れていない時はカウントが10000、触れた時はカウントが8000だとします。この場合、せっかく65535までカウントできるのに、10000以下で、8000〜10000の小さな変化を測定するのは勿体無いですよね。そこで、ホースの太さを太くして満杯になる速度を早めたり、満杯・空の判断基準を調整してカウント数が増えるようにします。すると、人が触れていない時は30000、触れた時は25000、というように、触れたときと触れていないときの数値差が大きくなり、判定がより容易になります。細かい設定ですが、PICマイコンのタッチセンサはこのような設定を行うことも可能です。これを踏まえて、各モジュールの設定について説明します。ピンの設定タッチセンサに使用するピンは、「デジタル」の「入力」に設定します。ANSELAレジスタで該当ピンのビットを0にすることによりデジタルに設定します。TRISAレジスタで該当ピンのビットを1にすることにより入力に設定します。タッチセンサモジュールの設定タッチセンサモジュールは、「CPSCON0」と「CPSCON1」レジスタで設定を行います。Control」(=静電容量センサ制御)の意味です。以下にそれぞれのレジスタについて説明します。CPSCON0レジスタです。このレジスタは8ビットで以下の構成です。PIC12F1822データシートより引用)CPSON0に設定するとセンサ値計測停止、1にすると計測を開始します。このビットを0にして計測停止します。停止後、後ほど説明するタイマー変数にセンサ値が入っています。CPSRMここでは、コンデンサに電気を貯める・空にする際のレベルを設定します。先ほど説明しました、バケツの例では満杯状態、空の状態の検知水位レベルをどうするかの設定を行います。1に設定すると、コンデンサに電荷を満杯にした状態を「満杯」、空の状態を「空」と判定します。0に設定すると、満杯と空の判定基準を別途設定します。(設定の詳細は省略します)この設定は最初に説明した、バケツの満杯・空の判定基準の設定になります。CPSRNGセンサ値を計測する際の電流値を指定します。この設定は最初に説明した、バケツに水を供給するためのホースの太さの設定になります。大CPSOUTこのビットは読み取り専用です。1の時はコンデンサに電荷を貯めるために電流を供給している状態、0の時はコンデンサから電荷を放出している状態を意味します。T0XCSセンサ値をカウントするためにTIMER0レジスタを使用しているときの設定です。今回はTIMER1を使用するため説明は省略させていただきます。次に、CPSCON1レジスタです。このレジスタは8ビットで以下の構成です。PIC12F1822データシートより引用)このレジスタでは、タッチセンサに使用するピンを選択します。CPSCHは4ビットで以下の意味になります。3番ピンタイマー1モジュールの設定ここでは、タイマーモジュールの設定レジスタのうち、タッチセンサに関わるレジスタのみ説明します。Control)レジスタで行います。難しい設定なく、「Timer1をタッチセンサのカウンタとして使用します」という設定だけです。TMR1CSTimer1でカウントする際のソース(元となる信号)を指定します。2ビットで以下の意味です。タッチセンサを使用する場合は、TMR1CSを0b11に指定することになります。実行クロック(システムクロックの4分の一)をソースとするT1CKPS入力信号の分周比を指定します。タッチセンサの場合は特に問題なければ1:1の指定で問題ありません。「分周」という言葉はこのシリーズでは出てきていませんが、簡単に説明すると「元の信号を、何回分を1回として数えるか」という意味です。タッチセンサモジュールからの信号は満杯が1、空が0という信号の繰り返しです。1回の繰り返しを1回と数えるか、2回の繰り返しを1回と数えるか、など、計測値を減らしたいときに使用します。1:1また、タイマーは割込み処理により動作しますので、割込み許可をします。割込み許可は周辺モジュールの割込み許可をする「PEIEレジスタ」と全体の割込み許可をする「GIEレジスタ」の両方を1にします。具体的なプログラム構造タッチセンサの設定に関するレジスタがわかりましたので、最初に説明したプログラム構造をもう少し具体的にすると以下のようになります。実際のプログラムはこの構造に加えて、もう少し色々な処理が入りますので、まずはこの基本構造を頭に入れておきましょう。タッチ検知プログラムのサンプル以上を踏まえて、タッチ検知を行う場合の典型的なプログラム例を以下に示します。プログラム動作としては、PIC12F1822の7番ピンをタッチセンサ接続ピンとして、タッチが検知された場合RA5ピンに接続されているLEDを点灯する、というものです。基本的なプログラム構造としては、単にタッチセンサのカウントを開始、一定時間待ってカウントを停止してカウント値に応じた処理をすればいいですが、実際にプログラムを作る際にはもう少し工夫が必要です。いうのは、タッチセンサのカウント値は、定常時、タッチ時ともに環境によって異なります。同じ場所でも周りの環境によって定常時の数値が異なったり、タッチセンサに触れる人によってタッチ時の数値が異なります。そのため、タッチ判定のやり方として、以下の方法があります。プログラム起動時など、タッチしていない状態でタッチセンサ値を何回か測定し、その平均値を定常時の数値とする(キャリブレーション)次に、キャリブレーションした値の0.9倍の値をタッチした値とするタッチセンサ値を読み取り、タッチ判定を行うこのような動作を実装した基本的なタッチ検知プログラムは以下になります。新規プロジェクトを作成し、新規main.cファイルを作成後、以下のプログラムをコピペしてビルド、現在製作しているタイマー回路に書き込むと動作します。7番ピンにジャンパワイヤなどを接続し、そのワイヤを触ると反応するはずです。