아두이노/아두이노 일반

거리측정센서(Time of Flight; VL53L0X) 아두이노, ESP8266, Wemos

아크리엑터 2024. 12. 22. 20:59
반응형

거리측정센서를 여러개 알아봤다. 50cm전후에서 사람이 근접하는 것을 찾으려고 했다.

초음파센서도 있었고, 적외선을 이용한 센서도 있었다. 웬지 초음파센서는 배터리를 많이 사용할 것 같아서, 적외선센서를 찾아보았는데, 샤프의  2Y0A21 센서는 너무 비싸고 크기도 많이 커서 사용하기에는 좀 버거운 느낌이 들었다.

그러다가, 찾은 센서가 아래 것인데, 가겨고 싸고 크기도 작아서 사용하기에 너무 괜찮아 보인다. 가격은 2달러 미만이다.

크기는 25mm x 11mm 정도 된다. 두께도 아주 얇아서 보드를 작게 만들때 괜찮을 것 같다.

구매는 아래의  알리익스프레스 링크를 아래에 추가하였다. 이런 모델로 구매하면 된다.

https://s.click.aliexpress.com/e/_oF7UvB9

 

VL53L0X Time-of-Flight (ToF) Laser Ranging Sensor Breakout 940nm GY-VL53L0XV2 Laser Distance Module I2C IIC 25MM*10.7MM - AliExp

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

이 모듈은 레이저를 이용하여 거리를 측정한다. 최대 2미터까지 측정가능하다고 하며 1mm단위로 측정할 수 있다. 실제 시험을 해보니, 2m까지는 안되는 것 같고 1m는 조금 넘는 것 같다. 그리고 측정값은 정확하게 보인다.

레이저를 사용하는 것이라 수명이 얼마나 갈지는 모르겠다. 만들때 부품 고장날 것을 고려해서 교체가 쉽도록 만들어야 할지도 모르겠다, .

통신은 I2C통신을 하는데, I2C 구분하는 값은 0x29로 되어있다.

 

핀 정보

구분 내용 비고
VIN 3~5v  
GND GND  
SCL I2C Clock   
SDA I2C Data  
GPIO1 Interrupt용.  특정 거리 내에 들어왔을 때, Digital PIN에 HIGH값을 보내어서, 아두이노를 깨우는 역할을 하게 할 수 있다.
XSHUT Default: HIGH 센서를 끄는 용도로 사용
LOW 입력시, 센서가 셧다운 모드로 전환

 

보드 연결

센서 아두이노 nodemcu 8266 (wemos)
VIN VCC 3V3
GND GND GND
SCL A5 D1
SDA A4 D2
GPIO1    
XSHUT    

 

인터럽트 기능은 나중에 고민해보고, 핀 연결하고 프로그램을 돌려본다. vl53l0x 라이브러리의 예제를 사용했다.

#include "Adafruit_VL53L0X.h"

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

void setup() {
  Serial.begin(9600);

  Serial.println("starting");

  // wait until serial port opens for native USB devices
  while (! Serial) {
    delay(1);
    Serial.println("delay..");
    
  }
  
  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);
}

 

정상적으로 실행된 결과다. 


20:56:03.571 -> Reading a measurement... Distance (mm): 542
20:56:03.691 -> Reading a measurement... Distance (mm): 444
20:56:03.867 -> Reading a measurement... Distance (mm): 342
20:56:04.005 -> Reading a measurement... Distance (mm): 263
20:56:04.144 -> Reading a measurement... Distance (mm): 203
20:56:04.284 -> Reading a measurement... Distance (mm): 159
20:56:04.422 -> Reading a measurement... Distance (mm): 129
20:56:04.560 -> Reading a measurement... Distance (mm): 113
20:56:04.685 -> Reading a measurement... Distance (mm): 96
20:56:04.854 -> Reading a measurement... Distance (mm): 84
20:56:04.993 -> Reading a measurement... Distance (mm): 74
20:56:05.110 -> Reading a measurement... Distance (mm): 65
20:56:05.272 -> Reading a measurement... Distance (mm): 59
20:56:05.394 -> Reading a measurement... Distance (mm): 57
20:56:05.564 -> Reading a measurement... Distance (mm): 54
20:56:05.702 -> Reading a measurement... Distance (mm): 52
20:56:05.840 -> Reading a measurement... Distance (mm): 50
20:56:05.979 -> Reading a measurement... Distance (mm): 49
20:56:06.104 -> Reading a measurement... Distance (mm): 52
20:56:06.270 -> Reading a measurement... Distance (mm): 55
20:56:06.407 -> Reading a measurement... Distance (mm): 51
20:56:06.544 -> Reading a measurement... Distance (mm): 46
20:56:06.671 -> Reading a measurement... Distance (mm): 44
반응형