初めに
水中で非接触で機械の操作を、ジェスチャーセンサーが利用できないか調べるため購入して、いろいろいじってみた。その時の調査した結果をとりあえず書いてみる。
ただ結果としては、水中では、というか、センサーの配置に制限があったので、ハウジングケースのような厚めの筐体の内側に配置しても、ジェスチャーを認識しないということが分かった。残念。
ハードウェアの概要
30×30のイメージセンサーを持っており、IR940nmを照射し画像を受け取り。受け取った結果をDSPに通して、ジェスチャー・近接接近に関する情報処理をする。
ジェスチャー・近接接近とチップ制御は、I2Cで行う。
イメージセンサーの情報取り出しは、SPIで行う。SPIはこのチップがマスターになるみたいな感じ。
ベースクロックはGPIO1(MCLK)で与える。周波数は22~48MHz(Frame subtraction モード)、または44~48MHz(RAWモード)となる。
サスペンド時の消費電力は15μA、動作時は、1.5mA~2.82mA。
マニュアルを読むうえで必要な語彙
GPIO | イメージデータ転送用のSPI用ピン 0:マスタークロック, 1:CS, 2:SCK, 3:DATA |
INT_N | ジェスチャー・PSの割り込みピン |
PS | 近接感知、Proximity Sensor |
OP | Operation State:消費電力2.82mA |
S1 | Standby 1 State:消費電力2.3mA |
S2 | Standby 2 State:消費電力1.5mA |
OPtoS1 Step | OPからS1に移行する時間で、レジスタはObj_TIME_1(0x6B,0x6C)になる。 |
S1toS2 Step | S1からS2に移行する時間で、レジスタはObj_TIME_2(0x6D,0x6E)になる。 |
ジェスチャーのモード
Operation State, Standby 1 State, Standby 2 Stateの3種類ある。
モードの手動変更は、Bank0, 0x45で行う。
オブジェクトが認識できない場合、OPtoS1 time(Bank1,0x6B,0x6C)経過するとS1に移行する。S1からさらにS1toS2 time(Bank1,0x6D,0x6E)で何もオブジェクトが検出できないと、S2に移行する。
オブジェクトが検出された場合、すぐにOPに移行する。
ジェスチャーと近接接近でのパラメータの違い
B | パラメータ名 | ジェスチャー | 近接接近 |
0 | Interrupt Enable(0x41,0x42) | 0x01FF | 0x0200 |
0 | AE_Exposure_UB(0x48, 0x49) | 0x003C | 0x0020 |
0 | Manual_GG(0x51:[0]) | FALSE | TRUE |
0 | Manual_Exposure(0x51:[1]) | FALSE | TRUE |
0 | LightThd(0x83) | 0x20 | 0x00 |
0 | UseBGModel(0x9F:[0]) | TRUE | FALSE |
1 | dac(0x41:[5:3]) | 0x0 | 0x2 |
1 | dacref_sel(0x43:[2]) | FALSE | TRUE |
1 | IDLE_TIME(0x65, 0x66) | 0x0096 | 0x0BCE |
1 | IDLE_TIME_SLEEP_1(0x67,0x68) | 0x0197 | 0x0BCE |
1 | IDLE_TIME_SLEEP_2(0x69,0x6A) | 0x01CD | 0x05E9 |
1 | Obj_TIME_1(0x6B,0x6C) | 0x04B0 | 0xC350 |
1 | Obj_TIME_2(0x6D,0x6E) | 0x012C | 0xC350 |
1 | Control_Mode(0x74:[2:0]) | 0x0 | 0x5 |
Interrupt Enable(割り込みマスク)
Reg | Bit | 内容 |
0x43 | 0 | 上 |
1 | 下 | |
2 | 左 | |
3 | 右 | |
4 | 前進 | |
5 | 後退 | |
6 | 時計回り | |
7 | 反時計回り | |
0x44 | 0 | ウェーブ |
1 | 近接接近 | |
2 | 物体あり | |
3 | Wake Up | |
4 | 確認 | |
5 | 中断 | |
7 | 物体なし |
近接接近のパラメータ
Pox_UBとPox_LBはアプリケーションノートでは、ジェスチャーから近接接近に変更した際に、その内容を変更していた。
時間についての基本的考え方
0.0323msを1Tとして計算されているらしい。
上記掲示板のノーマルモード・ゲーミングモードの切り替えに関する質問から考えるに、次のようなことが言える。
近接接近モードでのIDLE_TIMEが3022となっている。この時間はT*3022= 97.6106となる。
アプリケーションノートでは、近接接近モードの検知周波は10Hz(100ms単位)なので、近接接近モードの検知時間は25ms相当だと思われる。
ジェスチャーモードでは、アプリケーションノートのGesture Detection Operating State and State Machineの計算式から、3.55msがジェスチャーの解析時間だと思われる。それをもとに、120Hz、240HzになるようにIDLE_TIMEを調整する。
結果として、120Hzは148となり、240Hzは19となる。
デフォルト値の150では、119Hzと約120Hzになっていた。
S1とS2での計測周波数を調べたところ、次のような形になった。
状態 | 設定値 | 計算式 | 周波数 |
S1 | 407 | 1000/(407*0.0323+3.55) | 59.89Hz |
S2 | 461 | 1000/(461*0.0646+3.55) | 30Hz |
初期パラメータの調査
アプリケーションノート、Grove、CHIRIMEN、mbedの情報を調査。
mbedは15, 20, 30の各距離のパラメータ変更についても記載があった。GroveとCHIRIMENは同じ、mbedはアプリケーションノートと同じ。
チップに書き込まれている初期値は、データシートと異なっていた。
これらはエクセルにまとめた。
最後に
ドキュメントのRecommended Mechanical Designをきちんと見ておけば。
カバーガラスが0.7mm以下とは。1cmあるアクリル越しではジェスチャーの検知はできないってあたりまえだよな。
コメント