2014年6月2日月曜日

Capsenseを使おう。~原理はスマホの画面と同じ~

今回はPSoC5LPのアナログ回路を大活用したいと思います。

CapSenseというのは、

人間が触ったり、近づいたりすることを
検出できる専用センサー

arduinoやmbedではライブラリーとして存在しています。

が、

PSoCでは、専用のハードウェアとエディターを持っているので
高機能なのに、簡単に使うことができます。

まずは、どんなことが出来るかと言うと

ボタン
スライダー
ラジアル(円型スライダー)
接近(3次元ということ)
タッチパッド 等とかなり豊富

難しいことはありません。
相変わらず、マウスでくるくるでOK。

さて、今回は「ボタン」を試してみます。
今回は、PSoC5LPの他に、2200pFのコンデンサと2.2KΩの抵抗を用意します。

今までと同じように、コンポーネットの中からCapSenseの中の
CapSense_CSDをドラックアンドドロップします。

ボタンを押した時に、LEDが光るようにしたいので、
Digital Output Pinを「HW Connection」のチェックを外した
状態にして置きます。
だいたい、こんな感じ。

そうしたら、CapSense_CSDをダブルクリックして設定を開きましょう。
開いた直後はこんな感じ。

「General」タブではお手軽モードを使うかについてだったり
CapSenseの設定を引き継げたりします。
「Tuning method」はお手軽モードを使うかどうかについてです。
今の「Auto(SmartSense)」はお手軽モード
このお手軽モードは、miniProg3と言って純正の書き込み機が必要になります。

しかし、miniProg3がなくとも問題はないです。
プルダウンメニューを「Auto」から「None」にします。

これで、miniprog3が無くても大丈夫です。

さて、「Wigdgets Config」タブを開くと
こんな感じ。


このタブでボタンを使うのか、ラインを使うのか、を設定できます。

たとえば、ボタン3つと、ライン1つと言う設定もできます。
「Buttons」のファイルをクリックして
「Add Button」を選びます。
そうするとこんな画面になります。

右側に「Tuning」と言う新しい画面が出ましたね。
この設定はCapSenseが検出したセンサーの値について設定を決めます。

指が触れたときの判断値「Finger Threshold」
ノイズの時の数値「Noise Threshold」
ON,OFFの判断数値の幅「Hysteresis」
(Finger Threshold + Hysteresis  OFFON,
Finger Threshold Hysteresis  ONOFF)
チャタリングの回数「Debounce」
スキャンの分解能「Scan Resolution」
を設定できます。

さて、次の「Scan Orler」タブを開いてみましょう。

これは何のエディターかと言うと、
「パッドのトータルスキャン時間について」です。
CapSenseは2チャンネル使うことができます。
また、パッド数が増えたりすれば処理が間に合わない場合もあります。
その時間算出用のエディターです。

次の「Advanced」タブを開いてみましょう。

ここではCapSense自体のタイプを選んだり、スキャンスピードの変更したり
かなり詳細な設定ができます。
今回設定を変えるのは「IDAC settings」「Current Source」
の所のプルダウンメニューから「External Resistor」にします。



この設定変更では、PSoC5LPの個体差に依らず
シビアな設計にも耐えられるモードですがお手軽モードでは使えません。

次の「Tuner Helper」タブはminiprog3のI2C通信を使った
お手軽モードを使うかどうかについてです。

今回は紹介だけで、省略します。

ここまで来たら、「OK」ボタンを押して閉じましょう。

次にピンの設定をします。
左側の「***.cydwr」を開きます

慣れない「Alias」の行があって、列の名前が
Cmod_CH0
Button0_BTN
「Rb0_CH0」
がありますね。これは、CapSenseで使っている名前です。
Cmod_CH0はコンデンサRb0_CH0は抵抗つなぎます
つなぎ方としてはこのようになります。

Cmod_CH0」と「Rb0_CH0」は同じポートの方が良いです。
「Button0_BTN」は実際に指が触る用線になります。
指が触る側のポートはなんでも平気ですが、なるべくなら
コンデンサと抵抗をつないだポート番号
ボタンで使うポート番号偶奇が同じだと、よりよいです。
使うピンを決めたら、ここで一度「コンパイル」しておきます。

今回はPSoC5LPのアナログ機能を使ったので
アナログ入出力をどういうラインを選んだのか確認しておきましょう。
「Pins」タブのとなりの「Analog」タブを開いてみましょう。


ここには、PSoC5LPのアナログ機能を

どのラインを使って、入出力するか

自動的に選択されます。

ピンの選び方によってえらばれるラインも異なります
アナログ機能を沢山詰め込みたい場合には
ここを見ながら、ピンを選ぶのも良いですし
ピンをとっかえひっかえ選んで見るのも良いです。

コンパイルが終わったら、左側にある「main.c」を開きます。
Int main()の中には

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    CyGlobalIntEnable;
    CapSense_1_Start();//CapScanON
    CapSense_1_InitializeAllBaselines();//静電容量の初期化
    CapSense_1_ScanEnabledWidgets();//一度すべてスキャン
   
    Opamp_1_Start();//オペアンプを使えるようにする。Vssaがある場合使わない。
   
   
    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
    CapSense_1_UpdateEnabledBaselines();//センサーの最低値を更新
    CapSense_1_ScanEnabledWidgets();//センサーをスキャンする
    while(CapSense_1_IsBusy() != 0);//センサーのスキャンが完了するまで待つ
    if(CapSense_1_CheckIsWidgetActive(CapSense_1_BUTTON0__BTN)){//センサーが指で押された and ボタン0が押された
        Pin_1_Write(1);
    }
    else{
        Pin_1_Write(0);
    }
   
    }
}
と書きます。

書けたら、もう一度コンパイルしましょう。

出来たら、プログラムをPSoC5LPに書きましょう。

どうでしょうか?接続したジャンプワイヤの片方を
触ったら光りましたか?

今回のコツとしては
必ず、配線の時にVssaを使うという所です。
使っていれば、基本的にはCapSenseのチューニングの値を
調整する必要はないはずです。

CapSenseのチューニングを変えたり、指が触る部分をグランドで囲むことによって
プラスチックやガラス越しでも使うことができます。
日本語マニュアルがあるので、よく読むと良いでしょう。

基板のパターンが作れない人には
導電インク(コンダクティブペン)や
アルミテープ(導電するもの)を
使うと、悩まずに楽しみながら作れます。
導電インクは乾かないと導電しないこともあるので
早く乾くように薄く使うが良いです。


******
Vssa(AGND)がボードの外に出ていない場合

PSoC5LPのオペアンプ電圧リファレンスコンポーネットを使って
Vssaを強制的に外に出します。

「TopDesign.cysch」を再度開いて
オペアンプと電圧リファレンスのコンポーネットを
ドラックアンドドロップします。

オペアンプの設定画面を開いて、

「Mode」のプルダウンメニューから「Follower」にします。

画面の「OK」をクリックしたら
今度は「Vref」のコンポーネットを開きます。

開いたら、「Vref Name」のプルダウンメニューから
「Vssa(GND)」を選びます。

選んだら「OK」をクリックして閉じます。

Vout_1」のピンをマウスでプレスして少しずらし、
オペアンプと接続している線選択して、キーボードのデリートキーで消します
消して移動させた後がこんな感じ。

ここまで来たらこの様に接続します。

接続が終わったら、Vout_1のピン設定をします。

この場合では、オペアンプの入出力も出来る
「ポート0番の[2],[4]
もしくは、
「ポート3番の[3],[5]」を使います。
抵抗とコンデンサを接続するポート
偶数の場合はポート0番系
奇数の場合はポート3番系
を使うと良いでしょう。

もし、Vout_1のピンの決め方が判らない場合には
何も選択せずにコンパイルすると、
エラーで「Vout_1はここにしてほしいんだけど」
みたいなメッセージが出るので、それを見るのも良いでしょう。

一度、コンパイルが終わったら
Int main()には、

Opamp_1_Start();
を書き足します。
******

2 件のコメント:

  1. 「このお手軽モードは、miniProg3と言って純正の書き込み機が必要になります。」と、書いてあるのですが、何か制約になりましたっけ?フラッシュの容量を圧迫するほかに思いつかないのですが?

    返信削除
    返信
    1. なぜ、miniprog3を使う必要があるか?という事ですね。

      CapsenseにはI2Cを反して、ボタン等のチューニングが出来るようになります。
      ただ、PSoC Creatorで通信できるI2C通信機がminiprog3位しかないんです。
      設定が終わったら、「None」にはするんです。

      削除