容量検知(CPS)モジュールをテストしてみます

〔CTMU〕 〔PICの動かせ方入門に戻る〕


PICに内蔵されている機能で容量検知モジュール(CPS:Capacitive Sensing)が有りこれをテストします。

マイクロチップでは、静電容量の変化を原理とする接触感知ソリューションをmTouchと読んでいる様です

PICで行われている静電容量を検出する方法は、
電圧の変化を検出する充電時間計測ユニット(CTMU)や静電容量式分圧器(CVD)等の方法と
今回このページで紹介する周波数を使用して変化をカウントする静電容量式センシングモジュール(CSM)の三つの方式が有ります。
これらは、PICにパッド(電極)を接続するだけでそのパッドに触れればONとするスイッチの様な
タッチセンサーを構築出来る機能です。

尚、PIC18F25K22のCTMUを使ったタッチセンシングの記事はこちらを参照下さい。  *2)

下の図を見て下さい、これはマイクロチップのデータシートからの拝借ですが、

タッチセンサー概要図

上図の左側絵の様にパッド(電極)には自然の寄生容量コンデンサー(Cp)が存在しています。
で、人にもコンデンサー(Cf)が存在していて中央絵の様に指で触れると、右側絵の様にコンデンサーが
並列接続の状態となり静電容量が増える事になります、この変化を容量検知モジュールで検出しようと言う事です。

どうやって検出するのぉ?

コンデンサーは電気を蓄えますよね、容量が大きければその分電気を沢山蓄えるので充電時間が余計かかると言う事を頭の隅に置いといて下さい。
まず、容量検知モジュールがパッド(電極)に対して充電と放電を繰り返します。
するとぉ、この下図の様にある一定の電圧(V1)まで充電と放電を繰り返すと三角波形が発生します。

三角波形図

そして次に、指で触れた場合の時は容量が大きくなるので充電・放電の時間が長くなり三角波形の周波数が変化します。

この周波数をPIC内蔵のタイマーで、ある一定時間(t)だけカウントすればよい事になります。
例えば5msの間カウントしたら800有り、指で触れた時はカウント数が600になります、
もちろん5msの時間は自由に決定すれば良く当然長くカウントした方が数値は大きくなり変化検出精度は上がりますが タッチした時の反応速度は鈍るかもね。
タイマーは、PICの Timer0 または Timer1 または Timer0 + Timer1 の組合わせが選択でき、
ここの紹介では Timer1 のみでカウントしています、PIC16F72x系は Timer2 も利用出来る様ですね。

《実験1》

まずは、容量検知モジュールの基本的な動作を調べて見ましょう。
ピンの構成図
 左図がPIC12F1822のピン構成図です。
 センサパッド(電極)はCPS0〜CPS3の端子に接続可能で
 最大4つまでOKで、16F1823は8つ、16F1827は12本。

実験1では、CPS2に電極を繋ぎ、カウント値をRA5端子から別途作成のLCDモニターに出力しています。

実験2では、CPS0とCPS1に電極を繋ぎ、CPS0に指を触れたらRA2接続のLEDを点灯させ、
CPS1に指を触れたらRA4接続のLEDを点灯させる事にします。

実験写真 左写真が実験1の風景です。

電極はCPS2に18cm程のリードジャンプワイヤーを配線しているだけです。
後は、RA5端子から別途作成のLCDモニターに接続されているだけのシンプルな回路です。

この回路でCPS2端子に色々な電極を接続して表示されるカウント値を調べて見ましょう。
電極が大きくなれば寄生容量コンデンサーの容量も大きくなるのでカウント値は少なくなっていきます。
下記の様な電極も作ってみました。
  タッチセンサー概要図

青いアクリル板は0.5mmの厚さがあり、これに横20mm x 縦20mm x 厚0.3mm の銅板を両面テープで貼付けて長さ22cmのリード線を配線しています。

@では、上の実験1風景写真の様に配線しましょう。
 (モニター表示は他の方法で行っているならその様に行っても構いません。)

AMPLAB X(v2.15)を起動させます。

B下記がPIC12F1822を使ったプログラムソースです、
 (16F1823もこのままプログラムは利用出来ます)
  MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
  プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
  プログラムソースをダウンロードしてプロジェクトに取込む事も出来ます。 *4)
---------------------------------------------------------------------
#include <xc.h>
#include <stdlib.h>
#include "skMonitorLCD.h"          // LCDモニター用

#define _XTAL_FREQ 8000000         // delay用に必要(クロック8MHzを指定)

// コンフィギュレーション1の設定
#pragma config FOSC     = INTOSC   // 内部クロック使用する(INTOSC)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config CPD      = OFF      // データメモリーを保護しない(OFF)
#pragma config BOREN    = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO     = OFF      // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN    = OFF      // 外部クロック監視しない(OFF)

// コンフィギュレーション2の設定
#pragma config WRT    = OFF        // Flashメモリーを保護しない(OFF)
#pragma config PLLEN  = OFF        // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON         // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV   = HI         // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP    = OFF        // 低電圧プログラミング機能使用しない(OFF)

// メインの処理
void main()
{
     char s[8] ;
     unsigned int cap ;

     OSCCON  = 0b01110010 ; // 内部クロックは8MHzとする
     ANSELA  = 0b00000100 ; // アナログはAN2を使用し、残りをすべてデジタルI/Oに割当
     TRISA   = 0b00000100 ; // AN2(RA2/CPS2)だけ入力その他のピンは出力に割当てる(RA3は入力専用)
     PORTA   = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
     // 容量検知モジュール(CPSM)の設定
     CPSCON0 = 0b00001000 ; // オシレータは中範囲(中速の発信周波数)で利用する
     CPSCON1 = 0b00000010 ; // CPS2から入力する
     // タイマー1の設定
     T1CON   = 0b11000001 ; // 容量検知オシレータでTIMER1をカウントする、プリスケーラカウント値 1:1
     TMR1H   = 0 ;          // タイマー1の初期化
     TMR1L   = 0 ;
     PEIE    = 1 ;          // 周辺装置割り込みを許可する
     GIE     = 1 ;          // 全割り込み処理を許可する 

     CPSON   = 1 ;          // 容量検知モジュール開始
     MonitorInit() ;        // LCDモニターに送信出来る様に初期化する

     while(1) {
          // 容量検知モジュールの値を読み込む
          CPSON = 0 ;                 // 容量検知モジュール停止
          cap = (TMR1H*256) + TMR1L ; // カウント値を読み込む
          TMR1H = 0 ;                 // タイマー1の初期化
          TMR1L = 0 ;
          CPSON = 1 ;                 // 容量検知モジュール開始
          // 読んだ値をLCDモニターに表示する
          utoa(s,cap,10) ;            // カウント値を文字列に変換する
          MonitorPutc(0x11) ;         // モニターの表示位置を設定する
          MonitorPuts("      ") ;     // 表示を消す
          MonitorPutc(0x11) ;         // モニターの表示位置を設定する
          MonitorPuts(s) ;            // 表示する
          // 400ms後に繰り返す
          __delay_ms(400) ;
     }
}
---------------------------------------------------------------------
 このプログラムにはデバッグモニタープログラム「skMonitorLCD.c」「skMonitorLCD.h」が必要です。
 デバッグLCDモニターについてはこちらを参照して下さい。
 「skMonitorLCD.c」は送信データをTimer2のタイミングで送る様に変更しました、
 その為に上記プログラムを変更しています。
 *3)

 また、LCDモニターの出力はRA5から行っているので「skMonitorLCD.h」を下記の様に変更します。
  #define _XTAL_FREQ 8000000  // 使用するPIC等により動作周波数値を設定する
  #define MONITOR_PIN RA5   // モニタ出力するピンの番号を設定する

CコンパイルPIC書き込みを実行して下さい。

DPICをブレッドボードに取付けて動作させます。

 カウンター値を見てみると、
電極 触れていない時 触れた時 0.5mmの青アクリル裏
から触れた時
リードジャンプワイヤー 62720〜62445位 39620〜39430位
20mm x 20mm x 0.3mm の銅板 57995〜57675位 38830〜38745位 49100〜49045位
 銅板の場合で、直接銅板に触れた時よりも、裏からふれた場合はカウント値が多いと言う事に注意
 ですね。それと、アクリル板が厚くなればとうぜんカウンター値は多くなって行きますよ。
 それに、カウンター値はノイズが有るので300カウント位はふれます。

 また、上記で”ある一定時間(t)だけカウントすればよい”と書いていますね、
 このサンプルプログラムでは400msで繰り返しているので約400msの間カウントする事になります。
 もし、カウント値が63100や2500や56000や4300などの様に妙に上下している場合は、
 Timer1 のカウント値がオーバフローしています、オシレータモード(下記)を低く設定しましょう。
 (TMR1H/TMR1Lレジスター使用で16ビット65535までしかカウント出来ません)
 または、カウントする時間(t)を短くしましょう。

 ためしに、銅板電極の上にガラス瓶(のり等入っている瓶)を乗せてカウンター値を見てみました、
 で、水を半分入れて見たらカウンター値の差が約450程下がり、水を満杯までいれたら約600程まで
 下がり、満杯水に指を入れたら更に2300位まで下がって行きました。
 水の中に電極を入れたら変化はもう少し大きいので上手く工夫を行えば水位センサー出来るかもね。

容量検知モジュールの設定について

容量検知モジュールの設定はCPSCON0とCPSCON1のレジスターで行います。

CPSCON0レジスタの構成
ビット
機能 CPSON CPSRM CPSRNG CPSOUT T0XCS

Bit 7    :CPSON    容量検知モジュール イネーブル ビット
                               1=モジュールの動作を開始させます
                               0=モジュールの動作を停止させます

Bit 6    :CPSRM    容量検知オシレータの範囲ビットのレンジを選択するビット
                           16F1827/16F1938にはこのビットは有りません。(Lowレンジのみ)
                           Highも有った方がカウント値を上げられるので良いと思うのだがぁ....
                           ただし、Highレベルにするには、PIC内部の固定電圧リファレンス(FVR)と
                           デジタルアナログ変換(DAC)を起動させ容量検知モジュールの電圧リファレンス
                           としないとだめです。(今回はめんっどいのでぇこの実験はパスしています)

Bit 2-3:CPSRNG  容量検知オシレータの範囲ビット
CPSRM レンジ CPSRNG オシレータモード 公称充電電流
0 Low 00 オフ 0.0μA
01 低範囲(Low) 0.1μA
10 中範囲(Medium) 1.2μA
11 高範囲(High) 18μA
1 High 00 ノイズ検出用 0.0μA
01 低範囲(Low) 9μA
10 中範囲(Medium) 30μA
11 高範囲(High) 100μA
                          充電電流が増えると言う事はそれだけ早く充電が完了するのでカウント値は
                          増える事になります、例えば中範囲で10000なら高範囲では20000とかになります。

Bit  1  :CPSOUT  容量検知オシレータのステータス ビット(読み出しのみ)
                               1=オシレータはソース電流 (ピンから出力する電流:充電)
                               0=オシレータはシンク電流 (ピンに吸い込む電流:放電)

Bit  0  :T0XCS     Timer0使用時の外部クロック ソースの選択ビット
                          OPTION レジスタのTMR0CS = 0 の場合
                               このビットは無視で、Timer0 クロック ソースは、FOSC/4で制御されます。
                          OPTION レジスタのTMR0CS = 1 の場合
                               1=Timer0 のクロック ソースは容量検知オシレータで動作
                               0=Timer0 のクロック ソースは T0CKI ピンで動作

CPSCON1レジスタの構成
このレジスターで接続した電極のチャンネル選択切り替えを行います。
CPSCON1 チャンネル 端子番号
00000000 チャンネル0、CPS0 7(RA0)
00000001 チャンネル1、CPS1 6(RA1)
00000010 チャンネル2、CPS2 5(RA2)
00000011 チャンネル3、CPS3 3(RA4)
※ 12F1823ならチャンネル7まで有ります。

電極を接続するピン(CPS0〜CPS3)について

・電極を接続するピンはANSELAレジスターでアナログ入力に設定しないとだめです。
・TRISAレジスターでピンを入力に設定します。

アナログI/O
 アナログピンの設定は下記のレジスターにて設定します。
 ANSELA = 0b00000100 ; アナログ入力を行うピンの指定をします
            赤数字右からCPS0(7ピン),CPS1(6ピン),CPS2(5ピン),CPS3(3ピン)の順
            1でアナログ、0でデジタル、この設定例はCPS2をアナログで使用するです

 指定したCPS2のアナログピンを入力に指定するには下記のレジスターにて設定します
 TRISA = 0b00000100 ; この設定はCPS2のみ入力に設定するです。
               1で入力、0で出力、右からCPS0,CPS1,CPS2,x,CPS3

タイマー1の設定について

今回はタイマー1を利用してカウントを行います、
タイマー1はカウントした結果をTMR1H/TMR1Lレジスターに格納します。

T1CONレジスターの設定
 T1CON = 0b11000001 ;
 青数字部分でTimer1のクロックソースを選択します。
  00 = Fosc/4  01 = Fosc  10 = 外部入力  11 = 内蔵の容量検知オシレータ (CAPOSC)
 緑数字部分でプリスケーラの設定を行います。
  00 = 1:1  01 = 1:2  10 = 1:4  11 = 1:8
  プリスケーラは1:1で使用してください。(その他はカウント値が少なくなります)
 赤数字部分 1=TIMER1を動作させる 0=TIMER1を動作させない

調整について

接続するセンサパッド(電極)により調整する箇所は、
CPSRNGのオシレータモードとカウンター値をカウントさせる時間(t)の2ヶ所です。
カウント値は出来るだけ大きい数字が出る様に調整しましょう、
でないと触れた時と触れない時の値に差がなくなり判断が付かなくなるでしょう。
電極に触れた時の応答性に問題なければカウント値を数回読み込んで平均をとれば少しはノイズ対策になるかもね?。

《実験2》

実験2の配線図
 この左図の電極1に触れればLED1が
 点灯し、電極2に触れればLED2が
 点灯する回路です。

 電極は上写真で紹介の銅板を使用し、
 端子はCPS0/CPS1に接続しています。

 LEDは足の短い方をGND側に接続して
 下さい。
 LEDの電流制限抵抗の話はこちら
 参考にして下さい。

では、上の様に配線したら下記のサンプルプログラムを動かして見て下さい。
実験2のサンプルプログラムはこちらからダウンロードして下さい。
---------------------------------------------------------------------
#include <xc.h>

#define _XTAL_FREQ  8000000        // delay用に必要(クロック8MHzを指定)
#define ROBE_NUMBER 2              // 接続している電極の個数を指定

unsigned int CPS_data[2][ROBE_NUMBER] ; // 容量検知用データ

// コンフィギュレーション1の設定
#pragma config FOSC     = INTOSC   // 内部クロック使用する(INTOSC)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config CPD      = OFF      // データメモリーを保護しない(OFF)
#pragma config BOREN    = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO     = OFF      // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN    = OFF      // 外部クロック監視しない(OFF)

// コンフィギュレーション2の設定
#pragma config WRT    = OFF        // Flashメモリーを保護しない(OFF)
#pragma config PLLEN  = OFF        // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON         // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV   = HI         // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP    = OFF        // 低電圧プログラミング機能使用しない(OFF)

// 容量検知モジュールの初期値を読み込む処理
void CPS_Init()
{
     int i ;

     // 接続している電極の分だけ繰り返す
     for (i=0 ; i<ROBE_NUMBER ; i++) {
          CPSCON1 = i ;          // 読み込むチャンネルを設定する
          TMR1H   = 0 ;          // タイマー1の初期化
          TMR1L   = 0 ;
          CPSON   = 1 ;          // 容量検知モジュール開始
          __delay_us(5000) ;     // 5msの間タイマー1をカウントさせる
          // 容量検知モジュールの値を読み込む
          CPSON = 0 ;            // 容量検知モジュール停止
          CPS_data[0][i] = (TMR1H*256) + TMR1L ;
          CPS_data[1][i] = 0 ;
     }
}
// 容量検知モジュールに接続されている電極の現在値を読み込む処理
void CPS_ScanRobe()
{
     unsigned int cap ;
     int i ;

     // 接続している電極の分だけ繰り返す
     for (i=0 ; i<ROBE_NUMBER ; i++) {
          CPSCON1 = i ;          // 読み込むチャンネルを設定する
          TMR1H   = 0 ;          // タイマー1の初期化
          TMR1L   = 0 ;
          CPSON   = 1 ;          // 容量検知モジュール開始
          __delay_us(5000) ;     // 5msの間タイマー1をカウントさせる
          // 容量検知モジュールの値を読み込む
          CPSON = 0 ;            // 容量検知モジュール停止
          cap = (TMR1H*256) + TMR1L ;
          if (cap <= (CPS_data[0][i]*0.9)) {
               CPS_data[1][i] = cap ;  // ONとする
          } else {
               CPS_data[1][i] = 0 ;    // OFFとする
               CPS_data[0][i] = cap ;
          }
     }
}
// 容量検知モジュールに接続されている電極の状態を調べる処理
//   num : 調べる電極の番号を指定する
int CPS_StateRobe(int num)
{
     if (num > ROBE_NUMBER)       return( -1 ) ; // 数値指定エラー
     if (CPS_data[1][num-1] == 0) return( 0 ) ;  // 電極に触れていない
     else                         return( 1 ) ;  // 電極に触れている
}
// メインの処理
void main()
{
     OSCCON  = 0b01110010 ; // 内部クロックは8MHzとする
     ANSELA  = 0b00000011 ; // アナログはAN0/AN1を使用し、残りAN2/AN3はデジタルI/Oに割当
     TRISA   = 0b00000011 ; // ピンRA0(AN0)/RA1(AN1)を入力、残りは出力に割当てる(RA3は入力専用)
     PORTA   = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
     // 容量検知モジュール(CPSM)の設定
     CPSCON0 = 0b00001100 ; // オシレータは高範囲(高速の発信周波数)で利用する
     // タイマー1の設定
     T1CON   = 0b11000001 ; // 容量検知オシレータでTIMER1をカウントする、プリスケーラカウント値 1:1
     TMR1H   = 0 ;          // タイマー1の初期化
     TMR1L   = 0 ;
     PEIE    = 1 ;          // 周辺装置割り込みを許可する
     GIE     = 1 ;          // 全割り込み処理を許可する 

     // 容量検知モジュールの初期値を読み込む
     CPS_Init() ;

     while(1) {
          // 容量検知モジュールの現在値を読み込む
          CPS_ScanRobe() ;
          // 電極1(CPS0)の状態でLED1を点灯させる処理
          if (CPS_StateRobe(1) == 1) RA2 = 1 ; // LED1を点灯
          else                       RA2 = 0 ; // LED1を消灯
          // 電極2(CPS1)の状態でLED2を点灯させる処理
          if (CPS_StateRobe(2) == 1) RA4 = 1 ; // LED2を点灯
          else                       RA4 = 0 ; // LED2を消灯
     }
}
---------------------------------------------------------------------
プログラムについて

電極
 電極をCPS0とCPS1に2個接続しています、なので下記の様に宣言されています。
  #define ROBE_NUMBER 2         // 接続している電極の個数を指定
 例えば、3個にする場合は3と指定して、CPS2端子を利用します、次の続いているチャンネルを使い
 ます、CPS0とCPS1とCPS3とか飛ばさないでね、利用する個数分CPS0から順番に使って下さい。
 (カウント値を読み込むプログラムが順番に読む様に作られているからで〜す)

カウンター値
 カウントは一つの電極あたり5msの時間(t)だけカウントしています、カウンター値を増やす場合は
 時間(t)を長くして下さい、その分接触の感度は鈍りますけどね。
 それが嫌な場合は、CPSRM=1 にして公称充電電流を増やすって手ぇもぉ有かもね

 下表に上写真で紹介の銅板電極で行ったカウンター値の結果を示します。(CPSRM=0 CPSRNG=11)
検知状態 触れていない時 触れた時 0.5mmの青アクリル裏
から触れた時
5msの間カウントした場合 2040〜2030位 1450〜1440位 1721〜1719位
10msの間カウントした場合 4070〜4038位 2992〜2987位 忘れた
 ちなみにぃCPSRNG=10で5ms間の場合、触れていない時で550〜534位でした。

CPS_Init( )
  容量検知モジュールの初期値を読み込む処理です。
  PICの電源ON時に1回だけ実行します、接続している電極の初期カウント値を読み込みます。

CPS_ScanRobe( )
  容量検知モジュールに接続されている全ての電極の現在値を読み込む処理です。
  この処理を実行すると電極の現在カウント値が読み込まれ前回値と比較して、今回値が前回値
  の90%より低かったら電極に触れたと判断します。
  なのでこの関数は常に実行させる必要が有ります。
      while(1) {
           CPS_ScanRobe() ;

      }
  とこんな感じですね。
  または、タイマー0が余っているならタイマー0をインターバル間欠タイマーとして割り込みを発生
  させ割り込み処理の中でこの関数を実行させた方が良いかもね。(未実験)
      void interrupt InterTimer( void )
      {
           if (TMR0IF == 1) {           // タイマー0の割込み発生か?
                TMR0 = ???? ;           // タイマー0の初期化
                CPS_ScanRobe() ;
                TMR0IF = 0 ;            // タイマー0割込フラグをリセット
           }
      }
  とこんな感じですね。
  インターバルは電極1個で5msなら2個で約10msとしたら11ms毎位の割り込み発生か?....
  或いは、タイマー0のオーバフローでタイマー1のゲートを制御すればOKでしょう。

  このプログラムの設定で、銅板の裏(アクリル板厚0.5mm)からタッチして見ましたが、
  LEDが点灯したり点かなかったりでぇ反応が今一つだったので、
  ”90%より低かったら電極に触れたと判断”をぎりぎりの97%にして見ました、
  その結果良好に反応しましたが、この閾値を上げすぎるとノイズなどでカウント値が
  ふらついているので触れた時の判断が出来なくなって行きますよ、念の為。
  尚、この閾値を変更する場合は、この関数中に
          if (cap <= (CPS_data[0][i]*0.9)) {
  の行が有りますこれを97%にするなら0.9から0.97と変更して下さい。

ans = CPS_StateRobe(int num)
  容量検知モジュールに接続されている電極の状態を調べる処理です。
  num      : 調べる電極の番号を指定する
  ans       : 1=触れている 0=触れていない −1=電極の番号を指定エラー

《その他》

実験2の風景
左写真は実験2の風景です。

写真ではカウント値を表示さる為にLCDモニター
が繋がっています。

今回はアクリル0.5mmでのタッチしか行っていないので、 他の厚さや他の素材(ガラス等)ではどうなのかが不明です、
またこの時電極の大きさがどう関係するのかや不明です、
なのでぇ、みなさんがんばって実験をしましょう。

今後、電極をタッチだけでなく、フリップ・ドラッグ等の 操作が出来る様な事を考えたいなぁっとぉ。
その際は、マイクロチップの
AN1334:堅牢なタッチセンシングの設計手法”
AN1104:容量性マルチボタンの構成”
AN1334AN1102:容量検知におけるレイアウトおよび物理的設計ガイド”
AN1250”内の電極の話辺りを参考にすれば良さげぇですね。

スイッチサイエンスでは静電容量タッチセンサIC(MPR121)を利用した こちらこちらの製品を販売しています。
電極→IC−(I2C)→マイコンで接続出来ます、なので容量検知モジュール無くてもOKですね。

共立エレショップのこちらもタッチセンサIC(AD7148A) でI2C接続です。 *5)

こんなん半田付け無理やん、って人はぁ、メトロ電気で販売のこちらをどうぞ
電極は1個か2個までの接続ですがぁデジタルに入力出来ます、でもぉ
ちょっと値段高いかなぁ......ぶつ、ぶっう。

こちらに”スライドスイッチ機能付感圧センサ(FSLP)を使ってみる”の記事も有ります。 *1)



リンク切れ見直し(*5) 2017/01/11
MPLAB X用に記事変更(*4) 2015/10/14
"skMonitorLCD.c"変更により"実験1"のプログラム変更(*3) 2014/02/01
追記(*2) 2013/06/03
追記(*1) 2013/02/12


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.