Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

go言語でvl53l0xを使ってみる

以前、vl53l0xで距離測定を行いました。
elsammit-beginnerblg.hatenablog.com

どうせなら、go言語でも実施してみたいな!!と思い調べてみました!!
せっかく調べたのでまとめておこうと思います!!



■使用環境

用いたデバイスは下記です。
・ラズパイ4
・測距センサ

測距センサですが、こちらを利用。

VL53L0Xレーザー測距センサーToF測距飛行時間測距センサーモジュール

新品価格
¥1,450から
(2020/12/12 22:38時点)

VL53L0Xを用いた構成は下記となります。
f:id:Elsammit:20200906172530p:plain

■ラズパイへのI2C設定

ラズパイへのI2C設定は以前こちらにまとめましたので必要に応じて確認ください。
elsammit-beginnerblg.hatenablog.com

■Go言語でのvl53l0x事前準備

Go言語でvl53l0xを用いるにあたり、すでにライブラリが用意されております!!
ライブラリをインストールするにあたり、こちらのコマンドを実行。

go get -u github.com/d2r2/go-vl53l0x

エラーメッセージが表示されなければインストールは完了です!!
設定は以上になります!!すでにライブラリが用意されているのでセッティングが楽ですね!!

■Go言語でvl53l0xを用いた距離測定

ではセッティングが完了しましたので、さっそく距離測定を行うコードを書いていきたいと思います!!
と言ってもすでに本ライブラリを作成した方がサンプルを展開されておりますので、そちらを流用!!

package vl53l0x

import (
	"fyne.io/fyne/widget"
	i2c "github.com/d2r2/go-i2c"
	vl53l0x "github.com/d2r2/go-vl53l0x"
	"log"
	"strconv"
	"time"
)

func main() {
	i2c, err := i2c.NewI2C(0x29, 1)
	if err != nil {
		log.Fatal(err)
	}
	defer i2c.Close()

	sensor := vl53l0x.NewVl53l0x()
	err = sensor.Reset(i2c)
	if err != nil {
		log.Fatal(err)
	}
	err = sensor.Init(i2c)
	if err != nil {
		log.Fatal(err)
	}
	for {
		rng, err := sensor.ReadRangeSingleMillimeters(i2c)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf("Measured range = %v mm", rng)
		time.Sleep(time.Second)
	}
}

こちらのコードですが、

i2c, err := i2c.NewI2C(0x29, 1)

でI2Cのデバイス番号(0x29)とI2Cのデバイスドライバ番号(1)を設定します。
それぞれ、
バイス番号

i2cdetect -y 1

デバイスドライバ番号

ls /dev/i2c*

で確認できます。

そしてこちらのコードでセンサを定義するのと同時にI2Cの初期化を行います。

sensor := vl53l0x.NewVl53l0x()
err = sensor.Reset(i2c)
err = sensor.Init(i2c)

最後に、

	for {
		rng, err := sensor.ReadRangeSingleMillimeters(i2c)
		if err != nil {
			log.Fatal(err)
		}
		log.Printf("Measured range = %v mm", rng)
		time.Sleep(time.Second)
	}

で1秒ごとに距離の測定を行います。
距離はミリメートルで取得できます。

■困っていること

デバッグログがかなり出力されてしまうので他のログが醜くなっているのが厄介だな、と感じております。
無効方法が分かっていないのでもう少し調べてみようと思います!!

■最後に

go言語でもvl53l0xが制御できるようになりました!!
最近デバイス制御系に偏ってしまっている気がするので、改めてWeb系をやっていこうかな?と思います。