Пребарување код

ESP32 Упатство 49/55 - Контролирај DC мотор преку интернет користејќи Adafruit IoT | SunFounder's ESP32 комплет

ESP32 Упатство 49/55 - Контролирај DC мотор преку интернет користејќи Adafruit IoT | SunFounder's ESP32 комплет

Во ова упатство, ќе истражиме како да контролираме DC мотор преку интернет користејќи го ESP32 и Adafruit IO MQTT услугата. Брзината и насоката на 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 од било какви потенцијално штетни back-emf сигнали.

Детали од податочната листа

Производител Texas Instruments
Број на дел L293D
Логички/IO напон 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 за ефикасна контрола на брзината на моторот.
  • Почитувајте ги границите на влезниот напон за да спречите оштетување.
  • Проверете ги соодветните заземјувања помеѓу сите компоненти.
  • Бидете внимателни со back-emf; користете диоди ако е потребно.
  • Проверете го двојно жичањето бидејќи поларитетот може да влијае на насоката на моторот.
  • Тестирајте со понизок напон пред целосна работа.
  • Внимавајте на прегревање при продолжена употреба.
  • Погрижете се да ги дебаунсирате механичките прекинувачи ако се користат.
  • Осигурете се дека ESP32 не е преоптоварен од струјата на моторот.

Инструкции за жичање

ESP32-15_L293D_motor_schematic

Започнете со поврзување на напојувањето. Поврзете го позитивниот терминал на вашиот надворешен извор на енергија со VCC пинот на L293D (пин 8) и заземјувањето со GND пинот (пин 4). Осигурете се дека ESP32 е напојуван одделно ако е потребно, обично преку микро USB конекција.

Следно, поврзете го моторот со L293D. Едниот терминал на моторот треба да се поврзе со излезниот пин 3 (пин 2 од L293D), а другиот терминал со излезниот пин 6 (пин 7 од L293D). За контролни сигнали, поврзете го пинот 13 од ESP32 со влезниот пин 2 (пин 1 од L293D) и пинот 14 со влезниот пин 7 (пин 2 од L293D). Овозможувачкиот пин (пин 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 Како се контролира DC моторот
  • 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!");
}

Ресурси и референци

Сè уште нема ресурси.

Датотеки📁

Нема достапни датотеки.