Caută cod

Tutorial ESP32 49/55 - Controlați motorul DC prin internet folosind Adafruit IoT | Kitul ESP32 de la SunFounder

Tutorial ESP32 49/55 - Controlați motorul DC prin internet folosind Adafruit IoT | Kitul ESP32 de la SunFounder

În acest tutorial, vom explora cum să controlăm un motor de curent continuu prin internet folosind ESP32 și serviciul MQTT Adafruit IO. Viteza și direcția motorului de curent continuu pot fi manipulate de la distanță, permițând un control eficient de oriunde cu o conexiune la internet. Acest proiect demonstrează capacitățile microcontrolerului ESP32, care dispune de Wi-Fi integrat, fiind ideal pentru aplicații de Internet of Things (IoT).

esp32-49-DC-motor-mqtt-main

Vom implementa un sistem în care motorul poate fi pornit, oprit, iar viteza sa ajustată printr-o interfață web conectată la Adafruit IO. Utilizatorii se pot abona la subiecte specifice pentru controlul motorului și pot ajusta parametrii în consecință. Pentru a înțelege mai bine procesul, asigurați-vă că vizionați videoclipul care însoțește acest tutorial (în videoclip la 00:00).

Hardware Explicat

Pentru acest proiect, vom utiliza microcontrolerul ESP32, care este inima sistemului nostru. ESP32 este capabil să gestioneze comunicațiile Wi-Fi, făcându-l perfect pentru aplicația noastră IoT. Se conectează la platforma Adafruit IO, permițându-ne să trimitem și să primim mesaje prin protocolul MQTT.

În plus, vom folosi driverul de motor L293D, care este esențial pentru controlul motorului de curent continuu. L293D poate acționa două motoare de curent continuu și permite controlul atât al direcției, cât și al vitezei prin modularea lățimii impulsurilor (PWM). Acesta acționează practic ca o interfață între ESP32 și motor, gestionând curentul mai mare necesar motorului, izolând în același timp ESP32 de eventualele semnale de forță electromotoare inversă dăunătoare.

Detalii din Fișa Tehnică

Producător Texas Instruments
Număr de piesă L293D
Tensiune logică/IO 4,5 - 36 V
Tensiune de alimentare 4,5 - 36 V
Curent de ieșire (pe canal) 600 mA
Curent de vârf (pe canal) 1,2 A
Ghid de frecvență PWM 10 kHz (tipic)
Praguri logice de intrare 0,8 V (ridicat), 2,0 V (scăzut)
Cădere de tensiune / RDS(on) / saturație 1,5 V max
Limite termice 150 °C
Pachet DIP-16
Note / variante Driver cvadruplu de mare curent semi-punte H

 

  • Asigurați o disipare termică adecvată pentru funcționare continuă.
  • Utilizați PWM pentru a controla eficient viteza motorului.
  • Respectați limitele tensiunii de intrare pentru a preveni deteriorarea.
  • Verificați conexiunile corecte de masă între toate componentele.
  • Fiți atenți la forța electromotoare inversă; utilizați diode dacă este necesar.
  • Verificați de două ori cablajul, deoarece polaritatea poate afecta direcția motorului.
  • Testați cu o tensiune mai mică înainte de funcționarea completă.
  • Supravegheați supraîncălzirea în timpul utilizării prelungite.
  • Asigurați-vă că debounce-ul comutatoarelor mecanice dacă sunt utilizate.
  • Asigurați-vă că ESP32 nu este supraîncărcat de curentul motorului.

Instrucțiuni de Cablare

ESP32-15_L293D_motor_schematic

Începeți prin conectarea sursei de alimentare. Conectați borna pozitivă a sursei externe de alimentare la pinul VCC al L293D (pinul 8) și masa la pinul GND (pinul 4). Asigurați-vă că ESP32 este alimentat separat dacă este necesar, de obicei printr-o conexiune micro USB.

Apoi, conectați motorul la L293D. O bornă a motorului ar trebui conectată la pinul de ieșire 3 (pinul 2 al L293D), iar cealaltă bornă la pinul de ieșire 6 (pinul 7 al L293D). Pentru semnalele de control, conectați pinul 13 al ESP32 la pinul de intrare 2 (pinul 1 al L293D) și pinul 14 la pinul de intrare 7 (pinul 2 al L293D). Pinul de activare (pinul 1) ar trebui, de asemenea, conectat la sursa de 5V pentru a activa driverul. În cele din urmă, asigurați-vă că masa ESP32 este conectată la masa L293D pentru o referință comună.

Exemple de Cod & Parcurgere

Codul furnizat inițializează bibliotecile necesare și configurează clientul Wi-Fi și MQTT. Identificatorii cheie includ motorSpeed, motorDirection și motorStart, care gestionează funcționarea motorului pe baza comenzilor primite de la Adafruit IO.

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

În acest extras, pinii motorului sunt definiți împreună cu variabilele inițiale pentru controlul vitezei, direcției și stării de pornire/oprire a motorului. Variabila motorSpeed va fi ajustată pe baza intrării de la Adafruit IO.

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

În funcția de configurare, comunicarea serială este inițiată, iar ESP32 se conectează la rețeaua Wi-Fi specificată. Această conexiune este crucială pentru a permite comunicarea MQTT.

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

Această funcție de buclă stabilește conexiunea MQTT și procesează pachetele primite pentru a controla motorul pe baza celor mai recente comenzi primite. Funcția runMotor() este apelată pentru a aplica setările curente motorului.

Demonstrație / Ce să Vă Așteptați

Când configurarea este finalizată și codul este încărcat, ar trebui să poți controla motorul prin intermediul panoului de control Adafruit IO. Poți ajusta viteza motorului folosind un glisor și să schimbi direcția acestuia cu un comutator. Dacă totul este conectat corect, motorul va răspunde la aceste comenzi în timp real, demonstrând latența scăzută a sistemului (în videoclip la 00:00).

Problemele frecvente includ direcția inversată a motorului din cauza cablării incorecte, așa că verifică de două ori conexiunile dacă motorul nu se comportă conform așteptărilor. În plus, asigură-te că subiectele MQTT sunt configurate corect în Adafruit IO pentru a corespunde codului.

Marcaje temporale din videoclip

  • 00:00 Început
  • 2:21 Introducere în proiect
  • 4:20 Cum este controlat motorul DC
  • 6:39 Driverul de motor L293D
  • 11:42 Ce este MQTT?
  • 15:03 Configurarea Adafruit IO
  • 19:17 Explicația cablării
  • 22:42 Explicația codului
  • 35:28 Demonstrația proiectului

Imagini

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

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Nu sunt disponibile fișiere.