Search Code

ESP32 টিউটোরিয়াল ৪৯/৫৫ - Adafruit IoT ব্যবহার করে ইন্টারনেটের মাধ্যমে DC মোটর নিয়ন্ত্রণ করুন | SunFounder-এর ESP32 কিট

ESP32 টিউটোরিয়াল ৪৯/৫৫ - Adafruit IoT ব্যবহার করে ইন্টারনেটের মাধ্যমে DC মোটর নিয়ন্ত্রণ করুন | SunFounder-এর ESP32 কিট

এই টিউটোরিয়ালে, আমরা ESP32 এবং Adafruit IO MQTT পরিষেবা ব্যবহার করে ইন্টারনেটের মাধ্যমে একটি DC মোটর কীভাবে নিয়ন্ত্রণ করা যায় তা অন্বেষণ করব। DC মোটরের গতি এবং দিক দূর থেকে নিয়ন্ত্রণ করা যেতে পারে, যা ইন্টারনেট সংযোগ সহ যেকোনো স্থান থেকে দক্ষ নিয়ন্ত্রণের সুযোগ দেয়। এই প্রকল্পটি ESP32 মাইক্রোকন্ট্রোলারের ক্ষমতা প্রদর্শন করে, যার মধ্যে অন্তর্নির্মিত Wi-Fi রয়েছে, যা এটিকে ইন্টারনেট অফ থিংস (IoT) অ্যাপ্লিকেশনের জন্য আদর্শ করে তোলে।

esp32-49-DC-motor-mqtt-main

আমরা এমন একটি সিস্টেম বাস্তবায়ন করব যেখানে মোটরটি Adafruit IO-এর সাথে সংযুক্ত একটি ওয়েব ইন্টারফেসের মাধ্যমে চালু, বন্ধ এবং এর গতি সামঞ্জস্য করা যাবে। ব্যবহারকারীরা মোটর নিয়ন্ত্রণের জন্য নির্দিষ্ট বিষয়গুলিতে সাবস্ক্রাইব করতে পারেন এবং সেই অনুযায়ী পরামিতি সামঞ্জস্য করতে পারেন। প্রক্রিয়াটি আরও ভালভাবে বোঝার জন্য, এই টিউটোরিয়ালের সাথে থাকা ভিডিওটি (ভিডিওতে 00:00 সময়ে) দেখতে ভুলবেন না।

হার্ডওয়্যার ব্যাখ্যা

এই প্রকল্পের জন্য, আমরা ESP32 মাইক্রোকন্ট্রোলার ব্যবহার করব, যা আমাদের সিস্টেমের হৃদয়। ESP32 Wi-Fi যোগাযোগ পরিচালনা করতে সক্ষম, যা এটিকে আমাদের IoT অ্যাপ্লিকেশনের জন্য নিখুঁত করে তোলে। এটি Adafruit IO প্ল্যাটফর্মের সাথে সংযুক্ত হয়, যা আমাদের MQTT প্রোটোকলের মাধ্যমে বার্তা পাঠাতে এবং গ্রহণ করতে দেয়।

অতিরিক্তভাবে, আমরা L293D মোটর ড্রাইভার ব্যবহার করব, যা DC মোটর নিয়ন্ত্রণের জন্য অপরিহার্য। L293D দুটি DC মোটর চালাতে পারে এবং পালস উইডথ মডুলেশন (PWM) এর মাধ্যমে দিক এবং গতি উভয় নিয়ন্ত্রণের অনুমতি দেয়। এটি মূলত ESP32 এবং মোটরের মধ্যে একটি ইন্টারফেস হিসাবে কাজ করে, মোটরের প্রয়োজনীয় উচ্চতর কারেন্ট পরিচালনা করে এবং ESP32-কে কোনো সম্ভাব্য ক্ষতিকারক ব্যাক-ইএমএফ সংকেত থেকে বিচ্ছিন্ন রাখে।

ডেটাশিট বিবরণ

প্রস্তুতকারক টেক্সাস ইন্সট্রুমেন্টস
পার্ট নম্বর L293D
লজিক/আইও ভোল্টেজ 4.5 - 36 V
সাপ্লাই ভোল্টেজ 4.5 - 36 V
আউটপুট কারেন্ট (প্রতি চ্যানেল) 600 mA
পিক কারেন্ট (প্রতি চ্যানেল) 1.2 A
PWM ফ্রিকোয়েন্সি নির্দেশিকা 10 kHz (সাধারণ)
ইনপুট লজিক থ্রেশহোল্ড 0.8 V (উচ্চ), 2.0 V (নিম্ন)
ভোল্টেজ ড্রপ / RDS(on) / স্যাচুরেশন 1.5 V সর্বোচ্চ
থার্মাল সীমা 150 °C
প্যাকেজ DIP-16
নোট / ভেরিয়েন্ট চতুর্গুণ উচ্চ-কারেন্ট অর্ধ-H ড্রাইভার

 

  • ক্রমাগত অপারেশনের জন্য সঠিক হিট সিংকিং নিশ্চিত করুন।
  • মোটরের গতি কার্যকরভাবে নিয়ন্ত্রণ করতে 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 গ্রাউন্ডের সাথে সংযুক্ত।

কোড উদাহরণ ও ওয়াকথ্রু

প্রদত্ত কোডটি প্রয়োজনীয় লাইব্রেরিগুলি শুরু করে এবং Wi-Fi ও 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 নির্দিষ্ট Wi-Fi নেটওয়ার্কের সাথে সংযুক্ত হয়। 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!");
}

সম্পদ ও রেফারেন্সসমূহ

এখনো কোনো সম্পদ নেই।

ফাইলসমূহ📁

কোনো ফাইল উপলব্ধ নেই।