M5stickC plusでレーザー距離センサーVL53L0Xを動かしてみる
大型バイクのデーターロガーを作ってみようの第1段で、距離センサーを動かします。
レーザーを使った非接触センサーを使います。
データーロガーの全体像は、追々まとめていきたいと思います。
はじめに
STマイクロ社製のVL53シリーズレーザー距離センサーを使います。値はI2Cに出力されるので、
マイコン、ラズパイいずれでもOKです。今回は空いていたM5sticCplusを使います。
レーザー距離センサーは、こちら。
M5stickCplusはこちら。
各種仕込み
配線
センサー出力は6線出ていますが、Vcc,GND,I2C(SDA,SCL)の4線のみ接続すればいいようです。
M5stickCplusのGROVEコネクターにブレッドボードを介して接続します。
1
2
3
4
5
| M5stickC VL53
G32 SDA
G33 SCL
Vcc V+
GND GND
|
ソフトウェア
先人が多数いるので、センサー読み出しは簡単にできます。M5stickCのLCDに読んだ値と値の横バーを表示します。ちらつかないようにsprite機能を使いました。
VScode+PlathomeIO環境にてarduinoを使って作成しました。ページ下部にソースを載せておきます。
動作確認
USB経由でM5stickCにバイナリーを書き込むとちゃんと動きました。測定限界の値と横バー表示は、若干調整が必要です。
動画は、右側に距離センサーを左側に向けて固定し左側の手を動かして距離を測定している状況です。
まとめ
STマイクロ社製のVL53シリーズレーザー距離センサーを使って、M5stickCplusにセンサー値を表示させました。ざっと測った感じでは1mm単位で正確に計測されている感じです。
今後は、BlueToothでデーターロガー本体に値を転送して、各種データーの収集や表示を少しづつ進めていきたいと思います。
参考リンク
arduinoソースコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| #include <M5StickCPlus.h>
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
TFT_eSprite sprite = TFT_eSprite(&M5.Lcd);
// 距離mm
int dist = 0;
void Distance_screen_display(int dist){
//画面を黒でクリアー
sprite.fillRect(0, 0, M5.Lcd.width(), M5.Lcd.height(), BLACK);
// text 表示
sprite.setCursor(0,5,2);
sprite.setTextSize(2);
sprite.printf("dist:%d\n", dist);
// bar 表示
sprite.fillRect(0, 60, (int)dist*M5.Lcd.width()/1000, 10, YELLOW);
// スプライトを表示画面に転送する
sprite.pushSprite(0, 0);
delay(50);
}
void setup() {
M5.begin();
Serial.begin(115200);
M5.Lcd.setRotation(3);
// スプライトの作成
sprite.setRotation(3);
sprite.createSprite(M5.Lcd.width(), M5.Lcd.height());
//
// I2C and Sensor start
// 32 SDA, 33 SCL
//
Wire.begin(GPIO_NUM_32, GPIO_NUM_33); //Inialize I2C Hardware
//タイムアウトまでの時間をセット
sensor.setTimeout(500);
//距離センサ(VL53L0X)の初期化
if (!sensor.init())
{
Serial.println("Failed to detect and initialize sensor!");
while (1) {}
}
// Start continuous back-to-back mode (take readings as
// fast as possible). To use continuous timed mode
// instead, provide a desired inter-measurement period in
// ms (e.g. sensor.startContinuous(100)).
sensor.startContinuous();
}
void loop() {
// sensor値読み
dist = sensor.readRangeContinuousMillimeters();
// タイムアウトが起きた場合はタイムアウトが起きたことを出力
if (sensor.timeoutOccurred()) {
Serial.print(" TIMEOUT");
}
// シリアルにsensor値出力
Serial.println(dist);
// Lcd出力
Distance_screen_display(dist);
}
|