Search Code

ESP32 Tutoriaal 49/55 - Beheer GS-motor oor die internet met Adafruit IoT | SunFounder se ESP32-kit

ESP32 Tutoriaal 49/55 - Beheer GS-motor oor die internet met Adafruit IoT | SunFounder se ESP32-kit

In hierdie tutoriaal gaan ons ondersoek hoe om 'n GS-motor oor die internet te beheer met behulp van die ESP32 en die Adafruit IO MQTT-diens. Die GS-motor se spoed en rigting kan op afstand gemanipuleer word, wat doeltreffende beheer van enige plek met 'n internetverbinding moontlik maak. Hierdie projek demonstreer die vermoëns van die ESP32-mikrobeheerder, wat ingeboude Wi-Fi het, wat dit ideaal maak vir Internet van Dinge (IoT)-toepassings.

esp32-49-DC-motor-mqtt-main

Ons gaan 'n stelsel implementeer waar die motor aangeskakel, afgeskakel en sy spoed aangepas kan word via 'n webkoppelvlak wat aan Adafruit IO gekoppel is. Gebruikers kan op spesifieke onderwerpe vir motorbeheer inteken en parameters dienooreenkomstig aanpas. Om die proses beter te verstaan, maak seker om die video wat hierdie tutoriaal vergesel te kyk (in video by 00:00).

Hardeware Verduidelik

Vir hierdie projek sal ons die ESP32-mikrobeheerder gebruik, wat die hart van ons stelsel is. Die ESP32 is in staat om Wi-Fi-kommunikasie te hanteer, wat dit perfek maak vir ons IoT-toepassing. Dit koppel aan die Adafruit IO-platform, wat ons in staat stel om boodskappe via die MQTT-protokol te stuur en te ontvang.

Daarbenewens sal ons die L293D-motorbestuurder gebruik, wat noodsaaklik is vir die beheer van die GS-motor. Die L293D kan twee GS-motors aandryf en maak beheer van beide rigting en spoed deur Pulsbreedtemodulasie (PWM) moontlik. Dit dien in wese as 'n koppelvlak tussen die ESP32 en die motor, wat die hoër stroom wat deur die motor benodig word, bestuur terwyl dit die ESP32 van enige potensieel skadelike terug-emk-seine isoleer.

Datablad Besonderhede

Vervaardiger Texas Instruments
Deelnommer L293D
Logika/IO-spanning 4.5 - 36 V
Toevoerspanning 4.5 - 36 V
Uitgangstroom (per kanaal) 600 mA
Piekstroom (per kanaal) 1.2 A
PWM-frekwensie riglyn 10 kHz (tip.)
Insetlogika-drempels 0.8 V (hoog), 2.0 V (laag)
Spanningval / RDS(on) / versadiging 1.5 V maks
Termiese limiete 150 °C
Pakket DIP-16
Notas / variante Vierdubbele hoëstroom half-H-bestuurder

 

  • Verseker behoorlike hitte-afvoer vir deurlopende werking.
  • Gebruik PWM om motorspoed effektief te beheer.
  • Neem insetspanningslimiete in ag om skade te voorkom.
  • Kontroleer vir behoorlike grondverbindings tussen alle komponente.
  • Wees versigtig vir terug-emk; gebruik diodes indien nodig.
  • Kontroleer bedrading dubbel aangesien polariteit motorrigting kan beïnvloed.
  • Toets met 'n laer spanning voor volle werking.
  • Let op vir oorverhitting tydens langdurige gebruik.
  • Maak seker om meganiese skakelaars te ontbons indien gebruik.
  • Verseker dat die ESP32 nie oorlaai word deur die motor se stroom nie.

Bedradingsinstruksies

ESP32-15_L293D_motor_schematic

Begin deur die kragtoevoer te koppel. Koppel die positiewe terminaal van jou eksterne kragbron aan die VCC-pen van die L293D (pen 8) en die grond aan die GND-pen (pen 4). Verseker dat die ESP32 afsonderlik aangedryf word indien nodig, gewoonlik deur 'n mikro-USB-verbinding.

Koppel vervolgens die motor aan die L293D. Een terminaal van die motor moet aan uitsetpen 3 (pen 2 van die L293D) gekoppel word en die ander terminaal aan uitsetpen 6 (pen 7 van die L293D). Vir beheerseine, koppel pen 13 van die ESP32 aan insetpen 2 (pen 1 van die L293D) en pen 14 aan insetpen 7 (pen 2 van die L293D). Die aktiveerpen (pen 1) moet ook aan die 5V-toevoer gekoppel word om die bestuurder te aktiveer. Laastens, maak seker dat die ESP32-grond aan die L293D-grond gekoppel is vir 'n gemeenskaplike verwysing.

Kode Voorbeelde & Deurloop

Die verskafde kode initialiseer die nodige biblioteke en stel die Wi-Fi- en MQTT-kliënt op. Sleutelidentifiseerders sluit motorSpeed, motorDirection, en motorStart in, wat die motor se werking bestuur op grond van die opdragte wat van Adafruit IO ontvang word.

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

In hierdie uittreksel word die motorpenne gedefinieer saam met aanvanklike veranderlikes vir die beheer van spoed, rigting, en die aan/af-toestand van die motor. Die veranderlike motorSpeed sal aangepas word op grond van die inset van Adafruit IO.

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

In die setup-funksie word die seriekommunikasie geïnisieer, en die ESP32 koppel aan die gespesifiseerde Wi-Fi-netwerk. Hierdie verbinding is noodsaaklik om MQTT-kommunikasie moontlik te maak.

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

Hierdie lusfunksie vestig die MQTT-verbinding en verwerk inkomende pakkies om die motor te beheer op grond van die nuutste opdragte wat ontvang is. Die funksie runMotor() word geroep om die huidige instellings op die motor toe te pas.

Demonstrasie / Wat om te Verwags

Wanneer die opstelling voltooi is en die kode opgelaai is, behoort jy die motor deur die Adafruit IO-kontroleskerm te kan beheer. Jy kan die motorspoed met 'n skuifbalk aanpas en die rigting daarvan met 'n skakelaar verander. As alles korrek bedraad is, sal die motor in reële tyd op hierdie opdragte reageer, wat die lae latensie van die stelsel ten toon stel (in die video by 00:00).

Algemene probleme sluit in omgekeerde motorrigting as gevolg van verkeerde bedrading, so kontroleer verbindings dubbeld as die motor nie soos verwag optree nie. Maak ook seker dat jou MQTT-onderwerpe korrek in Adafruit IO opgestel is om met die kode ooreen te stem.

Video-tydstempels

  • 00:00 Begin
  • 2:21 Inleiding tot die projek
  • 4:20 Hoe GS-motor beheer word
  • 6:39 L293D-motorbestuurder
  • 11:42 Wat is MQTT?
  • 15:03 Adafruit IO-opstelling
  • 19:17 Bedrading verduidelik
  • 22:42 Kode verduidelik
  • 35:28 Projekdemonstrasie

Beelde

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

Hulpbronne en verwysings

Geen hulpbronne nog.

Lêers📁

Geen lêers beskikbaar.