APDS-9960ジェスチャーセンサーには、可視光照度を測るフォトダイオードが4つ(RGB,Clear)あり、適切に設定することでPICなどマイコンに数値を取り込むことができます。
しかし最初は動作も使い方もよくわからずいろいろとつまずきました。
・AEN=1(ALSをENABLE)にすればいつかAVALID=1(ALS値は有効)と測定は完了します。ジェスチャーセンサーがデータ取得完了時にインタラプトで通知してくれるのとは違います。測定完了を通知する方法は無いのでマイコン側からは適切な時間おきに読みに行く(ポーリングする)必要があります。(←間違いかも。どうやっても測定データが閾値内に入らないよう閾値を設定し、Persistenceを0にすれば毎回AINTが発生するはず。実験中)
低閾値=1、高閾値=0で、APERS=0回に設定したところ、毎回測定完了でAINT(ALSインタラプト)が発生しました。
・16bitフルスケールで照度を取得するにはATIMEを 0xC0=192 以下に設定する必要があります。↓
初期設定のままだとATIME=0xFF=255となっていて測定時間が2.78ms、MAXカウントが1025になるので、0~65535の値が取得できると思って高閾値=0xFFE0、低閾値=0x0003のような設定を最初試みましたが無意味でした。
・フォトダイオードがサチって(Saturation=飽和)、取得した照度の信頼性が無いことをCPSAT(Clear Photodiode SATuration)フラグで教えてくれます。またそのときインタラプトを発生させることができます。
・高閾値、低閾値に挟まれないデータをAPERS(Persistenceレジスタの APERS に設定)回、連続で取得した場合、インタラプトを発生させることができます。
上記2つの事象は測定データが不要の場合に相当し、この場合のみインタラプトが使えるということです。(←同上で間違いかも。実験中)
同上、必要データ測定完了でも特定の設定にて、インタラプトは使えます。
・測定と測定の間の時間をWEN(Enable Register の Wait Enable bit)、WTIME(Wtime Register)、WLONG(Config one Register の WLONG bit) で設定します。最初WTIMEを50msを表す値(=0xEE)を設定、WLONG=1にしていましたが、WLONGは0で1倍、1で12倍にすることを見落としてました。
結果的には50x12=600msの間をあけて照度を測るようになっていました。メインプログラム側でAVALIDをポーリングしていましたが、600msを待たずにALS停止→開始を繰り返していたので測定できませんでした。
実際のポーリング間隔として正しいのは、ATIMEに設定した値が 0xC0 の場合、測定時間が175ms程度になるので、上記600msと175msを足した775ms付近となります。
ポーリングの場合は上記設定、測定完了の割り込みも使えます。
それではなんとか測定ができるようになったので、いろんなタイプのLED光源で値を見てみます。表示が8桁2行しかないので16進数表示、上段左半分がClear値、右がRed、下段左半分がGreen値、右がBlue値になります。
まずは、部屋の明るさ。照明は何もない状態です。
C=10、R=3、G=4、B=4
自作観望用ライト
C=0x0312=786、R=0x02e7=743、G=0x0040=64、B=0x0066=102
ほとんど赤の波長しかないようなライトですね。
GENTOS GTR-031T ライト
C=0xffff=65535、R=0x6b0f=27407、G=0x75ce=30158、B=0x824a=33354
サチってます。CPSATフラグが出たとき”S”を1文字目に出力するようにしてあります。
BLUEの比率が高くて青色LEDが使われている感じがします。
ちょっと離して再測定
C=0xe25c=57948、R=0x4626=17958、G=0x4809=18441、B=0x540e=21518
Lighting EVER製紫外線ライト (ピーク波長=395nm カタログ値)
C=0x431c=17180、R=0x11a9=4521、G=0x059e=1438、B=0x2adb=10971
下のAPDS-9960データシートから切り取った各波長に対する反応グラフでは、350nm以下は測定不能なのでこの紫外線ライトはわりと下限いっぱい。
これを使って照度を比較することはできそうですが、照度計ということではないので正確なルクスがわかるわけではないですね^^;
今回ALS初期化に使った関数
ALS Gain 調整はしていません。(AGAIN_1x)