Search Code

Bài 78: Hiển thị khoảng cách từ VL53L0X trên LCD | Khóa học Arduino Từng Bước

Bài 78: Hiển thị khoảng cách từ VL53L0X trên LCD | Khóa học Arduino Từng Bước

Phần cứng cần chuẩn bị

  • Bo mạch Arduino (ví dụ: Uno)
  • Cảm biến khoảng cách laser VL53L0X
  • Màn hình LCD 1602 có module I2C
  • Dây nối

Hướng dẫn đấu dây

Việc đấu dây cho dự án này khá đơn giản nhờ giao thức I2C, cho phép cả màn hình LCD và cảm biến giao tiếp qua cùng hai dây. Cảm biến VL53L0X yêu cầu nguồn 5V, được lấy trực tiếp từ chân 5V của Arduino. Để đảm bảo cảm biến có nguồn ổn định, một chân bổ sung được dùng làm VCC thứ cấp. (xem video tại 00:27)

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

Dưới đây là sơ đồ kết nối:

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

Các kết nối như sau:

  • VL53L0X VCC -> Arduino 5VChân 13 (Chân 13 được đặt làm đầu ra số để cung cấp thêm độ ổn định nguồn).
  • 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).

Nếu bạn dùng một model Arduino khác, các chân I2C có thể nằm ở vị trí khác. Các chân SDA và SCL thường được ghi rõ trên bo mạch. (xem video tại 02:42)

Giải thích mã code

Mã code được thiết kế để dễ cấu hình. Các phần người dùng có thể tùy chỉnh nằm ở đầu sketch. (xem video tại 04:18)

Đầu tiên, chúng ta định nghĩa một hằng số cho chân nguồn phụ. Chân này dùng để cung cấp nguồn 5V sạch cho cảm biến.

const int vcc2 = 13; // Chân VCC phụ cho cảm biến VL53L0X

Tiếp theo, chúng ta tạo một đối tượng từ thư viện LCD và định nghĩa địa chỉ I2C của nó. Bạn có thể tìm địa chỉ này bằng cách chạy sketch quét I2C, như được hướng dẫn trong video. (xem video tại 03:26)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // Đặt địa chỉ LCD là 0x3F cho màn hình 16 ký tự và 2 dòng

Cuối cùng, có một biến điều khiển đơn vị đo. Bạn có thể thay đổi giá trị này để hiển thị khoảng cách bằng milimét hoặc centimét.

const int type = 1; // Đặt 1 cho milimét, 2 cho centimét

Trong hàm setup(), chân VCC phụ được cấu hình là đầu ra và đặt ở mức HIGH để cấp nguồn cho cảm biến. Sau đó, màn hình LCD được khởi tạo.

Logic chính trong hàm loop() đọc khoảng cách từ cảm biến, xóa màn hình LCD và in giá trị cùng đơn vị. Khi type được đặt là 2, khoảng cách được chuyển từ milimét sang giá trị float centimét để đọc chính xác hơn. (xem video tại 06:47)

Trình diễn dự án thực tế

Trong phần trình diễn, cảm biến được kiểm tra với thước kẻ để xác minh độ chính xác. Video cho thấy cảm biến cung cấp số đo rất chính xác, chỉ lệch vài milimét. (xem video tại 08:32)

Điều quan trọng cần lưu ý là cảm biến có phạm vi tối đa khoảng 1,2 mét ở chế độ đo liên tục. Khi mục tiêu nằm ngoài phạm vi, màn hình sẽ hiển thị giá trị 8190. (xem video tại 09:53)

Một quan sát quan trọng khác là cảm biến có thể cho kết quả đo không chính xác trên các bề mặt phản chiếu cao. Hướng nó vào một vật bóng loáng có thể gây ra sai số đáng kể, trong khi hướng vào bề mặt mờ lại cho kết quả chính xác. (trong video tại 10:42)

Mã code cũng tương thích với các biến thể mô-đun VL53L0X khác nhau và màn hình LCD lớn hơn, chẳng hạn như mẫu 2004, mà không cần thay đổi gì về cách đấu dây. (trong video tại 11:30)

Các Chương của Video

  • [00:05] Giới thiệu về dự án VL53L0X và LCD
  • [00:27] Sơ đồ đấu dây cho VL53L0X và LCD
  • [02:51] Chi tiết cách đấu dây trên bo mạch Arduino thực tế
  • [03:26] Quét địa chỉ I2C
  • [04:18] Giải thích mã code và cấu hình
  • [08:32] Trình diễn trực tiếp phép đo khoảng cách
  • [09:53] Kiểm tra phạm vi và giới hạn của cảm biến
  • [10:42] Độ chính xác trên các bề mặt khác nhau
  • [11:30] Kiểm tra với mô-đun cảm biến khác và màn hình LCD lớn hơn

Hình ảnh

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
Ngôn ngữ: 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);
}

Nghĩ bạn có thể cần

Tài nguyên & tài liệu tham khảo

Tập tin📁

Tập tin Fritzing

  • 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