آموزش سنسور فاصله‌سنج Time-of-Flight

راه‌اندازی VL53L0X با ESP32 و Arduino؛ از دیتاشیت تا پروژه

در این راهنمای پروژه‌محور، روش کار سنجش زمان پرواز نور، تفاوت تراشه خام و برد آماده، پایه‌ها، آدرس I2C، سیم‌کشی، کدنویسی و عیب‌یابی VL53L0X را قدم‌به‌قدم بررسی می‌کنیم. همه اعداد فنی با دیتاشیت Rev.6 و راهنمای API رسمی ST تطبیق داده شده‌اند.

نمای نزدیک برد واقعی Adafruit VL53L0X و برچسب پایه‌های VIN، GND، SCL، SDA، GPIO و XSHUT
عکس واقعی برد Adafruit VL53L0X؛ اثر Kattni Rembor، مجوز CC BY-SA 3.0، تغییر اندازه و افزودن حاشیه برای LCENJ.
روش اندازه‌گیریTime-of-Flight با VCSEL 940nm
تغذیه تراشه خام2.6 تا 3.5V
رابطI2C تا 400kHz
آدرس در Arduino0x29 هفت‌بیتی

VL53L0X چیست و چه تفاوتی با سنسور اولتراسونیک دارد؟

VL53L0X یک حسگر فاصله تک‌ناحیه‌ای از STMicroelectronics است. فرستنده VCSEL نور مادون‌قرمز نامرئی با طول موج 940nm می‌فرستد و آرایه SPAD بازگشت فوتون‌ها را دریافت می‌کند. مدار داخلی با سنجش زمان پرواز نور، فاصله مطلق را بر حسب میلی‌متر گزارش می‌دهد؛ بنابراین خروجی فقط از شدت بازتاب نور به‌دست نمی‌آید.

ربات جلوگیری از برخورد، تشخیص حضور، کنترل نزدیک‌شدن دست، اندازه‌گیری سطح داخل مخزنِ سازگار با میدان دید و شمارش عبور از کاربردهای متداول‌اند. میدان دید سیستم طبق دیتاشیت 25 درجه است؛ پس جسم باید بخش کافی از این مخروط را بپوشاند. نتیجه اندازه‌گیری به فاصله، بازتاب سطح، نور مادون‌قرمز محیط، پوشش روی سنسور و تنظیمات API وابسته است.

کاربردهای مناسب و نامناسب

ربات و مانع

فاصله مستقیم روبه‌روی ربات را بدون نیاز به پالس صوتی اندازه می‌گیرد. برای مانع باریک یا زاویه‌دار باید پوشش میدان دید و بازتاب واقعی آزمایش شود.

تشخیص حضور نزدیک

برای فعال‌کردن نمایشگر، نور یا رابط کاربری با نزدیک‌شدن دست مناسب است؛ شرط اعتبار RangeStatus باید در منطق پروژه لحاظ شود.

سطح مخزن

برای سطحی که نور کافی برمی‌گرداند قابل بررسی است، اما بخار، گردوغبار، پوشش محافظ و دیواره مخزن می‌توانند Cross-talk یا خطای بازتاب بسازند.

فضای باز پرنور

نور مادون‌قرمز محیط برد را کاهش می‌دهد. دیتاشیت برای هدف خاکستری 17٪ در شرایط Outdoor نمونه، اعداد بسیار کوتاه‌تری از هدف سفید داخل محیط گزارش می‌کند.

چطور دیتاشیت VL53L0X را درست بخوانیم؟

عدد «تا 2 متر» در صفحه محصول یک سقف قابلیت تحت شرایط مناسب است، نه تضمین برای هر هدف و هر نور. جدول 12 دیتاشیت، بدون شیشه پوششی، در 23°C و 2.8V و با بودجه زمانی 33ms نوشته شده است. برای هدف سفید 88٪ در داخل، مقدار تیپیک با پروفایل Long Range بیش از 200 سانتی‌متر است؛ ولی حداقل همان ردیف 120 سانتی‌متر است. برای هدف خاکستری 17٪ در فضای بازِ تعریف‌شده، مقدار تیپیک 50 و حداقل 40 سانتی‌متر است.

پارامتر دیتاشیتمقدارنتیجه عملی
AVDD تراشه خام2.6 تا 3.5Vحد ورودی برد آماده را با مشخصات همان برد اشتباه نگیرید.
دمای کاری عادی-20 تا +70°Cکارکرد بیرون این بازه در مشخصات تضمین‌شده نیست.
سرعت I2Cحداکثر 400kbit/sبرای بردبورد و سیم بلند از 100kHz شروع کنید.
زمان Bootحداکثر 1.2msXSHUT فقط پس از وصل بودن AVDD بالا برود.
جریان Active تیپیک19mAپیک شامل VCSEL می‌تواند به 40mA برسد.
بودجه زمانی پیش‌فرض33msزمان بیشتر معمولاً فرصت سنجش بیشتری می‌دهد اما نرخ را کم می‌کند.
میدان دید سیستم25°هدف کوچک یا لبه قاب می‌تواند نتیجه را تغییر دهد.

در جدول دقت، شرایط آزمون را همراه عدد بخوانید. برای نمونه، هدف خاکستری در فضای باز و فاصله 40 سانتی‌متر با بودجه 33ms، پراکندگی 12٪ دارد؛ افزایش بودجه به 66ms در همان ردیف مقدار را به 9٪ می‌رساند. این اعداد را نباید به همه سطوح و نورها تعمیم داد.

تفاوت تراشه خام VL53L0X با ماژول آماده

حد 2.6 تا 3.5V مربوط به تراشه خام است. برد Adafruit دیده‌شده در تصویر، رگولاتور و تغییر سطح دارد و طبق راهنمای خودش با تغذیه و منطق 3 تا 5 ولت استفاده می‌شود. ماژول‌های ناشناس ممکن است همین مدار را نداشته باشند؛ پیش از اتصال 5 ولت، شماتیک و شماره قطعات همان ماژول را بررسی کنید.

در طراحی با تراشه خام، ST خازن‌های 100nF و 4.7µF را نزدیک تغذیه نشان می‌دهد. برای باس 400kHz و AVDD برابر 2.8V، Pull-up تیپیک 1.5 تا 2 کیلواهم پیشنهاد شده، اما مقدار نهایی باید با ظرفیت کل باس و مشخصات میزبان محاسبه شود. GPIO1 خروجی Open-drain و XSHUT ورودی Active-low است.

پایه‌ها و تفاوت آدرس 0x52 با 0x29

پایه برد Adafruitکاربردنکته طراحی
VINورودی تغذیه بردبرای همین برد مستند 3 تا 5 ولت؛ تراشه خام حداکثر کاری 3.5 ولت دارد.
GNDزمین مشترکزمین منبع و میکروکنترلر مشترک باشد.
SCLکلاک I2Cبه SCL برد میزبان وصل شود.
SDAداده I2Cبه SDA برد میزبان وصل شود.
GPIOاعلام آماده‌بودن دادهدر تراشه GPIO1 خروجی Open-drain است؛ در کد پایه استفاده نشده است.
XSHUTخاموشی سخت‌افزاری، Active-lowبرای چند حسگر هم‌آدرس و کاهش مصرف مفید است.

دیتاشیت ST آدرس پیش‌فرض را 0x52 می‌نویسد؛ این نمایش هشت‌بیتی شامل بیت Read/Write است. کتابخانه‌ها و اسکنرهای Arduino آدرس هفت‌بیتی را می‌خواهند، بنابراین مقدار درست در کد 0x29 است. چون 0x29 << 1 = 0x52، این دو عدد تناقض ندارند.

سیم‌کشی VL53L0X با ESP32 و Arduino Uno

برد VL53L0X AdafruitESP32 عمومیArduino Uno
VIN3V35V یا 3.3V
GNDGNDGND
SDAGPIO21 در Generic ESP32A4 / SDA
SCLGPIO22 در Generic ESP32A5 / SCL
XSHUTاختیاری؛ یک GPIO خروجیاختیاری؛ یک پایه دیجیتال

GPIO21 و GPIO22 فقط انتخاب رایج برای Generic ESP32 هستند؛ روی بردهای دیگر برچسب SDA/SCL یا مستندات سازنده را ملاک قرار دهید. اگر برد آماده Pull-up دارد، مقاومت موازی اضافی می‌تواند مقاومت مؤثر را بیش از حد کم کند. ابتدا با سیم کوتاه و کلاک 100kHz آزمایش کنید.

API، حالت‌های اندازه‌گیری و چرا رجیسترها را حدس نمی‌زنیم

برخلاف برخی سنسورها، دیتاشیت VL53L0X یک جدول ساده برای راه‌اندازی دستی همه رجیسترها ارائه نمی‌کند. ST در UM2039 صریحاً API سطح‌بالا را راه‌حل آماده معرفی می‌کند تا دسترسی‌های متعدد رجیستری و کالیبراسیون داخل لایه درایور مدیریت شوند. بنابراین در این پروژه از کتابخانه‌ای استفاده می‌کنیم که API رسمی ST را در خود دارد و هیچ آدرس رجیستر آزمایشی یا حدس‌زده‌ای نمی‌نویسیم.

پروفایلبودجه زمانی نمونه دیتاشیتکاربرد
Default30msتعادل عمومی سرعت و دقت
High Accuracy200msاندازه‌گیری دقیق‌تر؛ دقت تیپیک کمتر از ±3٪ در شرایط جدول
Long Range33msبرد بلند در شرایط تاریک و هدف مناسب
High Speed20msسرعت بیشتر وقتی دقت اولویت اصلی نیست

سنسور حالت‌های Single، Continuous و Continuous Timed دارد. در پروژه ساده از فراخوانی تک‌اندازه‌گیری کتابخانه استفاده می‌کنیم تا کنترل خطا شفاف باشد. برای نمونه‌برداری سریع، Continuous را همراه با بررسی آماده‌بودن داده و محدودیت نرخ انتخاب کنید.

راه‌اندازی گام‌به‌گام در Arduino IDE

  1. برد و پورت درست ESP32 یا Arduino را انتخاب کنید.
  2. در Library Manager، کتابخانه Adafruit VL53L0X و وابستگی‌های پیشنهادی آن را نصب کنید.
  3. سیم‌کشی I2C و زمین مشترک را انجام دهید و ولتاژ مجاز همان ماژول را کنترل کنید.
  4. ابتدا فایل i2c-scanner.ino داخل بسته را اجرا کنید؛ باید آدرس هفت‌بیتی 0x29 دیده شود.
  5. کد اصلی را آپلود و Serial Monitor را روی 115200 baud باز کنید.
  6. با هدف سفید و مات از فاصله معلوم شروع کنید و سپس سطح و نور واقعی پروژه را آزمایش کنید.

کد عملی VL53L0X برای ESP32 و Arduino

#include <Wire.h>
#include <Adafruit_VL53L0X.h>

#if defined(ESP32)
constexpr int SDA_PIN = 21;  // Generic ESP32 only
constexpr int SCL_PIN = 22;  // Generic ESP32 only
#endif

constexpr uint8_t VL53L0X_ADDRESS = 0x29;
Adafruit_VL53L0X sensor;

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

#if defined(ESP32)
  Wire.begin(SDA_PIN, SCL_PIN);
#else
  Wire.begin();
#endif
  Wire.setClock(100000);

  if (!sensor.begin(VL53L0X_ADDRESS, false, &Wire)) {
    Serial.println(F("VL53L0X not found; check power, wiring and 0x29"));
    while (true) delay(10);
  }
}

void loop() {
  VL53L0X_RangingMeasurementData_t measurement;
  sensor.rangingTest(&measurement, false);

  if (measurement.RangeStatus == 0) {
    Serial.print(F("Distance: "));
    Serial.print(measurement.RangeMilliMeter);
    Serial.println(F(" mm"));
  } else {
    Serial.print(F("Invalid measurement; RangeStatus="));
    Serial.println(measurement.RangeStatus);
  }

  delay(100);
}

تحلیل کد

خطاهای رایج و عیب‌یابی VL53L0X

نشانهعلت محتملبررسی پیشنهادی
آدرس 0x29 دیده نمی‌شودSDA/SCL جابه‌جا، زمین مشترک نیست، XSHUT پایین یا تغذیه نامناسبولتاژ را اندازه بگیرید، XSHUT را بالا و اسکنر I2C را دوباره اجرا کنید.
دیتاشیت 0x52 می‌گویداختلاف نمایش 8 بیتی و 7 بیتیدر Arduino از 0x29 استفاده کنید؛ 0x52 شکل شیفت‌داده‌شده آن است.
عدد ثابت یا نامعتبرروکش محافظ روی سنسور، هدف خارج میدان دید یا بازتاب کمروکش حمل را بردارید و با هدف سفید مات در فاصله معلوم تست کنید.
برد در نور خورشید کم می‌شودنویز مادون‌قرمز محیطنور مستقیم را کم کنید و عملکرد را در شرایط واقعی محصول اندازه بگیرید.
چند حسگر با هم پاسخ نمی‌دهندهمه با آدرس 0x29 بیدار شده‌اندبا XSHUT یکی‌یکی روشن و در هر Boot آدرس‌های یکتا تعیین کنید.
پس از نصب پشت شیشه خطا زیاد استCross-talk یا هندسه نامناسب پنجرهراهنمای AN5231 و کالیبراسیون Offset/Cross-talk در UM2039 را اجرا کنید.
ریست تصادفی هنگام سنجشمنبع تغذیه ضعیف یا افت لحظه‌ایپیک 40mA، خازن نزدیک و کیفیت مسیر تغذیه را بررسی کنید.

نکات طراحی PCB و نصب مکانیکی

نتیجه‌گیری

VL53L0X وقتی بهترین نتیجه را می‌دهد که آدرس I2C، وضعیت RangeStatus، میدان دید، نور محیط و کالیبراسیون مکانیکی را هم‌زمان در نظر بگیرید. برای نمونه اولیه، برد Adafruit و کتابخانه رسمی مسیر ساده‌ای فراهم می‌کنند؛ برای محصول نهایی، محدودیت تغذیه تراشه خام، پیک جریان، پنجره محافظ و آزمون روی هدف واقعی تعیین‌کننده‌اند.

پرسش‌های متداول

آدرس درست VL53L0X در Arduino برابر 0x29 است یا 0x52؟

در Arduino و بیشتر APIهای I2C از آدرس هفت‌بیتی 0x29 استفاده کنید. عدد 0x52 در دیتاشیت نمایش هشت‌بیتیِ آدرس نوشتن است و از شیفت‌دادن 0x29 به چپ به‌دست می‌آید.

آیا می‌توان تراشه VL53L0X را مستقیم به 5 ولت وصل کرد؟

خیر؛ تغذیه کاری تراشه خام 2.6 تا 3.5 ولت است. فقط برد آماده‌ای را با 5 ولت تغذیه کنید که سازنده همان برد وجود رگولاتور و تغییر سطح را مستند کرده باشد.

چرا فاصله در نور روز کمتر می‌شود؟

نور مادون‌قرمز محیط به دریافت فوتون‌ها نویز اضافه می‌کند. دیتاشیت نیز برد کوتاه‌تری برای شرایط Outdoor و هدف کم‌بازتاب گزارش می‌کند؛ نتیجه را در نور واقعی پروژه آزمایش کنید.

آیا می‌توان چند VL53L0X را روی یک باس I2C گذاشت؟

بله، اما همه با آدرس 0x29 روشن می‌شوند. با پایه‌های XSHUT آن‌ها را یکی‌یکی بیدار کنید و در هر بار روشن‌شدن آدرس نرم‌افزاری یکتا بدهید؛ تغییر آدرس دائمی نیست.

آیا عدد RangeMilliMeter همیشه معتبر است؟

خیر. پیش از استفاده از فاصله باید RangeStatus را بررسی کنید. در API رسمی، وضعیت صفر به معنی Range Valid است و وضعیت‌های دیگر باید به‌عنوان اندازه‌گیری نامعتبر مدیریت شوند.

منابع دقیق و ادامه مسیر

مشخصات تراشه خام از DS11555 Rev.6 و رفتار API از UM2039 Rev.2.0 استخراج شده‌اند. مشخصات 3 تا 5 ولت فقط به برد مستند Adafruit تعمیم داده شده است. هیچ رجیستر، مدار یا مقدار عملکردی بدون منبع وارد مقاله نشده است.