AI智能水枪完整开发攻略

适配 Arduino 主控,离线语音识别、舵机云台俯仰/左右转向、电动水泵喷水、防误喷安全逻辑,纯本地运行无需联网,包含硬件选型、接线、完整源码、调试、拓展方案,可直接落地复刻,适合DIY、科创作品、课程设计。


一、项目整体介绍

1.1 核心功能

  1. 离线语音控制:识别中文语音指令,控制设备启停、转向、喷水,无网络也可使用;
  2. 双轴云台:水平左右旋转 + 垂直俯仰,精准调整水枪喷射角度;
  3. 电动喷水系统:微型直流水泵实现喷水、持续喷水、点喷,带延时防误触发;
  4. 安全防护:指令防抖、水泵过热保护、连续喷水时长限制;
  5. 状态反馈:串口打印运行状态,方便调试。

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 水泵+继电器接线(强电隔离,重中之重)

  1. 继电器 输入端:VCC接5V、GND接GND、IN接D4;
  2. 继电器 输出端:一端接水泵正极,一端接外部电源正极;
  3. 水泵负极统一接外部电源负极,同时和Arduino GND共地;
  4. 禁止水泵直接接Arduino IO口,电流过大容易烧毁主控。

3.3 机械结构安装

  1. 双轴云台固定在底座,水枪/出水嘴固定在云台顶端;
  2. 水管一端接入储水箱,另一端固定在出水嘴,跟随云台转动;
  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 前置准备

  1. 打开 Arduino IDE,代码自带 Servo 库,无需额外安装;
  2. 语音模块提前烧录上方指令码,波特率 9600;
  3. 严格按照接线表接好线路,检查共地、继电器回路。

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("动作:全部设备停止,进入待机");
  }
}

六、语音模块配置教程(必做步骤)

  1. 打开语音模块配套上位机软件,选择「离线中文识别」模式;
  2. 新建词条,依次录入上文12条语音指令,绑定对应指令码(00、01、02...99);
  3. 通信参数设置:波特率 9600、数据位8、停止位1、无校验
  4. 输出格式设置:指令码 + 换行符 \n(代码依赖换行读取数据);
  5. 点击「烧录配置」,将词条写入语音模块,断电重启即可;
  6. 测试:打开Arduino串口监视器(9600波特),说出语音指令,查看是否正常接收指令码。

七、核心安全逻辑说明

  1. 舵机角度限位 :使用 constrain() 函数限制舵机转动范围,杜绝机械结构卡死、舵机烧毁;
  2. 水泵超时保护:连续喷水最长5秒,超时自动断电,防止微型水泵长时间空转/满载烧毁;
  3. 继电器电气隔离:水泵与主控物理隔离,避免电机反向电动势击穿Arduino;
  4. 指令防抖:语音模块输出带换行符,代码修剪多余字符,避免乱码误执行。

八、常见故障排查

1. 语音识别无反应

  • TX/RX 接反,互换D5、D6;
  • 所有设备未共地,重新检查GND接线;
  • 串口波特率不一致,统一改为9600。

2. 云台舵机不动/抖动

  • 舵机供电不足,单独给舵机引5V电源;
  • 机械支架卡滞,手动调整云台活动范围;
  • 信号线虚接,重新插紧杜邦线。

3. 水泵不工作

  • 检查继电器指示灯,指令触发后灯是否亮起;
  • 水泵正负极接反,调换接线;
  • 储水箱无水、水管堵塞,检查水路。

4. 喷水不停/关不掉

  • 继电器粘连,更换新继电器模块;
  • 代码 PUMP_RELAY 引脚定义错误,核对引脚。

5. 指令乱执行

  • 电机、水泵电磁干扰过大,将语音模块远离动力设备;
  • 缩短杜邦线长度,使用屏蔽线。

九、功能拓展方案(进阶修改)

  1. 增加蓝牙控制:加装HC-05蓝牙模块,实现手机APP+语音双控制;
  2. 红外遥控:叠加红外接收头,遥控器远程操控转向、喷水;
  3. 人体感应自动喷水:加装HC-SR501人体红外传感器,检测到人自动喷水;
  4. 水量检测:增加水位传感器,水箱缺水语音提示并禁止水泵工作;
  5. 声光提示:外接LED、蜂鸣器,转向/喷水时灯光、声音同步提醒;
  6. 连续转向:新增语音指令,实现云台持续左右扫动喷水。

十、项目总结

本套AI智能水枪基于离线语音+双轴云台+水泵驱动实现全功能,代码结构分层清晰、注释完整,新手可快速上手修改。整体成本低、硬件易采购、稳定性强,兼顾趣味性与技术学习价值。

代码内置多重安全保护,既适合课堂教学、科创竞赛,也适合个人DIY把玩,可在现有代码基础上自由拓展传感器、无线通信等更多智能功能。

相关推荐
江畔柳前堤18 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术18 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客18 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术19 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO19 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术20 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架20 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab20 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI20 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab20 小时前
【无标题】
人工智能·开源