کنترل ESP32 با تشخیص حالت دست (پروژه OpenCV)

این پروژه ESP32 یک روش تعاملی و جذاب برای کنترل LEDها با استفاده از حرکات دست است. در این پروژه از برد ESP32، Python، MediaPipe و OpenCV استفاده میکنیم تا سیستمی بسازیم که حرکات دست را تشخیص داده و آنها را به دستورات کنترل LED تبدیل کند. MediaPipe برای شناسایی حرکات دست به کار میرود و OpenCV ویدیو زنده وبکم را دریافت میکند. بسته به حرکت دست (مثل باز کردن دست، مشت کردن یا حرکات انگشتان)، دستورات به ESP32 ارسال شده و LEDهای متصل به آن را کنترل میکنند. با این روش میتوان LEDها را روشن یا خاموش کرد، روشنایی آنها را تغییر داد یا LEDهای مختلف را با حرکات مشخص کنترل کرد. این پروژه یک روش عملی و سرگرمکننده برای یادگیری تشخیص حرکات، کنترل سختافزار و ارتباط بین Python و میکروکنترلرهاست.
بررسی پروژه تشخیص حالت دست با ESP32
این پروژه نشان میدهد چگونه میتوان LEDها را با حرکات دست از طریق ترکیبی از Python، OpenCV و میکروکنترلر ESP32 کنترل کرد. حرکات دست توسط وبکم شناسایی شده و با MediaPipe پردازش میشوند. هر حرکت شناساییشده به یک دستور کنترل LED مانند روشن یا خاموش کردن LEDها نگاشت میشود. این امکان کنترل تعاملی LEDها با حرکات ساده دست را فراهم میکند.
دستورات تولیدشده از حرکات دست به صورت بیسیم از طریق Wi-Fi و با استفاده از HTTP به ESP32 ارسال میشوند. ESP32 به عنوان سرور عمل کرده و دستورات را دریافت و LEDهای متصل به پایههای GPIO خود را کنترل میکند. این پروژه بینایی ماشین، سیستمهای امبدد و شبکه را ترکیب کرده و نقطه شروع عالی برای مبتدیان علاقهمند به سیستمهای کنترل حرکتی، IoT و یکپارچهسازی سختافزار و نرمافزار ارائه میدهد.
قطعات مورد نیاز
- برد ESP32 – 1 عدد (کنترلکننده دستورات دریافتی بر اساس حرکات دست)
- LED ها – 5 عدد (برای هر انگشت: شست، سبابه، وسطی، حلقه و کوچک)
- مقاومت ها – پنج عدد 220Ω برای هر LED
- سیم های جامپر – نر به ماده
- برد بورد
مدار تشخیص دست با ESP32

برای کنترل 5 LED با ESP32، LED ها به پایههای GPIO خاص متصل میشوند و هر LED به یک حرکت دست اختصاص دارد. پایه مثبت هر LED (آند) به یک GPIO مشخص مانند 14، 27، 26، 25 و 33 متصل میشود تا LEDها را کنترل کند. برای جلوگیری از جریان بیش از حد که ممکن است به LED یا ESP32 آسیب بزند، یک مقاومت 220Ω یا 330Ω در سری با هر LED قرار میگیرد. این مقاومتها جریان عبوری از LEDها را محدود کرده و ایمنی عملکرد را تضمین میکنند.

پایه منفی هر LED (کاتد) به زمین (GND) ESP32 متصل میشود تا یک مدار کامل برای هر LED ایجاد شود. وقتی یک پایه GPIO در حالت HIGH قرار میگیرد، ولتاژ به آند LED ارسال شده و LED روشن میشود؛ و با قرار دادن GPIO در حالت LOW، LED خاموش میشود. با این اتصالات، سیستم کنترل LED با حرکات دست میتواند هر LED را بر اساس حرکت شناساییشده روشن یا خاموش کند و محیطی تعاملی و کاربردی ایجاد نماید.

کد آردوینو ESP32 برای کنترل LEDها با ژست دست
حال بیایید منطق و عملکرد کد این پروژه تشخیص موقعیت صدا را بررسی کنیم.
این کد، ESP32 را بهعنوان یک وبسرور تنظیم میکند که 5 LED مربوط به انگشت شست، اشاره، میانی، حلقه و کوچک را کنترل میکند. هر LED به یک پین GPIO خاص متصل است و از طریق درخواستهای HTTP روشن یا خاموش میشود. ESP32 با استفاده از اطلاعات ورود به شبکه WiFi متصل میشود و پس از اتصال، نقاط پایانی (endpoints) برای کنترل هر LED ارائه میدهد. وقتی کاربر به URL مربوط به یک LED دسترسی پیدا میکند (مثلاً “/led/thumb/on”)، LED مربوطه روشن شده و پیامی بهعنوان پاسخ ارسال میشود. سرور روی پورت 80 فعالیت میکند و درخواستهای کنترل LEDها را مدیریت میکند.
حال بیایید کد را از ابتدا و با بررسی کتابخانههای استفادهشده بررسی کنیم.
کتابخانههای استفادهشده:
- ESPAsyncWebServer – موجود در Library Manager
- Wire – کتابخانه پیشفرض
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در این قسمت توضیح قسمت های مهم کد را مشاهده میکنید.
توضیح کد آردوینو برای برد ESP32
مقدمه: ESP32 ارتباط سریال را با نرخ 115200 بیت بر ثانیه راهاندازی کرده و پینهای GPIO (27، 26، 25، 33، 32) را برای LEDها تنظیم میکند.
راهاندازی LED: همه LEDها در ابتدا خاموش هستند و پینهای GPIO مربوطه روی LOW قرار دارند.
اتصال WiFi: ESP32 تلاش میکند تا با استفاده از SSID و رمز عبور ارائهشده به شبکه WiFi مشخصشده متصل شود.
بررسی وضعیت WiFi: اگر اتصال موفق باشد، آدرس IP چاپ میشود؛ در غیر این صورت، تا 20 ثانیه تلاش میکند.
راهاندازی سرور: پس از اتصال به WiFi، ESP32 یک سرور HTTP روی پورت 80 راهاندازی میکند.
تعریف نقاط پایانی: هندلرهای درخواست GET برای هر LED تعریف شدهاند، با URLهایی برای روشن یا خاموش کردن هر LED (مثلاً “/led/thumb/on”).
کنترل LED: وقتی درخواست به یک نقطه پایانی مشخص دریافت میشود، LED مربوطه روشن یا خاموش میشود.
پاسخ: هر درخواست HTTP با یک پیام تأیید پاسخ داده میشود، مانند “Thumb LED is ON” یا “Price – 300”.
شروع سرور: سرور شروع به گوش دادن به درخواستهای ورودی میکند و کنترل LEDها از طریق نقاط پایانی وب فراهم میشود.
Loop: تابع loop() خالی است، زیرا سرور بهصورت آسنکرون کار میکند و درخواستها را بدون نیاز به بررسی مداوم در حلقه پردازش میکند.
توضیح کد پایتون با استفاده از OpenCV و MediaPipe
این کد از OpenCV و MediaPipe برای شناسایی ژستهای دست از طریق وبکم استفاده میکند. این کد وضعیت هر انگشت (بالا یا پایین) را تشخیص میدهد و دستورات کنترل مربوطه را به ESP32 ارسال میکند، مانند روشن یا خاموش کردن LEDها. آدرس IP ESP32 تعیین شده و با سرور از طریق درخواستهای HTTP ارتباط برقرار میکند. برنامه بررسی میکند که آیا همه انگشتان پایین هستند و در این صورت دستور خاصی ارسال میکند. تشخیص ژست دست روی صفحه نمایش داده شده و دستور ESP32 بهصورت زنده نمایش داده میشود.
کتابخانههای استفادهشده:
- pip install opencv-python
- pip install mediapipe
- pip install requests
راهاندازی کتابخانهها: OpenCV و MediaPipe برای مدیریت ویدئو و شناسایی ژست دست وارد شدهاند.
تعیین IP ESP32: آدرس IP ESP32 تعریف شده است که برای ارسال و دریافت درخواستهای HTTP استفاده میشود.
راهاندازی MediaPipe Hands: مدل ردیابی دست MediaPipe برای شناسایی و پردازش نقاط مرجع دست در ویدئو فعال میشود.
تعریف تابع control_led: این تابع دستوری به ESP32 ارسال میکند تا LEDها بر اساس ژست دست روشن یا خاموش شوند.
تعریف تابع fetch_esp32_command: این تابع با ارسال یک درخواست GET HTTP به URL مشخص، دستورات ESP32 را دریافت میکند.
تعریف تابع count_fingers: این تابع نقاط مرجع دست را تحلیل میکند تا تعیین کند هر انگشت بالا یا پایین است و دستورات مربوطه را به ESP32 ارسال میکند.
ضبط ویدئو: کد، ویدئو (دوربین) را باز کرده و فریمها را برای پردازش دریافت میکند.
پردازش نقاط مرجع دست: MediaPipe هر فریم را پردازش میکند تا نقاط مرجع دست را تشخیص داده و وضعیت هر انگشت (بالا یا پایین) را شناسایی کند.
ارسال دستورات به ESP32: بر اساس وضعیت تشخیص دادهشده انگشتان، دستورات برای روشن یا خاموش کردن LEDها به ESP32 ارسال میشود.
نمایش نتایج: ژست دست و دستور ESP32 بهصورت زنده روی صفحه نمایش داده میشود و برنامه تا فشردن کلید “Esc” توسط کاربر به پردازش ویدئو ادامه میدهد.
نکات کلیدی برای یادآوری:
اطمینان حاصل کنید که “http://192.168.x.x” با آدرس IP واقعی که در Serial Monitor آردوینو IDE مشاهده میکنید جایگزین شود.
بررسی عملکرد پروژه تشخیص ژست دست
این سیستم امکان کنترل شهودی LEDها با ژست دست را فراهم میکند. با تشخیص موقعیت انگشتان با استفاده از MediaPipe، پروژه تعیین میکند کدام انگشتان بالا هستند و دستورات مربوطه را به ESP32 ارسال میکند. هر انگشت (شست، اشاره، میانی، حلقه و کوچک) به یک LED مشخص متصل است. وقتی یک انگشت بالا میرود، LED مربوطه روشن میشود و هنگام پایین آمدن، LED خاموش میشود. این پروژه دستورات کنترل را از طریق درخواستهای HTTP به ESP32 ارسال میکند و کنترل چند LED را بهصورت همزمان و در زمان واقعی امکانپذیر میسازد. علاوه بر این، اگر همه انگشتان پایین باشند، سیستم یک عمل از پیش تعریفشده مانند خاموش کردن همه LEDها را اجرا میکند. این راهحل، شناسایی ژست دست را با اینترنت اشیا (IoT) ترکیب کرده و تعامل روان بین کاربر و سختافزار ESP32 را فراهم میکند.


موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود







