Hardware | VL53L0X 레이저 거리 측정 센서 사용해 보기

|

1. 드론


드론 제작시 필요한 sensor 중에 하나는 거리 측정기 라고 합니다.

이는 호버링이나 일정한 높이를 유지하면서 이동시, 항상 지상의 높이를 측정하여 자기의 위치를 알아야 하니까요.


또한 충돌 방지등에도 필요할 것 같습니다.



드론이 보는 시각은 향후 이렇게 되겠죠?





2. 주문


항상 그렇듯 AliExpress 에서 검색하여 주문하였습니다.


정식 명칭은,

"VL53L0X,Time-of-Flight (ToF) Laser Ranging Sensor Breakout 940nm GY-VL53L0XV2 Laser Distance Module I2C IIC" 입니다.


https://ko.aliexpress.com/item/VL53L0X-Time-of-Flight-ToF-Laser-Ranging-Sensor-Breakout-940nm-GY-VL53L0XV2-Laser-Distance-Module-I2C/32773306734.html



여러가지 breakout 보드가 존재하지만, 이 제품이 고정홀이 2개이고 가장 저렴해서 선택했습니다.




3. 도착


도착샷들 입니다.

AliExpress 제품답게 포장되어 왔습니다. Gift 표시가 빠지면 섭섭하지요.



레이저를 쏘는 소자 부분입니다.



뒷면은 신호처리에 필요한 회로로 구성되어 있습니다.





4. Layout


Pin 연결 정보 입니다.


  VL53L0X | Arduino Nano
-------------------------
    VIN   |     3.3V
    GND   |     GND
    SCL   |     A5
    SDA   |     A4
-------------------------



I2C를 사용하는지라, SSD1306 연결과 완벽하게 동일합니다.


  SSD1306 | Arduino Nano
-------------------------
    VCC   |     3.3V
    GND   |     GND
    SDC   |     A5
    SDA   |     A4
-------------------------


구성도는 다음과 같습니다.





5. VL53L0X sketch


Adafruit 용 VL53L0X library 를 다운로드 받아 libraries 폴더에 카피합니다.


* Adafruit VL53L0X library

https://github.com/adafruit/Adafruit_VL53L0X


#include "Adafruit_VL53L0X.h"

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

void setup() {
	Serial.begin(115200);
	
	// wait until serial port opens for native USB devices
	while (! Serial) {
	delay(1);
	}
	
	Serial.println("Adafruit VL53L0X test");
	if (!lox.begin()) {
	Serial.println(F("Failed to boot VL53L0X"));
	while(1);
	}
	// power 
	Serial.println(F("VL53L0X API Simple Ranging example\n\n")); 
}


void loop() {
	VL53L0X_RangingMeasurementData_t measure;
	
	Serial.print("Reading a measurement... ");
	lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!
	
	if (measure.RangeStatus != 4) {  // phase failures have incorrect data
	Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter);
	} else {
	Serial.println(" out of range ");
	}
	
	delay(100);
}


I2C detector 로 확인해 보면 VL53L0X 의 기본 address 인 "0x29" 이라는 것을 확인할 수 있습니다.


#include "Wire.h"
#include "i2cdetect.h"
 
void setup() {
    Wire.begin();
    Serial.begin(9600);
    Serial.println("i2cdetect example\n");
    Serial.print("Scanning address range 0x03-0x77\n\n");
}
 
void loop() {
    i2cdetect(); // default range from 0x03 to 0x77
    delay(2000);
}




6. VL53L0X + OLED


SSD1306 OLED sample sketch 도 있어서 실행하면 에러를 냅니다.

원인은 library source 가 다른것.



특이하게도 Adafruit sample 에 vl53l0x_oled 라고 되어 있음에도 불구하고,

pololu 제작자가 만든 library 를 다운로드 받아서사용해야 합니다.


* VL53L0X library

https://github.com/pololu/vl53l0x-arduino


/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

#include "Wire.h"
#include "VL53L0X.h"
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 display = Adafruit_SSD1306();

VL53L0X sensor;

void setup()
{
	Serial.begin(9600);
	
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
	// init done
	display.display();
	delay(1000);
	
	
	Wire.begin();
	
	sensor.init();
	sensor.setTimeout(500);
	
	// 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();
	
	// text display big!
	display.setTextSize(4);
	display.setTextColor(WHITE);
}

void loop()
{
	uint16_t reading = sensor.readRangeContinuousMillimeters();
	
	if (reading > 8000) {
		display.display();
		display.clearDisplay();
		return;
	}
	
	Serial.print(sensor.readRangeContinuousMillimeters());
	if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
	
	display.clearDisplay();
	display.setCursor(0,0);
	display.print(reading);
	display.print("mm");
	display.display();
	Serial.println();
	delay(50);
}


이번에는 OLED 를 추가하였으므로, I2C detector 로 확인해 보면 아래와 같이 "0x3c" 가 추가적으로 검출된 것을 알 수 있습니다.

속도는 좀 느릴지 모르지만, address 를 따로 가지고 있어서 동시에 같은 pin 연결을 할 수 있는 I2C 의 강점인것 같습니다.


* 참고 글

http://chocoball.tistory.com/entry/Hardware-SSD1306-128x64-monochrome-OLED





7. 결과


VL53L0X 센서만 부착하여 "Serial Monitor" 로 확인한 내용입니다.



아래는 OLED 를 부착하여 측정한 내용입니다.

15Cm 자를 쟀는데, 20Cm 언저리가 나오네요. 뭔가 칼리브레이션이 필요한 듯 보입니다.



왔다갔다 하면서 측정해 봤습니다.

역시 5Cm 정도가 이미 + 가 되어 있네요. 조정이 초기에는 필요한것 같습니다.



센서부를 찍어봤습니다.

맨눈으로는 보이지 않지만, 감도가 좋은 스마트폰 카메라에는 센서에서 나오는 불빛이 보입니다.

아마도 레이저겠죠?





FIN


잘만 사용하면 요긴하게 쓰일 수 있을것 같습니다.

애들 키 재는 용도로도 쉽게 만들 수 있을것 같네요.

And