Cari Kode

Tutorial ESP32 49/55 - Mengendalikan Motor DC Melalui Internet menggunakan Adafruit IoT | Kit ESP32 SunFounder

Tutorial ESP32 49/55 - Mengendalikan Motor DC Melalui Internet menggunakan Adafruit IoT | Kit ESP32 SunFounder

Dalam tutorial ini, kita akan mengeksplorasi cara mengendalikan motor DC melalui internet menggunakan ESP32 dan layanan MQTT Adafruit IO. Kecepatan dan arah motor DC dapat dimanipulasi dari jarak jauh, memungkinkan kontrol yang efisien dari mana saja dengan koneksi internet. Proyek ini menunjukkan kemampuan mikrokontroler ESP32, yang memiliki Wi-Fi bawaan, menjadikannya ideal untuk aplikasi Internet of Things (IoT).

esp32-49-DC-motor-mqtt-main

Kita akan mengimplementasikan sistem di mana motor dapat dihidupkan, dihentikan, dan kecepatannya disesuaikan melalui antarmuka web yang terhubung ke Adafruit IO. Pengguna dapat berlangganan ke topik tertentu untuk kontrol motor dan menyesuaikan parameter sesuai kebutuhan. Untuk lebih memahami prosesnya, pastikan untuk menonton video yang menyertai tutorial ini (di video pada 00:00).

Penjelasan Perangkat Keras

Untuk proyek ini, kita akan menggunakan mikrokontroler ESP32, yang merupakan inti dari sistem kita. ESP32 mampu menangani komunikasi Wi-Fi, menjadikannya sempurna untuk aplikasi IoT kita. Ini terhubung ke platform Adafruit IO, memungkinkan kita untuk mengirim dan menerima pesan melalui protokol MQTT.

Selain itu, kita akan menggunakan driver motor L293D, yang penting untuk mengendalikan motor DC. L293D dapat menggerakkan dua motor DC dan memungkinkan kontrol arah dan kecepatan melalui Pulse Width Modulation (PWM). Ini pada dasarnya bertindak sebagai antarmuka antara ESP32 dan motor, mengelola arus yang lebih tinggi yang dibutuhkan oleh motor sambil mengisolasi ESP32 dari sinyal back-emf yang berpotensi merusak.

Detail Datasheet

Produsen Texas Instruments
Nomor bagian L293D
Tegangan logika/IO 4,5 - 36 V
Tegangan suplai 4,5 - 36 V
Arus keluaran (per saluran) 600 mA
Arus puncak (per saluran) 1,2 A
Panduan frekuensi PWM 10 kHz (khas)
Ambang logika input 0,8 V (tinggi), 2,0 V (rendah)
Penurunan tegangan / RDS(on) / saturasi 1,5 V maks
Batas termal 150 °C
Kemasan DIP-16
Catatan / varian Driver setengah-H arus tinggi empat kali lipat

 

  • Pastikan pembuangan panas yang tepat untuk operasi berkelanjutan.
  • Gunakan PWM untuk mengontrol kecepatan motor secara efektif.
  • Perhatikan batas tegangan input untuk mencegah kerusakan.
  • Periksa koneksi ground yang tepat antara semua komponen.
  • Berhati-hatilah dengan back-emf; gunakan dioda jika perlu.
  • Periksa ulang kabel karena polaritas dapat mempengaruhi arah motor.
  • Uji dengan tegangan lebih rendah sebelum operasi penuh.
  • Perhatikan panas berlebih selama penggunaan yang lama.
  • Pastikan untuk debounce sakelar mekanis jika digunakan.
  • Pastikan ESP32 tidak kelebihan beban oleh arus motor.

Instruksi Pengkabelan

ESP32-15_L293D_motor_schematic

Mulailah dengan menghubungkan catu daya. Hubungkan terminal positif dari sumber daya eksternal Anda ke pin VCC L293D (pin 8) dan ground ke pin GND (pin 4). Pastikan ESP32 diberi daya secara terpisah jika diperlukan, biasanya melalui koneksi mikro USB.

Selanjutnya, hubungkan motor ke L293D. Satu terminal motor harus dihubungkan ke pin keluaran 3 (pin 2 dari L293D) dan terminal lainnya ke pin keluaran 6 (pin 7 dari L293D). Untuk sinyal kontrol, hubungkan pin 13 ESP32 ke pin input 2 (pin 1 dari L293D) dan pin 14 ke pin input 7 (pin 2 dari L293D). Pin enable (pin 1) juga harus dihubungkan ke suplai 5V untuk mengaktifkan driver. Terakhir, pastikan ground ESP32 terhubung ke ground L293D untuk referensi yang sama.

Contoh Kode & Penjelasan

Kode yang disediakan menginisialisasi pustaka yang diperlukan dan menyiapkan klien Wi-Fi dan MQTT. Pengidentifikasi kunci termasuk motorSpeed, motorDirection, dan motorStart, yang mengelola operasi motor berdasarkan perintah yang diterima dari Adafruit IO.

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

Dalam kutipan ini, pin motor didefinisikan bersama dengan variabel awal untuk mengontrol kecepatan, arah, dan status mulai/berhenti motor. Variabel motorSpeed akan disesuaikan berdasarkan input dari Adafruit IO.

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

Dalam fungsi setup, komunikasi serial dimulai, dan ESP32 terhubung ke jaringan Wi-Fi yang ditentukan. Koneksi ini sangat penting untuk memungkinkan komunikasi MQTT.

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

Fungsi loop ini membangun koneksi MQTT dan memproses paket yang masuk untuk mengontrol motor berdasarkan perintah terbaru yang diterima. Fungsi runMotor() dipanggil untuk menerapkan pengaturan saat ini ke motor.

Demonstrasi / Apa yang Diharapkan

Ketika pengaturan selesai dan kode diunggah, Anda seharusnya dapat mengendalikan motor melalui dasbor Adafruit IO. Anda dapat menyesuaikan kecepatan motor menggunakan penggeser dan mengubah arahnya dengan sakelar toggle. Jika semuanya terhubung dengan benar, motor akan merespons perintah-perintah ini secara real-time, menunjukkan latensi rendah dari sistem (dalam video pada 00:00).

Masalah umum termasuk arah motor yang terbalik karena kabel yang salah, jadi periksa kembali koneksi jika motor tidak berperilaku seperti yang diharapkan. Selain itu, pastikan topik MQTT Anda diatur dengan benar di Adafruit IO agar sesuai dengan kode.

Stempel Waktu Video

  • 00:00 Mulai
  • 2:21 Pengenalan proyek
  • 4:20 Cara Motor DC dikendalikan
  • 6:39 Pengemudi Motor L293D
  • 11:42 Apa itu MQTT?
  • 15:03 Pengaturan Adafruit IO
  • 19:17 Penjelasan Kabel
  • 22:42 Penjelasan Kode
  • 35:28 Demonstrasi Proyek

Gambar

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

Sumber daya & referensi

Belum ada sumber daya.

Berkas📁

Tidak ada file tersedia.