PSoC CapSenseで静電容量タッチセンサ 4つ動かした
前の記事の回路などが思いきり間違っていたので修正しつつ、CapSenseとLED4つずつに増やした。
多分、マイコンの足の数だ増やせる。
例によってコードはBitbucketにアップした
CapSense CSDウィザードで4つスイッチを置いて
AnalogMUXBusに接続されている事を確認
CSDの設定。しきい値などをかなり何度も直した。適当にやってたので理論をわかってないんだけど、どうやらセンサ部分の形状や配置に応じて微調整しなければ使い物にならないっぽい。
ピンの設定。LEDが4つにした。
使ってないピンをPull Upにしておくとノイズが来ないので安定する事に気づいた。
実体配置図
前の記事の回路が間違っていて、あのままではうまく動かなかったが、1kΩの抵抗と0.1μFのキャパシタを足したら複数認識できるようになった。
CapSense CSDのデータシートにあった図。抵抗とキャパシタが必要らしい
P1[5]とP0[3]の間に1kΩを入れて、P0[3]からキャパシタを通して銅箔テープに延ばす。
前の記事はP1[5]とP0[3]で静電容量取ろうとしてたので、思いっきり間違ってた。
プログラム。
前のやつのif(CSD_1_bIsSensorActive(センサ番号))を増やしただけ。
shokai / CapSense LED / source — bitbucket.org
main.c
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))
#define LED_0_ON() sbi(PRT1DR, 7);
#define LED_0_OFF() cbi(PRT1DR, 7);
#define LED_1_ON() sbi(PRT0DR, 1);
#define LED_1_OFF() cbi(PRT0DR, 1);
#define LED_2_ON() sbi(PRT0DR, 5);
#define LED_2_OFF() cbi(PRT0DR, 5);
#define LED_3_ON() sbi(PRT0DR, 7);
#define LED_3_OFF() cbi(PRT0DR, 7);
void main()
{
M8C_EnableGInt;
CSD_1_Start();
CSD_1_InitializeBaselines();
CSD_1_SetDefaultFingerThresholds();
while(1){
CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
if(CSD_1_bIsSensorActive(0)){
LED_0_ON();
}
else{
LED_0_OFF();
}
if(CSD_1_bIsSensorActive(1)){
LED_1_ON();
}
else{
LED_1_OFF();
}
if(CSD_1_bIsSensorActive(2)){
LED_2_ON();
}
else{
LED_2_OFF();
}
if(CSD_1_bIsSensorActive(3)){
LED_3_ON();
}
else{
LED_3_OFF();
}
}
}
PSoC CapSenseで静電容量タッチセンサを自作した
回路などが間違っている事に気がつきました
正しい実装は次の記事へ。
使った部品の説明などはこのまま下へ。
*********************************************
できたっぽい。ひさしぶりにマイコンいじった。
銅箔テープの部分に指が近づけると電気容量の乱れるので、それをPSoC CY8C21334のCapSense機能で検出してLEDを光らせている。
コードもbitbucketにアップしました
(音小さい)
LEDは点滅させたくてさせているんじゃないんだけど、してしまっている。
もう少し抵抗値などの調整が必要らしい。
静電容量タッチセンサはメカニカルな部品が無いので、ビデオの最後にやっている様に、何の変哲もない壁に埋め込んでその上に人の手が乗っているかを検出したりできる。
防水加工も容易だし、銅箔等を使えば曲面に埋め込む事も出来る。
実際ヨーロッパの寒いところに行くと信号機やエレベータのボタンが凍結防止のために静電容量センサで実装されていたりする。
PSoCのCapSenseはワンチップで静電容量センサを簡単に実装できるパッケージで、商業的にはSONYのオーディオコンポやAppleのiPodのホイールなんかにも使われていてずいぶん潤っているらしく、セミナーも無料だし基盤は配るしタダメシも出てくる。
次は複数のcapsenseを使えるようにしてみる予定。
■必要な部品
リンク先は買ったお店の商品ページ。
- PSoCマイコン CY8C21334-24PVXI(20pin)
capsenseがついているマイコン。いろいろ探した結果、これをchip1stopで買うのがコストパフォーマンスが一番良いという結論になった - 秋月のSSOP変換基板
CY8C21334がSSOPという超小さいパッケージしか無いので、ブレッドボードに刺せるように足幅を広げる基盤。28ピンなので8ピン余るけど安いからこれを使う。 - 銅箔テープ たしか千石で買ったと思う。薄くて平べったい電極ならなんでも良さそう
あとは、秋月で買ったPSoC MiniProgというUSB接続の書き込み機と、ブレッドボードとLEDとクリップとベニヤ板と変換基板のピンヘッダ(オス)。
■センサー部分の制作
銅箔テープを千石で買ってきて適当な木の板に平行に貼る。裏に糊がついていたので楽だった。
CY3235 CapSense-ProxDetでは2.2kΩの抵抗と0.1μFのキャパシタがついているらしいが、手持ちのPSoC Expressセミナーの時にもらったCY3121では何もなくCY8C21434に直結しているように見えるので、これでいいのかも。
■マイコンのはんだづけ
今回はんだづけはここだけ。
フラックスをたっぷり塗って、足に沿ってさっさっと撫でる。
■PSoC Designerでのデバイス設定
新規プロジェクトをCY8C21334 24PVXI(20pin)で開始して、
Device EditorでUser ModulesからCap Sense(CSD)を配置。
「Select CSD with clock prescaler」を選択した。
PSoC入門:PSoC First Touch編 – MeRLマイコンブの記事ではwithout clock prescalerを選んでいるが、digital/analog block消費量も変わらないのでclock prescalerにしてみた。
Interconnect Viewで、CSD_1をplaceしてから右クリックすると「CSDウィザード」というのがあるのでそれを使う。
センサの数を1、スライダーを0にしてPORT0_1を左上にドラッグアンドドロップして「OK」
すると、CSD_1に接続されている。
いままでUARTやADCモジュールではInterconnect Viewで自分で接続していたが、その必要が無くなっている。
CSD_1の設定を確認。Pinの設定をしておく。
最後に、PORT0_0でLEDを光らせるためにDriveをStrongに変更
ピン割り当て
Generate Applicationして、Cでプログラムを書く。
■PSoC Designerでのプログラミング
shokai / CapSense LED / source — bitbucket.org
main.c
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))
#define LED_ON() sbi(PRT0DR, 0);
#define LED_OFF() cbi(PRT0DR, 0);
void main()
{
M8C_EnableGInt;
CSD_1_Start();
CSD_1_InitializeBaselines();
CSD_1_SetDefaultFingerThresholds();
while(1){
CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
if(CSD_1_bIsSensorActive(0)){
LED_ON();
}
else{
LED_OFF();
}
}
}
■マイコンの回路を作る
データシートを見て、PSoC MiniProgから接続が必要なSCLK、SDATA、XRES、VDD(VCC)、VSS(GND)の位置を確認
その通りに配線。電源はUSBのPSoC MiniProgから給電できる。
この時点でLEDを点灯させるだけのプログラムを書いて、マイコン単体で動くか確認した。
さきほどのプログラムを書き込んで、
PORT0_1とPORT1_5からクリップで銅箔テープに接続して完成。
さわると光る。
プログラムはこれ
OpenCV Study: 5af15ced343f BgSubAvg/bgsubAvg.cpp
ノシ ノシ できる
ハードをもう一つ作るぞ
(エイプリルフールだけどコラではないです)
先日買ったUSBカメラのケーブルが変なケーブルで気に入らなかったので作った。
市販のUSBケーブルをバラして、赤・黒・白・緑の4本を同じ色同士接続したら動いた。紫は無視していい。
この状態だとまずいので後で絶縁するべき。あと今回はこれの中に埋め込むので、もっと短い(10cm弱ぐらいの)ケーブルにする。
カメラ側はコネクタを買いに行くのが面倒だったので付属のケーブルから切断
USBは4芯のはずだけど、裏を見ると5芯になっている。テスターで調べてみたら黒と紫は基盤内で両方GNDに通電していた
なので、紫はとりあえず接続する必要無し。
赤・黒・白・緑の4つだけ接続した