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

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


秋月電子のこちらで購入した、ジェスチャーセンサモジュールですが、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"で動作させた場合にどうなるかは未実験。

《配線図》

配線図
上が実験回路の実態配線図です、
PIC16F1829を使いましたが、4KWord以上のPICであればOKと思われます。
尚、16F1829は右上が1番ピンです、間違わない様に!

センサ電源は本体(VDD=2.4-3.6V)と光源用LED(LEDA=3.0-4.5V)で別れています。
センサが3.3V電源なので回路電源も3.3Vです。

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

センサモジュールとの接続はI2Cで、I2C用プルアップ抵抗はPIC内蔵プルアップを利用しました。
又、センサモジュールの裏に半田盛すれば4.7KΩでI2C用がプルアップされます。

《ダウンロードプログラム》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
skAPDS9960.lzh(2016/01/14)
skAPDS9960.lzh 構造体(0xA2/A3)定義のミスを修正 *1)

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 AllFunc.c・・・・・・・・・ 本体のサンプルプログラム(全ての機能を使っています)
 ProxInter.c・・・・・・・・・ 本体のサンプルプログラム(近接での割込みサンプル)
 skAPDS9960.c・・・・・ ジェスチャー・センサ(APDS9960)関数ソースファイル
 skAPDS9960.h・・・・・ ジェスチャー・センサ(APDS9960)関数用のヘッダファイル *1)
 skI2CLCDlib.c・・・・・・ I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h・・・・・・ I2C接続LCDライブラリ用ヘッダファイル
 skI2Clib.c・・・・・・・・・・ I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・・・・ I2C通信を行う関数のヘッダファイル

 尚、CPUのクロックは16MHzを想定しています。
 なので通信速度等(I2C)はシステムクロック16MHzで計算されています。

AllFunc.ino

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

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

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

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

ProxInter.ino

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

スイッチは使いません、スイッチ側の配線をセンサの"INT"ピンに接続を替えます、
勿論プルアップ抵抗は忘れずに、で、PICの外部割込みはRA5(2番)端子を使っています。
(PICによってはRA5を外部割込みで使用出来ない物が有りますよ、念の為)

@ PICを起動させます。
  "I2C LCD Test"が表示され2秒後に初期化が開始され、"PROX START [?]"が表示され更に
  2秒後に開始します。
A センサに手をかざし近づけて行きましょう。
  検出値が100以上になれば割り込みが入り値が表示されます。

skAPDS9960.h

ジェスチャー・センサ(APDS9960)関数のヘッダファイルです。
"skAPDS9960.c"を利用する場合に
#include "skAPDS9960.h" をプログラムの先頭で記述して下さい。

今回は16MHzで利用しているので、
 #ifndef _XTAL_FREQ
  // Unless already defined assume 16MHz system frequency
  // This definition is required to calibrate __delay_us() and __delay_ms()
  #define _XTAL_FREQ 16000000    // 使用するPIC等により動作周波数値を設定する
 #endif
と記述しています、16MHz以外で利用する人は"16000000"を書き換えて下さい。

本ライブラリでの各機能の初期化は、下記の様に記述しています。
自分の環境等により変更して下さい。
#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.c

このライブラリはジェスチャー・センサ(APDS9960)をI2C接続で読み書きする関数集です。
ですので、この関数集にはskI2Clib.c/skI2Clib.hのファイルが必要です。

この関数集を利用する場合は、"skI2Clib.c"の"InitI2C_Master( )"関数を呼び出した後使います、
使い方の例は、"AllFunc.c"を参照下さい。

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

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

  id         :デバイスの識別IDを指定します(APDS-9960=0xAB)
  address :デバイス(スレーブ)のI2Cアドレスを指定します(0x39)
  ans       :戻り値    0=正常終了、それ以外はI2C通信エラーです
              1=異常(相手からACKが返ってこない)
              6=デバイスのIDチェックエラー

アドレス設定  アドレスは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_PowerOnOff(mode)
 内部発振器の起動と停止をさせる処理です。
 停止させると低電力スリープモードになりますがI2Cは通信可能です。
 この関数を呼ぶ前に、各検出機能を停止("IDLE")させて下さい。
 各機能の"Start( )"関数をコールすれば、起動状態になります。

  mode    :0=停止(PON_OFF) 1=起動(PON_ON) の何れかを指定する
  ans       :戻り値、0=正常終了 1=異常(相手からACKが返ってこない)

※ "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=正常終了 1=異常(相手からACKが返ってこない)

※ MPUが32Bit以上なら"uint16_t"ですが、16Bit以下なら"Unsigned int"でも良いです、
  "uint16_t"を使用する場合は、"#include <stdint.h>"を宣言します。

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

  ans    :戻り値、0=正常終了 1=異常(相手からACKが返ってこない)

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

  *cdata  :読み込んだデータ(8バイト)の格納先を指定する
  ans      :戻り値、0=正常終了 1=異常(相手からACKが返ってこない) 7=検出データは無効である
  例) 下記の様に呼び出せば簡単です。
  char         buf[32] ;
  uint16_t     dt[4] ;  // 8-32Bitはこちらで宣言
  unsigned int dt[4] ;  // 16Bit以下

    APDS_ColorRead(&dt[0]) ;
    sprintf(buf,"C=%d R=%d G=%d B=%d",dt[0],dt[1],dt[2],dt[3]) ;
    printf(buf) ;
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=正常終了 1=異常(相手からACKが返ってこない)

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

  ans    :戻り値、0=正常終了 1=異常(相手からACKが返ってこない)

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

  *pdata  :読み込んだデータの格納先を指定する
  ans      :戻り値、0=正常終了 1=異常(相手からACKが返ってこない) 7=検出データは無効である
  例)
  char          buf[24] ;
    unsigned char dt ;

    APDS_ProximityRead(&dt) ;
    sprint(buf,"PDATA=%d",dt) ;
    printf(buf) ;
ans = APDS_GestureStart(inter)
 ジェスチャー検出機能を開始する処理です。
 SLEEP状態からIDLEへ移行する場合は7ms時間掛かります。

  inter   :1=検出時の割込みを行う 0=検出時の割込みをしない
  ans    :戻り値、0=正常終了 1=異常(相手からACKが返ってこない)

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

  ans    :戻り値、0=正常終了 1=異常(相手からACKが返ってこない)

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

  *gdata  :読み込んだデータの解析結果値格納先を指定する
        'U''D''L''R'=移動方向をセットする 0=移動無か変化なし時
  ans      :戻り値、0=正常終了 1=異常(相手からACKが返ってこない) 7=検出データは無効である
  例)
    unsigned char dt ;

    APDS_GestureRead(&dt) ;
    switch (dt) {
       case 'U':printf("UP") ;
                break ;
       case 'D':printf("DOWN") ;
                break ;
       case 'L':printf("LEFT") ;
                break ;
       case 'R':printf("RIGHT") ;
                break ;
       default :break ;
    }
skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.c
skI2Clib.h

この内容は”秋月電子I2C接続小型LCDモジュールに表示を行う”を参照下さい。

尚、システムクロックを変えた人は"skI2Clib.c"ファイル内の"InitI2C_Master( )"関数と、
"skI2CLCD.h"のファイルを変更する必要が有ります。
また、APDS-9960はI2C通信速度が最大400KHz対応です、ここでは400KHzで行っています。

《その他》

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

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

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

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

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



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


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