Search Code

레슨 78: VL53L0X로부터의 거리를 LCD에 표시하기 | 아두이노 단계별 강좌

레슨 78: VL53L0X로부터의 거리를 LCD에 표시하기 | 아두이노 단계별 강좌

VL53L0X 200cm range sensor-blue

이 가이드는 VL53L0X 비행시간(ToF) 센서와 I2C 모듈이 장착된 16x2 LCD 디스플레이를 사용하여 정밀한 레이저 거리 측정기를 구축하는 방법을 보여줍니다. 이 프로젝트는 정확하고 비접촉식 거리 측정을 자신의 작품에 추가하려는 메이커에게 완벽합니다. VL53L0X는 레이저를 사용하여 거리를 측정하므로 초음파 센서가 어려움을 겪을 수 있는 응용 분야(예: 탱크의 충전 수준 측정 또는 컨베이어 벨트 위 물체의 정확한 위치 감지)에 이상적입니다.

이 프로젝트를 활용할 수 있는 몇 가지 실용적인 방법은 다음과 같습니다:

  • 자동 반려동물 급식기: 용기의 사료 수준을 측정하여 재충전을 트리거하거나 알림을 보냅니다.
  • 스마트 쓰레기통: 쓰레기통이 얼마나 찼는지 감지하고 비워야 할 때 경고합니다.
  • DIY 높이 게이지: 작은 물체를 측정하거나 아이의 성장을 추적하기 위한 정밀 측정 도구를 만듭니다.
  • 주차 보조 장치: 차고나 좁은 공간에서 정밀한 주차를 돕는 센서 시스템을 구축합니다.
  • 로봇 공학: 로봇에 사용하여 장애물을 감지하거나 내비게이션을 위해 벽까지의 거리를 측정합니다.
VL53L0x_pin_round_module

필요한 하드웨어

  • Arduino 보드 (예: Uno)
  • VL53L0X 레이저 거리 센서
  • I2C 모듈이 장착된 LCD 1602 디스플레이
  • 점퍼 와이어

배선 가이드

이 프로젝트의 배선은 I2C 프로토콜 덕분에 간단합니다. I2C 프로토콜을 사용하면 LCD와 센서가 동일한 두 개의 와이어를 통해 통신할 수 있습니다. VL53L0X 센서는 Arduino의 5V 핀에서 직접 공급되는 5V 전원이 필요합니다. 센서에 안정적인 전원을 보장하기 위해 추가 핀이 보조 VCC로 사용됩니다. (비디오 00:27 참조)

VL53L0X_LCD1602_wiring-3
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-4

다음은 연결 다이어그램입니다:

Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)

연결은 다음과 같습니다:

  • VL53L0X VCC -> Arduino 5VPin 13 (Pin 13은 추가 전원 안정성을 제공하기 위해 디지털 출력으로 설정됨).
  • VL53L0X GND -> Arduino GND.
  • VL53L0X SCL -> Arduino SCL (A5).
  • VL53L0X SDA -> Arduino SDA (A4).
  • LCD I2C VCC -> Arduino 5V.
  • LCD I2C GND -> Arduino GND.
  • LCD I2C SCL -> Arduino SCL (A5).
  • LCD I2C SDA -> Arduino SDA (A4).

다른 Arduino 모델을 사용하는 경우 I2C 핀이 다른 위치에 있을 수 있습니다. SDA 및 SCL 핀은 종종 보드에 직접 표시되어 있습니다. (비디오 02:42 참조)

코드 설명

코드는 구성하기 쉽도록 설계되었습니다. 주요 사용자 구성 가능 부분은 스케치의 맨 위에 있습니다. (비디오 04:18 참조)

먼저 추가 전원 핀에 대한 상수를 정의합니다. 이는 센서에 깨끗한 5V 공급을 제공하는 데 사용됩니다.

const int vcc2 = 13; // VL53L0X 센서용 추가 VCC 핀

다음으로 LCD 라이브러리의 인스턴스를 만들고 I2C 주소를 정의합니다. 이 주소는 비디오에 표시된 대로 I2C 스캐너 스케치를 실행하여 찾을 수 있습니다. (비디오 03:26 참조)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // 16자 2줄 디스플레이용 LCD 주소를 0x3F로 설정

마지막으로 측정 단위를 제어하는 변수가 있습니다. 이 값을 변경하여 거리를 밀리미터 또는 센티미터로 표시할 수 있습니다.

const int type = 1; // 1로 설정하면 밀리미터, 2로 설정하면 센티미터

setup() 함수에서 추가 VCC 핀은 출력으로 구성되고 센서에 전원을 공급하기 위해 HIGH로 설정됩니다. 그런 다음 LCD가 초기화됩니다.

loop() 함수의 주요 로직은 센서에서 거리를 읽고 LCD를 지운 다음 값과 단위를 출력합니다. type2로 설정되면 거리가 밀리미터에서 센티미터의 부동 소수점 값으로 변환되어 더 정밀한 판독값을 제공합니다. (비디오 06:47 참조)

라이브 프로젝트 시연

시연에서 센서는 정확성을 확인하기 위해 자와 비교 테스트됩니다. 비디오는 센서가 몇 밀리미터의 편차만으로 매우 정밀한 판독값을 제공함을 보여줍니다. (비디오 08:32 참조)

센서는 연속 측정 모드에서 최대 약 1.2미터의 범위를 가진다는 점에 유의하는 것이 중요합니다. 대상이 범위를 벗어나면 디스플레이에 8190 값이 표시됩니다. (비디오 09:53 참조)

또 다른 핵심 관찰 사항은 센서가 반사율이 높은 표면에서 부정확한 측정값을 제공할 수 있다는 점입니다. 반짝이는 물체를 향하면 상당한 오류가 발생할 수 있는 반면, 무광택 표면을 향하면 정확한 결과를 제공합니다. (영상 10:42 부분)

이 코드는 배선 변경 없이 다양한 VL53L0X 모듈 변형 및 2004 모델과 같은 더 큰 LCD와도 호환됩니다. (영상 11:30 부분)

비디오 챕터

  • [00:05] VL53L0X 및 LCD 프로젝트 소개
  • [00:27] VL53L0X 및 LCD 배선도
  • [02:51] 실제 Arduino 보드에서의 상세 배선
  • [03:26] I2C 주소 스캔
  • [04:18] 코드 설명 및 구성
  • [08:32] 거리 측정 실시간 데모
  • [09:53] 센서 범위 및 한계 테스트
  • [10:42] 다양한 표면에서의 정확도
  • [11:30] 다른 센서 모듈 및 더 큰 LCD로 테스트

이미지

VL53L0X 200cm range sensor-black
VL53L0X 200cm range sensor-black
VL53L0X 200cm range sensor-blue
VL53L0X 200cm range sensor-blue
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)
Arduino wiring for VL53L0X and LCD1602 I2C (4 wires LCD)
VL53L0x_pin_module
VL53L0x_pin_module
VL53L0x_pin_round_module
VL53L0x_pin_round_module
VL53L0X_LCD1602_wiring-4
VL53L0X_LCD1602_wiring-4
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-1
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-2
VL53L0X_LCD1602_wiring-3
VL53L0X_LCD1602_wiring-3
641-Lesson 78: Using a VL53L0X Laser Distance Sensor with an LCD1602 or LCD2004 Display and Arduino
언어: C++
/*
* Lesson 76-1: Using One single VL6180 Laser Distance Sensor with Arduino 
 * Adafruit code modified for this tutorial
 * by Ahmad Shamshiri at 22:22 on 
 * March 10-11, 2021 in Ajax, ON, Canada
 Please watch video instruction of this code: https://youtu.be/_H9D0czQpSI
 
View code for using two or more VL6180X sensors: https://robojax.com/course1/lecture76

  This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8

 

If you found this tutorial helpful, please support me so I can continue creating 
content like this. 

or make a donation using PayPal http://robojax.com/L/?id=64
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. * 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>. 
 */
#include <Wire.h>
#include "Adafruit_VL6180X.h"

Adafruit_VL6180X vl = Adafruit_VL6180X();

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

  // wait for serial port to open on native usb devices
  while (!Serial) {
    delay(1);
  }
  
  Serial.println("Adafruit VL6180x test!");
  if (! vl.begin()) {
    Serial.println("Failed to find sensor");
    while (1);
  }
  Serial.println("Sensor found!");
}

void loop() {

  uint8_t range = vl.readRange();
  uint8_t status = vl.readRangeStatus();

  if (status == VL6180X_ERROR_NONE) {
    Serial.print("Range: "); Serial.print(range);
    Serial.println("mm");
  }
//  if(range <=76)
//  {
//    //do something
//  }

  // Some error occurred, print it out!
  
  if  ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
    Serial.println("System error");
  }
  else if (status == VL6180X_ERROR_ECEFAIL) {
    Serial.println("ECE failure");
  }
  else if (status == VL6180X_ERROR_NOCONVERGE) {
    Serial.println("No convergence");
  }
  else if (status == VL6180X_ERROR_RANGEIGNORE) {
    Serial.println("Ignoring range");
  }
  else if (status == VL6180X_ERROR_SNR) {
    Serial.println("Signal/Noise error");
  }
  else if (status == VL6180X_ERROR_RAWUFLOW) {
    Serial.println("Raw reading underflow");
  }
  else if (status == VL6180X_ERROR_RAWOFLOW) {
    Serial.println("Raw reading overflow");
  }
  else if (status == VL6180X_ERROR_RANGEUFLOW) {
    Serial.println("Range reading underflow");
  }
  else if (status == VL6180X_ERROR_RANGEOFLOW) {
    Serial.println("Range reading overflow");
  }
  delay(50);
}

필요할 수 있는 것들

자원 및 참고자료

파일📁

프리징 파일

  • Adafruit VL6180X Time of Flight Distance Sensor
    Fritzing 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.fzpz 0.02 MB