アマゾンで購入したタッチキーパッドを使ってみた

最近アマゾンで中華パーツを買うことにハマってます(^^)
今回は4x4キーのタッチキーパッドってのが面白そうだったので購入してみました。
/media/uploads/jk1lot/ttp229_.jpg
うちでテストした限りではデフォルトのシングルキーモードなら誤検出は全くなくて充分に実用になりそうです(マルチキーモードに設定すると全く触っていない隣のキーも押されているというふうに誤検出してしまうことが結構あります) 約500円ですから、16個のタクトスイッチとIOエキスパンダ等をユニバーサル基板に取り付けて自作するよりは(ちょっとだけ)高く付きますが、製作の手間を考えたらこのボードのほうが良いくらいですね。

このボードには TTP229というチップが載っていて、外部とは SCL,SDO の2本の線で接続するようになっています。
クロックとデータの2線接続というと I2Cかなとか思ってしまうのですが、全然違う独自のプロトコルです。
キーパッドに触ったり離したりする毎に SDOにパルスが出ます。それを検出したら SCLにクロックを出せば SDOでキーの状態を示すデータが得られるようになっています。
今回書いたライブラリではパルスを割り込みで検出して、割り込みルーチンで取得したデータをクラス内部に保持します。読み出し用のメンバ関数は保持しているデータを返しているだけになっています。

割り込みを使っていますので SDOとの接続にはInterruptInをサポートしているピンを使ってください(と言っても mbed LPC1768では全ての GPIOピンがサポートしているみたいですが^^)
SCLのほうはクロック信号をソフトで作ってますので GPIOピンならどれでもOKです。

割り込みで呼ばれるコールバック関数を設定(TTP229::attach())することもできますし、コールバック関数を設定せずに使うことも出来ます。サンプルプログラムには両方の例が入っています。

ライブラリでも説明していますが TTP229のデフォルトは8キーモードなのでジャンパで16キーモードに設定することが必要です。上記の写真のように TP2(基板のシルク印刷では3番)をクローズにしてください。私はピンヘッダを付けましたが、このボードを8キーモードで使うってのは意味がない(ので今回書いたライブラリは16キーモード専用)ですから、ピンヘッダを付けずに直結しちゃったほうが良いかも知れません。
ちなみに同じメーカーによると思われる8キーのタッチキーパッドも売られていますが、使用チップが違っていて通信プロトコルも 4本の線を使うという全くの別物みたいです。

余談

TTP229::attach() では mbedライブラリに用意されている FunctionPointer というのを使っています。ですので TTP229::attach() では attach(&func)で通常の関数、attach(FunctionPointer(&foo,&Foo::func))でメンバ関数を設定できます。
この FunctionPointer は何故かどこにも説明がないみたいなのですが、とても便利です。これ一つで通常の関数ポインタとメンバ関数ポインタの両方を保持できます。 要するに C++11の std::function の簡易版ですね(FunctionPointer.hにもそういうコメントが書いてあります)
正確に言うと std::function の簡易版に相当するのは FunctionPointerArg1<戻り値の型, 引数の型> というテンプレートクラスで FunctionPointer は FunctionPointerArg1<void,void> に typedef されています。(ですので TTP229::attach() で設定する関数は、「戻り値, 引数無し」のものになります。ここはちょっと解りにくいかも)
解りにくさを解消するためにドキュメントコメントを追加しましたが、関数版attach()とメンバ関数版attach()の2つを書くよりも記述量が多くなってしまいました(^^;) 増えたのはコメントなのでコード量としては2つ書くより少ないんですけどね。公式で FunctionPointer の説明があれば、こんな苦労しなくても済むのになあ…

追記:
よく見たら cookbook に FunctionPointerの説明がありました…でも、この説明じゃダメですね。最大の利点である「見た目では本物の普通の関数ポインタと同じ物として扱える」つまり FunctionPointer fp=&func; とか fp(); とか書けるということが全く書かれてません。使用例でも attach() の引数の型には使ってなくて、関数版attach() とメンバ関数版attach()の両方を書いちゃってますし…
ということで TTP229::attach()のドキュメントコメントは削除できそうもないです(^^;)


Please log in to post comments.