ジェスチャーセンサ(APDS-9960)を動作させて見ます

〔Arduinoの動かせ方入門に戻る〕


秋月電子のこちらで購入した、ジェスチャーセンサモジュールですが、APDS-9960を使っています。
このセンサは、対象物までの距離を測る近接機能と対象物の移動方向を測るジェスチャー機能に、
周囲の明るさを測る照度センス機能色温度を測る機能が内蔵された盛り沢山なI2C接続センサです。

スイッチサイエンスのこちらもAPDS-9960を使った物です、同じ様に使えそうな感じ。 *2)

[エンジン]と呼ぶ3つの処理機能に解れています。
COLOR/ALS ENGINE
 4個の可視光フォトダイオード(Red,Green,Blue,Clear)で照度と色を検出します。
GESTURE ENGINE
 4個の赤外フォトダイオード(up,down,left,right)で移動方向を検出します。
PROXIMITY ENGINE
 赤外フォトダイオード(4個から選択も可能)で対象物までの距離を検出します。

 赤外フォトダイオード用の光源として赤外LEDを内蔵していてこれに流す電流を制御出来ます。
 GESTUREとPROXIMITYは同じフォトダイオードを利用します。

APDS-9960のデータシートはこちらからダウンロードして下さい。
こんな感じで盛り沢山なセンサなので、もぉ〜レジスター設定が多くて大変なんですぅ、
なのでぇ、データシートのレジスタ記述部分を"Google翻訳"に掛けたままの内容で良ければこちら
アップして置きますので参考にして見て下さい。


各エンジン間の推移概念図 左は、各エンジン間の推移概念図です、
データシートの図を若干変更しました。

"WAIT"は計測間のタイミング時間で、
この時間を長く取れば電力消費及び
データ収集レートを低減出来ます。
WTIME =2.78ms 〜 8.54s
GWTIME=0ms 〜 39.2ms

PROXIMITY・GESTURE・COLOR/ALSの
各エンジンがONしている場合は、
[IDLE]→[PROX]→[GESTURE]→[WAIT]
→[COLOR/ALS]→[SLEEP]or[IDLE]と
推移して行くらしい。(*A)

[SLEEP]に推移する時は、"SAI=1"で"INT"ピンが
出力されている場合です、この後データを
読み出せばSLEEPは解除される様です。

[PROX]と[COLOR/ALS]は1回データを収集すれば次に推移しますが、
[GESTURE]は終了条件を満たすまで繰り返しデータを収集します。

(*A) 単純に全てONさせて動作させて見たが、測定値データが変だったりで上手く動作しなかった、
    レジスタの設定を上手く行えば良いのかもだがぁ.....深く追求していない m(_ _)m

測定値データについて

[COLOR/ALS]データ
16ビット(0-65535)で、"CDATAL/H(clear)、RDATAL/H(red)、GDATAL/H(green)、BDATAL/H(blue)"の
レジスタにそれぞれ格納されます。(数値は明るくなる程に増えて行きます)
(CDATALを 読み出せば、他の7バイトはラッチされ読出すまでデータの更新はされません)

A/D変換の積分時間レジスタ(ATIME) にて測定する時間を設定出来ます、デフォルトは2.78msで
712msまで設定可能、この時間を長くすれば測定値データの数値は増える(積算)事になります。
センサのゲインを"AGAIN" で1x-64x倍にコントロール出来ます。

又、4つのフォトダイオードから読出されたデータはA/D変換が行われレジスタに格納される一連の
1サイクルが完了した時点でステータスレジスタの"AVALID"が"1"となります、データを読出せば
"AVALID=0"とリセットされます。

[PROX]データ
8ビット(0-255)で、"PDATA" のレジスタに格納されます。(数値はセンサに近づく程に増えて行きます)

センサのゲインを"PGAIN" で1x-8x倍にコントロール出来ます。

又、フォトダイオードから読出されたデータはA/D変換が行われPDATAに 格納される一連の
1サイクルが完了した時点でステータスレジスタの"PVALID" が"1"となります、データを読出せば
"PVALID=0" とリセットされます。

[GESTURE]データ
8ビット(0-255)で、各UP/DOWN/LEFT/RIGHTと4バイトのデータが有り、レジスタアドレス0x00-0x7F
までのRAMエリアに各方向其々に32バッファのFIFOデータとして格納されます。
読出す窓口レジスタは、"GFIFO_U/GFIFO_D/GFIFO_L/GFIFO_R"から読出し、GFIFO_Uを読出せば
他のレジスタはラッチされるのでデータ更新は置きません。
FIFO内にデータが何件保存されているかは"GFLVL" のFIFOレベルレジスタに書き込まれているので
この件数分全て読み出します、例えばGFLVL=2なら2*4バイト読み出す事になります。
尚、FIFOのデータ保存が32バイトを超えた場合は、"GFOV=1" となりオーバーフローを知らせます。

又、ジェスチャーコンフィグ1レジスタの"GFIFOTH" に 1(デフォルト)/4/8/16 の値を設定すれば、
FIFOのデータ保存が"GFLVL" >= "GFIFOTH" となった時点で"GVALID=1" となります、
FIFOのデータを全て読み出せば"GVALID=0" となりリセットされます。

センサのゲインを"GGAIN" で1x-8x倍にコントロール出来ます。(近接とレジスタが解れている)

[GESTURE]エンジンは"GMODE=0"終了条件が整うまで繰り返しFIFOにデータを収集します。
終了条件は、ジェスチャーコンフィグ1レジスタの"GEXPERS" に 1(デフォルト)/2/4/7 の値を設定し、
有る条件が成立したらカウントをして行きます、で"GEXPERS" の値になったら終了します。
カウント条件は"GEXTH" に設定された値を、各UP/DOWN/LEFT/RIGHTの4つのデータが超えた場合
にカウントされる用です。(未実験)
尚、"GEXTH=0" とすれば終了条件処理は無視です。

※ [PROX]と[GESTURE]には、読んだセンサ値を補正する為のレジスタ(POFFSET_UR/POFFSET_DL
 GOFFSET_U/GOFFSET_D/GOFFSET_L/GOFFSET_Rのレジスタ)が有り、-127...0...127の補正係数を
 設定可能です。

割り込みについて

フォトダイオードのデータが飽和した時に発生する割り込み
 コンフィグ2レジスタの"PSIEN=1","CPSIEN=1"でこの割り込みは有効になります。
 発生すれば、ステータスレジスタが"PGSAT=1","CPSAT=1"となります。
 リセットは"AICLEAR" レジスタからデータを読み出す(アクセス)すればクリアされます。
 この割り込みについては未実験です。

A/D変換されたデータがレジスタに書き込まれた時に発生する割り込み
 "PIEN"近 接、"AIEN" 照度/色、"GIEN" ジェスチャーにて有効無効を決めます。
 ステータスレジスタの"PINT"近 接、"AINT" 照度/色、"GINT" ジェスチャーにて発生状況を見ます。
 発生すれば、INTピンがLOWになります、オープンドレインなのでプルアップ抵抗を入れます。
 割り込みのリセットは、ジェスチャーで有ればFIFOデータを全て読み出せばクリアされますが、
 他は"PICLEAR","CICLEAR"にアクセス(読出す)すればクリアされます。

近接と照度/色機能には、割り込み閾値レジスタが有り、これはフィルタ機能で指定した値の範囲に
測定値データが入れば割り込みが発生します。
例えば近接ならばセンサに近づいて来たら割り込みを発生するみたいなぁかんじぃ。

割り込み閾値レジスタはハイローの2つのトリガポイントが指定出来ます。
近接はPIHT/PILTで、照度/色は16ビット なのでAIHT(AIHTL/H)/AILT(AILTL/H)です、
又、この閾値をどの様に比較するのかを"PPERS","APERS"で選択します。
[0 = 閾値に関係なく全てのデータ収集サイクルでデータを得る](デフォルト)
[1 = 閾値の範囲に掛かった時のみデータを得る]
※ 何だかぁ、ロー値を下回った時とハイ値を上回った時が割込みを発生する様なんですよねぇ。

光源用LEDについて

近接とジェスチャーは赤外フォトダイオードを使うので入射させる為の光源用LEDを内蔵していて、
これの電流を制御(PWM)出来ます。
近接とジェスチャーは別々に制御用レジスタを持っていますので注意が必要かもね。

PWM制御なので1サイクルの長さを"xPLEN" に指定し、"xPULSE"で発生させるパルスの回数を指定
します、指定数値が増えるとセンサが検出する距離が延びます。(20cm位まででしょう)

近接はコントロール1レジスタの"LDRIVE"で、ジェスチャーはジェスチャーコンフィグ2レジスタの
"GLDRIVE" にてLEDのドライブ電流(12.5mA-100mA)を指定出来ます。
又、コンフィグ2レジスタの"LED_BOOST" でドライブ電流を100-300%にブースト出来ますが、
ジェスチャー機能時に200%以上に設定する場合は、VDDとLEDAの電源ピンを分けた方が良いらしい。

※ センサが検出する距離を調整する場合はPWMのパルス設定やゲインコントロールをいじりましょう。

各機能のON/OFFについて

レジスタ名 Enable Register Gesture Configuration 4 Register
ビット位置 6 5 4 3 2 1 0 1 0
機能名 GEN PIEN AIEN WEN PEN AEN PON GIEN GMODE
照度・色
近接
ジェスチャー
△は割り込みを利用する場合に有効にします。


※ その他に4つのフォトダイオードを停止させたり出来る様ですが実験していません。
  例えば上下を禁止にして左右だけ利用すれば検出精度も上がる様ですがぁ.....
※ レジスタには、Reservedビットが存在しますが、"1"にしておかないとダメなビットが有るので注意。
  ・"Configuration Register One (0x8D)"のビット5/6
  ・"Configuration Register Two (0x90)"のビット0
  これらは電源ON時は"1"でセットされる、"0"で動作させた場合にどうなるかは未実験。

《配線図》

下が実験回路の実態配線図です、
センサ電源は本体(VDD=2.4-3.6V)と光源用LED(LEDA=3.0-4.5V)で別れています。
センサが3.3V電源なので回路電源も3.3Vです。
但し、Arduinoが5VなのでI2C接続は電圧レベル変換が必要です。
配線図  I2Cレベル変換モジュール
 上の"I2C用電圧レベル変換モジュール"を
 使いました。
 左図の変換モジュール上側がVREF2側となり
 こちら側に電圧の高い方(5V側)を接続します。

 3.3Vマイコンを使う場合、変換は必要なく直接接続
 出来ますが、I2C用プルアップ抵抗は必要になります
 この変換モジュールは1KΩプルアップ抵抗を内蔵
 しているのでそれを今回利用しています。
 外付けプルアップ抵抗を使う場合モジュール裏の
 ジャンパーパターンをカットすれば良いです

 又、センサモジュールの裏に半田盛すれば4.7KΩでI2C用がプルアップされます。
 尚、VPU端子は外部から通信可能不可能の切替えをする為の物ですが、今回未使用です

あ、それとぉ、Arduino UNOの場合はデジタル端子側の方にSCL/SDA専用端子が有ります、
そちらに接続しても良いでしょう。

センサモジュールの"VDD"と"LEDA"の電源は今回同じ電源としています、
ですが、データシートによると同じ単一電源の場合は、VDD電源に22Ω抵抗を直列に入れる様に
指示が有りますので念の為に。
又、LEDAピンにはサージ対策として10uF/16Vの電解コンデンサーを必ず取り付けましょう。
"INT"ピンは割り込み機能を利用する場合にプルアップ抵抗を介して外部割込み端子に接続します。
(Arduino Unoでは2番と3番ピンが、外部割込み端子になります)

《ダウンロードスケッチ》

↓ここからArduino用サンプルスケッチファイルをダウンロードして下さい。
skAPDS9960.zip(2016/01/05)
skAPDS9960.zip 構造体(0xA2/A3)定義のミスを修正 *1)

解凍すると下の様に展開されます。
[skAPDS9960]─┬─[examples]───┬─[AllFunc]----- AllFunc.ino
        ├ skAPDS9960.cpp └─[ProxInter]--- ProxInter.ino
        ├ skAPDS9960.h
        └ keywords.txt
ArduinoIDE 1.7.3 がインストールされているフォルダー、インストール先を変更していないなら
[C:\Program Files\arduino-1.7.3\libraries]です。
この場所に上記解凍ファイルを[skAPDS9960]ディレクトリ丸ごと移動します。
また、ライブラリの登録や利用方法などの話はこちらを参考にして下さい。

AllFunc.ino  ・・・・・・・本体のサンプルスケッチ(全ての機能を使っています)
ProxInter.ino  ・・・・・・本体のサンプルスケッチ(近接での割込みサンプル)
skAPDS9960.cpp ・・・ジェスチャー・センサ(APDS9960)関数ライブラリソース
skAPDS9960.h ・・・・・ヘッダファイル  *1)
keywords.txt ・・・・・・・キーワードファイル

AllFunc.ino

AllFunc.inoを開くには、
IDEを起動して、メニューバーの「ファイル」→「スケッチの例」→「skAPDS9960」→[AllFunc]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

このサンプルはスイッチを押す度に検出する機能(エンジン)を切り替えています。
[SLEEP] → [近接] → [ジェスチャー] → [色・照度(ALS)] → [SLEEP]

@ IDEの[シリアルモニター]を起動させます。
  "Press the switch"が表示されればセンサは動作しています。
  "Init failed ans=?"の表示で有れば初期化失敗しています、配線等を確認しましょう。
A スイッチを押して下さい、押す度に検出する機能が変わります。
  スイッチを押す場合は、"SW ON"が表示されるまで気持ち長めに押しましょう。
  次の検出機能に移る場合は、前の検出機能は「停止」させてから切り替えています。

  因みに「停止」させないで全部最初から「start」させた場合は上手く動作しませんでした、
  [近接][色・照度(ALS)]の組み合わせはOKでした、設定を上手くいじれば良いのかもですがぁ...
  後は、みなさんで、いじり倒して下さい。m(_ _)m
  PS. 上記プログラムミスを修正したので動作する可能性が有るかも?(未実験) *1)

  [近接]
  センサの上で手を上げ下げすれば、検出値(0-255)を表示します。
  検出値から距離を算出する事はしていません、このセンサーは物が有るか否かの検出用でしょう。
  [ジェスチャー]
  センサの上で手のひらを上下左右に移動させて見て下さい、移動方向を表示します。
  "RIGHT"方向が若干ミスが多い様なぁ、検出値の補正係数を設定すれば良いと思うがぁ.....未実験
  葉書等のキッチリ四角で行った場合、殆どミス無だったのですがぁ....私の手ぇガタガタなのでぇ....
  [色・照度(ALS)]
  センサ前の照度(clear)/赤(red)/緑(green)/青(blue)の検出値を表示します。
  データシートには、”RGBCの結果は、周囲光レベル(即ちルクス)と色温度(即ちケルビン)を計算する
  為に使用する事が出来ます。”と有るのですがぁ....
  計算式が書いてないので変換方法が解りません。 <(`^´)>エッヘン ヾ(^_^;) オイオイ

ProxInter.ino

ProxInter.inoを開くには、
IDEを起動して、メニューバーの「ファイル」→「スケッチの例」→「skAPDS9960」→[ProxInter]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

このサンプルは、近接機能での割り込みを使用する場合のサンプルですが、他の機能も同じです。

スイッチは使いません、スイッチ側の配線をセンサの"INT"ピンに接続を替えます、
勿論プルアップ抵抗は忘れずに、で、ArduinoUNOの外部割込みは2番端子を使っています。

@ IDEの[シリアルモニター]を起動させます。
  "Proximity START"が表示されます。
A センサに手をかざし近づけて行きましょう。
  検出値が100以上になれば割り込みが入り値が表示されます。
  (割り込み発生中は内蔵13番LEDが点灯します)

skAPDS9960.h

ジェスチャー・センサ(APDS9960)関数のヘッダファイルです。
関数ライブラリを利用する場合は、メニューバーの「スケッチ」→「ライブラリを使用」→「skAPDS9960」を
クリック操作すれば、"#include <skAPDS9960.h>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。

本ライブラリでの各機能の初期化は、下記の様に記述しています。
自分の環境等により変更して下さい。
#define GDATA_LOW_BORDER	10	// ジェスチャーデータの低レベル境界値(これ以下はノイズとする)
#define WTIME_50ms		238	// ウエイトタイム(低電力時における時間の量)は50msに設定
// ジェスチャーレジスタの定数定義
#define GWTIME_2_8ms		1	// ジェスチャーウエイトは2.8msに設定
#define GPULSE_12ps		11	// ジェスチャー(LED)パルスの発生個数は"12"に設定
#define GPLEN_16us		2	// ジェスチャー(LED)パルスの1サイクルは16usに設定
#define GLDRIVE_100mA		0	// ジェスチャーLEDドライブ電流は100mAに設定
#define GGAIN_8x		3	// ジェスチャーゲインコントロールは8倍に設定
#define GFIFOTH_16ko		3	// FIFOが16データ溜まったら報告(GVALID)する
// 近接レジスタの定数定義
#define PPULSE_8ps		7	// 近接(LED)パルスの発生個数は"8"に設定
#define PPLEN_8us		1	// 近接(LED)パルスの1サイクルは8usに設定
#define LEDBOOST_100pa		0	// LEDドライブ電流の増幅率は100%に設定
#define LDRIVE_100mA		0	// 近接LEDドライブ電流は100mAに設定
#define PGAIN_4x		2	// 近接ゲインコントロールは4倍に設定
// 色・照度レジスタの定数定義
#define AGAIN_4x		1	// ALSゲインコントロールは4倍に設定
#define ATIME_100ms		220	// ALSの計測(積算)する時間は100msに設定
skAPDS9960.cpp

まず利用する場合は下記2行をスケッチの最初に記述します。
#include <Wire.h>
#include <skAPDS9960.h>

setup( )関数内で下の様にI2Cを使用する為の初期化処理を記述します。
Wire.begin() ;   // マスターとする

※ センサのI2C通信速度はMAX400KHzまでの様ですがArduinoは100KHzで初期化されます。
※ このライブラリは、"Arduino UNO"と"Arduino ZERO(M0) PRO"で確認を行っています。

ジェスチャー・センサ(APDS9960)関数の使い方を説明します。

skAPDS9960
 ジェスチャー・センサ(APDS9960)用関数ライブラリを使用する為に必要な宣言(初期化)を行います。
 skAPDS9960 APDS(id,address) ;
  id         :デバイスの識別IDを指定します(APDS-9960=0xAB)
  address :デバイス(スレーブ)のI2Cアドレスを指定します(0x39)
 "APDS"の名前は任意に変更可能です。
 例)
 #define APDS9960_ADRS 0x39 // センサのI2Cアドレス  #define APDS9960_ID 0xAB // APDS-9960のID  skAPDS9960 APDS(APDS9960_ID,APDS9960_ADRS) ; 以下はこの宣言例で記述します。
アドレス設定  アドレスは7ビットで表します、左図の1〜7ビットです。
 0ビット目はR/Wでこれはデバイスに対する読書き指示ビットです。
 R/W=0 : 書き込み要求です(デバイスは受信モード)
 R/W=1 : 読み込み要求です(デバイスは送信モード)

 このAPDS-9960は固定("0111001":39h)("0111001"+R/W)となりますので
 R/W=0書込みなら"0111001"+"0"で0x72、R/W=1読込みなら"0111001"+"1"で0x7Dとなりますが
 ここでは7ビットで指定なので
 #define APDS9960_ADRS 0x39  // デバイスのI2Cアドレス
 となっています。

ans = APDS.Init( )
 デバイスの初期値設定を行う処理です。
 デバイスの動作を確かめる為にデバイスIDのチェックを行い、エラーならans=6を返します。
 デバイスは、低電力スリープモードで起動しています。
 尚、エラー時は制御レジスタの設定は行っていません。

  ans   :戻り値   0=正常終了、それ以外はI2C通信エラーです
             1=送ろうとしたデータが送信バッファのサイズを超えた(32バイトMAX)
             2=スレーブ・アドレスを送信し、NACKを受信した
             3=データ・バイトを送信し、NACKを受信した
             4=その他のエラー
             5=データ受信エラー
             6=デバイスのIDチェックエラー

ans = APDS.PowerOnOff(mode)
 内部発振器の起動と停止をさせる処理です。
 停止させると低電力スリープモードになりますがI2Cは通信可能です。
 この関数を呼ぶ前に、各検出機能を停止("IDLE")させて下さい。
 各機能の"Start( )"関数をコールすれば、起動状態になります。

  mode    :0=停止(PON_OFF) 1=起動(PON_ON) の何れかを指定する
  ans       :戻り値、0=正常終了 それ以外Init( )のans値を参照

※ "IDLE"の状態から"PON OFF"にした場合に、本当に"SLEEP"へ移行するのかが実は......
  <(`^´)>ちょっとぉ不明です ヾ(`o´メ) ヲォイ
  消費電流を測定すれば良いのかもだがぁ...私の機材では....

ans = APDS.ColorStart(inter,iht,ilt)
 色・照度(ALS)検出機能を開始する処理です。
 ilt/ihtは0x00-0xFFFFまでの16ビット値です、変数で指定する場合は”uint16_t”で宣言しましょう。
 ilt/iht共に0x00にした場合は全ての検出サイクルで割込み発生します。
 SLEEP状態からIDLEへ移行する場合は7ms時間掛かります。
 この関数は初期化が完了するまで約300ms程待ちます。

  inter   :1=ALS検出時の割込みを行う 0=ALS検出時の割込みをしない
  iht     :高レベル側割込み閾値(AIHT)レジスタに設定する値、使わないなら0指定
  ilt      :低レベル側割込み閾値(AILT)レジスタに設定する値、使わないなら0指定
  ans    :戻り値、0=正常終了 それ以外Init( )のans値を参照

ans = APDS.ColorStop()
 色・照度(ALS)検出機能を停止させる処理です。

  ans    :戻り値、0=正常終了 それ以外Init( )のans値を参照

ans = APDS.ColorRead(*cdata)
 色・照度(ALS)センサの検出データを読み込む処理です。
 cdataは”clear,red,green,blue”の4つのデータを返します、それぞれHighバイト/LOWバイトの
 2バイトづつで返します。
 読みに行った時に、センサからまだ検出データがセットされていない場合はans=7で返ります。

  *cdata  :読み込んだデータ(8バイト)の格納先を指定する
  ans      :戻り値、0=正常終了 7=検出データは無効である それ以外Init( )のans値を参照
  例) 下記の様に呼び出せば簡単です。
  uint16_t  dt[4] ;  // "uint16_t にて宣言して下さい"

    APDS.ColorRead(&dt[0]) ;
    Serial.print("C=") ;
    Serial.print(dt[0]) ;   // clear channel data
    Serial.print(" R=") ;
    Serial.print(dt[1]) ;   // red channel data
    Serial.print(" G=") ;
    Serial.print(dt[2]) ;   // green channel data
    Serial.print(" B=") ;
    Serial.println(dt[3]) ; // blue channel data
ans = APDS.ProximityStart(inter,iht,ilt)
 近接検出機能を開始する処理です。
 ilt/ihtは0x00-0xFFまでの8ビット値です、変数で指定する場合は”uint16_t”で宣言しましょう。
 ilt/iht共に0x00にした場合は全ての検出サイクルで割込み発生します。
 SLEEP状態からIDLEへ移行する場合は7ms時間掛かります。
 この関数は初期化が完了するまで約300ms程待ちます。

  inter   :1=近接検出時の割込みを行う 0=近接検出時の割込みをしない
  iht     :高レベル側割込み閾値(PIHT)レジスタに設定する値、使わないなら0指定
  ilt      :低レベル側割込み閾値(PILT)レジスタに設定する値、使わないなら0指定
  ans    :戻り値、0=正常終了 それ以外Init( )のans値を参照

ans = APDS.ProximityStop()
 近接検出機能を停止させる処理です。

  ans    :戻り値、0=正常終了 それ以外Init( )のans値を参照

ans = APDS.ProximityRead(*pdata)
 近接センサの検出データを読み込む処理です。
 読みに行った時に、センサからまだ検出データがセットされていない場合はans=7で返ります。

  *pdata  :読み込んだデータの格納先を指定する
  ans      :戻り値、0=正常終了 7=検出データは無効である それ以外Init( )のans値を参照
  例)
    unsigned char dt ;

    APDS.ProximityRead(&dt) ;
    Serial.print("PDATA=") ;
    Serial.println(dt) ;
ans = APDS.GestureStart(inter)
 ジェスチャー検出機能を開始する処理です。
 SLEEP状態からIDLEへ移行する場合は7ms時間掛かります。

  inter   :1=検出時の割込みを行う 0=検出時の割込みをしない
  ans    :戻り値、0=正常終了 それ以外Init( )のans値を参照

ans = APDS.GestureStop()
 ジェスチャー検出機能を停止させる処理です。

  ans    :戻り値、0=正常終了 それ以外Init( )のans値を参照

ans = APDS.GestureRead(*gdata)
 ジェスチャーセンサの検出データを読み込む処理です。
 読みに行った時に、センサからまだ検出データがセットされていない場合はans=7で返ります。

  *gdata  :読み込んだデータの解析結果値格納先を指定する
        'U''D''L''R'=移動方向をセットする 0=移動無か変化なし時
  ans      :戻り値、0=正常終了 7=検出データは無効である それ以外Init( )のans値を参照
  例)
    unsigned char dt ;

    APDS.GestureRead(&dt) ;
    switch (dt) {
       case 'U':Serial.println("UP") ;
                break ;
       case 'D':Serial.println("DOWN") ;
                break ;
       case 'L':Serial.println("LEFT") ;
                break ;
       case 'R':Serial.println("RIGHT") ;
                break ;
       default :break ;
    }

《その他》

実験風景 左写真は実験時の物です。

センサ部はホントに小さいですね。
そのせいも有ると思うのですがぁ、ジェスチャー
解析結果で右方向なのに下なんて....ミスがぁ...
(私のアルゴリズムがぁダメダメなのかぁ....)

スイッチサイエンスのこんな物もあります、
左右と上下高さ方向のみですがぁ。 *2)

ルクスとケルビンの変換式計算を
何故にデータシートに書いてないのだろう?
相当難しいんだろうか?
書いて欲しいですぅ、"Avago"さん。
って言うかぁ、
頭のいい人のブログまちぃ、
みたいなぁ、かんじぃ。

他に”GROVEシステム用のPAJ7620U2搭載ジェスチャーモジュール”もあります。 *2)



リンクの見直し(*2) 2020/03/21
プログラムミス修正(*1) 2016/03/08


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.