Wa Koodu

Èkọ́ ESP32 49/55 - Ṣàkóso DC Motor Lórí Íńtánẹ́ẹ̀tì nípa lílo Adafruit IoT | Àkójọpọ̀ ESP32 ti SunFounder

Èkọ́ ESP32 49/55 - Ṣàkóso DC Motor Lórí Íńtánẹ́ẹ̀tì nípa lílo Adafruit IoT | Àkójọpọ̀ ESP32 ti SunFounder

Nínú ẹ̀kọ́ yìí, a óò ṣàwárí bí a ṣe lè ṣàkóso mọ́tò DC lórí Íńtánẹ́ẹ̀tì nípa lílo ESP32 àti iṣẹ́ Adafruit IO MQTT. Ìyára àti ìtọ́sọ́nà mọ́tò DC ni a lè ṣàkóso láti ọ̀nà jíjìn, tí ó ń jẹ́ kí ìṣàkóso náà yá níbi gbogbo tí wọ́n bá ní ìsopọ̀ Íńtánẹ́ẹ̀tì. Iṣẹ́-ọwọ́ yìí ń fi agbára ESP32 microcontroller hàn, tí ó ní Wi-Fi tí a kọ́ sínú rẹ̀, tí ó sì dára fún àwọn ohun èlò Internet of Things (IoT).

esp32-49-DC-motor-mqtt-main

A óò ṣe ètò kan níbi tí a lè bẹ̀rẹ̀ mọ́tò, dá a dúró, àti ṣàtúnṣe ìyára rẹ̀ nípa lílo ojú-ojú wẹ́ẹ̀bù tí ó sopọ̀ mọ́ Adafruit IO. Àwọn olùṣàmúlò lè ṣàmúlò àwọn kókó-ọ̀rọ̀ pàtó fún ìṣàkóso mọ́tò àti ṣàtúnṣe àwọn paramita ní ìbámu. Láti lóye ìlànà náà dáradára, rí i dájú pé o wo fídíò tí ó bá ẹ̀kọ́ yìí lọ (nínú fídíò ní 00:00).

Ohun èlò Tí A Ṣàlàyé

Fún iṣẹ́-ọwọ́ yìí, a óò lo ESP32 microcontroller, tí ó jẹ́ ọkàn-àyà ètò wa. ESP32 lè ṣàkóso ìbánisọ̀rọ̀ Wi-Fi, tí ó sì jẹ́ kí ó péye fún ohun èlò IoT wa. Ó sopọ̀ mọ́ pẹ̀pẹ̀ Adafruit IO, tí ó ń jẹ́ kí a rán àti gba àwọn ifiranṣẹ́ nípa ìlànà MQTT.

Pẹ̀lúpẹ̀lú, a óò lo L293D motor driver, tí ó ṣe pàtàkì fún ìṣàkóso mọ́tò DC. L293D lè wakọ̀ àwọn mọ́tò DC méjì, ó sì ń gbà wá láti ṣàkóso ìtọ́sọ́nà àti ìyára nípa lílo Pulse Width Modulation (PWM). Ó ń ṣiṣẹ́ gẹ́gẹ́ bí ọ̀nà ìsopọ̀ láàárín ESP32 àti mọ́tò, tí ó ń ṣàkóso ẹ̀rọ̀ iná tí ó ga tí mọ́tò nílò, nígbà tí ó ń ya ESP32 sọ́tọ̀ kúrò lọ́wọ́ àwọn ifihan back-emf tí ó lè ba a jẹ́.

Àwọn Àlàyé Datasheet

Olùṣe Texas Instruments
Nọ́mbà apá L293D
Fóltì Logic/IO 4.5 - 36 V
Fóltì ìpèsè 4.5 - 36 V
Ìyọ̀ọ̀dà ẹ̀rọ̀ (fún ikanni kọ̀ọ̀kan) 600 mA
Ẹ̀rọ̀ tí ó ga jùlọ (fún ikanni kọ̀ọ̀kan) 1.2 A
Ìtọ́sọ́nà ìgbohùnsáfẹ́fẹ́ PWM 10 kHz (typ.)
Àwọn ìwọ̀n àkọsílẹ̀ input 0.8 V (ga), 2.0 V (rẹlẹ̀)
Ìrẹwẹ̀sì fóltì / RDS(on) / saturation 1.5 V max
Àwọn ìwọ̀n ooru 150 °C
Àpò DIP-16
Àwọn àkíyèsí / àwọn oríṣi Quadruple high-current half-H driver

 

  • Rí i dájú pé o ṣe heat sinking tí ó tọ́ fún iṣẹ́ tí ó ń lọ lọ́wọ́.
  • Lo PWM láti ṣàkóso ìyára mọ́tò dáradára.
  • Kíyèsi àwọn ìwọ̀n fóltì input láti yẹra fún ìbàjẹ́.
  • Ṣàyẹ̀wò fún àwọn ìsopọ̀ ilẹ̀ tí ó tọ́ láàárín gbogbo àwọn ẹ̀yà.
  • Ṣọ́ra fún back-emf; lo àwọn diodes bí ó bá pọn dandan.
  • Ṣàyẹ̀wò ìsopọ̀ wáyà lẹ́ẹ̀mejì nítorí polarity lè nípa lórí ìtọ́sọ́nà mọ́tò.
  • Dán an wò pẹ̀lú fóltì tí ó kéré ṣáájú kí o tó ṣiṣẹ́ ní kíkún.
  • Ṣọ́ra fún ooru púpọ̀ nígbà tí o bá ń lò ọ́ fún ìgbà pípẹ́.
  • Rí i dájú pé o debounce àwọn mechanical switches bí o bá lo wọ́n.
  • Rí i dájú pé ESP32 kò jẹ́ ẹrù púpọ̀ nípa ẹ̀rọ̀ mọ́tò.

Àwọn Ìtọ́sọ́nà Ìsopọ̀ Wáyà

ESP32-15_L293D_motor_schematic

Bẹ̀rẹ̀ nípa ṣíṣopọ̀ ìpèsè iná. Sopọ̀ terminal rere ti orísun iná òde rẹ sí pin VCC ti L293D (pin 8) àti ilẹ̀ sí pin GND (pin 4). Rí i dájú pé a fi iná fún ESP32 lọ́tọ̀ bí ó bá pọn dandan, ní ọ̀pọ̀ ìgbà nípa lílo ìsopọ̀ micro USB.

Ní àtẹ̀yìnwá, sopọ̀ mọ́tò sí L293D. Ọ̀kan terminal mọ́tò yẹ kí ó sopọ̀ sí pin ìyọ̀ọ̀dà 3 (pin 2 ti L293D) àti terminal kejì sí pin ìyọ̀ọ̀dà 6 (pin 7 ti L293D). Fún àwọn ifihan àkóso, sopọ̀ pin 13 ti ESP32 sí pin input 2 (pin 1 ti L293D) àti pin 14 sí pin input 7 (pin 2 ti L293D). Pin enable (pin 1) yẹ kí ó tún sopọ̀ sí ìpèsè 5V láti mú driver ṣiṣẹ́. Ní ìparí, rí i dájú pé ilẹ̀ ESP32 sopọ̀ sí ilẹ̀ L293D fún ìtọ́kasí tí ó wọ́pọ̀.

Àwọn Àpẹẹrẹ Kóòdù & Ìṣàlàyé

Kóòdù tí a pèsè ń bẹ̀rẹ̀ àwọn ilé-ìkàwé tí a nílò, ó sì ń ṣètò Wi-Fi àti MQTT client. Àwọn idanimọ̀ pàtàkì ní motorSpeed, motorDirection, àti motorStart, tí ó ń ṣàkóso iṣẹ́ mọ́tò ní ìbámu pẹ̀lú àwọn àṣẹ tí a gbà láti Adafruit IO.

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

Nínú àyọkà yìí, a ṣàlàyé àwọn pin mọ́tò pẹ̀lú àwọn oniyipada àkọ́kọ́ fún ìṣàkóso ìyára, ìtọ́sọ́nà, àti ipò bẹ̀rẹ̀/dúró ti mọ́tò. Oniyipada motorSpeed ni a óò ṣàtúnṣe ní ìbámu pẹ̀lú input láti Adafruit IO.

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

Nínú iṣẹ́ setup, a bẹ̀rẹ̀ ìbánisọ̀rọ̀ serial, ESP32 sì sopọ̀ sí nẹ́tíwọọkì Wi-Fi tí a yàn. Ìsopọ̀ yìí ṣe pàtàkì fún ṣíṣe ìbánisọ̀rọ̀ MQTT.

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

Iṣẹ́ loop yìí ń fi ìsopọ̀ MQTT kalẹ̀, ó sì ń ṣiṣẹ́ àwọn packet tí ó wọlé láti ṣàkóso mọ́tò ní ìbámu pẹ̀lú àwọn àṣẹ tuntun tí a gbà. Iṣẹ́ runMotor() ni a pè láti fi àwọn ètò lọ́wọ́lọ́wọ́ sí mọ́tò.

Ìfihàn / Ohun Tí O Lè Retí

Nígbàtí ìṣètò bá parí àti pé kódù náà bá ti gbé sókè, o yẹ kí o lè ṣàkóso mọ́tò náà nípasẹ̀ àpótí Adafruit IO. O lè ṣàtúnṣe ìyára mọ́tò náà pẹ̀lú ẹ̀rọ ìsúnwọ́ (slider) àti yípadà ìtọ́sọ́nà rẹ̀ pẹ̀lú bọ́tìnnì ìyípadà (toggle switch). Bí gbogbo nǹkan bá ti ní ìsopọ̀ tó tọ́, mọ́tò náà yóò dáhùn sí àwọn àṣẹ wọ̀nyí ní àkókò gidi, tí ó ń fi ìpẹ̀kùn kéréje (low latency) ti ètò náà hàn (nínú fídíò ní 00:00).

Àwọn ìṣòro tí ó wọ́pọ̀ ní pẹ̀lú ìyípadà ìtọ́sọ́nà mọ́tò nítorí ìsopọ̀ tí kò tọ́, nítorí náà ṣàyẹ̀wò àwọn ìsopọ̀ lẹ́ẹ̀mejì bí mọ́tò náà kò bá hùwà bí a ṣe retí. Pẹ̀lúpẹ̀lú, rí i dájú pé àwọn kókó-ọ̀rọ̀ MQTT rẹ̀ ti ṣètò dáradára nínú Adafruit IO láti bá kódù náà mu.

Àwọn Àsìkò Fídíò

  • 00:00 Ìbẹ̀rẹ̀
  • 2:21 Ìfihàn iṣẹ́-ọnà náà
  • 4:20 Bí a ṣe ń ṣàkóso Mọ́tò DC
  • 6:39 L293D Motor Driver
  • 11:42 Kí ni MQTT?
  • 15:03 Ìṣètò Adafruit IO
  • 19:17 Àlàyé Ìsopọ̀ Wáyà
  • 22:42 Àlàyé Kódù
  • 35:28 Ìfihàn Iṣẹ́-ọnà

Aworan

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

Orisun & itọkasi

Ko si awọn orisun sibẹsibẹ.

Fáìlìs📁

Ko si awọn faili ti o wa.