Raspberry Pi講座 距離センサ(VL53L0X)

今回はスイッチサイエンス製のVL53L0X Time-of-Flight 距離センサモジュール 1512円を使用してみたいと思います。
VL53L0XもPWMコントローラ (PCA9685)と同じくI2C接続を行います。

Raspberry PiとVL53L0Xの接続
以下のように配線を行ってください。

Raspberry PiのI2Cを有効にする
Raspberry PiのI2C接続をraspi-configを使って有効にします。
$sudo raspi-config
『5 Interfacing Options 』⇒『P5 I2C』⇒『はい』

VL53L0Xとの通信確認とI2Cチャンネルの確認
$sudo apt-get update
$sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$sudo apt-get install python-dev and python3-dev

$sudo apt-get -y install python-smbus i2c-tools
$sudo i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

上記の結果より、VL53L0Xは0x29というチャンネルに接続されまた通信もできていることが分かります。

VL53L0X APIのダウンロード、解凍、Raspberry Piへコピー
Windows PCで『http://www.st.com/content/st_com/en/products/embedded-software/proximity-sensors-software/stsw-img005.html』の以下ののボタンよりSTSW-IMG005をダウンロードします。

ダウンロードしたZIPファイルを解凍すると『VL53L0X_1.0.2』というフォルダがあるので、SFTP等でRaspberry Piにコピーします。初心者の方はホームディレクトリ(/home/pi)にコピーしてください。

VL53L0X APIをRaspberry Pi上でコンパイルする
VL53L0X APIをRaspberry Pi上でコンパイルするためのmakefileを『https://github.com/cassou/VL53L0X_rasp』で公開されていますので以下のコマンドでホームディレクトりにダウンロードします。
$cd ~
$git clone https://github.com/cassou/VL53L0X_rasp
次にダウンロードしたディレクトリに移動し先ほどRaspberry Piに保存したAPI(VL53L0X_1.0.2)を指定してコンパイルを行います。
$cd VL53L0X_rasp
$API_DIR=~/VL53L0X_1.0.2 make
せっかくなので、VL53L0X_raspで保存したC言語のサンプルプログラムをコンパイルし、実行してみましょう。
$API_DIR=path/to/the/api/dir make examples
$./bin/vl53l0x_ContinuousRanging_Example

以下のようにプログラムが動けばここまでの作業は問題なしです。因みに各行の一番右側の数字が対象物までの距離[mm]となっています。


VL53L0XをPythonで使用する
VL53L0X_rasp_pythonに必要なモジュールをインストールする
$sudo apt-get install build-essential python-dev

VL53L0X_rasp_pythonをインストールする
$cd ~
$git clone https://github.com/johnbryanmoore/VL53L0X_rasp_python.git
$cd VL53L0X_rasp_python
$make

ここでもサンプルプログラムを実行してみましょう
          $cd python
$python VL53L0X_example.py

以下のようにプログラムが動けばここまでの作業は問題なしです。


自分でのVL53L0Xを使用するPythonプログラム(vl53l0x_test.py)を作成する

VL53L0X.pyとbinを作業用のディレクトリへコピーする
(私の場合は作業用ディレクトリ名が~/python_test/ですが各自の環境のフォルダに読み替えてください)
$cp python/VL53L0X.py ~/python_test/
$cp -rf bin ~/python_test/

作業用フォルダへ移動する
$cd ~/python_test

VL53L0X.pyとbinディレクトリの位置関係が変わったのでVL53L0X.pyの以下の行を書き換える
(元)tof_lib = CDLL("../bin/vl53l0x_python.so")
 ↓
(変更後)
tof_lib = CDLL("./bin/vl53l0x_python.so")

以下のコードを『vl53l0x_test.py』という名前で保存する。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time             #time(sleepを使うためのモジュール)のインポート
import VL53L0X          #VL53L0X(spi通信を行うためのモジュール)のインポート

"""メイン関数"""
if __name__ == '__main__':
    """VL53L0Xのインスタンスを作成"""
    tof = VL53L0X.VL53L0X(address=0x29)

    #距離の取得を開始する
    tof.start_ranging(VL53L0X.VL53L0X_BETTER_ACCURACY_MODE)

    try:
        while True:
            dist = tof.get_distance()/float(10)   #VL53L0Xから距離[cm]を取得する
            print ("%0.1f cm " % dist)     #距離[cm]を表示する
            time.sleep(1)               #1[s]スリープする
    except KeyboardInterrupt  :         #Ctl+Cが押されたらループを終了
        print("\nCtl+C")
    except Exception as e:
        print(str(e))                   #例外処理の内容をコンソールに表示
    finally:
        tof.stop_ranging()              #VL53L0Xの終了処理
        print("\nexit program")         #プログラムが終了することを表示する

自分でのVL53L0Xを使用するPythonプログラム(vl53l0x_test.py)を実行する
『$python python vl53l0x_test.py』でサンプルプログラムを実行すると、以下のようなプログラムが動きます。
尚、vl53l0x_text.pyと同じディレクトリに先ほど修正した『VL53L0X.py』と『bin』が必要になります。






   




Comments