Kod Ara

ESP32 Eğitimi 49/55 - Adafruit IoT Kullanarak İnternet Üzerinden DC Motor Kontrolü | SunFounder'ın ESP32 Kiti

ESP32 Eğitimi 49/55 - Adafruit IoT Kullanarak İnternet Üzerinden DC Motor Kontrolü | SunFounder'ın ESP32 Kiti

Bu eğitimde, ESP32 ve Adafruit IO MQTT hizmetini kullanarak bir DC motoru internet üzerinden nasıl kontrol edeceğimizi keşfedeceğiz. DC motorun hızı ve yönü uzaktan değiştirilebilir, bu da internet bağlantısı olan her yerden verimli kontrol sağlar. Bu proje, yerleşik Wi-Fi özelliğine sahip olan ve Nesnelerin İnterneti (IoT) uygulamaları için ideal olan ESP32 mikrodenetleyicisinin yeteneklerini gösterir.

esp32-49-DC-motor-mqtt-main

Motorun başlatılabildiği, durdurulabildiği ve hızının Adafruit IO'ya bağlı bir web arayüzü aracılığıyla ayarlanabildiği bir sistem uygulayacağız. Kullanıcılar motor kontrolü için belirli konulara abone olabilir ve parametreleri buna göre ayarlayabilir. Süreci daha iyi anlamak için bu eğitime eşlik eden videoyu mutlaka izleyin (videoda 00:00'da).

Donanım Açıklaması

Bu proje için sistemimizin kalbi olan ESP32 mikrodenetleyicisini kullanacağız. ESP32, Wi-Fi iletişimini yönetebilir ve bu da onu IoT uygulamamız için mükemmel kılar. Adafruit IO platformuna bağlanarak MQTT protokolü üzerinden mesaj gönderip almamızı sağlar.

Ayrıca, DC motoru kontrol etmek için gerekli olan L293D motor sürücüsünü kullanacağız. L293D, iki DC motoru sürebilir ve Darbe Genişliği Modülasyonu (PWM) aracılığıyla hem yön hem de hız kontrolüne olanak tanır. Temel olarak ESP32 ile motor arasında bir arayüz görevi görür, motorun gerektirdiği daha yüksek akımı yönetirken ESP32'yi potansiyel olarak zarar verici geri elektromotor kuvveti (back-emf) sinyallerinden izole eder.

Veri Sayfası Detayları

Üretici Texas Instruments
Parça numarası L293D
Mantık/IO voltajı 4.5 - 36 V
Besleme voltajı 4.5 - 36 V
Çıkış akımı (kanal başına) 600 mA
Tepe akımı (kanal başına) 1.2 A
PWM frekansı kılavuzu 10 kHz (tipik)
Giriş mantık eşikleri 0.8 V (yüksek), 2.0 V (düşük)
Voltaj düşümü / RDS(on) / doyum 1.5 V maks.
Termal limitler 150 °C
Paket DIP-16
Notlar / varyantlar Dörtlü yüksek akımlı yarım-H sürücü

 

  • Sürekli çalışma için uygun ısı emilimini sağlayın.
  • Motor hızını etkili bir şekilde kontrol etmek için PWM kullanın.
  • Hasarı önlemek için giriş voltajı limitlerine dikkat edin.
  • Tüm bileşenler arasında doğru toprak bağlantılarını kontrol edin.
  • Geri elektromotor kuvvetine dikkat edin; gerekirse diyot kullanın.
  • Kutupluluk motor yönünü etkileyebileceğinden kablolamayı iki kez kontrol edin.
  • Tam çalıştırmadan önce daha düşük bir voltajla test edin.
  • Uzun süreli kullanımda aşırı ısınmaya dikkat edin.
  • Kullanılıyorsa mekanik anahtarları debounce ettiğinizden emin olun.
  • ESP32'nin motorun akımıyla aşırı yüklenmediğinden emin olun.

Bağlantı Talimatları

ESP32-15_L293D_motor_schematic

Güç kaynağını bağlayarak başlayın. Harici güç kaynağınızın pozitif terminalini L293D'nin VCC pinine (pin 8) ve toprağı GND pinine (pin 4) bağlayın. Gerekirse ESP32'nin ayrı olarak, genellikle bir mikro USB bağlantısıyla beslendiğinden emin olun.

Ardından, motoru L293D'ye bağlayın. Motorun bir terminali çıkış pin 3'e (L293D'nin pin 2'si) ve diğer terminali çıkış pin 6'ya (L293D'nin pin 7'si) bağlanmalıdır. Kontrol sinyalleri için, ESP32'nin pin 13'ünü giriş pin 2'ye (L293D'nin pin 1'i) ve pin 14'ü giriş pin 7'ye (L293D'nin pin 2'si) bağlayın. Enable pini (pin 1) ayrıca sürücüyü etkinleştirmek için 5V beslemeye bağlanmalıdır. Son olarak, ortak bir referans için ESP32 toprağının L293D toprağına bağlı olduğundan emin olun.

Kod Örnekleri ve Açıklama

Sağlanan kod gerekli kütüphaneleri başlatır ve Wi-Fi ile MQTT istemcisini kurar. Anahtar tanımlayıcılar, Adafruit IO'dan alınan komutlara göre motorun çalışmasını yöneten motorSpeed, motorDirection ve motorStart içerir.

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

Bu alıntıda, motor pinleri ve hız, yön ile motorun başlatma/durdurma durumunu kontrol etmek için başlangıç değişkenleri tanımlanır. motorSpeed değişkeni, Adafruit IO'dan gelen girdiye göre ayarlanacaktır.

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

Kurulum fonksiyonunda, seri iletişim başlatılır ve ESP32 belirtilen Wi-Fi ağına bağlanır. Bu bağlantı, MQTT iletişimini etkinleştirmek için çok önemlidir.

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

Bu döngü fonksiyonu MQTT bağlantısını kurar ve alınan en son komutlara göre motoru kontrol etmek için gelen paketleri işler. runMotor() fonksiyonu, mevcut ayarları motora uygulamak için çağrılır.

Gösterim / Ne Beklemeli

Kurulum tamamlandığında ve kod yüklendiğinde, motoru Adafruit IO paneli üzerinden kontrol edebilmelisiniz. Bir kaydırıcı kullanarak motor hızını ayarlayabilir ve bir açma-kapama anahtarıyla yönünü değiştirebilirsiniz. Her şey doğru şekilde bağlandıysa, motor bu komutlara gerçek zamanlı olarak yanıt verecek ve sistemin düşük gecikme süresini sergileyecektir (videoda 00:00'da).

Yaygın sorunlar arasında hatalı kablolama nedeniyle ters yönde dönen motor bulunur; bu nedenle motor beklenildiği gibi davranmazsa bağlantıları tekrar kontrol edin. Ayrıca, MQTT konularınızın Adafruit IO'da kodla eşleşecek şekilde doğru ayarlandığından emin olun.

Video Zaman Damgaları

  • 00:00 Başlangıç
  • 2:21 Projeye giriş
  • 4:20 DC Motor nasıl kontrol edilir
  • 6:39 L293D Motor Sürücüsü
  • 11:42 MQTT nedir?
  • 15:03 Adafruit IO kurulumu
  • 19:17 Kablolama açıklaması
  • 22:42 Kod açıklaması
  • 35:28 Proje tanıtımı

Görseller

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

Kaynaklar ve referanslar

Henüz kaynak yok.

Dosyalar📁

Dosya mevcut değil.