【ARDUINO】通过ESP8266控制电机【待测试】

需求

通过Wi-Fi控制Arduino驱动的3V直流电机。这个方案使用外部6V或9V电源,ESP8266作为Wi-Fi模块,Arduino作为主控制器,L298N作为电机驱动器。

手机/电脑 (Wi-Fi客户端)
|
| (Wi-Fi)
|
ESP8266 (Wi-Fi模块, AT指令模式)
|
| (串口通信)
|
Arduino Uno (主控制器)
|
| (数字引脚控制)
|
L298N (电机驱动模块)
|
| (电力输出)
|
3V直流电机

所需材料

  1. Arduino Uno
  2. ESP8266模块 (如ESP-01)
  3. L298N电机驱动模块
  4. 3V直流电机
  5. 外部电源:
    • 6V或9V电池/电源适配器 (用于L298N电机驱动)
    • 3.3V稳压模块 (如AMS1117-3.3V,用于ESP8266)
  6. 面包板和跳线
  7. 10kΩ电阻 (2个,用于ESP8266的GPIO0和RST引脚上拉)

连接步骤

1. 电源连接

组件连接方式
外部6V/9V电源正极 → L298N的VM引脚
负极 → L298N的GND和Arduino的GND
Arduino 5V→ L298N的VCC引脚 (逻辑供电)
AMS1117-3.3V模块输入 → 外部电源正极 (通过适当电阻分压或使用Arduino 5V)
输出 → ESP8266的VCC引脚
GND → 共同GND

2. ESP8266与Arduino连接

ESP8266引脚连接至Arduino引脚备注
VCCAMS1117-3.3V输出必须使用外部3.3V供电
GNDArduino GND共同接地
TX引脚10 (软件串口RX)ESP发送,Arduino接收
RX引脚11 (软件串口TX)Arduino发送,ESP接收
CH_PD (EN)通过10k电阻接3.3V使能引脚,接高电平
GPIO0悬空悬空为正常工作模式
RST通过10k电阻接3.3V复位引脚,上拉

3. L298N与Arduino连接

L298N引脚连接至Arduino引脚备注
IN1引脚5控制电机方向
IN2引脚6控制电机方向
ENA引脚9 (PWM)控制电机速度
OUT1, OUT23V直流电机两端电机连接

4. L298N电源连接

L298N引脚连接方式
VM外部6V/9V电源正极
GND外部电源负极和Arduino GND
VCCArduino 5V引脚

Arduino代码

#include <SoftwareSerial.h>// 定义软件串口引脚 (RX, TX)
SoftwareSerial esp8266(10, 11); // Arduino RX, Arduino TX// L298N控制引脚
const int IN1 = 5;
const int IN2 = 6;
const int ENA = 9;// Wi-Fi设置
const char* SSID = "Your_WiFi_SSID";     // 替换为您的Wi-Fi名称
const char* PASSWORD = "Your_WiFi_Password"; // 替换为您的Wi-Fi密码// 电机速度设置 (根据电源电压调整)
// 对于3V电机,使用6V电源时PWM值约为128,使用9V电源时PWM值约为85
const int MOTOR_SPEED = 128; // 0-255范围内调整// 全局变量
String wifiCommand = "";
bool isConnected = false;void setup() {// 初始化串口Serial.begin(115200);esp8266.begin(115200);// 设置L298N控制引脚pinMode(IN1, OUTPUT);pinMode(IN2, OUTPUT);pinMode(ENA, OUTPUT);// 初始状态:电机停止digitalWrite(IN1, LOW);digitalWrite(IN2, LOW);analogWrite(ENA, 0);delay(2000); // 等待系统稳定Serial.println("Initializing ESP8266...");// 初始化ESP8266setupESP8266();
}void loop() {// 检查ESP8266是否有数据可用if (esp8266.available()) {char c = esp8266.read();Serial.write(c); // 将数据转发到串口监视器// 构建完整的命令字符串if (c == '\n') {processCommand(wifiCommand);wifiCommand = ""; // 清空命令字符串} else {wifiCommand += c;}}// 检查串口监视器是否有输入(用于调试)if (Serial.available()) {String command = Serial.readStringUntil('\n');processCommand(command);}
}void setupESP8266() {// 发送AT指令设置ESP8266sendATCommand("AT", "OK", 2000);sendATCommand("AT+CWMODE=1", "OK", 2000); // 设置为STA模式sendATCommand("AT+CIPMUX=1", "OK", 2000); // 允许多连接// 连接到Wi-FiString connectCmd = "AT+CWJAP=\"";connectCmd += SSID;connectCmd += "\",\"";connectCmd += PASSWORD;connectCmd += "\"";if (sendATCommand(connectCmd, "GOT IP", 10000)) {Serial.println("Wi-Fi connected!");isConnected = true;// 获取IP地址sendATCommand("AT+CIFSR", "OK", 2000);// 启动TCP服务器 on port 8888if (sendATCommand("AT+CIPSERVER=1,8888", "OK", 2000)) {Serial.println("TCP server started on port 8888");Serial.println("Ready to receive commands...");}} else {Serial.println("Failed to connect to Wi-Fi");}
}bool sendATCommand(String command, String expectedResponse, int timeout) {esp8266.println(command);Serial.println("Sent: " + command);long int startTime = millis();String response = "";while (millis() - startTime < timeout) {while (esp8266.available()) {char c = esp8266.read();response += c;}if (response.indexOf(expectedResponse) != -1) {Serial.println("Response: " + response);return true;}}Serial.println("Timeout. Response: " + response);return false;
}void processCommand(String command) {command.trim(); // 移除首尾空白字符if (command.length() == 0) return;Serial.println("Processing command: " + command);// 处理电机控制命令if (command == "F") {// 正转digitalWrite(IN1, HIGH);digitalWrite(IN2, LOW);analogWrite(ENA, MOTOR_SPEED);Serial.println("Motor: FORWARD");} else if (command == "B") {// 反转digitalWrite(IN1, LOW);digitalWrite(IN2, HIGH);analogWrite(ENA, MOTOR_SPEED);Serial.println("Motor: BACKWARD");} else if (command == "S") {// 停止digitalWrite(IN1, LOW);digitalWrite(IN2, LOW);analogWrite(ENA, 0);Serial.println("Motor: STOP");}else if (command == "STATUS") {// 返回状态信息String status = "Wi-Fi: ";status += (isConnected ? "Connected" : "Disconnected");status += ", Motor: ";if (digitalRead(IN1) == HIGH && digitalRead(IN2) == LOW) {status += "FORWARD";} else if (digitalRead(IN1) == LOW && digitalRead(IN2) == HIGH) {status += "BACKWARD";} else {status += "STOPPED";}Serial.println(status);if (isConnected) {esp8266.println("AT+CIPSEND=0," + String(status.length()));delay(100);esp8266.println(status);}}else {Serial.println("Unknown command: " + command);}
}

使用步骤

  1. 硬件连接:按照上述连接图正确连接所有组件

  2. 代码修改

    • 将代码中的Your_WiFi_SSIDYour_WiFi_Password替换为您的实际Wi-Fi信息
    • 根据您的电源电压调整MOTOR_SPEED值:
      • 6V电源:约128 (50%占空比)
      • 9V电源:约85 (33%占空比)
  3. 上传代码

    • 将代码上传到Arduino Uno
    • 上传时确保断开ESP8266的RX/TX连接,上传完成后再接回
  4. 测试

    • 打开串口监视器(115200波特率)
    • 观察ESP8266初始化过程,记录显示的IP地址
    • 使用网络调试工具(如TCP客户端)连接到该IP地址的8888端口
    • 发送以下命令控制电机:
      • F - 正转
      • B - 反转
      • S - 停止
      • STATUS - 获取当前状态

安全注意事项

  1. 电源隔离:确保电机电源与逻辑电源适当隔离,避免电流回灌
  2. 散热:L298N在驱动电机时可能会发热,确保有适当的散热措施
  3. 电压匹配:使用PWM控制电机速度,确保平均电压不超过3V以保护电机
  4. 电流保护:考虑在电机回路中添加保险丝或电流传感器,防止过流损坏

这个方案提供了一个完整的Wi-Fi控制电机系统,您可以通过手机或电脑远程控制电机的转动方向和速度。

esp8266启动http服务

```cpp
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>// WiFi 配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";// 创建 HTTP 服务器,监听端口 80
ESP8266WebServer server(80);// 根路径处理函数
void handleRoot() {// 返回 HTML 响应server.send(200, "text/html", "<h1>ESP8266 HTTP 服务器</h1><p>欢迎访问 ESP8266 搭建的网页!</p>");
}// 自定义路径处理函数(例如 /data)
void handleData() {// 返回 JSON 数据String json = "{\"status\":\"ok\", \"message\":\"这是来自 ESP8266 的数据\"}";server.send(200, "application/json", json);
}// 404 页面处理函数
void handleNotFound() {server.send(404, "text/plain", "页面未找到");
}void setup() {Serial.begin(115200);// 连接 WiFiWiFi.begin(ssid, password);Serial.print("连接 WiFi...");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi 连接成功");Serial.println("IP 地址: " + WiFi.localIP().toString());// 注册路径处理函数server.on("/", handleRoot);          // 根路径server.on("/data", handleData);      // 自定义数据路径server.onNotFound(handleNotFound);   // 未匹配路径// 启动 HTTP 服务器server.begin();Serial.println("HTTP 服务器已启动");
}void loop() {// 处理客户端请求(必须在 loop 中调用)server.handleClient();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98014.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cuda编程笔记(18)-- 使用im2col + GEMM 实现卷积

我们之前介绍了cudnn调用api直接实现卷积&#xff0c;本文我们探究手动实现。对于直接使用for循环在cpu上的实现方法&#xff0c;就不过多介绍&#xff0c;只要了解卷积的原理&#xff0c;就很容易实现。im2col 的核心思想im2col image to column把输入 feature map 的每个卷积…

Loopback for Mac:一键打造虚拟音频矩阵,实现跨应用音频自由流转

虚拟音频设备创建 模拟物理设备&#xff1a;Loopback允许用户在Mac上创建虚拟音频设备&#xff0c;这些设备可被系统及其他应用程序识别为真实硬件&#xff0c;实现音频的虚拟化传输。多源聚合&#xff1a;支持将麦克风、应用程序&#xff08;如Skype、Zoom、GarageBand、Logic…

深入解析Django重定向机制

概述 核心是一个基类 HttpResponseRedirectBase&#xff0c;以及两个具体的子类 HttpResponseRedirect&#xff08;302 临时重定向&#xff09;和 HttpResponsePermanentRedirect&#xff08;301 永久重定向&#xff09;。它们都是 HttpResponse 的子类&#xff0c;专门用于告诉…

【Java实战⑳】从IO到NIO:Java高并发编程的飞跃

目录一、NIO 与 IO 的深度剖析1.1 IO 的局限性1.2 NIO 核心特性1.3 NIO 核心组件1.4 NIO 适用场景二、NIO 核心组件实战2.1 Buffer 缓冲区2.2 Channel 通道2.3 Selector 选择器2.4 NIO 文件操作案例三、NIO2.0 实战3.1 Path 类3.2 Files 类3.3 Files 类高级操作3.4 NIO2.0 实战…

OpenCV 实战:图像模板匹配与旋转处理实现教程

目录 一、功能概述&#xff1a;代码能做什么&#xff1f; 二、环境准备&#xff1a;先搭好运行基础 1. 安装 Python 2. 安装 OpenCV 库 3. 准备图像文件 三、代码逐段解析&#xff1a;从基础到核心 1. 导入 OpenCV 库 2. 读取图像文件 3. 模板图像旋转&#xff1a;处理…

一、cadence的安装及入门教学(反相器的设计与仿真)

一、Cadence的安装 1、安装VMware虚拟机 2、安装带有cadence软件的Linux系统 注&#xff1a;网盘链接 分享链接&#xff1a;https://disk.ningsuan.com.cn/#s/8XaVdtRQ 访问密码&#xff1a;11111 所有文件压缩包及文档密码&#xff1a; Cadence_ic 3、安装tsmc18工艺库…

用ai写了个UE5插件

文章目录实际需求1.头文件2.源文件3.用法小结实际需求 这个需求来源于之前的一个项目&#xff0c;当时用了一个第三方插件&#xff0c;里边有一些绘制线段的代码&#xff0c;c层用的是drawdebugline&#xff0c;当时看底层&#xff0c;觉得应该没问题&#xff0c;不应该在rele…

机器学习从入门到精通 - 强化学习初探:Q-Learning到Deep Q-Network实战

机器学习从入门到精通 - 强化学习初探&#xff1a;从 Q-Learning 到 Deep Q-Network 实战 一、开场白&#xff1a;推开强化学习这扇门 不知道你有没有过这种感觉 —— 盯着一个复杂的系统&#xff0c;既想让它达到某个目标&#xff0c;又苦于无法用传统规则去精确描述每一步该怎…

【OpenHarmony文件管理子系统】文件访问接口解析

OpenHarmony文件访问接口&#xff08;filemanagement_file_api&#xff09; 概述 OpenHarmony文件访问接口&#xff08;filemanagement_file_api&#xff09;是开源鸿蒙操作系统中的核心文件系统接口&#xff0c;为应用程序提供了完整的文件IO操作能力。该项目基于Node-API&…

云手机运行是否消耗自身流量?

云手机运行是否消耗自身流量&#xff0c;取决于具体的使用场景和设置&#xff1a;若用户在连接云手机时&#xff0c;使用的是家中Wi-Fi、办公室局域网等非移动数据网络&#xff0c;那么在云手机运行过程中&#xff0c;基本不会消耗用户自身的移动数据流量&#xff0c;在家中连接…

JavaSe之多线程

一、多线程基本了解 1、多线程基本知识 1.进程:进入到内存中执行的应用程序 2.线程:内存和CPU之间开通的通道->进程中的一个执行单元 3.线程作用:负责当前进程中程序的运行.一个进程中至少有一个线程,一个进程还可以有多个线程,这样的应用程序就称之为多线程程序 4.简单理解…

产品月报|睿本云8月产品功能迭代

睿本云8月更新已陆续上线&#xff01; 睿本云8月产品月报&#xff0c;点击查收&#x1f447;小程序支付成功弹窗广告、企业会员增加卡券销售和卡券退货模块、工厂端可批量新增多门店订货单、门店端和工厂端新增“极速订货”、商品调拨业务支持自定义多种流程配置等功能迭代更新…

融云:当我们谈论 AI 重构业务时,我们到底在谈论什么

所有业务都值得用 AI 重新做一次。 这句话正在从一句鼓舞人心的口号&#xff0c;演变为一场无人可避的商业现实。AI 带来的结构性机会&#xff0c;意味着企业有机会从根本上重构成本、效率与体验的曲线。但这一切最终都要回到一个无比务实的问题上&#xff1a; AI 究竟如何在我…

org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1异常

org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1异常问题解决一、问题背景二、错误现象三、原因分析核心问题&#xff1a;字符集不匹配四、解决过程试错路径记录五、最终方案1.创建launch.json文件&#xff0c;修改VSCode…

【C语言】深入理解指针(5)

目录 sizeof和strlen 1.sizeof 2.strlen 3. sizeof 和 strlen 的对比 sizeof和strlen 1.sizeof sizeo正名&#xff1a;sizeof是操作符&#xff0c;不是函数&#xff0c;sizeof是操作符&#xff0c;括号内如果有计算不会进行计算sizeof 是操作符&#xff0c;用于计算变量所…

动态代理设计模式

JDK动态代理实现 动态代理利用了JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能.动态代理又被称为JDK代理或接口代理. 静态代理与动态代理的区别: 静态代理在编译时就已经实现了,编译完成后代理类是一个实际的class文 动态代理是在运行时动态生成的,即编译…

《Html泛型魔法学院:用霍格沃茨风格网页教授集合框架》

一、项目概述 这个创意教学网页&#xff0c;将Java泛型与集合框架知识融入霍格沃茨魔法世界主题。通过沉浸式UI设计和交互式代码练习&#xff0c;让抽象的技术概念变得生动有趣。主要技术栈包括&#xff1a; HTML5语义化结构Tailwind CSS框架Font Awesome图标库纯JavaScript交…

学习PaddlePaddle--环境配置-PyCharm + Conda​

第一阶段&#xff1a;安装与配置 Python 和 Conda​​ 虽然 PyCharm 可以管理环境&#xff0c;但我们先独立准备好 Conda 环境&#xff0c;这样更清晰可靠。 ​​1. 安装 Miniconda (Python 环境管理)​​ 1. ​​下载​​&#xff1a; • 访问 Miniconda 官网。 • 选择 ​​M…

【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录前言ISNULL用法c…

【蓝桥杯选拔赛真题64】C++最大空白区 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

C++最大空白区 第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 1、C++专栏 电子学会C++一级历年真题解析 电子学会C++二级历年真题解析