فهرست مطالب:

ESP32 بلوتوث کنترل از راه دور: 8 مرحله
ESP32 بلوتوث کنترل از راه دور: 8 مرحله

تصویری: ESP32 بلوتوث کنترل از راه دور: 8 مرحله

تصویری: ESP32 بلوتوث کنترل از راه دور: 8 مرحله
تصویری: How to use ESP32 WiFi and Bluetooth with Arduino IDE full details with examples and code 2024, نوامبر
Anonim
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور
ESP32 بلوتوث کنترل از راه دور

این پروژه نمونه ای از نحوه اتصال جوی استیک بلوتوث ارزان BLE به ESP32 است. کد با استفاده از Arduino IDE Ver 1.8.5 با افزونه ESP32 نوشته شده است. جوی استیک BLE مورد استفاده یک دستگاه تجاری است که می توانید آن را در اینترنت با قیمت کمتر از 20.00 دلار یا از فروشگاه محلی پنجBELoW خود با قیمت 5.00 دلار خریداری کنید.

جوی استیکی که برای این پروژه استفاده کردم یک کنترل از راه دور بلوتوث Spektrum VR Control است. در حال کار با تبلت های Android و IOS به عنوان جوی استیک/ماوس برای استفاده با هدست های VR به بازار عرضه می شود.

کنترل از راه دور بلوتوث VR Control دارای یک جوی استیک با محور X و Y ، دو دکمه ماشه در جلو و شش دکمه روی دسته است. دو دکمه برای روشن/خاموش و کنترل حالت هستند. از چهار دکمه دیگر می توان برای هر چیزی که می خواهید استفاده کرد. این پروژه یک اسکلت یا چارچوبی است که تمام رابط بلوتوث و رمزگشایی دکمه ها و جوی استیک را کنترل می کند. تنها کاری که باید انجام دهید این است که فراخوانی های عملکردی را برای کنترل آنچه می خواهید دکمه ها و جوی استیک انجام دهند ، اضافه کنید. برای استفاده از این فریم ورک نیازی به دانستن چیزی در مورد بلوتوث ندارید.

وب سایت های متعددی با دستورالعمل های دقیق برای نصب Arduino IDE و افزونه ESP32 وجود دارد. من قصد ندارم این اطلاعات را در اینجا تکرار کنم. آن را در گوگل جستجو کنید و دستورالعمل ها را دنبال کنید.

چارچوب اقتباس از یک مثال مشتری BLE است که توسط IoT Sharing منتشر شده است. میتوانید اینجا پیدایش کنید. می توانید این کد را مطالعه کنید تا ایده ای از نحوه عملکرد BLE بدست آورید. Expressif یک مثال کامل برای یک مشتری GATT BLE دارد و عملیات را با جزئیات توضیح می دهد (برای Arduino IDE نوشته نشده است). می توانید آن را از اینجا دریافت کنید.

این یک آموزش BLE نیست. من نحوه عملکرد کد را با جزئیات توضیح نمی دهم. من از اصطلاحات BLE برای توصیف برخی از ویژگی های جوی استیک استفاده خواهم کرد. قسمتی از کد که باید برای پروژه خود تغییر دهید به طور مفصل توضیح داده می شود تا به شما در اصلاح آن کمک کند. دامنه محدود است برای کوتاه نگه داشتن این دستورالعمل و تمرکز بر استفاده از جوی استیک.

مرحله 1: کمی درباره بلوتوث کم مصرف (BLE)

این برنامه آموزشی برای BLE نیست. وقتی این پروژه را شروع کردم ، تفاوت BLE و بلوتوث کلاسیک را نمی دانستم. فقط می خواستم ببینم آیا می توانم جوی استیک خریداری شده را با ESP32 کار کنم یا نه. در متن زیر من از اصطلاحات BLE برای ارائه یک نمای ساده از نحوه عملکرد BLE استفاده می کنم.

BLE از معماری کلاینت/سرور استفاده می کند. یک دستگاه سروری است که خدمات ارائه می دهد. دستگاه دیگر مشتری است که خدمات مصرف می کند. به منظور پایین نگه داشتن نیازهای برق ، BLE تنها بسته های کوچکی از اطلاعات را هنگام تغییر ایجاد می کند. در مورد جوی استیک ، دستگاه جوی استیک یک سرور است. به عنوان سرور ، خود را تبلیغ می کند و در صورت درخواست ، لیستی از خدمات ارائه شده را ارسال می کند. دستگاه جوی استیک پنج سرویس را تبلیغ می کند. تنها سرویس مورد علاقه ما سرویس BLE HID (دستگاه رابط انسانی) است. سرویس BLE دارای ویژگی های مرتبط با آن است. یک مشخصه معمولاً یک منبع داده است. سرویس HID جوی استیک دارای ده ویژگی است. برخی از ویژگی ها تکراری هستند و نادیده گرفته می شوند. ما فقط به ویژگی های گزارش BLE که دارای قابلیت Read and Notify هستند علاقه مند هستیم. سه ویژگی با این الزامات مطابقت دارد و اطلاعاتی در مورد موقعیت جوی استیک و وضعیت دکمه ها ارائه می دهد. هنگامی که اعلان فعال است ، سرور بسته های داده ای را ارسال می کند که تغییری در ویژگی مربوطه تشخیص داده شود.

چارچوب تأیید می کند که سروری که پیدا می کند دارای سرویس BLE HID است و سپس اعلان ها را در سه ویژگی گزارش که اطلاعات جوی استیک و دکمه را ارائه می دهند فعال می کند. سپس ، وقتی دکمه ای فشار داده می شود یا رها می شود یا جوی استیک منتقل می شود ، ESP32 بسته ای از داده ها را دریافت می کند که به آن می گوید موقعیت جوی استیک جدید و/یا وضعیت برخی دکمه ها چیست.

مرحله 2: شاخص های اسکن و اتصال

این چارچوب دو LED ، GREENLED و BLUELED را تعریف کرده و آنها را به دو پین GPIO ESP32 اختصاص می دهد. GREENLED هنگامی روشن می شود که ESP32 در حال جستجوی جوی استیک BLE است. وقتی جوی استیک پیدا شد GREENLED خاموش می شود و BLUELED روشن می شود تا نشان دهد که اتصال برقرار شده است و شما آماده رفتن هستید. اگر اتصال قطع شود ، BLUELED خاموش است ، ESP32 بازنشانی می شود ، GREENLED روشن می شود و اسکن دوباره شروع می شود. اگر جوی استیک در عرض سی ثانیه یافت نشد ، اسکن متوقف می شود و GREENLED خاموش می شود. بعد از پنج ثانیه ، اسکن دوباره شروع می شود و GREENLED روشن می شود.

نتیجه نهایی این است که ESP32 به جستجوی جوی استیک تا یافتن آن ادامه می دهد. هنگامی که اتصال برقرار شد ، در صورت قطع شدن ، ESP32 خود را بازنشانی می کند و دوباره شروع به اسکن می کند. ESP32 بازنشانی می شود زیرا هیچ عملکرد ESP32 SDK برای تنظیم مجدد پشته Bluetooth برای شروع مجدد اسکن وجود ندارد.

مرحله 3: رمزگشایی رویدادهای جوی استیک و دکمه

یک رویداد فراخوانی در ESP32 سه بسته مختلف داده را از سرور دریافت می کند به دلیل سه ویژگی که برای ارائه اعلانات تنظیم شده است. یک بسته چهار بایت طول دارد. سه بایت شامل موقعیت محور X ، موقعیت محور Y و دکمه های ماشه است که در بایت ترسیم شده اند. دو بسته دیگر هر کدام دو بایت هستند و دارای یک بایت واحد هستند که حالت دکمه bit mapped را دارد. بسته های دریافتی رمزگشایی شده و در یک آرایه بایت در حافظه کپی می شوند. داده های محور جوی استیک به بایت های داده X و Y می رود و هر یک از بایت های دکمه نقشه برداری سه بیتی به بایت مناسب آن دکمه ها هدایت می شود.

یک وظیفه FreeRTOS برای رسیدگی به داده های دریافت شده توسط اعلان ها ایجاد شده است. یک کار برای دکمه های جوی استیک و ماشه ، یک کار برای دکمه های A & B و یک کار برای دکمه های C & D. هر یک از این وظایف به وضوح مناطقی را مشخص کرده اند که در آنها باید کد خود را اضافه کنید تا آنچه را که می خواهید با رویداد انجام دهید. در بدنه کار به دنبال نظر "// ===== اضافه کردن کد خود در اینجا =====" باشید و کد خود را بعد از آن اضافه کنید. هر وظیفه دارای یک نظر است که نشان می دهد برای چه چیزی استفاده می شود و از Serial.println () برای چاپ پیام در مورد رویداد رخ داده استفاده می کند.

در اینجا مثالی از وظیفه دکمه A/B آمده است.

void taskButtonAB (پارامتر void *) {uint8_t buttons؛

// ===== اگر کار نیاز به یکبار راه اندازی اولیه دارد ، آن را اینجا ===== قرار دهید

while (true) {// CPU را رها کنید ، منتظر داده های جدید vTaskSuspend (NULL) باشید ؛ // ما تازه بیدار شدیم ، داده های جدید در دسترس است دکمه ها = VrBoxData [VB_BTNAB] ؛ Serial.printf ("دکمه های A/B:٪ 02X / n" ، دکمه ها) ؛ if (دکمه ها & VB_BUTTON_A) {// دکمه A را فشار داده یا نگه داشته است Serial.println ("دکمه A") ؛ // ===== کد خود را در اینجا اضافه کنید =====}

if (دکمه ها و VB_BUTTON_B)

{// دکمه B را فشار داده یا نگه داشته است Serial.println ("دکمه B") ؛

// ===== کد خود را در اینجا ===== اضافه کنید

}} // for} // taskButtonAB

مرحله 4: عملیات جعبه واقعیت مجازی: جوی استیک

اگر جوی استیک در موقعیت مرکزی باقی بماند ، هیچ اعلان جوی استیک ارسال نمی شود. هنگامی که جوی استیک از مرکز خارج می شود ، یک پیام اطلاع رسانی با داده های جوی استیک و داده های دکمه ماشه در هر 15mS ارسال می شود. هنگامی که جوی استیک به مرکز منتقل می شود ، اعلان اینکه به مرکز منتقل شده است ارسال نمی شود. به عبارت دیگر ، به شما می گوید جوی استیک از مرکز خارج شده است ، اما نه اینکه به مرکز حرکت کرده باشد. نتیجه نهایی این است که شما پیام هایی دریافت می کنید که نشان می دهد جوی استیک به سمت مرکز حرکت می کند ، اما نه اینکه به مرکز رسیده باشد. بسیار آزار دهنده. دو دکمه ماشه با داده های جوی استیک گنجانده شده است. با فشار دادن یکی از دکمه های ماشه پس از بازگشت جوی استیک به مرکز ، موقعیت جوی استیک را به صفر می رساند. Framework دارای یک زمان سنج داخلی است که به طور خودکار یک پیام اعلان جوی استیک را پس از رسیدن همه پیام های اعلان جوی استیک/ماشه شبیه سازی می کند. تایمر جوی استیک را صفر می کند. محدوده جوی استیک در هر محور +/- 25 است.

مرحله 5: عملکرد جعبه VR: دکمه های راه اندازی

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

نگه داشتن دکمه ماشه پایین باعث می شود که سرور متوجه نشود که دکمه ماشه بالا فشار داده شده است. نگه داشتن دکمه ماشه بالا و فشار دادن دکمه ماشه پایین باعث می شود که سرور یک پیام اطلاع رسانی مبنی بر فشار دادن دکمه ماشه پایین تر ارسال کند (دکمه ماشه بالا صفر خواهد بود!). انتشار دکمه ماشه پایین باعث می شود که سرور اعلانی مبنی بر فشار دادن دکمه ماشه بالا و آزاد شدن ماشه پایین ارسال کند.

به عبارت دیگر ، دکمه ماشه پایین بر دکمه ماشه بالا غالب است و با فشردن هر دو آن را لغو می کند. شما باید نحوه رسیدگی به مورد فشردن هر دو دکمه را تعیین کنید.

مرحله 6: عملکرد جعبه VR: دکمه های A/B

دکمه های A و B مانند جوی استیک عمل می کنند و در صورت فشردن و نگه داشتن آنها پیغام های اعلان را به طور مداوم ارسال می کنند. وقتی دکمه آزاد شد پیام ها متوقف می شوند. دکمه های A و B شبیه به دکمه های Trigger عمل می کنند ، زیرا دکمه A بر دکمه B غالب است ، درست مانند دکمه ماشه پایین بر دکمه ماشه بالا.

مرحله 7: عملکرد جعبه VR: دکمه های C/D

دکمه های C و D یکبار هنگام فشار دادن و یک بار دیگر هنگام رها شدن پیام اعلان را ارسال می کنند. در صورت متوقف شدن ، هیچ پیام دیگری تا زمان انتشار ارسال نمی شود. با نگه داشتن یکی از دکمه های C یا D ، سرور از تشخیص فعالیت روی دکمه دیگر جلوگیری می کند.

مرحله 8: نتیجه گیری

به نظر من عملکرد دکمه ها کمی مبهم است. Framework مکان هایی را برای قرار دادن کد شما در هنگام فشار دادن یک دکمه فراهم می کند. اگر شما همچنین نیاز به تشخیص انتشار دکمه دارید ، این امر به شما واگذار می شود تا نحوه انجام کار را بفهمید.

این کاملاً به شما بستگی دارد که تعیین کنید هر دکمه می خواهد چه کاری انجام دهد و حرکت جوی استیک باید چه کاری انجام دهد. نحوه کنترل تفاوت های ماشه ، A & B و دکمه های C & D به خود شما بستگی دارد.

در کد جستجو کنید ؛ taskJoyStick () ، taskButtonAB () ، taskButtonCD () کار می کند و بعد از نظر "// ===== اضافه کردن کد خود در اینجا =====" کد خود را اضافه کنید.

برای انجام جوی استیک (جلو ، عقب ، راست و چپ) به حداکثر چهار عملکرد و برای کنترل دکمه های مختلف به حداکثر شش عملکرد نیاز دارید. همه آنها را اجرا کنید یا فقط آنچه را که نیاز دارید انجام دهید. انتخاب باشماست.

اگر از این چارچوب استفاده می کنید. من دوست دارم فریادی در مورد آنچه شما برای آن استفاده کرده اید و اگر استفاده از آن آسان می دانید ، فریاد بزنم.

اگر در مورد نحوه عملکرد آن س questionsالی دارید یا برای کار کردن به کمک نیاز دارید ، با من تماس بگیرید.

کد در GitHub در اینجا موجود است.

لذت بردن.

توصیه شده: