ESP32 ٹیوٹوریل 30/55 - ایڈافرٹ آئی او سروس کا استعمال کرتے ہوئے MQTT کے ذریعے ویب پر سروو کو کنٹرول کریں | سن فاؤنڈر کا ESP32 IoT لرننگ کٹ
اس ٹیوٹوریل میں، ہم سیکھیں گے کہ ESP32 مائیکروکنٹرولر اور MQTT پروٹوکول کا استعمال کرتے ہوئے ویب پر سروو موٹر کی پوزیشن کو کیسے کنٹرول کیا جائے۔ Adafruit IO سروس کا فائدہ اٹھاتے ہوئے، آپ سروو کو مختلف زاویوں جیسے 0°، 90°، یا 180° پر دور سے پوزیشن کر سکیں گے۔ یہ پروجیکٹ ESP32 کی صلاحیتوں کو ظاہر کرتا ہے، جس میں بلٹ ان Wi-Fi اور Bluetooth شامل ہیں، جو اسے IoT ایپلیکیشنز کے لیے ایک طاقتور ٹول بناتا ہے۔

اس پروجیکٹ میں، ہم Adafruit IO کا استعمال کرتے ہوئے ایک MQTT بروکر ترتیب دیں گے، سروو کو کنٹرول کرنے کے لیے ایک ڈیش بورڈ بنائیں گے، اور ESP32 کو اس سے منسلک کریں گے۔ سروو کی پوزیشن ڈیش بورڈ پر سلائیڈر کے ذریعے ایڈجسٹ کی جا سکے گی، جس سے کسی بھی انٹرنیٹ سے منسلک ڈیوائس سے ریئل ٹائم کنٹرول ممکن ہو گا (ویڈیو میں 5:30 پر)۔
ہارڈویئر کی وضاحت
اس پروجیکٹ کے بنیادی اجزاء میں ESP32 مائیکروکنٹرولر اور سروو موٹر شامل ہیں۔ ESP32 ایک ورسٹائل مائیکروکنٹرولر ہے جس میں مربوط Wi-Fi اور Bluetooth صلاحیتیں ہیں، جو اسے IoT ایپلیکیشنز کے لیے مثالی بناتی ہیں۔ یہ MQTT پروٹوکول کا استعمال کرتے ہوئے Adafruit IO سروس کے ساتھ بات چیت کرتا ہے، جو انٹرنیٹ پر پیغامات منتقل کرنے کے لیے ہلکا پھلکا اور موثر ہے۔
سروو موٹر ایک روٹری ایکچیویٹر ہے جو کونیی پوزیشن کے درست کنٹرول کی اجازت دیتا ہے۔ یہ پلس-وڈتھ ماڈیولیشن (PWM) سگنل حاصل کرکے کام کرتا ہے جو اس کی پوزیشن کا تعین کرتا ہے۔ اس پروجیکٹ میں، ہم سروو کو ESP32 کے ڈیجیٹل پنوں میں سے ایک سے منسلک کریں گے، جس سے ہم اس کے زاویے کو دور سے کنٹرول کر سکیں گے۔
ڈیٹاشیٹ کی تفصیلات
| مینوفیکچرر | Parallax |
|---|---|
| پارٹ نمبر | SG90 |
| لاجک/IO وولٹیج | 3.3 V - 5 V |
| سپلائی وولٹیج | 4.8 V - 6.0 V |
| آؤٹ پٹ کرنٹ (فی چینل) | 1 A زیادہ سے زیادہ |
| PWM فریکوئنسی رہنمائی | 50 Hz |
| ان پٹ لاجک تھریشولڈز | 0.3 V - 0.7 V |
| وولٹیج ڈراپ / RDS(on) / سنترپتی | 0.2 V زیادہ سے زیادہ |
| تھرمل حدود | آپریٹنگ درجہ حرارت: -10°C سے 60°C |
| پیکیج | پلاسٹک کیس |
| نوٹس / مختلف قسمیں | منی سروو، 180° گردش |
- سروو کو مناسب وولٹیج سپلائی یقینی بنائیں (4.8 V - 6.0 V)۔
- ESP32 اور سروو کے درمیان مشترکہ زمین استعمال کریں۔
- سروو کی حدود سے تجاوز کرنے سے بچنے کے لیے PWM سگنل کی نگرانی کریں۔
- آپریشن کے دوران منقطع ہونے سے بچنے کے لیے سروو کو محفوظ طریقے سے منسلک کریں۔
- مطابقت کو یقینی بنانے کے لیے Adafruit MQTT لائبریری کو اپ ڈیٹ کریں۔
MQTT ڈایاگرام
وائرنگ ہدایات

سروو موٹر کو ESP32 سے وائر کرنے کے لیے، سروو کی زمینی تار کو ESP32 کے زمینی پن سے جوڑ کر شروع کریں۔ اگلا، سروو کی پاور تار (عام طور پر سرخ) کو ESP32 کے 5V پن سے منسلک کریں۔ آخر میں، سگنل تار (اکثر پیلا یا سفید) کو ESP32 کے ڈیجیٹل پن 25 سے جوڑیں۔ یقینی بنائیں کہ آپریشن کے دوران منقطع ہونے سے بچنے کے لیے کنکشن محفوظ ہیں۔
اگر آپ 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 کنکشن مستحکم ہے۔ اگر سروو جواب نہیں دیتا ہے، تو وائرنگ اور سروو کو بجلی کی فراہمی چیک کریں (ویڈیو میں 20:15 پر)۔
سروو کی حد کی حدود سے آگاہ رہیں؛ 0° سے 180° کے باہر کوئی قدر بھیجنا اسے غیر متوقع طور پر برتاؤ کرنے کا سبب بن سکتا ہے۔ کوڈ میں اس حد کے اندر زاویہ کو محدود کرکے ایسے واقعات کو روکنے کے لیے چیک شامل ہیں۔
ویڈیو ٹائم اسٹیمپس
- 00:00 آغاز
- 1:54 پروجیکٹ کا تعارف
- 2:52 MQTT کا تعارف
- 6:50 Adafruit IO سیٹ اپ
- 9:54 سروو کی وائرنگ
- 11:07 کوڈ کی وضاحت
- 18:59 ESP32 بورڈ اور COM پورٹ کا انتخاب
- 22:10 پروجیکٹ کا مظاہرہ
/***********************************************************************
This is Arduino sketch for ESP32 to control Servo motor using MQTT service of Adafruit
www.Robojax.com
Written By Ahamd Shamshiri
on Feb 2nd, 2024
Watch video instruction for this code on YouTube https://youtu.be/T4DhWNg2Rb8
Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
this code can be downloaded from https://robojax.com/RJT671
/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
#include <ESP32Servo.h>
// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle =defaultServoAngle;
// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "Barqasaa"
#define WLAN_PASS "wan9&Jang~5"
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
// Using port 8883 for MQTTS
#define AIO_SERVERPORT 8883
// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
// #define AIO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"
// #define AIO_KEY "YOUR_ADAFRUIT_IO_KEY"
#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"
/************ Global State (you don't need to change this!) ******************/
// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// io.adafruit.com root 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";
/****************************** Feeds ***************************************/
// Setup a feed called 'test' for publishing and 'test2' for subscription.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe SERVO = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/servo-angle-1");
/*************************** Sketch Code ************************************/
void setup() {
// Attach the servo to the specified pin and set its pulse width range
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
// Set the PWM frequency for the servo
myServo.setPeriodHertz(50); // Standard 50Hz servo
Serial.begin(115200);
delay(10);
Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));
// Connect to WiFi access point.
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
delay(1000);
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set Adafruit IO's root CA
client.setCACert(adafruitio_root_ca);
// register callback for feed
SERVO.setCallback(servoCallback);
// Setup MQTT subscription for time feed.
mqtt.subscribe(&SERVO);
}
// uint32_t x=0;
void loop() {
// Ensure the connection to the MQTT server is alive (this will make the first
// connection and automatically reconnect when disconnected). See the MQTT_connect
// function definition further below.
MQTT_connect();
Serial.print("Angle: ");
Serial.println(servoAngle);
// wait 0.5 seconds for subscription messages
mqtt.processPackets(500);
//from lesson 17
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
// wait a couple seconds to avoid rate limit
//delay(2000);
}
void servoCallback(char* message, uint16_t len) {
char messageBuffer[40];
snprintf(messageBuffer, sizeof(messageBuffer), "Servo status is :: %s, len :: %u", message, len);
Serial.println(messageBuffer);
Serial.println(message);
String inString = message;//sotre the message to String
servoAngle = inString.toInt();//convert the message to Integer
if(servoAngle >180 || servoAngle < 0)
{
servoAngle =0;
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1)
;
}
}
Serial.println("MQTT Connected!");
}
Common Course Links
Common Course Files
آپ کو جن چیزوں کی ضرورت ہو سکتی ہے
-
علی ایکسپریسPurchase SG90 Servo motor 180 or 360 from AliExpresss.click.aliexpress.com
وسائل اور حوالہ جات
-
دستاویزاتESP32 Tutorial 17/55- SunFunder Servo motor documentationdocs.sunfounder.com
-
باہرونیSG90 servo on Amazon USAamzn.to
فائلیں📁
دیگر فائلیں
-
SG90 سیروموٹر کی ڈیٹا شیٹ
robojax-servo-SG90_datasheet.pdf0.12 MB