کوڈ تلاش کریں

ESP32 ٹیوٹوریل 49/55 - Adafruit IoT کا استعمال کرتے ہوئے انٹرنیٹ پر DC موٹر کو کنٹرول کریں | SunFounder کا ESP32 کٹ

ESP32 ٹیوٹوریل 49/55 - Adafruit IoT کا استعمال کرتے ہوئے انٹرنیٹ پر DC موٹر کو کنٹرول کریں | SunFounder کا ESP32 کٹ

اس ٹیوٹوریل میں، ہم دریافت کریں گے کہ ESP32 اور Adafruit IO MQTT سروس کا استعمال کرتے ہوئے ڈی سی موٹر کو انٹرنیٹ کے ذریعے کیسے کنٹرول کیا جائے۔ ڈی سی موٹر کی رفتار اور سمت کو دور سے کنٹرول کیا جا سکتا ہے، جس سے انٹرنیٹ کنکشن کے ساتھ کہیں سے بھی موثر کنٹرول ممکن ہوتا ہے۔ یہ پروجیکٹ ESP32 مائیکروکنٹرولر کی صلاحیتوں کو ظاہر کرتا ہے، جس میں بلٹ ان وائی فائی موجود ہے، جو اسے انٹرنیٹ آف تھنگز (IoT) ایپلیکیشنز کے لیے مثالی بناتا ہے۔

esp32-49-DC-motor-mqtt-main

ہم ایک ایسا نظام نافذ کریں گے جہاں موٹر کو شروع، روکا جا سکتا ہے، اور اس کی رفتار کو Adafruit IO سے منسلک ویب انٹرفیس کے ذریعے ایڈجسٹ کیا جا سکتا ہے۔ صارفین موٹر کنٹرول کے لیے مخصوص موضوعات کو سبسکرائب کر سکتے ہیں اور پیرامیٹرز کو اس کے مطابق ایڈجسٹ کر سکتے ہیں۔ اس عمل کو بہتر طور پر سمجھنے کے لیے، اس ٹیوٹوریل کے ساتھ موجود ویڈیو ضرور دیکھیں (ویڈیو میں 00:00 پر)۔

ہارڈویئر کی وضاحت

اس پروجیکٹ کے لیے، ہم ESP32 مائیکروکنٹرولر استعمال کریں گے، جو ہمارے نظام کا مرکز ہے۔ ESP32 وائی فائی کمیونیکیشن کو سنبھالنے کی صلاحیت رکھتا ہے، جو اسے ہماری IoT ایپلیکیشن کے لیے بہترین بناتا ہے۔ یہ Adafruit IO پلیٹ فارم سے منسلک ہوتا ہے، جس سے ہم MQTT پروٹوکول کے ذریعے پیغامات بھیج اور وصول کر سکتے ہیں۔

مزید برآں، ہم L293D موٹر ڈرائیور استعمال کریں گے، جو ڈی سی موٹر کو کنٹرول کرنے کے لیے ضروری ہے۔ L293D دو ڈی سی موٹرز چلا سکتا ہے اور پلس وڈتھ ماڈیولیشن (PWM) کے ذریعے سمت اور رفتار دونوں کو کنٹرول کرنے کی اجازت دیتا ہے۔ یہ بنیادی طور پر ESP32 اور موٹر کے درمیان ایک انٹرفیس کے طور پر کام کرتا ہے، موٹر کے لیے درکار زیادہ کرنٹ کو منظم کرتا ہے جبکہ ESP32 کو کسی بھی ممکنہ نقصان دہ بیک-ای ایم ایف سگنلز سے الگ رکھتا ہے۔

ڈیٹاشیٹ کی تفصیلات

مینوفیکچرر ٹیکساس انسٹرومینٹس
پارٹ نمبر L293D
لاجک/آئی او وولٹیج 4.5 - 36 V
سپلائی وولٹیج 4.5 - 36 V
آؤٹ پٹ کرنٹ (فی چینل) 600 ایم اے
پیک کرنٹ (فی چینل) 1.2 اے
PWM فریکوئنسی رہنمائی 10 کلو ہرٹز (عام)
ان پٹ لاجک تھریشولڈز 0.8 V (ہائی)، 2.0 V (لو)
وولٹیج ڈراپ / RDS(on) / سیچوریشن 1.5 V زیادہ سے زیادہ
تھرمل حدود 150 °C
پیکیج DIP-16
نوٹس / ویریئنٹس کواڈروپل ہائی کرنٹ ہاف-ایچ ڈرائیور

 

  • مسلسل آپریشن کے لیے مناسب ہیٹ سنکنگ کو یقینی بنائیں۔
  • موٹر کی رفتار کو مؤثر طریقے سے کنٹرول کرنے کے لیے PWM استعمال کریں۔
  • نقصان سے بچنے کے لیے ان پٹ وولٹیج کی حدود کا مشاہدہ کریں۔
  • تمام اجزاء کے درمیان مناسب گراؤنڈ کنکشن چیک کریں۔
  • بیک-ای ایم ایف سے محتاط رہیں؛ اگر ضروری ہو تو ڈائیوڈ استعمال کریں۔
  • وائرنگ کو دوبارہ چیک کریں کیونکہ پولارٹی موٹر کی سمت کو متاثر کر سکتی ہے۔
  • مکمل آپریشن سے پہلے کم وولٹیج کے ساتھ ٹیسٹ کریں۔
  • طویل استعمال کے دوران زیادہ گرمی پر نظر رکھیں۔
  • اگر مکینیکل سوئچ استعمال ہوں تو ڈیباؤنس کرنا یقینی بنائیں۔
  • یقینی بنائیں کہ ESP32 موٹر کے کرنٹ سے زیادہ لوڈ نہ ہو۔

وائرنگ ہدایات

ESP32-15_L293D_motor_schematic

پاور سپلائی کو جوڑ کر شروع کریں۔ اپنے بیرونی پاور سورس کے مثبت ٹرمینل کو L293D کے VCC پن (پن 8) سے اور گراؤنڈ کو GND پن (پن 4) سے جوڑیں۔ اگر ضرورت ہو تو ESP32 کو الگ سے پاور کریں، عام طور پر مائیکرو USB کنکشن کے ذریعے۔

اگلا، موٹر کو L293D سے جوڑیں۔ موٹر کا ایک ٹرمینل آؤٹ پٹ پن 3 (L293D کا پن 2) سے اور دوسرا ٹرمینل آؤٹ پٹ پن 6 (L293D کا پن 7) سے منسلک ہونا چاہیے۔ کنٹرول سگنلز کے لیے، ESP32 کے پن 13 کو ان پٹ پن 2 (L293D کا پن 1) سے اور پن 14 کو ان پٹ پن 7 (L293D کا پن 2) سے جوڑیں۔ انیبل پن (پن 1) کو بھی 5V سپلائی سے منسلک کیا جانا چاہیے تاکہ ڈرائیور کو فعال کیا جا سکے۔ آخر میں، یقینی بنائیں کہ ESP32 گراؤنڈ L293D گراؤنڈ سے منسلک ہے تاکہ ایک مشترکہ حوالہ ہو۔

کوڈ مثالیں اور واک تھرو

فراہم کردہ کوڈ ضروری لائبریریوں کو انیشیالائز کرتا ہے اور وائی فائی اور MQTT کلائنٹ سیٹ اپ کرتا ہے۔ اہم شناخت کنندگان میں motorSpeed، motorDirection، اور motorStart شامل ہیں، جو Adafruit IO سے موصول ہونے والی کمانڈز کی بنیاد پر موٹر کے آپریشن کو منظم کرتے ہیں۔

bool debug = false;
#define motor1A 13
#define motor2A 14
int motorSpeed = 0;
int motorDirection = 1;
int motorStart = 1;

اس اقتباس میں، موٹر پنز کی وضاحت کی گئی ہے اور رفتار، سمت، اور موٹر کی اسٹارٹ/اسٹاپ حالت کو کنٹرول کرنے کے لیے ابتدائی متغیرات دیے گئے ہیں۔ متغیر motorSpeed کو Adafruit IO سے ان پٹ کی بنیاد پر ایڈجسٹ کیا جائے گا۔

void setup() {
  Serial.begin(115200);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  delay(2000);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}

سیٹ اپ فنکشن میں، سیریل کمیونیکیشن شروع کی جاتی ہے، اور ESP32 مخصوص وائی فائی نیٹ ورک سے منسلک ہوتا ہے۔ یہ کنکشن MQTT کمیونیکیشن کو فعال کرنے کے لیے اہم ہے۔

void loop() {
  MQTT_connect();
  mqtt.processPackets(500);
  runMotor();
}

یہ لوپ فنکشن MQTT کنکشن قائم کرتا ہے اور موصول ہونے والی تازہ ترین کمانڈز کی بنیاد پر موٹر کو کنٹرول کرنے کے لیے آنے والے پیکٹس پر کارروائی کرتا ہے۔ فنکشن runMotor() کو موجودہ سیٹنگز کو موٹر پر لاگو کرنے کے لیے بلایا جاتا ہے۔

ڈیمونسٹریشن / کیا توقع کریں

جب سیٹ اپ مکمل ہو جائے اور کوڈ اپ لوڈ ہو جائے، تو آپ Adafruit IO ڈیش بورڈ کے ذریعے موٹر کو کنٹرول کر سکیں گے۔ آپ سلائیڈر کے ذریعے موٹر کی رفتار کو ایڈجسٹ کر سکتے ہیں اور ٹوگل سوئچ سے اس کی سمت تبدیل کر سکتے ہیں۔ اگر سب کچھ درست طریقے سے وائر کیا گیا ہے، تو موٹر ان کمانڈز کا حقیقی وقت میں جواب دے گی، جو سسٹم کی کم لیٹنسی کو ظاہر کرے گی (ویڈیو میں 00:00 پر)۔

عام مسائل میں غلط وائرنگ کی وجہ سے موٹر کی الٹی سمت شامل ہے، لہٰذا اگر موٹر توقع کے مطابق کام نہ کرے تو کنکشنز کو دوبارہ چیک کریں۔ مزید برآں، یقینی بنائیں کہ آپ کے MQTT موضوعات Adafruit IO میں کوڈ سے مماثل ہونے کے لیے درست طریقے سے ترتیب دیے گئے ہیں۔

ویڈیو ٹائم اسٹیمپس

  • 00:00 آغاز
  • 2:21 پروجیکٹ کا تعارف
  • 4:20 ڈی سی موٹر کو کیسے کنٹرول کیا جاتا ہے
  • 6:39 L293D موٹر ڈرائیور
  • 11:42 MQTT کیا ہے؟
  • 15:03 Adafruit IO سیٹ اپ
  • 19:17 وائرنگ کی وضاحت
  • 22:42 کوڈ کی وضاحت
  • 35:28 پروجیکٹ کا مظاہرہ

تصاویر

ESP32-15_L293D_motor_schematic
ESP32-15_L293D_motor_schematic
esp32-49-DC-motor-mqtt-main
esp32-49-DC-motor-mqtt-main
851-ESP32 Tutorial 49/55- Arduino code using ESP32 to DC Motor using MQTT service of Adafruit
زبان: C++
/***********************************************************************
 This is Arduino sketch for ESP32 to DC Motor using MQTT service of Adafruit
 Watch video instruction https://youtu.be/OUgyPXNYg3g
 📚⬇️ Download and resource page https://robojax.com/RJT673
 Written By Ahamd Shamshiri
 on Feb 18, 2024

  Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example

  

/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
bool debug = false;
#define motor1A 13
#define motor2A 14

// PWM settings
const int freq = 500; // PWM frequency: 500 Hz
const int resolution = 8; // PWM resolution: 8 bits
const int channelA = 0; // PWM channel for motor1A: 0
const int channelB = 1; // PWM channel for motor2A: 1

char* dir[]={"CCW", "CW"};

int motorSpeed =0;
int motorDirection =1;
int motorStart = 1;
int dutyCycle =0;

#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/************************* WiFi Access Point *********************************/


#define WLAN_SSID "Book"
#define WLAN_PASS "88888888"

/************************* 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_jHpm60SEsWUdU5x472FViZjWzsY9"

/************ 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 MOTOR_SPEED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.speed");
Adafruit_MQTT_Subscribe MOTOR_DIRECTION = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.direction");
Adafruit_MQTT_Subscribe MOTOR_START = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/motor.start");


/*************************** Sketch Code ************************************/


void setup() {
  // Set up PWM
  ledcSetup(channelA, freq, resolution);
  ledcSetup(channelB, freq, resolution);

  // Attach PWM channels to GPIO pins
  ledcAttachPin(motor1A, channelA);
  ledcAttachPin(motor2A, channelB);

  Serial.begin(115200);
  delay(10);

  Serial.println(F("DC Motor over MQTT 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
  MOTOR_SPEED.setCallback(MOTOR_SPEED_Callback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&MOTOR_SPEED);

  // register callback for feed
  MOTOR_DIRECTION.setCallback(MOTOR_DIRECTION_Callback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&MOTOR_DIRECTION);

  // register callback for feed
  MOTOR_START.setCallback(MOTOR_START_Callback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&MOTOR_START);

}

// 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("Speed: ");
  // Serial.print (motorSpeed);
  // Serial.print(" Dir: ");
  // Serial.print (dir[motorDirection]);
  // Serial.print(" Sart: ");
  // Serial.println(motorStart);

  // Serial.print("DutyCycle: ");
  // Serial.println(dutyCycle);

  // wait 0.5 seconds for subscription messages
  mqtt.processPackets(500);

   runMotor();//very important
  // wait a couple seconds to avoid rate limit
  //delay(2000);
}

void MOTOR_SPEED_Callback(char* message, uint16_t len) {
  char messageBuffer[40];
  //snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
  //Serial.println(messageBuffer);
  Serial.println(message);
  String inString = message;//sotre the message to String
 
  motorSpeed  =  inString.toInt();//convert the message to Integer
  if(motorSpeed >100 || motorSpeed < 0)
  {
    motorSpeed = 0;
  }
  dutyCycle = map (motorSpeed, 0, 100, 0, 255);
 
}


void MOTOR_DIRECTION_Callback(char* message, uint16_t len) {
  char messageBuffer[40];
  //snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
  //Serial.println(messageBuffer);
  Serial.println(message);
  String inString = message;//sotre the message to String
 
  motorDirection  =  inString.toInt();//convert the message to Integer

 
}


void MOTOR_START_Callback(char* message, uint16_t len) {
  char messageBuffer[40];
  //snprintf(messageBuffer, sizeof(messageBuffer), "Color status is :: %s, len :: %u", message, len);
  //Serial.println(messageBuffer);
  Serial.println(message);

  String inString = message;//sotre the message to String
 
  motorStart  =  inString.toInt();//convert the message to Integer

 
}


void runMotor()
{

  if(motorStart ==1)
  {
      if(debug)
      {
        Serial.print("Motor running:");
        Serial.print(dir[motorDirection]);
        Serial.print(" at ");
        Serial.print(motorSpeed);
        Serial.println("%");
      }
    if(motorDirection)
    {
      ledcWrite(channelA, dutyCycle);
      ledcWrite(channelB, 0);
      delay(50); 
    }else{

      ledcWrite(channelA, 0);
      ledcWrite(channelB, dutyCycle);
      delay(50); 
    }
  }else{
    if(debug)
    {
      Serial.println("***Motor Stopped***");
    }
      ledcWrite(channelA, 0);
      ledcWrite(channelB, 0);   
  }

}//runMotor() end

// 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!");
}

وسائل اور حوالہ جات

ابھی تک کوئی وسائل نہیں۔

فائلیں📁

کوئی فائلیں دستیاب نہیں ہیں۔