레이저 VL53L0X 6핀 모듈과 TM1637 디스플레이를 사용한 Arduino용 거리 측정
이 튜토리얼에서는 VL53L0X 레이저 거리 센서를 사용하여 거리를 측정하고, 측정값을 TM1637 7세그먼트 디스플레이에 표시하는 방법을 배웁니다. 이 프로젝트는 두 구성 요소를 결합하여 간단하면서도 효과적인 거리 측정 도구를 만듭니다. VL53L0X는 레이저 기술을 사용하여 정확한 거리 측정값을 제공하며, TM1637 디스플레이는 이러한 측정값을 사용자 친화적인 형식으로 표시합니다.


필요한 하드웨어, 배선 지침, 그리고 모든 것을 작동시키는 데 필요한 코드를 살펴보겠습니다. 이 튜토리얼이 끝나면 다양한 응용 분야에서 사용할 수 있는 작동하는 거리 측정 장치를 갖게 됩니다. 시각적 가이드를 위해 (비디오 00:00 시점) 영상을 꼭 확인하세요.
하드웨어 설명
이 프로젝트의 주요 구성 요소는 VL53L0X 레이저 거리 센서와 TM1637 디스플레이 모듈입니다. VL53L0X는 레이저 빔을 방출하고 반사가 돌아오는 데 걸리는 시간을 계산하여 물체까지의 거리를 측정하는 비행 시간(time-of-flight) 센서입니다. 2.6V~3.5V의 전압 범위에서 작동하지만 통합 전압 조정기 덕분에 5V에서도 작동할 수 있습니다.
TM1637은 7세그먼트 LED 디스플레이를 제어하는 디스플레이 드라이버입니다. 간단한 2선식 인터페이스(CLK 및 DIO)를 통해 통신하므로 Arduino에 쉽게 연결할 수 있습니다. 디스플레이는 숫자 값을 표시할 수 있으며 VL53L0X 센서의 거리 측정값을 시각화하는 데 적합합니다.
데이터시트 세부 정보
| 제조업체 | STMicroelectronics |
|---|---|
| 부품 번호 | VL53L0X |
| 로직/IO 전압 | 2.6V - 3.5V |
| 공급 전압 | 2.6V - 5V |
| 작동 온도 | -20°C ~ 70°C |
| 측정 범위 | 30mm ~ 2000mm |
| I2C 주파수 | 400kHz |
| 타임아웃 설정 | 500ms |
| 패키지 | 6핀 모듈 |
- 적절한 전원 공급(5V 허용)을 확인하세요.
- 풀업 저항으로 누설을 방지하려면 XSHUT 핀을 연결하세요.
- 통신에는 I2C를 사용하고 SDA 및 SCL을 적절히 연결하세요.
- 예기치 않은 동작을 방지하려면 코드에서 타임아웃을 처리하세요.
- 정확성을 위해 작동 온도 범위를 주의하세요.
배선 지침

VL53L0X와 TM1637 디스플레이를 배선하려면 먼저 VL53L0X의 VCC 핀을 Arduino의 5V 핀에 연결하고 GND 핀을 Arduino의 접지 핀에 연결하세요. 다음으로 VL53L0X의 SDA 핀을 Arduino의 A4 핀에 연결합니다. 이 핀은 일반적으로 I2C 데이터 통신에 사용됩니다. SCL 핀은 클록 신호에 사용되는 Arduino의 A5 핀에 연결해야 합니다.
TM1637 디스플레이의 경우 CLK 핀을 Arduino의 디지털 핀 2에 연결하고 DIO 핀을 디지털 핀 3에 연결하세요. 마지막으로 VL53L0X의 XSHUT 핀을 Arduino의 디지털 핀 12에 연결합니다. VL53L0X의 GPIO1과 같은 사용하지 않는 핀은 연결하지 않은 상태로 두어야 합니다. 이 설정을 통해 Arduino는 센서와 디스플레이 모두와 효과적으로 통신할 수 있습니다.
코드 예제 및 설명
코드는 센서와 디스플레이를 초기화하고 I2C 통신을 설정한 다음 거리 측정값을 지속적으로 읽습니다. 아래는 핀이 구성되고 센서가 초기화되는 setup 함수를 보여주는 코드 조각입니다:
void setup() {
pinMode(12, INPUT_PULLUP); // 핀 12를 입력으로 설정
digitalWrite(12, HIGH); // 핀 12를 높게 설정(5V)
Serial.begin(9600);
Wire.begin(); // I2C 통신 초기화
sensor.init(); // 거리 센서 초기화
sensor.setTimeout(500); // 타임아웃 설정
sensor.startContinuous(); // 측정 유형 설정
}
이 setup 함수에서 XSHUT 핀은 풀업 저항이 있는 입력으로 구성되고 센서는 연속 범위 측정을 위해 초기화됩니다. 또한 거리 측정값을 표시하기 위해 시리얼 모니터가 설정됩니다.
다음으로 메인 루프는 거리를 읽고 디스플레이를 업데이트합니다. 다음은 loop 함수의 핵심 부분입니다:
void loop() {
int distance = sensor.readRangeContinuousMillimeters(); // 거리를 mm 단위로 읽기
display.setSegments(clearLED); // LED 디스플레이에서 이전 값 제거
display.showNumberDec(distance, false, 4, 0); // 거리 표시
Serial.print("Distance: ");
Serial.print(distance); // 시리얼 모니터에 거리 출력
}
이 루프는 센서에서 거리를 지속적으로 읽고 최신 측정값으로 TM1637 디스플레이를 업데이트합니다. 또한 디버깅 목적으로 거리를 시리얼 모니터에 출력합니다. 전체 코드를 보려면 기사 아래에 로드됩니다.
시연 / 기대 효과
설정을 완료하고 코드를 업로드하면 VL53L0X가 측정한 거리가 TM1637에 표시되는 것을 볼 수 있습니다. 물체를 센서에 가까이 또는 멀리 이동하면 표시된 값이 그에 따라 변경됩니다. 예기치 않은 측정값이 발생하면 센서가 가려져 있지 않은지, 물체 표면이 레이저 반사에 적합한지 확인하세요(비디오 09:30 시점).
일반적인 문제로는 배선이 반대로 되었거나 센서가 제대로 초기화되지 않아 타임아웃 오류가 발생하는 경우가 있습니다. 정확한 거리 측정을 위해 올바른 핀이 연결되고 센서에 충분한 전원이 공급되는지 확인하세요.
/* This example shows how to use continuous mode to take readings.
This is Arduino code to measure distance with VL53L0X and display it on a TM1637 LED 7-segment display.
Original Laser Sensor source: https://github.com/adafruit/Adafruit_VL53L0X
Modified by Ahmad Shamshiri for RoboJax.com
Date modified: May 31, 2018 at 19:25 in Ajax, Ontario, Canada
You have to watch 1 video before using this code:
1- Watch VL53L0X video and get code https://youtu.be/1n9eJ9HaYpE
2- Watch TM1637 video and get code https://robojax.com?vid=robojax-TM1637
You can get this code from Robojax.com
Pin connection
VL53L0X Pin Arduino Pin
VCC 5V
GND GND
SDA A4 or SDA if available
SCL A5 or SCL if available
GPIO1 leave it unconnected
XSHUT D12 (digital 12 or pin 12)
*/
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
/////// start of TM1637 Display
#include <Arduino.h>
#include <TM1637Display.h>
#define CLK 2
#define DIO 3
#define TEST_DELAY 500
TM1637Display display(CLK, DIO);
uint8_t clearLED[] = { 0x0, 0x0, 0x0, 0x0 }; // value for clearing the LEDs
////// End of TM1637 Display
void setup()
{
pinMode(12,INPUT_PULLUP);// set pin 12 for input
digitalWrite(12,HIGH);// set pin 12 high (5V)
Serial.begin(9600);
Wire.begin();// I2C communication initialized
sensor.init();// distance sensor is initialized
sensor.setTimeout(500); // time out is set
// 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();// type of measurement is set
Serial.println("VL53L0X with MAX6675 test");
delay(500);
display.setBrightness(0x0f);// set brightness for display
}
void loop()
{
int distance =sensor.readRangeContinuousMillimeters();// read the distance in mm
display.setSegments(clearLED);// remove previous value from LED display
display.showNumberDec(distance, false, 4, 0);// display the distance
//distance = distance;
Serial.print("Distance: ");
Serial.print(distance);// print distance on serial monitor
Serial.print("mm");
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
delay(100);
}
자원 및 참고자료
아직 자원이 없습니다.
파일📁
데이터시트 (pdf)
-
TM1637 데이터시트
/download/datasheet/robojax_TM1637_datasheet.pdf0.67 MB
프리징 파일
-
TM1637 Seven Segment module
TM1637.fzpz0.01 MB -
TM1637 4 digit seven segment display
TM1637-1.fzpz0.01 MB -
Adafruit VL6180X Time of Flight Distance SensorFritzing part for the Adafruit VL6180X Time of Flight distance sensor. This sensor measures absolute distance up to 100mm and ambient light, communicating via I2C. Includes the sensor breakout board and pin connections for use in Fritzing projects.
Adafruit VL6180X Time of Flight Distance Sensor-1.fzpz0.02 MB
사용자 매뉴얼
-
TM1637 디스플레이 매뉴얼
robojax-TM1637_display_manual.pdf0.31 MB
다른 파일들
-
Polou VL53L0X 라이브러리
robojax-VL53L0X-polou-arduino-master.zip0.02 MB -
VL53L0X_Distance_sensor_purple
VL53L0X_Distance_sensor_purple.fzpz0.01 MB