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();
を書き足します。
******

2014年5月28日水曜日

アナログとデジタルのグランドって?

CapSenseの事を書こうと思ったのですが、
どうやっても、アナログのグランドについて触れないと
動作が厳しいので、アナログとデジタルのグランドについて
触れたいと思います。


まずは、グランドって何?というと
簡単に言えば、基準となる「ある電位」のことです。


電池で考えると良いでしょう。
と言う感じ。
0Vと考える、ある電圧」とも言えますね。

さて、グランドには2種類あって
アナログ回路用のグランド (表記だとAGNDもしくはVssa
デジタル回路用のグランド (表記だとDGNDもしくはVssd
があります。

なんで2つあるかと言うと
アナログ回路とデジタル回路、そのもの特徴にあります。

アナログ回路の特徴は、元々ノイズが少ないけど、外部からのノイズに弱い事

デジタル回路の特徴は、ノイズに強いけど、ノイズの素になりやすい事

どちらか一方だけの回路であればそこまで気にする事はないのですが
アナログ回路とデジタル回路をミックスで扱う場合には、グランドを通じて
デジタルからアナログへとノイズが乗ってしまいます。
ノイズが乗ってしまうとアナログの信号は誤った信号になって
正しい信号とは言えなくなってしまいます。

これを避けるため、アナログとデジタルのミックスで扱う部品
アナログデジタル変換器(ADC)やデジタルアナログ変換器(DAC)では
デジタル用とアナログ用のグランドが分かれて存在しています。

アナログのグランドもデジタルのグランドも最終的には
1つのグランドになる訳ですが、そのつなぎ方は

「電源の部分で1つにする」と言うのがセオリー

だそうです。と言うのはもはや、職人芸のレベルの難易度
なので、私はここまでしか書けませんし、判らないです。
ごめんなさい。
少なくとも、

アナログの回路とデジタルの回路では、グランドを必要に応じて分けないといけない。

と言うとこまで押さえられていれば良いと思います。


***mbed系やarduino系がマズイ所***
mbedの一部やarduino系ではアナログのグランドや電源系が
省略されている場合が多くある。これは、アナログを扱う場合ではキツイ。
テキトー工作では平気だけど、いざ正しい数値が重要な時ではどうしようもない。

*今回のブログは自信がありません。
「ここがヘン」っと言う所は書き込んでいただけたらと思います。

2014年5月2日金曜日

CDCUSBUARTを使ってみる。~送信するのみ~

マイコンで得られた情報をパソコンに送る手立てとして
手っ取り早いのは、「シリアル通信(UART)」

Arduino系やmbed系ではパソコンとのシリアル通信に
書き込みと同じUSBポートを使ってUSBシリアル通信をするはずです。

PSoCは書き込みとおなじ所からはUSBシリアル通信ができません。

と言うより

PSoC自体にUSBファンクションのUSBポートがあります。

USBファンクションと言うのは
USBのデバイスとしてPSoCを扱うことです。
PSoC5LPで扱えるのは HID Audio MIDI CDC とこんな感じ。

今回はPSoC5LPCDCクラスのUSBUARTコンポーネットを使って

PSoC5LPから文字を送信して、パソコンで受信してみましょう。

*今回はシリアル通信のソフトをTera Termなどを
インストールしておいてください。

では、PSoC5LPのシリアル通信をさせてみましょう。

まずは、空のプロジェクトを用意します。
(忘れた人はLEDチカチカの準備編へ)

コンポーネットの中のCommunicationsのファイルの中から
USBUART(CDC Interface)ドラックアンドドロップして
回路図の中に入れましょう。



通信の確認が出来るように
HW Connection」のチェックを外した
デジタル出力ピンも用意しましょう。
 (忘れた人はLEDチカチカの後編を。)

用意が出来るとこんな感じ。

***.cydwr のファイルを開いたら
デジタル出力のピンの設定をして置きます。
USBのピンは元々固定されているので設定しなくても構いません。


さて、USBUARTを使うためにはPSoC5LPのクロック」の設定する必要があります。
以前にPWMを動かした時とは違い
PWMで作った時のクロックの根幹としているクロックです。
根幹となるクロックを操作することによって
PSoC5LPCPUを低速にも高速にもすることが出来るようになります。

通常、根幹となるクロックの設定はかなりの呪文のような文を
書くのですがPSoC5LPではクリックだけで設定ができます。

ピン設定をしていた画面の下側にあるClocksのタブをクリックしましょう。
そうするとこんな感じ画面が出るはずです。



赤で囲った「Edit Clock」と言うのをクリックしましょう。

クリックするとこんな画面が出てきます。

カラフルな四角形に線と下に向かって矢印がありますね。
これがPSoC5LPのクロックエディタです。
根幹となるクロックを数倍に増幅したり、分割したりすることによって
適切な部分に適切なクロックを供給しています。

IMOが根幹となるクロック 3.0MHzが一番高精度
ILOが低速クロック(ただし、精度が低い) スリープモード等で使う
PLLは根幹となるクロックを数倍に増幅させる部分
Master Clockはデジタル系で使われるクロックを作る部分
Bus ClockCPUに供給する用のクロックを作る部分です。

これを次のように設定します。


クロックの精度が4%で平気か?と思う人もいるかと思いますが

UART系を使う場合にだけ高精度の24MHzにきり替わる事が出来るので、大丈夫です。

設定が出来たら「OK」をクリックして、1度目のコンパイルをしましょう。


さて、ここまで来たらプログラミングですね。
main.c」のファイルを開きましょう。

Int main()の中身は

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
       CyGlobalIntEnable;
       USBUART_1_Start(0, USBUART_1_3V_OPERATION);//3.3Vで動かす
       //USBUART_1_Start(0, USBUART_1_5V_OPERATION);//5.0V
      
       while(!USBUART_1_GetConfiguration());// USBUARTの設定が出来るまで待つ
       USBUART_1_CDC_Init();//CDCUSBUARTをスタートさせる

    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
        while(USBUART_1_CDCIsReady()==0u){};//通信の準備が出来るまで待つ
              USBUART_1_PutString("Hello from PSoC5LP");//文字を送信する。
              Pin_1_Write(1);
              CyDelay(250);
       
              while(USBUART_1_CDCIsReady() == 0u){};//通信の準備が出来るまで待つ
              USBUART_1_PutCRLF();//改行コード+行頭復帰を送信する
              Pin_1_Write(0);
              CyDelay(250);
    }
}

です。長いのでコピーして貼り付けましょう。

プログラムを書いたら、もう一度コンパイル。

プログラムを書き込んだら、USBケーブルをPSoC5LPから外します。

新しいデバイスを使う場合「ドライバファイル」が必要になります。
ドライバーのファイルの場所は
PSoCのファイルを保存しているところ(ドキュメント)⇒
PSoC Creator⇒「今回のファイル名」⇒Generated_SourcePSoC5
の中の

USBUART_1_cdc.inf がドライバーファイルです。

コンポーネットの設定を変えない限りはこのドライバーファイルを使うことができます。
このドライバーファイルを
Cドライブに「PSoC」と言う新しいフォルダを作ってそこに入れておきます。

入れたら、PSoC5LPの書き込み用ではない方のUSBポートにつなぎます。


ドライバーのインストール方法とWin8の署名なしドライバーの許可方法は
スイッチサイエンスのブログを参考にするのが良いでしょう。
デバイスドライバーの場所を指定するときに「C\PSoC」にすればいいです。


さて、Tera Termを起動させると
こんな感じとなります。


OK」をクリックすると

こんな感じとなります。

PSoC5LPでの受信は気が向けば書こうかなと思います。
*ボーレートの設定は自動で調整されます。