マイコン工作実験日記

Microcontroller を用いての工作、実験記録

MMA8452Qでタップ検出

2012-08-04 20:15:06 | Weblog
前回に続き、MMA8452Qです。タップ検出機能を試してみたので、その概要報告です。まず、タップ検出の仕組みを下図に示します。MMA8452Qではタップ操作によって生じた加速度変化を検出して、外部に割り込みをかけることができます。タップとして認識するための条件として、加速度の大きさや持続時間をレジスタで指定できます。ダブルタップの検出の場合には、2回目のタップまでの間隔(Pulse Window)を指定することができます。このように条件さえ指定してやれば、あとはチップ内蔵の検出ロジックが働いてくれるので、ホストマイコン側は割り込みを寝て待てばいいだけなんでとっても楽チンです。



とはいうものの、加速度の大きさや持続時間なんて実際にデータでもとってみないとどういう値を指定すればいいのか見当もつきません。幸いなことにFreescaleがアプリケーション・ノート(AN4072)を用意してくれており、実際のレジスタ設定例も出ていますので基本的にそれを真似れば動作確認することができます。設定例としては、シングルタップ検出、ダブルタップ検出、シングル/ダブルタップ検出の3種類の例が紹介されていますが、どうせならということで両方を検出できるシングル/ダブルタップ検出を試じてみました。実際に試してみてわかった注意点を列挙しておきます。
  • 設定例には設定すべきレジスタと設定値が順序だてて紹介されているので、そのとおりにプログラムすればいいのですが、どういうわけかCTRL_REG2の設定だけが示されていません。例ではLPモード(Low power mode)の場合のレジスタ値が示されているので、まず最初にCTRL_REG2に0x18を書き込んでLPモードに設定しておかないと、その後のレジスタ値の意味が違ってきてしまいます。
  • 設定例では、XYZの3軸ともにトリガ条件を指定しています。XY軸では加速度の閾値を1.575gに設定していますが、Z軸では2.65gに設定しています。最初は「どうしてZ軸だけ大きい値を指定しなければいけないんだ?」と思いましたが、Z軸方向には重力加速度が1g加わっていますから、当然ですね。
  • シングルタップとダブルタップの両方の検出を許可してダブルダップをおこなった場合には、上図のシングルタップ検出と同じように割り込み要求は2回発生します。ただし、PULSE_SRCのDPE(Double Pulse on first Event)ビットの内容が異なります。最初の割り込みではDPEが0ですが、2回目の割り込みではDPEが1となります。

このように、シングル/ダブルタップの両方を検出するための設定はあるのですが、どちらの事象が発生したかの区別はユーザ側で処理する必要があります。シングルタップの発生を通知する割り込みであるかのように見えても、それはダブルタップ操作の1回目のタップを検出しているのかもしれません。Pulse Window時間を待ってみて、DPEの通知があるかどうかを見極める必要があります。実際に、この処理をおこないタップ検出をおこなってみた様子を次に示します。

  • ミニUSBコネクタのあたりを指で叩いているのですが、その時によって検出する軸が違っていたりします。コネクタがボード下部についていることもあり、Z軸よりもY軸での検出が多いようです。
  • カンマで区切られた2つの数字は、左側がとおしの割り込み発生回数、右側が結果表示回数です。ダブルタップ検出時には、DPEの表示がありますが、その場合には割り込み回数が2回増えていることがわかります。

幸いなことにAPノートの例のとおりの閾値設定で調子良く動いてくれましたが、実際にケースに収納する場合には設定パラメータを調整する必要が生じるかもしれません。