5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (44) 距離センサ5 I2C VL53L0X
■レーザーを使った遠距離測距モジュール
VL53L0XはSTMicroelectronicsの約2mまでの距離を測れるデバイスで、VL6180Xと同様にマイコンが搭載されていて、I2Cインターフェースで通信を行います。ホストからはC言語によるAPIが用意されているので、コンパイルをして利用します。もしくは、APIのソース・コードをPythonなどで書き換えて使用します。VL6180Xより設定レジスタの数が増えています。メーカが提供するC言語のプログラムをそのまま利用したほうがよいように思えます。
ここではPythonを利用します。C言語のプログラムをコンパイルしてPythonで呼び出す形で利用しますが、メーカのソースには、同社の評価用ボードがプラットホームとして使われています。LinuxドライバのMakefileにはカメラ・インターフェースのドライバとして利用できるように記述されています。
ラズパイ用にMakefileを書き換えた方がおられます。また、複数のVL53L0Xに対応したpythonのライブラリを作られた方もおられます。
VL53L0Xのパッケージはリードがなく裏面に接点があります。一度はんだ付けを試みましたが、ピンピッチが0.8mmと狭く、失敗しました。ここでは秋月電子通商のモジュールを入手しました。配線に必要な4本の先端にピンヘッダのメスを圧着工具で取り付けました。
●VL53L0Xのスペック
- 計測距離 約3~200cm
- 電源電圧 2.6~3.5V
- インターフェース I2C(転送速度最大400kHz)
- スレーブ・アドレス 0x52(8ビット表記、書き換え可能)
●VL53L0Xモジュールのスペック
- 電源電圧 3.3V、5V
- I2C 信号レベル変換回路を搭載
●接続
ラズパイとの接続です。
VL53L0Xモジュール | ラズパイ |
---|---|
+V | 1番ピン 3.3V |
GND | 6番ピン |
SDA | 3番ピン |
SCL | 5番ピン |
XSHUT | - |
GPIO | - |
上記のように接続が完了したら、ラズパイの電源を入れます。ターミナルから、i2cdetect -y 1 で接続を確認しました。スレーブ・アドレスは0x29でした。
●APIのコンパイルとサンプルの実行確認
C言語のソースは、STMicroelectronicsのこちらからダウンロードします。登録が必要です。ダウンロードしたファイルは/home/piに入っているものとします。
ターミナルから、ラズパイ環境でコンパイルできるファイルをコピーします。
git clone https://github.com/cassou/VL53L0X_rasp |
VL53L0X_raspフォルダができました。そのディレクトリに移動して、ソースのあるディレクトリを指定してmakeを実行します。
cd VL53L0X_rasp API_DIR=~/VL53L0X_1.0.2 make |
API_DIR=~/VL53L0X_1.0.2 make examples |
/bin/vl53l0x_ContinuousRanging_Example |
●Pythonで利用
ターミナルで、/home/piに戻ります。
cd~ |
開発関連のツールbuild-essentialとヘッダ・ファイルや静的ライブラリのpython-devをインストールします。
sudo apt-get install build-essential python-dev |
Pythonのライブラリを作るのに必要なファイルをダウンロードします。
git clone https://github.com/johnbryanmoore/VL53L0X_rasp_python.git |
makeします。
cd VL53L0X_rasp_python make |
サンプルを動かします。
cd python VL53L0X_example.py |
●プログラム
VL53L0X_rasp_python/pythonディレクトリに入り、ここにプログラムを作って保存します。
#!/usr/bin/python
import time
import VL53L0X
tof = VL53L0X.VL53L0X()
tof.start_ranging(VL53L0X.VL53L0X_BEST_ACCURACY_MODE)
timing = tof.get_timing()
if (timing < 20000):
timing = 20000
print ("Timing %d ms" % (timing/1000))
while 1:
distance = tof.get_distance()
if (distance > 0):
print distance/10.0,"cm"
time.sleep(1)
tof.stop_ranging()
# Copyright (c) 2017 John Bryan Moore
●実行
センサの面からは垂直にレーザーが放射されます。したがって、まっすぐの方向の面に反射します。そうした状態で測ると、約1cmから正しい値が計測できました。実験は20cmまでしか行っていません。カタログ上約2mまで計測できるようです。
※プログラムを仮にvl53l0x.pyと/home/pi/VL53L0X_rasp_python/pythonに保存すると、sudo chmod 755 vl53l0x.py で実行権を付け、ターミナルから/home/pi/VL53L0X_rasp_python/pythonディレクトリに移動し、python vl53l0x.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、リターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで改行してください。
※I2Cの有効化は、この説明を参照ください。1-Wireと同じく、I2CやSPIもEnableにチェックを入れています。