ربات و مانع
فاصله مستقیم روبهروی ربات را بدون نیاز به پالس صوتی اندازه میگیرد. برای مانع باریک یا زاویهدار باید پوشش میدان دید و بازتاب واقعی آزمایش شود.
آموزش سنسور فاصلهسنج Time-of-Flight
در این راهنمای پروژهمحور، روش کار سنجش زمان پرواز نور، تفاوت تراشه خام و برد آماده، پایهها، آدرس I2C، سیمکشی، کدنویسی و عیبیابی VL53L0X را قدمبهقدم بررسی میکنیم. همه اعداد فنی با دیتاشیت Rev.6 و راهنمای API رسمی ST تطبیق داده شدهاند.
0x29 هفتبیتیVL53L0X یک حسگر فاصله تکناحیهای از STMicroelectronics است. فرستنده VCSEL نور مادونقرمز نامرئی با طول موج 940nm میفرستد و آرایه SPAD بازگشت فوتونها را دریافت میکند. مدار داخلی با سنجش زمان پرواز نور، فاصله مطلق را بر حسب میلیمتر گزارش میدهد؛ بنابراین خروجی فقط از شدت بازتاب نور بهدست نمیآید.
ربات جلوگیری از برخورد، تشخیص حضور، کنترل نزدیکشدن دست، اندازهگیری سطح داخل مخزنِ سازگار با میدان دید و شمارش عبور از کاربردهای متداولاند. میدان دید سیستم طبق دیتاشیت 25 درجه است؛ پس جسم باید بخش کافی از این مخروط را بپوشاند. نتیجه اندازهگیری به فاصله، بازتاب سطح، نور مادونقرمز محیط، پوشش روی سنسور و تنظیمات API وابسته است.
فاصله مستقیم روبهروی ربات را بدون نیاز به پالس صوتی اندازه میگیرد. برای مانع باریک یا زاویهدار باید پوشش میدان دید و بازتاب واقعی آزمایش شود.
برای فعالکردن نمایشگر، نور یا رابط کاربری با نزدیکشدن دست مناسب است؛ شرط اعتبار RangeStatus باید در منطق پروژه لحاظ شود.
برای سطحی که نور کافی برمیگرداند قابل بررسی است، اما بخار، گردوغبار، پوشش محافظ و دیواره مخزن میتوانند Cross-talk یا خطای بازتاب بسازند.
نور مادونقرمز محیط برد را کاهش میدهد. دیتاشیت برای هدف خاکستری 17٪ در شرایط Outdoor نمونه، اعداد بسیار کوتاهتری از هدف سفید داخل محیط گزارش میکند.
عدد «تا 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٪ میرساند. این اعداد را نباید به همه سطوح و نورها تعمیم داد.
حد 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 است.
| پایه برد 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 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 آزمایش کنید.
برخلاف برخی سنسورها، دیتاشیت VL53L0X یک جدول ساده برای راهاندازی دستی همه رجیسترها ارائه نمیکند. ST در UM2039 صریحاً API سطحبالا را راهحل آماده معرفی میکند تا دسترسیهای متعدد رجیستری و کالیبراسیون داخل لایه درایور مدیریت شوند. بنابراین در این پروژه از کتابخانهای استفاده میکنیم که API رسمی ST را در خود دارد و هیچ آدرس رجیستر آزمایشی یا حدسزدهای نمینویسیم.
| پروفایل | بودجه زمانی نمونه دیتاشیت | کاربرد |
|---|---|---|
| Default | 30ms | تعادل عمومی سرعت و دقت |
| High Accuracy | 200ms | اندازهگیری دقیقتر؛ دقت تیپیک کمتر از ±3٪ در شرایط جدول |
| Long Range | 33ms | برد بلند در شرایط تاریک و هدف مناسب |
| High Speed | 20ms | سرعت بیشتر وقتی دقت اولویت اصلی نیست |
سنسور حالتهای Single، Continuous و Continuous Timed دارد. در پروژه ساده از فراخوانی تکاندازهگیری کتابخانه استفاده میکنیم تا کنترل خطا شفاف باشد. برای نمونهبرداری سریع، Continuous را همراه با بررسی آمادهبودن داده و محدودیت نرخ انتخاب کنید.
i2c-scanner.ino داخل بسته را اجرا کنید؛ باید آدرس هفتبیتی 0x29 دیده شود.#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 معرفی میکند؛ عدد فاصله در وضعیت نامعتبر نباید وارد کنترل ربات شود.| نشانه | علت محتمل | بررسی پیشنهادی |
|---|---|---|
| آدرس 0x29 دیده نمیشود | SDA/SCL جابهجا، زمین مشترک نیست، XSHUT پایین یا تغذیه نامناسب | ولتاژ را اندازه بگیرید، XSHUT را بالا و اسکنر I2C را دوباره اجرا کنید. |
| دیتاشیت 0x52 میگوید | اختلاف نمایش 8 بیتی و 7 بیتی | در Arduino از 0x29 استفاده کنید؛ 0x52 شکل شیفتدادهشده آن است. |
| عدد ثابت یا نامعتبر | روکش محافظ روی سنسور، هدف خارج میدان دید یا بازتاب کم | روکش حمل را بردارید و با هدف سفید مات در فاصله معلوم تست کنید. |
| برد در نور خورشید کم میشود | نویز مادونقرمز محیط | نور مستقیم را کم کنید و عملکرد را در شرایط واقعی محصول اندازه بگیرید. |
| چند حسگر با هم پاسخ نمیدهند | همه با آدرس 0x29 بیدار شدهاند | با XSHUT یکییکی روشن و در هر Boot آدرسهای یکتا تعیین کنید. |
| پس از نصب پشت شیشه خطا زیاد است | Cross-talk یا هندسه نامناسب پنجره | راهنمای AN5231 و کالیبراسیون Offset/Cross-talk در UM2039 را اجرا کنید. |
| ریست تصادفی هنگام سنجش | منبع تغذیه ضعیف یا افت لحظهای | پیک 40mA، خازن نزدیک و کیفیت مسیر تغذیه را بررسی کنید. |
VL53L0X وقتی بهترین نتیجه را میدهد که آدرس I2C، وضعیت RangeStatus، میدان دید، نور محیط و کالیبراسیون مکانیکی را همزمان در نظر بگیرید. برای نمونه اولیه، برد Adafruit و کتابخانه رسمی مسیر سادهای فراهم میکنند؛ برای محصول نهایی، محدودیت تغذیه تراشه خام، پیک جریان، پنجره محافظ و آزمون روی هدف واقعی تعیینکنندهاند.
در Arduino و بیشتر APIهای I2C از آدرس هفتبیتی 0x29 استفاده کنید. عدد 0x52 در دیتاشیت نمایش هشتبیتیِ آدرس نوشتن است و از شیفتدادن 0x29 به چپ بهدست میآید.
خیر؛ تغذیه کاری تراشه خام 2.6 تا 3.5 ولت است. فقط برد آمادهای را با 5 ولت تغذیه کنید که سازنده همان برد وجود رگولاتور و تغییر سطح را مستند کرده باشد.
نور مادونقرمز محیط به دریافت فوتونها نویز اضافه میکند. دیتاشیت نیز برد کوتاهتری برای شرایط Outdoor و هدف کمبازتاب گزارش میکند؛ نتیجه را در نور واقعی پروژه آزمایش کنید.
بله، اما همه با آدرس 0x29 روشن میشوند. با پایههای XSHUT آنها را یکییکی بیدار کنید و در هر بار روشنشدن آدرس نرمافزاری یکتا بدهید؛ تغییر آدرس دائمی نیست.
خیر. پیش از استفاده از فاصله باید RangeStatus را بررسی کنید. در API رسمی، وضعیت صفر به معنی Range Valid است و وضعیتهای دیگر باید بهعنوان اندازهگیری نامعتبر مدیریت شوند.
مشخصات تراشه خام از DS11555 Rev.6 و رفتار API از UM2039 Rev.2.0 استخراج شدهاند. مشخصات 3 تا 5 ولت فقط به برد مستند Adafruit تعمیم داده شده است. هیچ رجیستر، مدار یا مقدار عملکردی بدون منبع وارد مقاله نشده است.