Search Code

ESP32 Tutorial 49/55 - Bestuur DC-motor over het internet met Adafruit IoT | SunFounder's ESP32-kit

ESP32 Tutorial 49/55 - Bestuur DC-motor over het internet met Adafruit IoT | SunFounder's ESP32-kit

In deze tutorial verkennen we hoe je een gelijkstroommotor via internet kunt aansturen met behulp van de ESP32 en de Adafruit IO MQTT-service. De snelheid en richting van de gelijkstroommotor kunnen op afstand worden aangepast, waardoor efficiënte bediening mogelijk is vanaf elke locatie met een internetverbinding. Dit project demonstreert de mogelijkheden van de ESP32-microcontroller, die beschikt over ingebouwde Wi-Fi, waardoor deze ideaal is voor Internet of Things (IoT)-toepassingen.

esp32-49-DC-motor-mqtt-main

We zullen een systeem implementeren waarbij de motor kan worden gestart, gestopt en de snelheid kan worden aangepast via een webinterface die is verbonden met Adafruit IO. Gebruikers kunnen zich abonneren op specifieke onderwerpen voor motorbediening en parameters dienovereenkomstig aanpassen. Om het proces beter te begrijpen, bekijk zeker de video die bij deze tutorial hoort (in video op 00:00).

Hardware Uitgelegd

Voor dit project gebruiken we de ESP32-microcontroller, die het hart van ons systeem vormt. De ESP32 is in staat om Wi-Fi-communicatie te verwerken, waardoor deze perfect is voor onze IoT-toepassing. Het maakt verbinding met het Adafruit IO-platform, waardoor we berichten kunnen verzenden en ontvangen via het MQTT-protocol.

Daarnaast gebruiken we de L293D-motorstuurmodule, die essentieel is voor het aansturen van de gelijkstroommotor. De L293D kan twee gelijkstroommotoren aansturen en maakt controle van zowel richting als snelheid mogelijk via pulsbreedtemodulatie (PWM). Het fungeert in wezen als een interface tussen de ESP32 en de motor, waarbij het de hogere stroom die de motor nodig heeft beheert en de ESP32 isoleert van mogelijk schadelijke terug-emk-signalen.

Datasheet Details

Fabrikant Texas Instruments
Onderdeelnummer L293D
Logica/IO-spanning 4,5 - 36 V
Voedingsspanning 4,5 - 36 V
Uitgangsstroom (per kanaal) 600 mA
Piekstroom (per kanaal) 1,2 A
PWM-frequentierichtlijn 10 kHz (typ.)
Ingangslogische drempels 0,8 V (hoog), 2,0 V (laag)
Spanningsval / RDS(on) / verzadiging 1,5 V max
Thermische limieten 150 °C
Behuizing DIP-16
Opmerkingen / varianten Vierdubbele hoogstroom half-H-driver

 

  • Zorg voor goede koeling bij continu gebruik.
  • Gebruik PWM om de motorsnelheid effectief te regelen.
  • Houd rekening met ingangsspanningslimieten om schade te voorkomen.
  • Controleer op correcte aardverbindingen tussen alle componenten.
  • Wees voorzichtig met terug-emk; gebruik indien nodig diodes.
  • Controleer de bedrading dubbel, aangezien polariteit de motorrichting kan beïnvloeden.
  • Test met een lagere spanning voordat u volledig gaat werken.
  • Let op oververhitting bij langdurig gebruik.
  • Zorg ervoor dat mechanische schakelaars, indien gebruikt, worden gedebounced.
  • Zorg ervoor dat de ESP32 niet wordt overbelast door de stroom van de motor.

Bedradingsinstructies

ESP32-15_L293D_motor_schematic

Begin met het aansluiten van de voeding. Sluit de positieve aansluiting van uw externe stroombron aan op de VCC-pin van de L293D (pin 8) en de massa op de GND-pin (pin 4). Zorg ervoor dat de ESP32 indien nodig afzonderlijk wordt gevoed, meestal via een micro-USB-verbinding.

Sluit vervolgens de motor aan op de L293D. Een aansluiting van de motor moet worden verbonden met uitgangspin 3 (pin 2 van de L293D) en de andere aansluiting met uitgangspin 6 (pin 7 van de L293D). Voor stuursignalen verbindt u pin 13 van de ESP32 met ingangspin 2 (pin 1 van de L293D) en pin 14 met ingangspin 7 (pin 2 van de L293D). De enable-pin (pin 1) moet ook worden verbonden met de 5V-voeding om de driver te activeren. Zorg er ten slotte voor dat de massa van de ESP32 is verbonden met de massa van de L293D voor een gemeenschappelijke referentie.

Codevoorbeelden & Uitleg

De meegeleverde code initialiseert de benodigde bibliotheken en stelt de Wi-Fi- en MQTT-client in. Belangrijke identificatoren zijn motorSpeed, motorDirection en motorStart, die de werking van de motor beheren op basis van de opdrachten die van Adafruit IO worden ontvangen.

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

In dit fragment worden de motorpinnen gedefinieerd samen met initiële variabelen voor het regelen van snelheid, richting en de start/stop-status van de motor. De variabele motorSpeed wordt aangepast op basis van de invoer van Adafruit IO.

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

In de setup-functie wordt de seriële communicatie gestart en maakt de ESP32 verbinding met het opgegeven Wi-Fi-netwerk. Deze verbinding is cruciaal voor het mogelijk maken van MQTT-communicatie.

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

Deze loop-functie brengt de MQTT-verbinding tot stand en verwerkt inkomende pakketten om de motor aan te sturen op basis van de nieuwste ontvangen opdrachten. De functie runMotor() wordt aangeroepen om de huidige instellingen op de motor toe te passen.

Demonstratie / Wat te Verwachten

Wanneer de setup is voltooid en de code is geüpload, zou je de motor moeten kunnen bedienen via het Adafruit IO-dashboard. Je kunt de motorsnelheid aanpassen met een schuifregelaar en de richting wijzigen met een tuimelschakelaar. Als alles correct is bedraad, zal de motor in realtime op deze commando's reageren, wat de lage latentie van het systeem laat zien (in de video op 00:00).

Veelvoorkomende problemen zijn onder meer een omgekeerde motorrichting door onjuiste bedrading, dus controleer de verbindingen dubbel als de motor zich niet gedraagt zoals verwacht. Zorg er bovendien voor dat je MQTT-onderwerpen correct zijn ingesteld in Adafruit IO om overeen te komen met de code.

Videotijdstempels

  • 00:00 Start
  • 2:21 Introductie van het project
  • 4:20 Hoe een gelijkstroommotor wordt aangestuurd
  • 6:39 L293D-motorstuurmodule
  • 11:42 Wat is MQTT?
  • 15:03 Adafruit IO-installatie
  • 19:17 Bedrading uitgelegd
  • 22:42 Code uitgelegd
  • 35:28 Projectdemonstratie

Afbeeldingen

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

Hulpmiddelen en referenties

Nog geen middelen.

Bestanden📁

Geen bestanden beschikbaar.