آموزش ESP32آموزش اینترنت اشیا

اتصال سنسور جریان نوری PMW3901 به برد ESP32

پهپادها برای حفظ پرواز پایدار به انواع حسگرها وابسته هستند، به‌ویژه زمانی که GPS در دسترس نباشد یا قابل اعتماد نباشد. یکی از ویژگی‌های مهم، موقعیت‌یابی ثابت است که پهپاد بدون حرکت ماندن در یک نقطه را امکان‌پذیر می‌کند. این ویژگی برای ناوبری داخلی، Hover کردن و فرود دقیق حیاتی است. حسگرهای Optical Flow مانند PMW3901 به پهپادها کمک می‌کنند تا این عملکرد را با ردیابی حرکت نسبت به زمین انجام دهند.

حسگر PMW3901 یک حسگر Optical Flow کوچک و کم‌مصرف است که با تحلیل الگوهای سطح، حرکت را اندازه‌گیری می‌کند. این حسگر به‌طور گسترده در رباتیک، پهپادها و سیستم‌های اتوماسیون برای تخمین تغییر موقعیت بدون نیاز به GPS استفاده می‌شود. این موضوع آن را به گزینه‌ای عالی برای کاربردهایی که نیاز به ردیابی دقیق حرکت دارند تبدیل می‌کند. در این راهنما، حسگر PMW3901، مشخصات آن و نحوه اتصال آن به ESP32 را بررسی خواهیم کرد. اگر به دنبال ایده‌های بیشتری برای پروژه‌های مبتنی بر ESP32 هستید، می‌توانید سایر پروژه‌های ESP32 ما را بررسی کنید. اگر این مقاله را می‌خوانید، احتمالاً به پهپادها نیز علاقه‌مند هستید، پس پروژه پهپاد مبتنی بر ESP32 که با Arduino و Python قابل برنامه‌ریزی و کنترل است را نیز ببینید.

سنسور جریان نوری PMW3901

PMW3901 یک حسگر جریان نوری است که حرکت سطح را با استفاده از الگوریتم داخلی Optical Flow تشخیص می‌دهد. عملکرد آن مشابه حسگر موس کامپیوتر است و حرکت نسبی را با مقایسه الگوهای تصویری گرفته شده توسط دوربین کوچک خود ردیابی می‌کند. PMW3901 جریان حرکت را به صورت داخلی محاسبه کرده و تفاوت پیکسل‌ها بین هر فریم را ارائه می‌دهد. خود حسگر موقعیت مطلق ارائه نمی‌دهد، بلکه نرخ حرکت در جهات X و Y را ارائه می‌کند.

سنسور جریان نوری PMW3901

ویژگی‌ها و مشخصات کلیدی

نوع حسگر: Optical Flow Sensor

ولتاژ کاری:

  • VDD: 1.8 – 2.1V
  • VDDIO: 1.8 – 3.6V

رابط ارتباطی: 4 سیم SPI با فرکانس 2MHz

مصرف انرژی:

  • حالت Run: 9mA
  • حالت Power Down: 12μA

حداکثر سرعت تشخیص حرکت: 7.4 rad/s

زاویه دید (FoV): حدود 42°

محدوده تشخیص: 80mm – 300mm (بسته به بافت سطح)

  • محدوده کاری گسترده از 80mm تا بی‌نهایت
  • نیازی به فوکوس لنز در زمان نصب لنز نیست
  • رجیسترهای داده حرکت با رزولوشن 16 بیتی
  • حسگر دارای Interrupt تشخیص حرکت

PMW3901 معمولاً در پهپادها، جاروبرقی‌های رباتیک و سیستم‌های صنعتی ردیابی حرکت استفاده می‌شود. اندازه کوچک و ارتباط SPI آن، ادغام در پروژه‌های Embedded، به‌ویژه با میکروکنترلرهایی مانند ESP32 را آسان می‌کند.

مشخصات ماژول حسگر Optical Flow PMW3901

ماژول‌های مختلفی برای حسگر PMW3901 موجود است. دو ماژول محبوب عبارتند از:

ماژول Pimoroni PMW3901

ماژول Pimoroni PMW3901

  • برند: Pimoroni
  • ولتاژ: 3-5V
  • رابط: SPI
  • ابعاد: جمع‌وجور، نصب آسان
  • مزایا: دارای Level Shifter داخلی، LED داخلی برای شرایط کم‌نور

ماژول Generic PMW3901

ماژول Generic PMW3901

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
  • تولیدکننده: Generic
  • ولتاژ: 3.3V
  • رابط: SPI
  • ابعاد: مشابه ماژول Pimoroni اما فاقد Level Shifter داخلی
  • مزایا: ارزان و در دسترس از منابع مختلف، دارای پین Reset اضافی
  • معایب: فاقد Level Shifter داخلی، نیاز به Level Shifter خارجی هنگام استفاده با سیستم‌های 5V

پین اوت و قطعات ماژول PMW3901

همانطور که گفته شد، ماژول‌های مختلفی از PMW3901 توسط تولیدکنندگان متفاوت موجود است. اگرچه همه آن‌ها از همان حسگر استفاده می‌کنند، ممکن است تفاوت‌هایی مانند Pinout یا ویژگی‌های اضافی داشته باشند. در اینجا Pinout و اجزای دو ماژول محبوب را بررسی می‌کنیم.

پین اوت و قطعات ماژول PMW3901

  • VCC – ورودی برق 3-5V
  • CS – Chip Select
  • SCK – ساعت SPI
  • MOSI – داده ورودی SPI
  • MISO – داده خروجی SPI
  • INT – پین Interrupt
  • GND – اتصال زمین

ماژول Pimoroni PMW3901 دارای هفت پین است: دو پین برای تغذیه (VCC با دامنه 3-5V) و چهار پین برای باس SPI، و یک پین برای Interrupt حرکت.

قطعات ماژول Pimoroni PMW3901

در مرکز ماژول، حسگر حرکت PMW3901 قرار دارد که با سایر قطعات احاطه شده است. ماژول Pimoroni شامل قطعات اضافی برای ویژگی‌های بیشتر است: یک رگولاتور ولتاژ برای تأمین ولتاژ حسگر، مدار Level Shifting برای سازگاری با میکروکنترلرهای مختلف، و دو LED برای شرایط کم‌نور که می‌توان آن‌ها را از طریق رجیسترهای مناسب فعال یا غیرفعال کرد.

پین اوت ماژول Generic PMW3901

پین اوت ماژول Generic PMW3901

  • VCC – ورودی برق 3.3V
  • GND – اتصال زمین
  • MOSI – داده ورودی SPI
  • CLK – ساعت SPI
  • MISO – داده خروجی SPI
  • CS – Chip Select
  • RST – پین Reset
  • MOT – پین Interrupt حرکت
  • VRE – خروجی رگولاتور داخلی PMW3901

ماژول Generic PMW3901 دارای 9 پین است: دو پین برای تغذیه، چهار پین SPI، یک پین Reset، یک پین Interrupt حرکت و یک پین خروجی رگولاتور داخلی.

قطعات ماژول Generic PMW3901

ماژول Generic کمی بزرگ‌تر از Pimoroni است به دلیل پین اضافی و جایگاه پیچ‌ها. اگرچه مساحت بزرگ‌تر است، تعداد قطعات روی PCB کمتر است زیرا فاقد مدار Level Shifting و LED اضافی برای نورپردازی است. علاوه بر حسگر PMW3901، یک رگولاتور Low-dropout برای خط 1.8V به همراه خازن‌های بای‌پس و فیلترینگ وجود دارد و همچنین یک LED برق روی برد قرار دارد. مقاومت‌های Pull-up برای خطوط SPI و Interrupt باقی مانده‌اند.

مدار اتصال ماژول جریان نوری به ESP32

برای اتصال ماژول حسگر PMW3901 به ESP32، از ارتباط SPI استفاده می‌کنیم. ما از ماژول Pimoroni PMW3901 استفاده کردیم، اما اتصال به صورت استاندارد SPI است و می‌توانید همین اتصالات را با سایر ماژول‌های PMW3901 نیز دنبال کنید. در ادامه، سیم‌کشی پایه‌ای نمایش داده شده است:

مدار اتصال ماژول جریان نوری به ESP32

ابتدا تغذیه ماژول را متصل می‌کنیم؛ پین VCC ماژول به پین 3.3V ESP32 و پین GND به زمین متصل می‌شود. سپس SCK به GPIO18، MISO به GPIO19، MOSI به GPIO23 و پین CS به GPIO5 متصل می‌شوند.

مدار اتصال ماژول جریان نوری به ESP32

کد آردوینو مشاهده فریم بافر حسگر PMW3901

کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است.

پس از اتصال موفقیت‌آمیز حسگر حرکت PMW3901 به ESP32، به سراغ کد می‌رویم. ابتدا مطمئن شوید که Board Manager برای ESP32 نصب شده و ماژول ESP32 Dev به‌عنوان برد انتخاب شده است. سپس کتابخانه‌های Bitcraze PMW3901 و ESPAsyncWebServer را از Arduino Library Manager نصب کرده و یک Sketch جدید با کد زیر ایجاد کنید. فراموش نکنید SSID و رمز عبور WiFi را در کد تغییر دهید، سپس کد را کامپایل کرده و روی برد ESP32 آپلود کنید.

با این کد، داده‌های Frame Buffer از حسگر دریافت و روی یک صفحه وب برای مشاهده آسان نمایش داده می‌شود. معمولاً نیازی به Frame Buffer نیست و تنها داده‌های حرکت کافی است، اما مشاهده Frame Buffer کمک می‌کند عملکرد حسگر بهتر درک شود. تصویر خروجی بزرگ‌نمایی شده و با رنگ‌بندی برای فهم آسان‌تر ارائه می‌شود.

در بخش setup، ابتدا پورت سریال برای دیباگ فعال می‌شود و حسگر PMW3901 مقداردهی اولیه می‌شود. اگر مقداردهی اولیه شکست بخورد، ESP32 پیام خطا چاپ کرده و منتظر ریست می‌ماند. در غیر این صورت، Frame Buffer فعال شده و اتصال WiFi برقرار می‌شود. پس از اتصال موفق، آدرس IP ESP32 روی مانیتور سریال نمایش داده می‌شود و می‌توان آن را در مرورگر وارد کرد تا داده‌های Frame Buffer نمایش داده شوند. سرور وب در پس‌زمینه اجرا می‌شود و نیازی به کد در تابع loop برای جلوگیری از ریست Watchdog Timer نیست.

برای مشاهده داده‌های بصری، آدرس IP نمایش داده شده در مانیتور سریال را در مرورگر وارد کنید تا داده‌های Frame Buffer نمایش داده شوند. توجه داشته باشید که PMW3901 تصاویر خاکستری تولید می‌کند و رنگ‌بندی برای سهولت نمایش توسط ما اضافه شده است.

پروژه نشانگر جهت PMW3901

در این مثال، یک نمایشگر OLED به مدار موجود اضافه می‌کنیم و جهت حرکت را روی OLED نمایش می‌دهیم. برای این کار، مطابق نمودار مدار، نمایشگر OLED را به مدار متصل کنید.

پروژه نشانگر جهت PMW3901

اتصالات حسگر Optical Flow PMW3901 همانند قبل باقی می‌ماند. پین‌های OLED به این صورت متصل می‌شوند: VCC به 3.3V، GND به زمین، SCL به IO22 و SDA به IO21. با این اتصال، می‌توان جهت حرکت را روی نمایشگر OLED مشاهده کرد.

پروژه نشانگر جهت PMW3901

کد Arduino برای نشانگر جهت PMW3901

کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است.

علاوه بر کتابخانه‌های نصب شده قبلی، کتابخانه‌های Adafruit GFX و Adafruit SSD1306 را به همراه وابستگی‌های مورد نیاز نصب کنید. پس از آن، یک Sketch جدید با کد زیر ایجاد کنید.

در ابتدا، تمام هدرهای لازم وارد شده‌اند و سپس نمونه‌هایی از نمایشگر OLED و حسگر PMW3901 ایجاد شده است. همچنین چند آرایه برای نگهداری داده‌های Bitmap فلش جهت‌ها و چند متغیر سراسری برای استفاده‌های بعدی تعریف شده‌اند.

تابع updateDisplay مسئول نمایش آیکون جهت مناسب است که بر اساس نام آیکون ذخیره شده در متغیر lastArrow انجام می‌شود. هنگام فراخوانی، این تابع بافر نمایش را پاک کرده، آیکون را در مرکز قرار داده و سپس بافر را روی نمایشگر واقعی می‌فرستد.

در تابع setup، پورت سریال برای دیباگ فعال می‌شود، سپس نمایشگر OLED و حسگر PMW3901 مقداردهی اولیه می‌شوند. پس از مقداردهی موفقیت‌آمیز، آیکون شروع نمایش داده می‌شود تا نشان دهد سیستم آماده است.

در تابع loop، داده‌های حرکت از ماژول PMW3901 به صورت مداوم خوانده می‌شوند. اگر حرکت شناسایی شود، متغیر lastArrow بسته به داده‌های حرکت به‌روزرسانی می‌شود و سپس تابع updateDisplay برای به‌روزرسانی نمایشگر فراخوانی می‌شود. این فرآیند به طور مداوم تکرار می‌شود تا جهت حرکت روی OLED نمایش داده شود.

حرکات کوچک نادیده گرفته می‌شوند و فقط حرکت‌های اصلی (بالا، پایین، چپ، راست) شناسایی شده و جهت نمایش داده می‌شود. حرکات مورب نادیده گرفته می‌شوند تا نمایش دقیق‌تر باشد.

این روش باعث می‌شود بتوانید جهت حرکت حسگر PMW3901 را به‌صورت بصری و لحظه‌ای روی نمایشگر OLED مشاهده کنید و آن را برای پروژه‌های رباتیک، پهپاد یا سیستم‌های ناوبری داخلی به کار ببرید.

موارد موجود در فایل : سورس کامل

5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *