落胆がらくた街

多分三日坊主で終わると思うんですけど

タッチセンサ RH6010をMbedで使ってみた

無駄にツボを抑えた製品を格安で揃える事に定評のあるいぶし銀ことaitendoでタッチセンサをなんとなく探してたら「8ch I2C接続タッチセンサ」なるものを発見した。

タッチコントローラ(8ch/I2C) - aitendo

お値段なんと100円也。ピッチ変換基板もセットで買って200円。レッドブルより安いぜ!

で、普通ならわざわざブログで書くような話では無いんだけれども、この製品、

・データシートが中国語しかない
サンプルソースらしきものもざっと探した限り見当たらない
・少なくとも日本語の資料は見当たらない
・データシートに書いてある内容が必ずしも正しくない

という状態なので、決して大した内容でないどころかまだ使いこなせてすらいないのだが、無いよりはマシという事でサンプルと使ってみた感想を記す事にした。私は中国語がさっぱり解らないし、記事の内容の信憑性も怪しいので、詳しい人がいたら是非意見を伺いたい。というか誰かライブラリとして仕上げてくれ。

#include "mbed.h"

I2C i2c(p9,p10);

const int addr = 0x78<<1; // データシートに書いてある0x78は右詰めなので左1シフト

#define SCT 0x2    //多分だけどセンシング時間の事 0b11で感度最大、0b00で最低(=最速)
#define SFT 0x3f    //上のさらに細かい版かなぁわかんない でかい程感度がいいらしい 6bitだから0x00~0x3f
#define OTC 1   //センサに入れるクロックがどうのこうののフラグ 1で感度が良いらしいしデフォが1だそうだから1でいいんじゃね
#define MOT 0x3    //ずっと触れっぱ判定が続いた時再キャリブレーションする時間 0b00で100秒、0b01で50秒、0b10で20秒、0b11でしない(デフォルト)
#define OLH 1   //INTの出力どうするか 1でHIを吐く(デフォルト)
#define KEYT 1  //マルチ判定がどうのこうの 1でマルチ(デフォルト) 0でシングル判定 0の存在価値が不明
#define LPM 1   //省電力モード 1で無効(デフォルト) 0で省電力モードになる
#define RTC 0x1    //再キャリブレーション時間(そのものの時間) 省電力モードでない(=LPMが1)場合、00で1秒、01で3秒(デフォルト)、10で6.3秒、11で13秒かける

int main()
{
    char cmd[2];

    cmd[0] = 0x0;            // CONFIG1 コマンド
    cmd[1] = (SCT<<6)|SFT;
    i2c.write(addr, cmd, 2); // Send command string
    wait(0.07);              // Could also poll, 65ms is typical

    cmd[0] = 0x1;   //CONFIG2 コマンド
    cmd[1]=(OTC<<7) | (MOT<<5) | (OLH<<4) | (KEYT<<3) | (LPM<<2) | RTC;
    i2c.write(addr, cmd, 2); // Send command string
    wait(0.07);              // Could also poll, 65ms is typical

    while(1) {
        cmd[0] = 0x2;
        char idx=1;
        i2c.write(addr,cmd,1);
        i2c.read(addr, cmd, 1);

        // 結果を出力
        for(int i=0; i<8; i++){
            printf("%d",(cmd[0]&idx)!=0?1:0);
            idx=idx<<1;
            if(i==7)printf("\r\n");
            else printf(":");
        }
    }
}

…初めて使ってみたけど見難いなソースコード。何かなんないかなこれ。

使い方。回路は以下のようにする。
f:id:suzumodoki:20160313170251j:plain
…本来はちゃんとした回路図を描くソフトを使うべきなんだろうけど面倒だった。無いよりマシが合言葉。
タッチがあった時に信号が飛んでくるINTピンは試してないのでNC。
それと右上のCJM/CJPは0~50pF程のコンデンサ通して感度を落とせるらしい?んだけど手持ちにそんなもの無いので未検証。NCで感度最大(デフォルト)らしい。
真ん中8つ(TP0~TP7)がタッチセンサとして働くんだけど、直列に抵抗を入れて感度を弄る(その為定数を記入していない)必要がある。
データシートでは1kを通せとの事だったが大嘘で、少なくとも私がやった限りでは10kが一番それらしい挙動をした。
あとデータシートはSda/Sclに直列100Ωの抵抗をつけてMCUに繋げ、との事だったが無くても動く以上必須ではなさ気。その代わりプルアップが必須である。

パラメータについて
以下は全て環境によるのであくまで参考程度に。
SCT、STF…どうもGoogle翻訳さん曰く感度を弄れるらしいのだが、ちょっと下げたら速攻でセンサが反応しなくなり、上げると他のピンまで反応した。SCTは0x2が最適のよう。STFは模索中。
MOT…色々変えたが特に効果が見られず謎。
これ以外のパラメータは未検証。

使ってみた感想
どうも暫く触って遊んでいたら、主に長時間触り続けた時にセンサの値が1に張り付く現象が見られた。
こうなると再キャリブレーションが必要(恐らくMOTはそのためのパラメータ)なのだが、できればこれを手動でやれないかと思った。
これさえ無ければしっかりタッチを認識してくれるので、細かい調整さえしてやれば使い道はあるかもしれない。
多分電気スタンドのスイッチのような、ワンタッチで済むような用途であれば格安で実装できるんじゃないかな。下手なスイッチより安いし。
タッチ式キーボードみたいなのは要検証。あと布越しでもタッチ反応するか、とかも検証の余地あり。
総合的に見て良い玩具というのが感想。問題は手汗体質と恐ろしく相性が悪い事くらいだな!