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の方が適している。
マイクロビットでの動作テスト
購入した基板とマイクロビットを、I2Cで接続して動作を試してみる。I2Cの端子が取り出せるように、センサーシールドを使用した。
MakeCodeの拡張機能で検索すると、APDS9930というブロックが出てくる。これを使って簡単にコードを組むことができたが、検出値を取り出すことができていないようだった。
APDS-9930のI2Cについて
既存の拡張機能で動作が確認できなかったので、細かく調べていくことにした。
I2Cのデバイスでは通常、対象となるレジスタアドレスをWriteしてから、データのWriteやReadを行う。APDS-9930ではここが、Command Codeという形になっている。
細かいことは省略するが、要はレジスタアドレスに"0x80"もしくは"0xA0"を加えた形でWriteしないといけないらしい。
これを踏まえて、先程の拡張機能の処理内容を確認した。setRegの方ではちゃんと処理しているのだが、なぜかgetRegの方ではレジスタアドレスをそのままWriteしてしまっている。これでは動作させることはできない。
MakeCodeでのコード
そういったわけで、自分で組んだ制御コードが以下である。
数値が10進数で表示されてしまうのでとてもわかりにくい。特にWriteの方は、データもまとめて16ビットの数値で入れないといけないので、このような形になった。
こちらのコードで無事に検出値を取り出すことができた。実際に手を近づけてみて、検出値が変化することも確認できた。
デバイスのID値について
試していて1点、不可解なことがあった。データシートによると、IDレジスタ(0x12)をReadして出てくるデバイスIDの値は、"0x39"となっている。
しかし実際にIDを読み出してみると、"0x30"であった。購入した基板は3枚あったが、すべて同じである。
調べてみたが、そのような情報は見つからなかった。問題なく動作しているようだし、偽造品ということでもないと思うが、ちょっと気持ち悪い。