BluePillでは検出すらできなかったAPDS-9960ですが、Raspberry Piで試してみます。
とりあえず、3.3V、GND、SDA、SCLを結線してRaspberry Piの電源を入れて、I2C上に見えているか確認します。
$ i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --
$
アドレス0x39でデバイス自体は見えているようですので、実際に動作させます。今回はお手軽に済ませたいので、こちらのライブラリを使用して進めます。
まずはPython3の仮想環境を作って、ライブラリをインストールします。
$ cd python3
$ python3 -m venv apds9660
$ cd apds9660
$ source bin/activate
$ pip install --upgrade pip
$ pip install apds9960 RPi.GPIO smbus
$ cd python-apds9960
$ python3 setup.py install
/usr/lib/python3.7/distutils/dist.py:274: UserWarning: Unknown distribution option: 'long_description_content_type'
warnings.warn(msg)
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/apds9960
copying apds9960/const.py -> build/lib/apds9960
copying apds9960/__init__.py -> build/lib/apds9960
copying apds9960/device.py -> build/lib/apds9960
copying apds9960/exceptions.py -> build/lib/apds9960
running install_lib
running install_egg_info
Writing /home/pi/python3/apds9660/lib/python3.7/site-packages/apds9960-0.2.egg-info
$
gitでプロジェクトをcloneしてサンプルプログラムを実行してみます。
$ git clone https://github.com/liske/python-apds9960.git
Cloning into 'python-apds9960'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 114 (delta 3), reused 6 (delta 2), pack-reused 102
Receiving objects: 100% (114/114), 37.23 KiB | 150.00 KiB/s, done.
Resolving deltas: 100% (49/49), done.
$ cd python-apds9960/rpi
$ python3 test_gesture.py
Traceback (most recent call last):
File "test_gesture.py", line 8, in <module>
bus = smbus.SMBus(port)
FileNotFoundError: [Errno 2] No such file or directory
$
ということで、エラーになってしまいます。どうやら、普通のsmbusモジュールでは仮想環境ではダメなようです。
$ pip install smbus2
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting smbus2
Downloading https://www.piwheels.org/simple/smbus2/smbus2-0.3.0-py2.py3-none-any.whl (9.1 kB)
Installing collected packages: smbus2
Successfully installed smbus2-0.3.0
$
として、smbus2というモジュールをインストールします。その後、test_gesture.py の ソースの冒頭の
import smbus
というモジュールをインポートしている箇所を
import smbus2 as smbus
と修正します。これで実行すると、今度は、
$ python3 test_gesture.py
Traceback (most recent call last):
File "test_gesture.py", line 8, in <module>
bus = smbus.SMBus(port)
File "/home/pi/python3/apds9660/lib/python3.7/site-packages/smbus2/smbus2.py", line 279, in __init__
self.open(bus)
File "/home/pi/python3/apds9660/lib/python3.7/site-packages/smbus2/smbus2.py", line 308, in open
self.fd = os.open(filepath, os.O_RDWR)
FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'
$
ということで、「そんなデバイスはない」と怒られます。ソース7行目の「port = 1」を「port = 0」に修正すると、ようやく動作しました。センサーの前で手を動かすと、その方向に応じた表示が出ます。なかなか面白いです。
・・・・が、Raspberry Piで動かすのではなく、もっと小さなマイコンで動かしたいんだよなぁ。なんでBluePillのI2Cは動かないんだろう??