【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
英文地址,請注明出處:http://en.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++二級歷年真題解析