آموزش سنسور VL53L0X با ESP32 و Arduino
راهنمای پروژهمحور فاصلهسنج VL53L0X؛ دیتاشیت، Time-of-Flight، پایهها، آدرس I2C، سیمکشی، کد ESP32 و Arduino، RangeStatus و عیبیابی.
آموزش سنسور فاصلهسنج Time-of-Flight
راهاندازی VL53L0X با ESP32 و Arduino؛ از دیتاشیت تا پروژه
در این راهنمای پروژهمحور، روش کار سنجش زمان پرواز نور، تفاوت تراشه خام و برد آماده، پایهها، آدرس I2C، سیمکشی، کدنویسی و عیبیابی VL53L0X را قدمبهقدم بررسی میکنیم. همه اعداد فنی با دیتاشیت Rev.6 و راهنمای API رسمی ST تطبیق داده شدهاند.
0x29 هفتبیتی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.2ms | XSHUT فقط پس از وصل بودن 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 Adafruit | ESP32 عمومی | Arduino Uno |
|---|---|---|
| VIN | 3V3 | 5V یا 3.3V |
| GND | GND | GND |
| SDA | GPIO21 در Generic ESP32 | A4 / SDA |
| SCL | GPIO22 در Generic ESP32 | A5 / SCL |
| XSHUT | اختیاری؛ یک GPIO خروجی | اختیاری؛ یک پایه دیجیتال |
GPIO21 و GPIO22 فقط انتخاب رایج برای Generic ESP32 هستند؛ روی بردهای دیگر برچسب SDA/SCL یا مستندات سازنده را ملاک قرار دهید. اگر برد آماده Pull-up دارد، مقاومت موازی اضافی میتواند مقاومت مؤثر را بیش از حد کم کند. ابتدا با سیم کوتاه و کلاک 100kHz آزمایش کنید.
API، حالتهای اندازهگیری و چرا رجیسترها را حدس نمیزنیم
برخلاف برخی سنسورها، دیتاشیت VL53L0X یک جدول ساده برای راهاندازی دستی همه رجیسترها ارائه نمیکند. ST در UM2039 صریحاً API سطحبالا را راهحل آماده معرفی میکند تا دسترسیهای متعدد رجیستری و کالیبراسیون داخل لایه درایور مدیریت شوند. بنابراین در این پروژه از کتابخانهای استفاده میکنیم که API رسمی ST را در خود دارد و هیچ آدرس رجیستر آزمایشی یا حدسزدهای نمینویسیم.
| پروفایل | بودجه زمانی نمونه دیتاشیت | کاربرد |
|---|---|---|
| Default | 30ms | تعادل عمومی سرعت و دقت |
| High Accuracy | 200ms | اندازهگیری دقیقتر؛ دقت تیپیک کمتر از ±3٪ در شرایط جدول |
| Long Range | 33ms | برد بلند در شرایط تاریک و هدف مناسب |
| High Speed | 20ms | سرعت بیشتر وقتی دقت اولویت اصلی نیست |
سنسور حالتهای Single، Continuous و Continuous Timed دارد. در پروژه ساده از فراخوانی تکاندازهگیری کتابخانه استفاده میکنیم تا کنترل خطا شفاف باشد. برای نمونهبرداری سریع، Continuous را همراه با بررسی آمادهبودن داده و محدودیت نرخ انتخاب کنید.
راهاندازی گامبهگام در Arduino IDE
- برد و پورت درست ESP32 یا Arduino را انتخاب کنید.
- در Library Manager، کتابخانه Adafruit VL53L0X و وابستگیهای پیشنهادی آن را نصب کنید.
- سیمکشی I2C و زمین مشترک را انجام دهید و ولتاژ مجاز همان ماژول را کنترل کنید.
- ابتدا فایل
i2c-scanner.inoداخل بسته را اجرا کنید؛ باید آدرس هفتبیتی0x29دیده شود. - کد اصلی را آپلود و Serial Monitor را روی 115200 baud باز کنید.
- با هدف سفید و مات از فاصله معلوم شروع کنید و سپس سطح و نور واقعی پروژه را آزمایش کنید.
کد عملی 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);
}
تحلیل کد
- شرط
#if defined(ESP32)روی ESP32 پایههای مثال را صریح تعیین میکند و روی Uno از پایههای سختافزاری Wire استفاده میکند. Wire.setClock(100000)کلاک محافظهکارانه 100kHz را انتخاب میکند؛ این مقدار کمتر از سقف 400kHz دیتاشیت است.sensor.begin(0x29, false, &Wire)آدرس هفتبیتی و همان باس I2C را به کتابخانه میدهد.rangingTestیک اندازهگیری کامل API را انجام میدهد و نتیجه را در ساختار رسمی قرار میدهد.- فقط
RangeStatus == 0معتبر چاپ میشود. UM2046 رسمی ST وضعیت صفر را Range Valid معرفی میکند؛ عدد فاصله در وضعیت نامعتبر نباید وارد کنترل ربات شود.
خطاهای رایج و عیبیابی 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 و نصب مکانیکی
- فرستنده و گیرنده نوری را با قاب، چسب، فلاکس یا گردوغبار نپوشانید و روکش حمل را قبل از تست بردارید.
- اگر پنجره محافظ دارید، هندسه آن را طبق AN5231 طراحی و Offset و Cross-talk را برای محصول نهایی کالیبره کنید.
- طبق دیتاشیت، XSHUT فقط وقتی بالا باشد که AVDD وصل است. اگر میزبان هنگام روشنشدن نامعلوم است، Pull-up مناسب در نظر بگیرید.
- GPIO1 در صورت عدم استفاده میتواند باز بماند؛ در صورت استفاده به ماهیت Open-drain و Pull-up توجه کنید.
- جسم هدف باید میدان دید را بهاندازه کافی بپوشاند؛ لبه قاب یا سطح براق زاویهدار ممکن است بازتاب ناخواسته بسازد.
- کالیبراسیون را روی برد و قاب نهایی انجام دهید، نه فقط روی ماژول بازِ روی میز.
- برای کنترل ایمنی ربات، وضعیت نامعتبر را «فاصله زیاد» فرض نکنید؛ آن را خطا یا حالت امن جداگانه در نظر بگیرید.
نتیجهگیری
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 است و وضعیتهای دیگر باید بهعنوان اندازهگیری نامعتبر مدیریت شوند.
منابع دقیق و ادامه مسیر
- دیتاشیت رسمی ST، VL53L0X، DS11555 Rev.6
- راهنمای رسمی API، سند UM2039 Rev.2.0
- Application Note رسمی AN5231 برای پنجره محافظ
- صفحه رسمی محصول VL53L0X
- راهنمای رسمی برد Adafruit VL53L0X
- کتابخانه رسمی Adafruit VL53L0X با مجوز BSD
- منبع عکس برد، Kattni Rembor، مجوز CC BY-SA 3.0
- آموزش BMP280 با ESP32 و Arduino
- دوره رایگان سنسورها در ۷ قدم
- دسته آموزش فاصله و سطح
- مرکز آموزش سنسورها در LCENJ
مشخصات تراشه خام از DS11555 Rev.6 و رفتار API از UM2039 Rev.2.0 استخراج شدهاند. مشخصات 3 تا 5 ولت فقط به برد مستند Adafruit تعمیم داده شده است. هیچ رجیستر، مدار یا مقدار عملکردی بدون منبع وارد مقاله نشده است.
پرسش و پاسخ مقاله
سوال فنی خود را مطرح کنید
پرسشها و پاسخها پس از بررسی مدیر منتشر میشوند. نویسنده، پیشنویس در انتظار بررسی را میبیند.
هنوز پرسش تاییدشدهای برای این مقاله ثبت نشده است.