From c7828ea914f1dd430b354ce0e479c436adb50bf4 Mon Sep 17 00:00:00 2001 From: whisper11111111111 <1819033498@qq.com> Date: Tue, 10 Feb 2026 23:52:15 +0800 Subject: [PATCH] Add main.ino firmware and update docs --- README.md | 11 +++++++ main.ino | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ 使用说明书.md | 3 +- 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 main.ino diff --git a/README.md b/README.md index d8e21df..7fd44c2 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,17 @@ * **麦克风**: 任意USB麦克风或电脑内置麦克风。 * **计算设备**: 建议配备 NVIDIA 显卡的 Windows/Linux 电脑(用于加速 YOLO 和 LLM 推理)。 +### 1.1 固件烧录 (Firmware) +本项目包含下位机控制代码 `main.ino`,适用于 ESP32 开发板。 +* **开发环境**: Arduino IDE 2.x +* **开发板管理器**: ESP32 by Espressif Systems (建议版本 3.0.0+) +* **烧录步骤**: + 1. 使用 USB 数据线连接 ESP32 到电脑。 + 2. 打开 `main.ino` 文件。 + 3. 选择开发板型号(如 "ESP32 Dev Module")和端口。 + 4. 上传代码。 + 5. 记下端口号(如 `COM3`),后续需在 `voice_main.py` 中配置。 + ## 2. 软件环境搭建 (Software) ### 2.1 基础环境 diff --git a/main.ino b/main.ino new file mode 100644 index 0000000..f71085c --- /dev/null +++ b/main.ino @@ -0,0 +1,88 @@ +/* + * ESP32 原生硬件 PWM 控制程序 (适配 Core 3.x 版本) + * 解决 'ledcSetup' was not declared 报错问题 + */ + +// --- 1. 引脚定义 --- +const int PIN_X = 14; +const int PIN_Y = 4; +const int PIN_Z = 5; +const int PIN_B = 18; +const int PIN_G = 23; + +// --- 2. PWM 参数 (舵机标准) --- +const int freq = 50; // 频率 50Hz (周期 20ms) +const int resolution = 12; // 分辨率 12位 (数值范围 0-4095) + +// 舵机角度对应的占空比数值 (12位分辨率) +// 0.5ms (0度) -> 约 102 +// 1.5ms (90度) -> 约 307 +// 2.5ms (180度) -> 约 512 + +void setup() { + Serial.begin(115200); + delay(1000); + + Serial.println("\n--- 使用 ESP32 Core 3.x LEDC 驱动初始化 ---"); + + // 在新版 Core 中,直接使用 ledcAttach(引脚, 频率, 分辨率) + ledcAttach(PIN_X, freq, resolution); + ledcAttach(PIN_Y, freq, resolution); + ledcAttach(PIN_Z, freq, resolution); + ledcAttach(PIN_B, freq, resolution); + ledcAttach(PIN_G, freq, resolution); + + // 初始归中 + writeAngle(PIN_X, 90); delay(500); + writeAngle(PIN_Y, 90); delay(500); + writeAngle(PIN_Z, 90); delay(500); + writeAngle(PIN_B, 90); delay(500); + writeAngle(PIN_G, 90); delay(500); + + Serial.println("--- 5轴硬件 PWM 初始化完成 ---"); +} + +void loop() { + if (Serial.available() > 0) { + String cmd = Serial.readStringUntil('\n'); + cmd.trim(); + + // 根据指令解析并控制 + if (cmd.startsWith("Servo_ArmX")) writeAngle(PIN_X, extractAngle(cmd, "Servo_ArmX")); + else if (cmd.startsWith("Servo_ArmY")) writeAngle(PIN_Y, extractAngle(cmd, "Servo_ArmY")); + else if (cmd.startsWith("Servo_ArmZ")) writeAngle(PIN_Z, extractAngle(cmd, "Servo_ArmZ")); + else if (cmd.startsWith("Servo_ArmB")) writeAngle(PIN_B, extractAngle(cmd, "Servo_ArmB")); + else if (cmd.startsWith("Servo_Gripper")) { + int a = extractAngle(cmd, "Servo_Gripper"); + if (a != -1) { + writeAngle(PIN_G, a); + Serial.print("夹爪已转动至: "); Serial.println(a); + } + } + } +} + +/** + * 核心控制函数 + * pin: 控制的引脚号 + * angle: 目标角度 (0-180) + */ +void writeAngle(int pin, int angle) { + if (angle < 0) angle = 0; + if (angle > 180) angle = 180; + + // 线性映射计算占空比 + // 0度 = 102, 180度 = 512 + int duty = (angle * (512 - 102) / 180) + 102; + + // 在新版 Core 中,ledcWrite 直接接收引脚号和数值 + ledcWrite(pin, duty); +} + +// 提取命令中的数字 +int extractAngle(String cmd, String prefix) { + int prefixLen = prefix.length(); + String valPart = cmd.substring(prefixLen); + if (valPart.length() > 0) return valPart.toInt(); + return -1; +} diff --git a/使用说明书.md b/使用说明书.md index 80b71f4..21d60bd 100644 --- a/使用说明书.md +++ b/使用说明书.md @@ -8,7 +8,8 @@ ## 二、快速开始 ### 2.1 启动程序 -请确保已连接好 USB 摄像头和 ESP32 控制板(串口默认为 COM3),然后在终端运行: +1. **硬件准备**:插入 USB 摄像头,连接 ESP32 控制板(请确保已烧录 `main.ino` 固件,其串口默认为 COM3)。 +2. **运行命令**:在终端输入: ```powershell python voice_main.py