Kod Ara

Ders 78: VL53L0X'ten mesafeyi LCD'de göster | Arduino Adım Adım Kurs

Ders 78: VL53L0X'ten mesafeyi LCD'de göster | Arduino Adım Adım Kurs

Bu kılavuz, VL53L0X uçuş süresi sensörü ve I2C modüllü 16x2 LCD ekran kullanarak hassas bir lazer mesafe ölçer nasıl yapılacağını gösterir. Bu proje, yaratımlarına doğru ve temassız mesafe ölçümü eklemek isteyen maker'lar için idealdir. VL53L0X, mesafeyi ölçmek için lazer kullanır; bu da ultrasonik sensörlerin zorlanabileceği uygulamalar için idealdir; örneğin bir tankın doluluk seviyesini ölçmek veya bir konveyör bant üzerindeki bir nesnenin tam konumunu tespit etmek gibi.

Bu projeyi kullanabileceğiniz birkaç pratik yol şunlardır:

  • Otomatik Evcil Hayvan Besleyici: Bir kaptaki mama seviyesini ölçerek yeniden doldurmayı tetikleyin veya bir bildirim gönderin.
  • Akıllı Çöp Kutusu: Çöp kutusunun ne kadar dolu olduğunu tespit edin ve boşaltılması gerektiğinde sizi uyarın.
  • Kendin Yap Boy Ölçer: Küçük nesneler için hassas bir ölçüm aleti oluşturun veya bir çocuğun büyümesini takip edin.
  • Park Yardımcısı: Garajda veya dar bir alanda hassas park etmeye yardımcı olacak bir sensör sistemi kurun.
  • Robotik: Bir robotta engelleri tespit etmek veya navigasyon için duvara olan mesafeyi ölçmek amacıyla kullanın.
VL53L0x_pin_round_module

Gerekli Donanım

  • Arduino Kartı (örn. Uno)
  • VL53L0X Lazer Mesafe Sensörü
  • I2C Modüllü LCD 1602 Ekran
  • Jumper Kablolar

Bağlantı Kılavuzu

Bu projenin bağlantısı, hem LCD'nin hem de sensörün aynı iki kablo üzerinden iletişim kurmasını sağlayan I2C protokolü sayesinde basittir. VL53L0X sensörü, doğrudan Arduino'nun 5V pininden çekilen 5V güç kaynağı gerektirir. Sensörün sabit bir güç kaynağına sahip olmasını sağlamak için ek bir pin ikincil VCC olarak kullanılır. (videoda 00:27'de)

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

İşte bağlantı şeması:

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

Bağlantılar şu şekildedir:

  • VL53L0X VCC -> Arduino 5V ve Pin 13 (Pin 13, ek güç stabilitesi sağlamak için dijital çıkış olarak ayarlanır).
  • 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).

Farklı bir Arduino modeli kullanıyorsanız, I2C pinleri başka bir yerde olabilir. SDA ve SCL pinleri genellikle kart üzerinde doğrudan etiketlenir. (videoda 02:42'de)

Kod Açıklaması

Kod, yapılandırması kolay olacak şekilde tasarlanmıştır. Kullanıcı tarafından yapılandırılabilir ana bölümler, taslağın en üstündedir. (videoda 04:18'de)

İlk olarak, ek güç pini için bir sabit tanımlarız. Bu, sensöre temiz bir 5V besleme sağlamak için kullanılır.

const int vcc2 = 13; // VL53L0X sensörü için ek VCC pini

Ardından, LCD kütüphanesinin bir örneğini oluşturur ve I2C adresini tanımlarız. Bu adresi, videoda gösterildiği gibi bir I2C tarayıcı taslağı çalıştırarak bulabilirsiniz. (videoda 03:26'da)

LiquidCrystal_I2C lcd(0x3F, 16, 2); // 16 karakter ve 2 satırlık ekran için LCD adresini 0x3F olarak ayarlayın

Son olarak, ölçüm birimini kontrol eden bir değişken vardır. Mesafeyi milimetre veya santimetre cinsinden görüntülemek için bu değeri değiştirebilirsiniz.

const int type = 1; // Milimetre için 1, santimetre için 2 olarak ayarlayın

setup() fonksiyonunda, ek VCC pini çıkış olarak yapılandırılır ve sensöre güç sağlamak için HIGH olarak ayarlanır. LCD daha sonra başlatılır.

loop() fonksiyonundaki ana mantık, sensörden mesafeyi okur, LCD'yi temizler ve değeri birimle birlikte yazdırır. type 2 olarak ayarlandığında, mesafe daha hassas bir okuma için milimetreden santimetre cinsinden bir ondalık değere dönüştürülür. (videoda 06:47'de)

Canlı Proje Gösterimi

Gösterimde, sensör doğruluğunu doğrulamak için bir cetvele karşı test edilir. Video, sensörün yalnızca birkaç milimetrelik sapma ile çok hassas okumalar sağladığını gösterir. (videoda 08:32'de)

Sensörün sürekli ölçüm modunda yaklaşık 1,2 metrelik maksimum bir menzile sahip olduğunu belirtmek önemlidir. Hedef menzil dışında olduğunda, ekran 8190 değerini gösterecektir. (videoda 09:53'te)

Bir diğer önemli gözlem, sensörün yüksek yansıtıcı yüzeylerde hatalı ölçümler verebilmesidir. Onu parlak bir nesneye doğrultmak önemli hatalara neden olabilirken, mat bir yüzeye doğrultmak doğru sonuçlar sağlar. (videoda 10:42'de)

Kod ayrıca farklı VL53L0X modül çeşitleri ve 2004 modeli gibi daha büyük LCD'lerle de kablolamada herhangi bir değişiklik yapılmadan uyumludur. (videoda 11:30'da)

Video Bölümleri

  • [00:05] VL53L0X ve LCD projesine giriş
  • [00:27] VL53L0X ve LCD için bağlantı şeması
  • [02:51] Gerçek bir Arduino kartı üzerinde ayrıntılı bağlantı
  • [03:26] I2C adreslerini tarama
  • [04:18] Kod açıklaması ve yapılandırma
  • [08:32] Mesafe ölçümünün canlı gösterimi
  • [09:53] Sensörün menzilini ve sınırlamalarını test etme
  • [10:42] Farklı yüzeylerde doğruluk
  • [11:30] Farklı bir sensör modülü ve daha büyük LCD ile test etme

Görseller

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
Dil: 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);
}

İhtiyacın olabileceğini düşünüyor

Kaynaklar ve referanslar

Dosyalar📁

Fritzing Dosyası

  • 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