搜索代码

ESP32教程49/55 - 通过Adafruit IoT在互联网上控制直流电机 | SunFounder的ESP32套件

ESP32教程49/55 - 通过Adafruit IoT在互联网上控制直流电机 | SunFounder的ESP32套件

在本教程中,我们将探讨如何使用ESP32和Adafruit IO MQTT服务通过互联网控制直流电机。电机的速度和方向可以远程操控,从而在具有互联网连接的任何地方实现高效控制。本项目展示了ESP32微控制器的能力,该控制器内置Wi-Fi,非常适合物联网(IoT)应用。

esp32-49-DC-motor-mqtt-main

我们将实现一个系统,通过连接到Adafruit IO的Web界面,可以启动、停止电机并调整其速度。用户可以订阅特定的电机控制主题,并相应地调整参数。为了更好地理解该过程,请务必观看本教程附带的视频(视频中00:00处)。

硬件说明

对于本项目,我们将使用ESP32微控制器,它是我们系统的核心。ESP32能够处理Wi-Fi通信,非常适合我们的物联网应用。它连接到Adafruit IO平台,使我们能够通过MQTT协议发送和接收消息。

此外,我们将使用L293D电机驱动器,这对于控制直流电机至关重要。L293D可以驱动两个直流电机,并允许通过脉冲宽度调制(PWM)控制方向和速度。它本质上充当ESP32和电机之间的接口,管理电机所需的高电流,同时将ESP32与任何可能有害的反电动势信号隔离。

数据手册详情

制造商 德州仪器
零件编号 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有效控制电机速度。
  • 遵守输入电压限制以防止损坏。
  • 检查所有组件之间的正确接地连接。
  • 注意反电动势;如有必要,使用二极管。
  • 仔细检查接线,因为极性会影响电机方向。
  • 在完全运行前,先用较低电压测试。
  • 长时间使用时注意过热。
  • 如果使用机械开关,请确保进行去抖处理。
  • 确保ESP32不会因电机电流而过载。

接线说明

ESP32-15_L293D_motor_schematic

首先连接电源。将外部电源的正极端子连接到L293D的VCC引脚(引脚8),将接地端连接到GND引脚(引脚4)。如有需要,确保ESP32单独供电,通常通过微型USB连接。

接下来,将电机连接到L293D。电机的一个端子应连接到输出引脚3(L293D的引脚2),另一个端子连接到输出引脚6(L293D的引脚7)。对于控制信号,将ESP32的引脚13连接到输入引脚2(L293D的引脚1),将引脚14连接到输入引脚7(L293D的引脚2)。使能引脚(引脚1)也应连接到5V电源以激活驱动器。最后,确保ESP32的接地与L293D的接地相连,以提供公共参考。

代码示例与讲解

提供的代码初始化了必要的库,并设置了Wi-Fi和MQTT客户端。关键标识符包括motorSpeedmotorDirectionmotorStart,它们根据从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);
  }
}

在setup函数中,启动串行通信,ESP32连接到指定的Wi-Fi网络。此连接对于启用MQTT通信至关重要。

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

此循环函数建立MQTT连接并处理传入的数据包,以根据接收的最新命令控制电机。调用函数runMotor()将当前设置应用于电机。

演示 / 预期效果

当设置完成且代码上传后,您应该能够通过Adafruit IO仪表板控制电机。您可以使用滑块调节电机速度,并通过拨动开关改变其方向。如果所有接线正确,电机将实时响应这些命令,展示系统的低延迟特性(视频中00:00处)。

常见问题包括因接线错误导致的电机方向反转,因此如果电机行为不符合预期,请仔细检查连接。此外,请确保您在Adafruit IO中正确设置了MQTT主题,以与代码匹配。

视频时间戳

  • 00:00 开始
  • 2:21 项目介绍
  • 4:20 直流电机控制方式
  • 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++
/*
 * 这是用于ESP32通过Adafruit的MQTT服务控制直流电机的Arduino示例代码  
 * 观看视频说明 https://youtu.be/OUgyPXNYg3g  
 * 📚⬇️ 下载和资源页面 https://robojax.com/RJT673  
 * 作者:Ahamd Shamshiri  
 * 日期:2024年2月18日  
 * 
 * Adafruit MQTT库 ESP32 Adafruit IO SSL/TLS示例  
 * 
 * /// 参考:https://www.electronicwings.com/esp32/esp32-mqtt-client
 */
bool debug = false;
#define motor1A 13
#define motor2A 14

 // PWM设置
const int freq = 500; // PWM频率:500 Hz
const int resolution = 8; // PWM 分辨率:8 位
const int channelA = 0; // 电机1A的PWM通道:0
const int channelB = 1; // 电机2A的PWM通道: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接入点 *********************************/
 * 
 * #define WLAN_SSID "书籍"
 * #define WLAN_PASS "88888888"
 * 
 *  /************************* Adafruit.io 设置
 */

#define AIO_SERVER "io.adafruit.com"

 // 使用端口8883进行MQTTS
#define AIO_SERVERPORT 8883

 // Adafruit IO 账户配置
 // (要获取这些值,请访问 https://io.adafruit.com 并点击活动密钥)
 // #define AIO_USERNAME "你的 Adafruit IO 用户名"
 // #define AIO_KEY "你的 Adafruit IO 密钥"

#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_jHpm60SEsWUdU5x472FViZjWzsY9"

/*
 * 全球状态(您无需更改此内容!)******************/
 * 
 * // WiFiFlientSecure用于SSL/TLS支持
 * WiFiClientSecure client;
 * 
 * // 通过传入WiFi客户端和MQTT服务器及登录信息来设置MQTT客户端类。
 * Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
 * 
 * // io.adafruit.com根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";
 * 
 * /****************************** 订阅内容
 */

 // 设置一个名为'test'的发布源和一个名为'test2'的订阅源。
 // 注意,AIO的MQTT路径遵循以下格式:<用户名>/feeds/<数据源名称>
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");


资源与参考

尚无可用资源。

文件📁

没有可用的文件。