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にチェックを入れています。