Avago Technologies(現在はBroadcom)の近接センサ、APDS-9930を使ってみた。マイクロビット用のMakeCodeで、ブロックプログラミングでの制御を試してみた。既存の拡張機能では上手く動作せず、I2Cで制御することで動作させることができた。

APDS-9930について

Avago Technologiesの、近接と照度を検出できるセンサである。よく見かけるものでAPDS-9960があるが、APDS-9960はジェスチャーの検出ができるものになっている。

AmazonでAPDS-9930を使った基板の販売ページを見てみると、「ジェスチャー」と書かれたものが多く見つかるが、APDS-9930で検出できるのは近接と照度だけである。おそらくAPDS-9960と混同しているのだろう。APDS-9930の方が安いので、近接だけ検出したいのであればAPDS-9930の方が適している。

購入したAPDS-9930の基板

マイクロビットでの動作テスト

購入した基板とマイクロビットを、I2Cで接続して動作を試してみる。I2Cの端子が取り出せるように、センサーシールドを使用した。

MakeCodeの拡張機能で検索すると、APDS9930というブロックが出てくる。これを使って簡単にコードを組むことができたが、検出値を取り出すことができていないようだった。

MakeCodeの機能検索画面

APDS-9930のI2Cについて

既存の拡張機能で動作が確認できなかったので、細かく調べていくことにした。

I2Cのデバイスでは通常、対象となるレジスタアドレスをWriteしてから、データのWriteやReadを行う。APDS-9930ではここが、Command Codeという形になっている。

APDS-9930のデータシートより 2番目が”Command Code”となっている

細かいことは省略するが、要はレジスタアドレスに"0x80"もしくは"0xA0"を加えた形でWriteしないといけないらしい。

APDS-9930のデータシートより "Command Code"の詳細

これを踏まえて、先程の拡張機能の処理内容を確認した。setRegの方ではちゃんと処理しているのだが、なぜかgetRegの方ではレジスタアドレスをそのままWriteしてしまっている。これでは動作させることはできない。

拡張機能"APDS9930"のソースコードの一部

MakeCodeでのコード

そういったわけで、自分で組んだ制御コードが以下である。

初期化の処理

検出値の読み出し

数値が10進数で表示されてしまうのでとてもわかりにくい。特にWriteの方は、データもまとめて16ビットの数値で入れないといけないので、このような形になった。

こちらのコードで無事に検出値を取り出すことができた。実際に手を近づけてみて、検出値が変化することも確認できた。

デバイスのID値について

試していて1点、不可解なことがあった。データシートによると、IDレジスタ(0x12)をReadして出てくるデバイスIDの値は、"0x39"となっている。

APDS-9930のデータシートより ID値は"0x39"

しかし実際にIDを読み出してみると、"0x30"であった。購入した基板は3枚あったが、すべて同じである。

ロジアナでID検出をモニタした波形 "0x30"が読み出されている

調べてみたが、そのような情報は見つからなかった。問題なく動作しているようだし、偽造品ということでもないと思うが、ちょっと気持ち悪い。