ESP32教程49/55 - 通过Adafruit IoT在互联网上控制直流电机 | SunFounder的ESP32套件
在本教程中,我们将探讨如何使用ESP32和Adafruit IO MQTT服务通过互联网控制直流电机。电机的速度和方向可以远程操控,从而在具有互联网连接的任何地方实现高效控制。本项目展示了ESP32微控制器的能力,该控制器内置Wi-Fi,非常适合物联网(IoT)应用。
我们将实现一个系统,通过连接到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不会因电机电流而过载。
接线说明
首先连接电源。将外部电源的正极端子连接到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客户端。关键标识符包括motorSpeed、motorDirection和motorStart,它们根据从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通过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");
Common Course Links
Common Course Files
资源与参考
尚无可用资源。
文件📁
没有可用的文件。