دليل ESP32 30/55 - التحكم في السيرفو عبر الويب باستخدام MQTT من خلال خدمة Adafruit IO | مجموعة تعلم IoT من SunFounder للـ ESP32
في هذا الدرس، سنتعلم كيفية التحكم في موضع محرك السيرفو باستخدام متحكم ESP32 وبروتوكول MQTT عبر الويب. من خلال الاستفادة من خدمة Adafruit IO، ستكون قادرًا على تحديد موضع السيرفو عند زوايا مختلفة مثل 0°، 90°، أو 180° عن بُعد. يوضح هذا المشروع قدرات ESP32، الذي يتضمن Wi-Fi وBluetooth مدمجين، مما يجعله أداة قوية لتطبيقات إنترنت الأشياء.

في هذا المشروع، سنقوم بإعداد وسيط MQTT باستخدام Adafruit IO، وإنشاء لوحة تحكم للتحكم في السيرفو، وتوصيل ESP32 بها. ستكون موضع السيرفو قابلة للتعديل من خلال منزلق على لوحة التحكم، مما يسمح بالتحكم في الوقت الحقيقي من أي جهاز متصل بالإنترنت (في الفيديو في 5:30).
شرح الأجهزة
تشمل المكونات الأساسية في هذا المشروع المتحكم الصغري ESP32 ومحرك السيرفو. إن ESP32 هو متحكم صغري متعدد الاستخدامات مع قدرات واي فاي وبلوتوث مدمجة، مما يجعله مثالياً لتطبيقات إنترنت الأشياء. يتواصل مع خدمة Adafruit IO باستخدام بروتوكول MQTT، الذي يعتبر خفيف الوزن وفعالًا في نقل الرسائل عبر الإنترنت.
المحرك المؤازر هو منظمات دوارة تتيح التحكم الدقيق في الموضع الزاوي. يعمل من خلال استلام إشارة تعديل عرض النبضة (PWM) التي تحدد موقعه. في هذا المشروع، سنقوم بتوصيل المحرك المؤازر بأحد الدبابيس الرقمية على ESP32، مما سيمكننا من التحكم في زاويته عن بُعد.
تفاصيل ورقة البيانات
| المصنع | بارالاكس |
|---|---|
| رقم الجزء | SG90 |
| فولتية المنطق/مدخلات/مخرجات | ٣.٣ فولت - ٥ فولت |
| جهد الإمداد | ٤.٨ فولت - ٦.٠ فولت |
| التيار الناتج (لكل قناة) | 1 أ قصوى |
| توجيه تردد PWM | 50 هرتز |
| عتبات منطق الإدخال | 0.3 فولت - 0.7 فولت |
| انخفاض الجهد / Rدي إس (أون)/ التشبع | 0.2 فولت كحد أقصى |
| الحدود الحرارية | درجة حرارة التشغيل: -10°C إلى 60°C |
| حزمة | حافظة بلاستيكية |
| ملاحظات / متغيرات | سيرفو صغير، دوران 180° |
- تأكد من توفير جهد مناسب للسيرفو (4.8 فولت - 6.0 فولت).
- استخدم أرضية مشتركة بين ESP32 والمحرك.
- راقب إشارة PWM لتجنب تجاوز حدود السيرفو.
- قم بتوصيل السيرفو بشكل آمن لتجنب الانقطاعات أثناء التشغيل.
- قم بتحديث مكتبة Adafruit MQTT لضمان التوافق.
مخططات MQTT
تعليمات التوصيل

لربط محرك السرفو بـ ESP32، ابدأ بتوصيل سلك الأرضي لمحرك السرفو إلى دبوس الأرضي على ESP32. بعد ذلك، قم بتوصيل سلك الطاقة (عادةً ما يكون أحمر) لمحرك السرفو إلى دبوس 5 فولت على ESP32. أخيرًا، قم بتوصيل سلك الإشارة (غالبًا ما يكون أصفر أو أبيض) إلى الدبوس الرقمي 25 على ESP32. تأكد من أن الاتصالات آمنة لمنع أي انقطاع أثناء التشغيل.
إذا كنت تستخدم بطارية لت powering ال ESP32، تأكد من أن جهد البطارية ضمن النطاق المقبول لكل من ESP32 والمحرك. بالإضافة إلى ذلك، تحقق مرة أخرى من أن الأسلاك تتطابق مع تعريفات الدبابيس المستخدمة في الكود الخاص بك لتجنب أي مشاكل (في الفيديو في 12:45).
أمثلة على الكود وإرشادات الاستخدام
في الكود المقدم، نقوم أولاً بإدراج المكتبات اللازمة لـ ESP32 و MQTT. نقوم بتعريف كائن السيرفو وتحديد الدبوس المتصل به.const int servoPin = 25;. يتم أيضًا تعيين الزاوية الافتراضية معconst int defaultServoAngle = 90;، والتي ستكون الموضع الأولي عند بدء تشغيل ESP32.
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;
تقوم هذه المقتطفات بتهيئة الخادم على الدبوس 25 وتعيين زاويته الافتراضية إلى 90°. المتغيرservoAngleسيتم التحديث بناءً على الرسائل المستلمة من وسيط MQTT.
فيsetup()نقوم بتوصيل Wi-Fi وإعداد عميل MQTT. تم تعريف بيانات اعتماد Adafruit IO هنا، بما في ذلك اسم المستخدم و المفتاح:
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
تحدد هذه القسم الاتصال بخدمة Adafruit IO. تأكد من استبدال هذه القيم ببيانات اعتماد Adafruit IO الخاصة بك عند تنفيذ الكود.
أخيرًا، تضمن الحلقة الرئيسية أن تظل الاتصال بخادم MQTT نشطًا وتعالج الرسائل الواردة. يتم تحديث موضع السيرفو بناءً على الزاوية المستلمة:
mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
هذا الرمز يربط زاوية السيرفو بعرض النبضة المقابل ويرسلها إلى محرك السيرفو.processPackets()تسمح الدالة لـ ESP32 بمعالجة رسائل MQTT الواردة، مما يضمن استجابة السيرفو للأوامر المرسلة عبر لوحة التحكم Adafruit IO.
عرض / ماذا تتوقع
بمجرد الانتهاء من الإعداد، يجب أن تكون قادرًا على التحكم في السيرفو من لوحة معلومات Adafruit IO باستخدام المت滑د الذي قمت بإنشائه. بينما تقوم بتحريك المت滑د، سيقوم السيرفو بضبط زاويته في الوقت الحقيقي. تأكد من أن ESP32 الخاص بك متصل بالواي فاي، وأن اتصال MQTT مستقر. إذا لم يستجب السيرفو، تحقق من الأسلاك ومصدر الطاقة للسيرفو (في الفيديو عند :15).
كن على علم بحدود مدى السيرفو؛ إرسال قيمة خارج 0° إلى 180° قد يتسبب في تصرفه بشكل غير متوقع. يتضمن الكود تحققًا لمنع حدوث مثل هذه الحالات عن طريق تثبيت الزاوية ضمن هذا النطاق.
طوابع زمنية للفيديو
- :00 ابدأ
- ١:٥٤ مقدمة المشروع
- :52 مقدمة في MQTT
- إعداد Adafruit IO 6:50
- 9:54 توصيل السيرفو
- 11:07 شرح الكود
- 18:59 اختيار لوحة ESP32 و منفذ COM
- 22:10 عرض المشروع
/*
* هذا هو كود Arduino ل ESP32 للتحكم في محرك السيرفو باستخدام خدمة MQTT من Adafruit www.Robojax.com كتب بواسطة أحمد شمشيري في 2 فبراير 2024 شاهد فيديو التعليمات لهذا الكود على يوتيوب https://youtu.be/T4DhWNg2Rb8 مكتبة Adafruit MQTT مثال ESP32 Adafruit IO SSL/TLS يمكن تحميل هذا الكود من https://robojax.com/RJT671
*
* /// المرجع: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
#include <ESP32Servo.h>
// حدد السيرفو والدبوس المتصل به
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle =defaultServoAngle;
// حدد الحد الأدنى والحد الأقصى لعرض النبضة للسيرفو
const int minPulseWidth = 500; // 0.5 مللي ثانية
const int maxPulseWidth = 2500; // 2.5 مللي ثانية
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/*
* نقطة وصول الواي فاي *********************************/
*
* #define WLAN_SSID "Barqasaa"
* #define WLAN_PASS "wan9&Jang~5"
*
* ************************* إعداد Adafruit.io
*/
#define AIO_SERVER "io.adafruit.com"
// استخدام المنفذ 8883 لـ MQTTS
#define AIO_SERVERPORT 8883
// تكوين حساب Adafruit IO
// (للحصول على هذه القيم، قم بزيارة https://io.adafruit.com وانقر على المفتاح النشط)
// #define AIO_USERNAME "اسم مستخدم أدافروت آي أو"
// #define AIO_KEY "مفتاح_أدافوريت_IO_الخاص_بك"
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
/*
* حالة عالمية (لا تحتاج لتغيير هذا!) ******************/
*
* // WiFiFlientSecure لدعم SSL/TLS
* WiFiClientSecure client;
*
* // إعداد فئة عميل MQTT بتمرير عميل WiFi وبيانات تسجيل دخول خادم MQTT.
* Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
*
* // io.adafruit.com الجذر CA
* const char* adafruitio_root_ca = \
* "-----BEGIN CERTIFICATE-----\n"
* "MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
* "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
* "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
* "MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
* "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
* "b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
* "DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
* "yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
* "gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
* "DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
* "fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
* "6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
* "PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
* "IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
* "AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
* "BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
* "HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
* "b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
* "HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
* "AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
* "c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
* "ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
* "jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
* "TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
* "7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
* "-----END CERTIFICATE-----\n";
*
* /****************************** الخلاصات
*/
// قم بإعداد تدفق يسمى 'test' للنشر و'test2' للاشتراك.
// تلاحظ أن مسارات MQTT لـ AIO تتبع الشكل: <اسم المستخدم>/feeds/<اسم التغذية>
Adafruit_MQTT_Subscribe SERVO = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/servo-angle-1");
Common Course Links
Common Course Files
الأشياء التي قد تحتاجها
-
علي إكسبريساشترِ محرك سيرفو SG90 بزاوية 180 أو 360 من علي إكسبريسs.click.aliexpress.com
الموارد والمراجع
-
توثيقدليل محرك سيرفو SunFunder ESP32 الدرس 17/55docs.sunfounder.com
-
خارجي
ملفات📁
ملفات أخرى
-
ورقة بيانات محرك SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB