كود البحث

قياس المسافة باستخدام وحدة ليزر VL53L0X ذات 6 دبابيس وشاشة TM1637 للأردوينو

قياس المسافة باستخدام وحدة ليزر VL53L0X ذات 6 دبابيس وشاشة TM1637 للأردوينو


في هذا الدرس سنتعلم كيفية قياس المسافة باستخدام حساس المسافة بالليزر VL53L0X وعرض القراءات على شاشة TM1637 ذات 7 مقاطع. يجمع هذا المشروع بين المكونين لإنشاء أداة بسيطة وفعّالة لقياس المسافة. يستخدم VL53L0X تقنية الليزر لتقديم قراءات مسافة دقيقة، بينما تعرض شاشة TM1637 هذه القراءات بطريقة سهلة الاستخدام.

VL53L0X 200cm range sensor
TM1637 4 digit display module

سنستعرض الأجهزة المطلوبة، وتعليمات التوصيل، والكود اللازم لتشغيل كل شيء. بنهاية هذا الدرس التعليمي، سيكون لديك جهاز قياس مسافة يعمل ويمكن استخدامه في تطبيقات متنوعة. للدليل المرئي، تأكد من مشاهدة الفيديو عند (في الفيديو عند 00:00).

شرح الأجهزة

المكونات الأساسية لهذا المشروع هي مستشعر المسافة بالليزر VL53L0X ووحدة العرض TM1637. يعد VL53L0X مستشعرًا من نوع وقت الرحلة يقيس المسافة إلى جسم عن طريق إصدار شعاع ليزر وحساب الوقت الذي يستغرقه ارتداد الشعاع للعودة. يعمل ضمن نطاق جهد من 2.6V إلى 3.5V ولكنه يمكنه أيضًا العمل بجهد 5V بفضل منظم جهد مدمج.

TM1637 هو متحكم عرض يتحكم في شاشة LED ذات 7 مقاطع. يتواصل عبر واجهة بسيطة بسلكين (CLK و DIO)، مما يجعل من السهل توصيله بأردوينو. يمكن للشاشة عرض قيم رقمية وهي مثالية لعرض قياسات المسافة من مستشعر VL53L0X.

تفاصيل ورقة البيانات

المصنِّعإس تي مايكروإلكترونيكس
رقم القطعةVL53L0X
جهد المنطق/الإدخال والإخراج2.6 فولت - 3.5 فولت
جهد التغذية2.6 فولت - 5 فولت
درجة حرارة التشغيل-20 °C إلى 70 °C
نطاق القياس30 مم إلى 2000 مم
تردد I2C400 كيلوهرتز
إعداد المهلة500 مللي ثانية
حزمةوحدة ذات 6 دبابيس

  • تأكد من توفّر مصدر طاقة مناسب (5 فولت مقبول).
  • قم بتوصيل دبوس XSHUT بمقاوم سحب للأعلى لتجنب تسرب التيار
  • استخدم I2C للاتصال؛ قم بتوصيل SDA وSCL بشكل مناسب.
  • تعامل مع حالات انتهاء المهلة في الكود لتجنب السلوك غير المتوقع
  • كن حريصًا على نطاق درجات حرارة التشغيل لضمان الدقة.

تعليمات الأسلاك

Arduino wiring for VL53L0X with TM1637 4 digit dispaly
Arduino wiring for VL53L0X with TM1637 4 digit dispaly

لتوصيل VL53L0X وشاشة TM1637، ابدأ بتوصيل دبوس VCC في VL53L0X بدبوس 5V في الأردوينو وتوصيل دبوس GND بدبوس الأرضي في الأردوينو. بعد ذلك، وصل دبوس SDA في VL53L0X بدبوس A4 في الأردوينو، والذي يُستخدم عادةً لبيانات بروتوكول I2C. ويجب توصيل دبوس SCL بدبوس A5 في الأردوينو المستخدم لإشارة الساعة.

بالنسبة لشاشة TM1637، قم بتوصيل دبوس CLK بالدبوس الرقمي 2 على لوحة الأردوينو ودبوس DIO بالدبوس الرقمي 3. أخيراً، قم بتوصيل دبوس XSHUT في مستشعر VL53L0X بالدبوس الرقمي 12 على لوحة الأردوينو. تأكد من ترك أي دبابيس غير مستخدمة، مثل GPIO1 على VL53L0X، غير متصلة. ستمكنك هذه الإعدادات من جعل الأردوينو يتواصل بفعالية مع كل من المستشعر والشاشة.

أمثلة على الكود وشرح خطوة بخطوة

يقوم الكود بتهيئة المستشعر والشاشة، ويعد اتصال I2C، ويقرأ قياسات المسافة باستمرار. فيما يلي مقتطف يوضح دالة الإعداد حيث تُكوَّن الأطراف وتُهيَّأ المستشعر:

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
  sensor.startContinuous(); // type of measurement is set
}

في دالة الإعداد هذه، يُضبط دبوس XSHUT كمدخل مع مقاومة سحب لأعلى، ويتم تهيئة المستشعر لقياس المدى بشكل مستمر. كما يتم إعداد المراقب التسلسلي لعرض قراءات المسافة.

بعد ذلك، تقوم الحلقة الرئيسية بقراءة المسافة وتحديث الشاشة. فيما يلي مقتطف مُركَّز من دالة الحلقة:

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
  Serial.print("Distance: ");
  Serial.print(distance); // print distance on serial monitor
}

تقوم هذه الحلقة بقراءة المسافة من المستشعر بشكل مستمر وتحديث شاشة TM1637 بأحدث قياس. كما تطبع المسافة على المراقب التسلسلي لأغراض تصحيح الأخطاء. إذا كنت تريد رؤية الكود الكامل، فسيُحمّل أسفل المقال.

عرض توضيحي / ما الذي تتوقعه

عند إكمال الإعداد ورفع الكود، يجب أن ترى المسافة المقاسة بواسطة VL53L0X معروضة على TM1637. عند تحريك جسم أقرب أو أبعد من المستشعر، ستتغير القيمة المعروضة وفقًا لذلك. إذا واجهت قراءات غير متوقعة، فتأكد من أن المستشعر غير محجوب وأن سطح الجسم مناسب لانعكاس الليزر (في الفيديو عند 09:30).

تشمل الأخطاء الشائعة توصيل الأسلاك بشكل معكوس أو عدم تهيئة المستشعر بشكل صحيح، مما قد يؤدي إلى أخطاء نفاد المهلة. تأكد من توصيل الدبابيس الصحيحة وأن المستشعر مزود بالطاقة بشكل كافٍ لضمان دقة قياسات المسافة.

الصور

VL53L0X 200cm range sensor
VL53L0X 200cm range sensor
TM1637 4 digit display module
TM1637 4 digit display module
Arduino wiring for VL53L0X with TM1637 4 digit dispaly
Arduino wiring for VL53L0X with TM1637 4 digit dispaly
104-Measure distance with a Laser VL53L0X 6-pin module and a TM1637 LED display for Arduino
اللغة: C++
/* 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)

Fritzing File

دليل المستخدم

ملفات أخرى