الدرس 78: عرض المسافة من VL53L0X على شاشة LCD | دورة الأردوينو خطوة بخطوة
شرح المشروع
يشرح هذا الدليل كيفية بناء جهاز قياس مسافة بالليزر دقيق باستخدام مستشعر وقت الطيران VL53L0X وشاشة LCD مقاس 16x2 مع وحدة I2C. هذا المشروع مثالي للصنّاع الذين يتطلعون إلى إضافة قياس مسافة دقيق دون تلامس إلى إبداعاتهم. يستخدم VL53L0X ليزرًا لقياس المسافة، مما يجعله مثاليًا للتطبيقات التي قد تواجه فيها مستشعرات الموجات فوق الصوتية صعوبة، مثل قياس مستوى الامتلاء في خزان أو اكتشاف الموضع الدقيق لجسم على حزام ناقل.
إليك بعض الطرق العملية التي يمكنك من خلالها استخدام هذا المشروع:
- وحدة تغذية الحيوانات الأليفة الآلية: قياس مستوى الطعام في حاوية لتشغيل إعادة التعبئة أو إرسال إشعار.
- سلة المهملات الذكية: اكتشاف مدى امتلاء السلة وتنبيهك عندما تحتاج إلى إفراغها.
- مقياس ارتفاع DIY: إنشاء أداة قياس دقيقة للأشياء الصغيرة أو لتتبع نمو الطفل.
- مساعد الركن: بناء نظام استشعار للمساعدة في الركن الدقيق في المرآب أو الأماكن الضيقة.
- الروبوتات: استخدامه في روبوت لاكتشاف العوائق أو قياس المسافة إلى الحائط للملاحة.
المكونات المطلوبة
- لوحة أردوينو (مثل Uno)
- مستشعر مسافة الليزر VL53L0X
- شاشة LCD 1602 مع وحدة I2C
- أسلاك توصيل
دليل التوصيل
التوصيل لهذا المشروع بسيط، بفضل بروتوكول I2C، الذي يسمح لكل من الشاشة والمستشعر بالتواصل عبر نفس السلكين. يتطلب مستشعر VL53L0X مصدر طاقة 5V، يتم سحبه مباشرة من دبوس 5V في الأردوينو. لضمان مصدر طاقة مستقر للمستشعر، يتم استخدام دبوس إضافي كـ VCC ثانوي. (في الفيديو عند 00:27)
إليك مخطط التوصيل:

التوصيلات كالتالي:
- VL53L0X VCC -> أردوينو 5V ودبوس 13 (يتم ضبط الدبوس 13 كمخرج رقمي لتوفير استقرار طاقة إضافي).
- VL53L0X GND -> أردوينو GND.
- VL53L0X SCL -> أردوينو SCL (A5).
- VL53L0X SDA -> أردوينو SDA (A4).
- LCD I2C VCC -> أردوينو 5V.
- LCD I2C GND -> أردوينو GND.
- LCD I2C SCL -> أردوينو SCL (A5).
- LCD I2C SDA -> أردوينو SDA (A4).
إذا كنت تستخدم طرازًا مختلفًا من الأردوينو، فقد تكون دبابيس I2C في مكان آخر. غالبًا ما تكون دبابيس SDA وSCL موضحة مباشرة على اللوحة. (في الفيديو عند 02:42)
شرح الكود
تم تصميم الكود ليكون سهل الإعداد. الأجزاء الرئيسية القابلة للتخصيص من قبل المستخدم موجودة في أعلى الكود. (في الفيديو عند 04:18)
أولاً، نعرّف ثابتًا للدبوس الإضافي للطاقة. يُستخدم هذا لتوفير مصدر 5V نظيف للمستشعر.
const int vcc2 = 13; // دبوس VCC إضافي لمستشعر VL53L0X
بعد ذلك، ننشئ مثيلًا لمكتبة LCD ونعرّف عنوان I2C الخاص بها. يمكنك العثور على هذا العنوان عن طريق تشغيل كود فحص I2C، كما هو موضح في الفيديو. (في الفيديو عند 03:26)
LiquidCrystal_I2C lcd(0x3F, 16, 2); // ضبط عنوان LCD على 0x3F لشاشة 16 حرفًا وسطرين
أخيرًا، يوجد متغير يتحكم في وحدة القياس. يمكنك تغيير هذه القيمة لعرض المسافة إما بالمليمترات أو السنتيمترات.
const int type = 1; // اضبط على 1 للمليمتر، و2 للسنتيمتر
في دالة setup()، يتم ضبط الدبوس الإضافي VCC كمخرج وتعيينه على HIGH لتوفير الطاقة للمستشعر. ثم يتم تهيئة شاشة LCD.
المنطق الرئيسي في دالة loop() يقرأ المسافة من المستشعر، ويمسح شاشة LCD، ويطبع القيمة مع الوحدة. عندما يتم ضبط type على 2، يتم تحويل المسافة من المليمترات إلى قيمة عشرية بالسنتيمترات لقراءة أكثر دقة. (في الفيديو عند 06:47)
عرض توضيحي مباشر للمشروع
في العرض التوضيحي، يتم اختبار المستشعر مقابل مسطرة للتحقق من دقته. يُظهر الفيديو أن المستشعر يوفر قراءات دقيقة جدًا، مع انحراف بضعة مليمترات فقط. (في الفيديو عند 08:32)
من المهم ملاحظة أن المستشعر له مدى أقصى يبلغ حوالي 1.2 متر في وضع القياس المستمر. عندما يكون الهدف خارج النطاق، ستعرض الشاشة قيمة 8190. (في الفيديو عند 09:53)
ملاحظة رئيسية أخرى هي أن المستشعر يمكن أن يعطي قراءات غير دقيقة على الأسطح شديدة الانعكاس. توجيهه نحو جسم لامع يمكن أن يسبب أخطاء كبيرة، بينما توجيهه نحو سطح غير لامع يعطي نتائج دقيقة. (في الفيديو عند 10:42)
الكود متوافق أيضًا مع إصدارات مختلفة من وحدات VL53L0X وشاشات LCD أكبر، مثل طراز 2004، دون أي تغييرات في التوصيلات. (في الفيديو عند 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 أكبر
الصور
/*
* 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);
}
الأشياء التي قد تحتاجها
-
أمازوناشترِ VL53L0X من أمازونamzn.to
-
إي باياشترِ VL53l0x من eBayebay.us
الموارد والمراجع
-
خارجياشترِ VL53l0x من eBayebay.us
-
خارجيمكتبة أردوينو (GitHub)github.com
-
خارجيورقة بيانات VL53L0X (PDF)st.com
ملفات📁
Fritzing File
-
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