适配 Arduino 主控,离线语音识别、舵机云台俯仰/左右转向、电动水泵喷水、防误喷安全逻辑,纯本地运行无需联网,包含硬件选型、接线、完整源码、调试、拓展方案,可直接落地复刻,适合DIY、科创作品、课程设计。
一、项目整体介绍
1.1 核心功能
- 离线语音控制:识别中文语音指令,控制设备启停、转向、喷水,无网络也可使用;
- 双轴云台:水平左右旋转 + 垂直俯仰,精准调整水枪喷射角度;
- 电动喷水系统:微型直流水泵实现喷水、持续喷水、点喷,带延时防误触发;
- 安全防护:指令防抖、水泵过热保护、连续喷水时长限制;
- 状态反馈:串口打印运行状态,方便调试。
1.2 应用场景
智能趣味装置、电子科创比赛、单片机课程设计、居家趣味DIY,入门级嵌入式项目,代码简单易修改。
1.3 核心硬件架构
Arduino Uno R3(主控)+ 离线语音识别模块 + 双SG90舵机(云台)+ 微型抽水泵 + 继电器驱动模块(水泵隔离)+ 供电电源
二、硬件清单 & 开发成本
2.1 硬件明细(通用款,电商均可采购)
| 硬件名称 | 型号规格 | 数量 | 单价(元) | 小计(元) | 功能说明 |
|---|---|---|---|---|---|
| 主控板 | Arduino Uno R3 | 1 | 42 | 42 | 程序运行、逻辑判断、IO控制 |
| 离线语音模块 | JQ8900/LD3320 中文语音识别 | 1 | 28 | 28 | 采集语音,串口输出指令码 |
| 水平云台舵机 | SG90 9g微型舵机 | 1 | 8 | 8 | 控制水枪左右转向 |
| 垂直云台舵机 | SG90 9g微型舵机 | 1 | 8 | 8 | 控制水枪上下俯仰 |
| 微型水泵 | 3-6V小型抽水泵(配水管) | 1 | 15 | 15 | 实现喷水功能 |
| 继电器模块 | 5V单路光耦隔离继电器 | 1 | 6 | 6 | 隔离驱动水泵,保护主控 |
| 塑料云台支架 | 双轴舵机云台 | 1 | 12 | 12 | 固定水枪、舵机、水管 |
| 供电电源 | 5V/2A USB电源/锂电池组 | 1 | 20 | 20 | 整机供电 |
| 辅助配件 | 杜邦线、扎带、水管、水箱 | 1 | 10 | 10 | 组装、布线、储水 |
2.2 总成本汇总
合计:149 元 ,预算区间:140 ~ 160 元
省钱方案:使用Arduino Nano、二手配件可压缩至110元以内。
三、硬件接线说明(关键,严格对应引脚)
3.1 全局引脚定义(代码与硬件绑定,不建议随意修改)
| 设备 | 引脚 | 连接 Arduino | 备注 |
|---|---|---|---|
| 水平舵机(左右) | Signal | D2 | VCC=5V,GND=GND |
| 垂直舵机(上下) | Signal | D3 | VCC=5V,GND=GND |
| 继电器(水泵控制) | IN | D4 | 高电平吸合,水泵工作 |
| 离线语音模块 | TX | D5 | 语音模块发送 → 主控接收 |
| 离线语音模块 | RX | D6 | 主控发送 → 语音模块接收 |
| 语音/舵机公共 | VCC / GND | 5V / GND | 所有设备必须共地 |
3.2 水泵+继电器接线(强电隔离,重中之重)
- 继电器 输入端:VCC接5V、GND接GND、IN接D4;
- 继电器 输出端:一端接水泵正极,一端接外部电源正极;
- 水泵负极统一接外部电源负极,同时和Arduino GND共地;
- 禁止水泵直接接Arduino IO口,电流过大容易烧毁主控。
3.3 机械结构安装
- 双轴云台固定在底座,水枪/出水嘴固定在云台顶端;
- 水管一端接入储水箱,另一端固定在出水嘴,跟随云台转动;
- 舵机初始角度设为90°(居中),左右转动范围:40° ~ 140°,俯仰范围:50° ~ 130°,防止机械卡死。
四、预设语音指令对照表
提前在离线语音模块上位机 录入以下中文指令,并绑定对应串口字符串指令码,波特率统一 9600。
| 语音指令 | 串口指令码 | 执行动作 |
|---|---|---|
| 开机就绪 | 00 | 云台复位居中,水泵关闭,初始化完成 |
| 向左转 | 01 | 云台水平向左转动25° |
| 向右转 | 02 | 云台水平向右转动25° |
| 向上抬 | 03 | 云台垂直向上俯仰20° |
| 向下压 | 04 | 云台垂直向下俯仰20° |
| 云台归位 | 05 | 水平+垂直舵机全部回到中心位置 |
| 单点喷水 | 10 | 短时间喷水(0.8秒),单次点喷 |
| 持续喷水 | 11 | 水泵开启,连续喷水 |
| 停止喷水 | 12 | 关闭水泵,停止出水 |
| 全部停止 | 99 | 云台不动、水泵关闭,整机待机 |
五、完整 Arduino 源码(可直接烧录运行)
5.1 前置准备
- 打开 Arduino IDE,代码自带
Servo库,无需额外安装; - 语音模块提前烧录上方指令码,波特率 9600;
- 严格按照接线表接好线路,检查共地、继电器回路。
5.2 完整代码
cpp
#include <Servo.h>
// ===================== 引脚定义 =====================
#define SERVO_H 2 // 水平舵机 左右转向
#define SERVO_V 3 // 垂直舵机 上下俯仰
#define PUMP_RELAY 4 // 水泵继电器控制引脚
// ===================== 舵机角度参数 =====================
Servo servoH;
Servo servoV;
const int h_center = 90; // 水平中心角度
const int v_center = 90; // 垂直中心角度
int cur_h = h_center; // 当前水平角度
int cur_v = v_center; // 当前垂直角度
// 角度限位(防止机械卡死)
const int h_min = 40;
const int h_max = 140;
const int v_min = 50;
const int v_max = 130;
// ===================== 喷水时间参数 & 安全保护 =====================
const int spray_once_time = 800; // 单点喷水时长(ms)
const int max_spray_time = 5000; // 最长连续喷水5秒(防水泵过热)
unsigned long spray_start_time = 0; // 连续喷水计时
bool pump_state = false; // 水泵状态 false=关闭 true=开启
// ===================== 系统初始化 =====================
void setup() {
// 引脚模式设置
pinMode(PUMP_RELAY, OUTPUT);
digitalWrite(PUMP_RELAY, LOW);
// 挂载舵机
servoH.attach(SERVO_H);
servoV.attach(SERVO_V);
// 云台复位居中
servoH.write(h_center);
servoV.write(v_center);
// 串口初始化(与语音模块通信 9600波特率)
Serial.begin(9600);
Serial.println("===== AI智能水枪 启动成功 =====");
Serial.println("等待语音指令...");
}
// ===================== 主循环:监听语音指令 =====================
void loop() {
// 连续喷水超时保护(超过5秒自动关泵)
if(pump_state && (millis() - spray_start_time > max_spray_time)){
pumpStop();
Serial.println("【安全保护】喷水超时,自动关闭水泵");
}
// 读取语音模块串口指令
if(Serial.available() > 0){
String cmd = Serial.readStringUntil('\n');
cmd.trim(); // 去除空格、换行符
Serial.print("收到语音指令码:");
Serial.println(cmd);
// 解析并执行指令
runCommand(cmd);
}
}
// ===================== 云台控制函数 =====================
// 云台向左转
void hTurnLeft(){
cur_h -= 25;
cur_h = constrain(cur_h, h_min, h_max);
servoH.write(cur_h);
Serial.println("动作:云台向左转动");
delay(150);
}
// 云台向右转
void hTurnRight(){
cur_h += 25;
cur_h = constrain(cur_h, h_min, h_max);
servoH.write(cur_h);
Serial.println("动作:云台向右转动");
delay(150);
}
// 云台向上抬
void vTurnUp(){
cur_v -= 20;
cur_v = constrain(cur_v, v_min, v_max);
servoV.write(cur_v);
Serial.println("动作:水枪向上俯仰");
delay(150);
}
// 云台向下压
void vTurnDown(){
cur_v += 20;
cur_v = constrain(cur_v, v_min, v_max);
servoV.write(cur_v);
Serial.println("动作:水枪向下俯仰");
delay(150);
}
// 云台全部归位
void turretReset(){
cur_h = h_center;
cur_v = v_center;
servoH.write(h_center);
servoV.write(v_center);
Serial.println("动作:云台已复位居中");
delay(200);
}
// ===================== 水泵喷水控制函数 =====================
// 开启水泵
void pumpStart(){
digitalWrite(PUMP_RELAY, HIGH);
pump_state = true;
spray_start_time = millis(); // 记录开始时间
Serial.println("动作:水泵开启,开始喷水");
}
// 关闭水泵
void pumpStop(){
digitalWrite(PUMP_RELAY, LOW);
pump_state = false;
Serial.println("动作:水泵关闭,停止喷水");
}
// 单点喷水(短时喷水)
void sprayOnce(){
pumpStart();
delay(spray_once_time);
pumpStop();
Serial.println("动作:单点喷水完成");
}
// ===================== 指令解析总入口 =====================
void runCommand(String cmd){
if(cmd == "00"){
turretReset();
pumpStop();
}
else if(cmd == "01"){
hTurnLeft();
}
else if(cmd == "02"){
hTurnRight();
}
else if(cmd == "03"){
vTurnUp();
}
else if(cmd == "04"){
vTurnDown();
}
else if(cmd == "05"){
turretReset();
}
else if(cmd == "10"){
sprayOnce();
}
else if(cmd == "11"){
pumpStart();
}
else if(cmd == "12"){
pumpStop();
}
else if(cmd == "99"){
turretReset();
pumpStop();
Serial.println("动作:全部设备停止,进入待机");
}
}
六、语音模块配置教程(必做步骤)
- 打开语音模块配套上位机软件,选择「离线中文识别」模式;
- 新建词条,依次录入上文12条语音指令,绑定对应指令码(00、01、02...99);
- 通信参数设置:波特率 9600、数据位8、停止位1、无校验;
- 输出格式设置:指令码 + 换行符
\n(代码依赖换行读取数据); - 点击「烧录配置」,将词条写入语音模块,断电重启即可;
- 测试:打开Arduino串口监视器(9600波特),说出语音指令,查看是否正常接收指令码。
七、核心安全逻辑说明
- 舵机角度限位 :使用
constrain()函数限制舵机转动范围,杜绝机械结构卡死、舵机烧毁; - 水泵超时保护:连续喷水最长5秒,超时自动断电,防止微型水泵长时间空转/满载烧毁;
- 继电器电气隔离:水泵与主控物理隔离,避免电机反向电动势击穿Arduino;
- 指令防抖:语音模块输出带换行符,代码修剪多余字符,避免乱码误执行。
八、常见故障排查
1. 语音识别无反应
- TX/RX 接反,互换D5、D6;
- 所有设备未共地,重新检查GND接线;
- 串口波特率不一致,统一改为9600。
2. 云台舵机不动/抖动
- 舵机供电不足,单独给舵机引5V电源;
- 机械支架卡滞,手动调整云台活动范围;
- 信号线虚接,重新插紧杜邦线。
3. 水泵不工作
- 检查继电器指示灯,指令触发后灯是否亮起;
- 水泵正负极接反,调换接线;
- 储水箱无水、水管堵塞,检查水路。
4. 喷水不停/关不掉
- 继电器粘连,更换新继电器模块;
- 代码
PUMP_RELAY引脚定义错误,核对引脚。
5. 指令乱执行
- 电机、水泵电磁干扰过大,将语音模块远离动力设备;
- 缩短杜邦线长度,使用屏蔽线。
九、功能拓展方案(进阶修改)
- 增加蓝牙控制:加装HC-05蓝牙模块,实现手机APP+语音双控制;
- 红外遥控:叠加红外接收头,遥控器远程操控转向、喷水;
- 人体感应自动喷水:加装HC-SR501人体红外传感器,检测到人自动喷水;
- 水量检测:增加水位传感器,水箱缺水语音提示并禁止水泵工作;
- 声光提示:外接LED、蜂鸣器,转向/喷水时灯光、声音同步提醒;
- 连续转向:新增语音指令,实现云台持续左右扫动喷水。
十、项目总结
本套AI智能水枪基于离线语音+双轴云台+水泵驱动实现全功能,代码结构分层清晰、注释完整,新手可快速上手修改。整体成本低、硬件易采购、稳定性强,兼顾趣味性与技术学习价值。
代码内置多重安全保护,既适合课堂教学、科创竞赛,也适合个人DIY把玩,可在现有代码基础上自由拓展传感器、无线通信等更多智能功能。