カテゴリー : mTouch

PIC F1シリーズでmTouch(その後2)


新PIC16シリーズの静電容量タッチセンサモジュールを使っていろいろやっているのだが、とりあえず使えそうになってきたのでソース公開する。タイマーリソースはタイマ0ではなくタイマ1を使うようにした。というのもタイマ0は8ビットなのですぐにオーバーフローしてしまうので調整が面倒である。自分で自分の作ったセットで個人的に使うのであればフローしないようにタイマ0で調整してもイイのだが、ブレッドボード上で実験することを前提としているので配線が変わる度に調整するのでは教えるのが大変である。そこで16ビットタイマーであるタイマー1を使うように変更した。いろいろ調整すべき箇所があるが、一番難しいのがどれだけ周波数が下がったらONとして認識して、どれだけ戻ったらOFFと見なすかというところ。ソースで言えばisCpsOnの後半if文のav/24とav/64のところで、24の値を大きくするとONの感度が上がり、64の値を大きくするとON→OFFの感度が下がる。ONの感度を上げ過ぎるとタッチしなくてもONになってしまい誤作動が増える。OFFの感度を上げるとOFFに戻らなくなってしまうなんてことになりかねない。また、セットを動かしただけでもONになったりONになりっぱなしになったりするので、注意が必要である。また、サンプリング時間は5msで設定しているが、これ以上短くすると丸め誤差が出てきて移動平均の値が狂ってくるのでこれも注意が必要。じゃぁ長くすればいいかというと長くすると当然スイッチの反応が鈍くなる。ということで、今回の値くらいが妥当じゃないかと思う。

// CPSライブラリで使用する定数など
#define CPS_ST    5000    // サンプリング時間
int CpsAve[5];            // 各チャンネルの移動平均した無負荷時のTMR値

void CpsInit(byte ch)
{
    byte b;
    if(ch>4) return;    // for safe
    b=0x01<<ch;

    TRISA=TRISA|b;
//  WPUA&=~b;        // not available on f1827
    ANSELA=ANSELA|b;
    T1CONbits.TMR1CS=3;TMR1ON=1;TMR1GE=0;    // Using Timer1
    CPSCON0bits.CPSRNG=3;    // 3:high,1:low,0:off
    CPSCON1bits.CPSCH=ch;
    TMR1L=0;TMR1H=0;
    CPSON=1;
    __delay_us(CPS_ST);            // sampling time
    CPSON=0;
    CpsAve[ch]=TMR1L+TMR1H*256;    // setting initial mean value
}

byte isCpsOn(byte ch)
{
    int t,av; // Ave[ch]
    static byte onoff[5]={0,0,0,0,0};
    if(ch>4) return 0;    // for safe
    av=CpsAve[ch];
    CPSCON1bits.CPSCH=ch;
    TMR1L=0;TMR1H=0;
    CPSON=1;
    __delay_us(CPS_ST);        // sampling time
    CPSON=0;
    t=TMR1L+TMR1H*256;
    if(t<av-av/24){
        onoff[ch]=1;
    }else if(t>av-av/64){
        CpsAve[ch]=((long)av*15+t)/16;
        onoff[ch]=0;
    }
    return onoff[ch];
}

このライブラリはPIC16F1827用になっており、また、ポートAの5チャンネル分しかサポートしていないのでフルサポートしたければCpsInitを書き換えるとよい。ポートの設定を調整すれば他のF1シリーズにも移植は簡単だと思う。

肝心の使い方は、CpsInitでチャンネルを指定して初期化して、isCpsOnでチャンネルをしてすればONかOFFがわかる。前回のビデオではメインループの中で次のようにしてON/OFFをチェックし、7セグLEDを制御している。

if(isCpsOn(3)) LATB|=0x42; else LATB&=0xbd;

マイクロチップからも日本語のアプリケーションノートがPDF配布されているので、実システムに組み込む人は参考にするといいと思う。今回はブレッドボード上で教材として使うことをメインにしているのでよいが、実システムに組むには考慮すべき点が他にもあるので参考にすべきである。

wordpressではcodeタグを使ってもスペースが勝手に削除されて非常に見づらいソースになってしまうみたいだ(ぼそっ)。やっと直した。

PIC F1シリーズでmTouch(その後)


PICのF1シリーズのPIC16F1827でmTouchを試しているのだが、一応動くものができたので公開する。

結局タイマ0を使わないとお話にならなかったのでタイマ0を使っている。いろいろなことを考えるとタイマ1だけを使う方がいいかもしれないので、時間があればタイマ1板も作ってみたいと思う。さらに今回のプログラムではタイマ0割り込みを使っているが、使わなくても使い物にはなる。

何が一番面倒かは基準となる無負荷時の値を取ることと、常にそれを更新すること。環境が変わってもちゃんと動き続けるようにするためには、アナログ的な要素がいろいろ必要となってくるみたいだ。特に、センサ用の線はあまり延ばせない。下手すればその線自体がセンサになる。閾値を決めるのも難しい。下手するとセットの向きを変えるだけでONになったりする。マイクロチップがいろいろと資料を公開しているらしいので、その辺のところを確認する必要がありそうだ(まだ見てなかったんかいw?なんてつっこまないでw)。

今回は写真じゃ動きがわからないので初めての動画アップ!WindowsではSkyDriveを使えとうんたらかんたら言ってくるのでアップしてみた。そのURLはこれらしい。

https://skydrive.live.com/redir.aspx?cid=8365a47b77197384&page=play&resid=8365A47B77197384!173

埋め込みもできるらしいが、いろいろがんばったがWordPressではできなさそうなので、結局できるYouTubeにアップし直した。


プログラム自体はソースが汚いので整理したあとで。。。w

PIC F1シリーズでmTouch


PIC F1シリーズを使った教材開発を考えているのだが、どうせなら高速版PIC16として使うのではなく新しい要素をいれてみようとmTouchを考えてみた。

モジュール名で言えばCSM(Capacitive Sensing Module)というらしい。正直なところ、この機能には過剰に期待をしていて、その辺で使っているタクトSWの代わりに使えば部品代が浮いて配線も楽になって指導しやすくなる。。。なーーんて考えていたのだがデータシートをみてびっくり!

ソフトウエアでほとんどの処理を行わなければならない!!

何のためのモジュールなんやと思いつつ、よくよくデータシートを読んでみるとこういうことらしい。

1.センサ部分(単なる電極なんだが)に絶縁体を挟んで人体との静電容量がうんたらかんたら・・(略)で周波数が変化する

2.周波数の変化をマイコン内蔵のタイマーを使ってカウントし、無負荷時の周波数と比べ、低くなっていたらタッチされたとする

以上!簡単でしょ?簡単じゃないわいw!

ってゆうかタイマリソースを2つも使って調べろというのか?どうりでタイマー4,6なーんて訳のわからんタイマーを増やしてるわけだ。

ということで、PIC16F1827を使っていろいろ試してみた結果、大体こういう感じだ。

1.ブレッドボード上での実験でオシロを使って周波数の測定をしてみると、無負荷時には105kHz位、近づけると数十kHzに下がり、接触すると数Hzにまで下がる

2.CPSOUTを監視すればどうにかなるかも?

先進的な技術かどうかはこの際関係なく、コストと手間を省くためだけに使うのであれば、プログラム次第で簡単に使えるのではないかということだ。

まぁタイマリソース1個くらいは使わないとできないかもしれないが、使えればブレッドボードに配線をしてタッチするだけでスイッチのかわりとして使える!

ということで考えてみよう!