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は動かないんだろう??