1、基于单片机的自动化农业喷药机器人

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/90134898

1.1、项目背景与研究意义

随着农业现代化的发展,传统人工喷药方式逐渐暴露出效率低、劳动强度大、喷洒不均匀以及人员长期接触农药带来健康风险等问题。尤其在果园、蔬菜大棚、苗圃以及园区绿化等场景中,喷药作业属于高频且重复的任务,通常需要大量人工投入。人工喷药不仅耗时耗力,而且喷药质量受操作者经验影响较大,容易出现喷洒不均、药液浪费或漏喷,从而导致病虫害防治效果不稳定。

自动化农业喷药机器人正是为解决这些痛点而提出的一种智能设备。它通过单片机作为核心控制器,结合电机驱动、喷药泵控制、位置检测、按键交互与显示模块,实现机器人自主移动与均匀喷药,从而达到“无人化、均匀化、可监控”的作业目标。相比传统方式,自动化喷药机器人能够带来以下优势:
1、提高作业效率:机器人可持续运行,减少人工参与,提升喷药速度与覆盖范围。
2、降低健康风险:避免人员长期暴露于农药环境,提升安全性。
3、喷洒更均匀:通过固定速度与喷药控制策略,使药液分布更加均匀,减少浪费。
4、便于管理与监控:通过显示屏实时展示当前位置与喷药次数,操作透明,便于管理者掌握作业进度。
5、具备扩展潜力:可进一步扩展路径规划、障碍检测、远程控制、自动配药、智能调速等功能。

因此,基于单片机的自动化农业喷药机器人设计既具有实际工程价值,也适合用于课程设计、毕业设计与农业自动化原型验证。


1.2、系统总体目标与功能概述

本系统以“按键控制—自主移动—自动喷药—实时显示—状态提示”为核心设计思路,实现以下功能:

1、按键控制
通过按键实现系统启动、暂停与复位操作。用户可以在现场快速控制机器人工作状态,提高灵活性与安全性。例如:当有人进入喷药区域或机器人需要临时停止时,可按暂停键立即停止运动与喷药。

2、自动喷药
系统启动后,机器人在园区内自动来回移动,并进行均匀喷药作业。机器人采用往返运动方式,适用于长条形通道、温室大棚走廊、果树行间等场景。系统可通过路径边界检测或计时/里程方式实现往返控制。

3、实时显示
通过显示屏实时显示机器当前位置(例如:行进方向、当前段编号、里程计数或区域编号)以及喷药累计次数。喷药次数可用于估算喷药覆盖面积、药液用量与作业进度。

4、状态提示
在工作状态下,蜂鸣器会发出提示音,提醒用户机器正在运行,避免误入作业区域,也便于远距离判断机器是否处于运行状态。蜂鸣器可采用间歇鸣叫方式,既能提示又不造成过大噪音。


2、系统总体方案与工作流程设计

2.1、系统硬件组成结构

系统硬件主要由以下模块构成:
1、单片机最小系统模块(核心控制)
2、按键控制模块(启动/暂停/复位)
3、显示模块(LCD1602或LCD12864/OLED等)
4、蜂鸣器提示模块(运行提示音)
5、电机驱动与运动控制模块(左右轮电机或履带驱动)
6、喷药执行模块(喷药泵/电磁阀/喷头)
7、位置检测模块(编码器/霍尔传感器/红外反射/限位开关,可选)
8、电源管理模块(主电池供电、稳压、保护、滤波)

系统软件主要由以下模块构成:
1、系统初始化模块
2、按键扫描与状态机模块
3、运动控制模块(前进/后退/转向/往返)
4、喷药控制模块(喷药启停、喷药次数计数)
5、位置计算与更新模块(里程/段编号/方向)
6、显示刷新模块(位置+喷药次数+状态)
7、蜂鸣器提示模块(工作提示节奏)
8、安全保护与异常处理模块(暂停、复位、超时保护扩展)


2.2、系统运行状态机设计

为了保证系统逻辑清晰、可扩展且不易出错,本系统采用“状态机”设计思想,将机器人运行过程划分为以下状态:

1、待机状态(IDLE)
系统上电后处于待机状态,电机不转、喷药关闭、蜂鸣器不响,屏幕显示“待机”以及初始位置、喷药次数。

2、运行状态(RUN)
按下启动键后进入运行状态。机器人开始自动移动,同时开启喷药系统;蜂鸣器间歇鸣叫;屏幕实时更新当前位置与喷药次数。

3、暂停状态(PAUSE)
运行中按下暂停键进入暂停状态。此时电机停止、喷药停止,蜂鸣器停止或改为短鸣提示暂停;屏幕显示暂停状态。再次按启动键可恢复运行。

4、复位状态(RESET)
按下复位键触发复位逻辑:停止电机与喷药,清零喷药次数与位置计数,恢复初始方向与初始状态,并显示复位完成提示。

采用状态机的优势在于:

  • 避免大量if-else导致逻辑混乱。
  • 易于扩展新的状态(例如:故障报警、低电量返回、补液提示等)。
  • 易于实现“按键控制优先级”,确保在任何情况下暂停键都能立即生效,提高安全性。

2.3、自动往返移动逻辑设计

农业园区常见的喷药场景具有明显的“长通道”特征,例如大棚走廊、果树行间。为了实现稳定可靠的自动运动,本系统采用“往返运动 + 边界检测/里程控制”的策略:
1、机器人从起点向前行驶,保持恒速喷药。
2、到达边界后(通过限位开关或红外检测到边界、或通过行驶距离到达预设值),机器人执行转向或原地掉头。
3、反向继续行驶,实现来回覆盖。
4、每完成一次往返或每经过一定距离,喷药次数累加,用于反映作业进度。

如果硬件条件允许,推荐采用左右轮编码器来检测里程与速度,这样不仅能统计位置,还能通过速度闭环提高运动平稳性,使喷洒更均匀。若不使用编码器,也可以采用定时方式估算距离,即“以固定速度运行固定时间视作走过固定距离”,但精度会受电压、电机差异影响。


3、电路设计

3.1、电路设计总体说明

喷药机器人属于“机电一体化系统”,电路设计必须同时满足控制稳定性与驱动安全性。系统存在电机、电磁阀或水泵等大功率负载,它们在启动时会产生较大的电流冲击与电磁干扰,因此电路设计中必须重点考虑:
1、电源分区:逻辑控制部分与电机/泵驱动部分尽量分开供电或分开滤波,避免干扰导致单片机复位。
2、驱动隔离:单片机I/O不能直接驱动电机或泵,必须采用驱动芯片或MOSFET/继电器。
3、滤波与保护:电机、泵属于感性负载,需要续流二极管、TVS、滤波电容等保护措施。
4、模块化接口:便于调试与维护,减少故障定位难度。


3.2、单片机最小系统模块

3.2.1、核心器件选择

本系统可采用常见8位单片机(如STC89C52、AT89S52等51系列),原因包括:

  • I/O资源丰富,可连接按键、显示、蜂鸣器、驱动信号等。
  • 定时器中断资源可用于按键消抖、喷药计数、蜂鸣器节奏控制与速度调节。
  • 开发资料丰富,适合工程实现与教学应用。

3.2.2、最小系统组成

单片机最小系统由以下电路构成:
1、电源引脚:VCC与GND,建议加入0.1uF去耦电容靠近芯片放置。
2、晶振电路:常用11.0592MHz或12MHz晶振,配套两个30pF左右电容到地,保证振荡稳定。
3、复位电路:RC上电复位+复位按键,确保上电可靠启动。

3.2.3、接口资源规划

为了使系统扩展性更好,应提前规划I/O:

  • LCD显示模块:占用6个I/O(4位模式)。
  • 按键模块:至少3个I/O(启动、暂停、复位)。
  • 蜂鸣器:1个I/O。
  • 电机驱动:至少2~4个I/O(方向与PWM)。
  • 喷药泵/电磁阀:1个I/O(开/关)。
  • 位置检测传感器:2个I/O或更多(编码器A/B相、限位开关等)。

3.3、按键控制模块

3.3.1、按键功能设计

按键模块用于提供人机交互,至少包括:
1、START启动键:从待机进入运行或从暂停恢复运行。
2、PAUSE暂停键:任何时刻优先暂停,停止运动与喷药。
3、RESET复位键:清零状态、回到初始待机。

在设计中应确保:

  • PAUSE键优先级最高,保证安全停机。
  • RESET键用于异常恢复与数据清零。

3.3.2、电路设计要点

按键一般采用低电平有效方式:

  • 按键一端接地,另一端接单片机I/O并上拉。
  • 上拉可使用单片机内部上拉或外接10k电阻。
    按键容易产生机械抖动,必须通过软件消抖或硬件RC消抖,否则会出现一次按键触发多次事件的情况。

3.4、显示模块(LCD1602/OLED)

3.4.1、显示内容规划

显示模块用于实时展示:

  • 当前状态:待机/运行/暂停/复位
  • 当前位置:可用段编号、里程计数或方向信息表示
  • 喷药累计次数:用于监控喷药进度
    例如LCD1602界面可设计为:
  • 第一行:POS:xxx SPR:xxx
  • 第二行:STATE:RUN / PAUSE / IDLE

3.4.2、LCD1602接口说明

LCD1602可采用4位并行方式连接:

  • RS、EN为控制信号
  • D4~D7为数据线
    RW一般固定接地,简化为只写模式
    这种方式可以减少I/O占用,同时满足字符显示需求。

3.4.3、显示刷新策略

为了避免闪烁与系统负担:

  • 显示刷新不必过快,建议200ms~500ms刷新一次。
  • 状态变化时(如启动、暂停)可强制刷新一次。
  • 对喷药次数与位置显示采用局部更新,避免整屏重绘。

3.5、蜂鸣器提示模块

3.5.1、功能与意义

蜂鸣器作为运行提示装置,主要作用:

  • 提醒周围人员机器人正在运行,提高安全性。
  • 提示机器人处于运行状态,便于远距离判断。
  • 可扩展为故障报警(如缺药、低电量、卡死等)。

3.5.2、蜂鸣器类型与驱动

建议使用有源蜂鸣器:只需输出高/低电平即可发声。
蜂鸣器电流一般较小,可直接由单片机I/O驱动,若蜂鸣器功率较大可加入三极管放大驱动,并在电源端加入滤波电容以减少噪声。

3.5.3、提示策略

运行状态下采用间歇鸣叫,例如:

  • 每1秒短鸣100ms
    既能提示运行,又不会持续高噪音影响环境。

3.6、电机驱动与运动控制模块

3.6.1、运动机构方案

机器人移动通常采用:

  • 两轮差速驱动(左右轮各一电机,结构简单,易转向)
  • 或履带驱动(适合复杂地形,但摩擦较大)

本设计推荐两轮差速结构:

  • 前进:左右轮同向转动
  • 后退:左右轮反向转动
  • 转向:一侧转另一侧停或反转

3.6.2、驱动芯片选择

电机属于大电流负载,必须使用驱动电路:

  • L298N:经典双H桥驱动,可驱动两路直流电机,支持方向控制与PWM调速。
  • TB6612FNG:效率更高,压降更小,适合电池供电场景。
  • MOSFET H桥:效率高但设计复杂。

L298N具有结构清晰、资料丰富、适合教学的优势,因此常用于此类系统。

3.6.3、驱动控制信号设计

单片机输出控制信号一般包括:

  • 左电机IN1/IN2:方向控制
  • 右电机IN3/IN4:方向控制
  • ENA/ENB:使能控制,可输入PWM实现调速

若无需调速,也可以固定使能为高电平,只控制方向即可。

3.6.4、电机干扰抑制

电机工作时会产生电磁干扰,可能导致单片机复位、显示乱码。建议采取:

  • 电机端并联0.1uF电容(火花抑制)
  • 电机供电端加大电解电容(例如470uF以上)
  • 控制电路与驱动电路供电分离或加滤波
  • 信号线尽量短并远离电机电源线

3.7、喷药执行模块(水泵/电磁阀/喷头)

3.7.1、喷药系统组成

喷药系统一般由:

  • 药液储罐
  • 喷药泵(微型直流水泵)或电磁阀(控制液体流动)
  • 喷头(雾化喷头、扇形喷头等)
  • 管路与过滤装置

本设计重点在控制部分,喷头类型可按实际农作物与喷洒需求选择。

3.7.2、喷药泵控制电路

喷药泵通常为直流电机负载或电磁阀负载,电流较大,必须采用MOSFET或继电器控制:

  • MOSFET方案:效率高、响应快、寿命长,适合频繁开关。
  • 继电器方案:隔离性好,但寿命与噪音存在限制。

建议使用逻辑电平MOSFET(如AO3400、IRLZ44N等)作为低端开关控制:

  • 泵正极接电源
  • 泵负极接MOSFET漏极
  • MOSFET源极接地
  • 单片机通过电阻驱动栅极
  • 泵两端并联续流二极管(抑制反向电动势)

3.7.3、均匀喷药控制策略

为了实现均匀喷药,喷药泵控制可采用两种策略:
1、持续喷药:机器人运行期间泵持续开启,喷药量由行驶速度决定,结构简单。
2、脉冲喷药:泵按周期开启/关闭(例如开500ms关500ms),可更精准控制喷药量并降低泵负荷。

本设计可以采用持续喷药作为基础方案,并通过喷药次数计数来反映喷药过程。


3.8、位置检测模块(可选)

3.8.1、位置检测需求

题目要求显示“机器当前位置”,在工程实现中常见的实现方式包括:
1、编码器测距:通过车轮编码器累计脉冲换算位移,精度高,适合真实机器人。
2、霍尔传感器计数:在轮子上贴磁铁,霍尔传感器计数脉冲,成本低。
3、红外反射/黑线循迹:在地面铺设路线,传感器检测黑线位置,适合固定路线。
4、限位开关/碰撞开关:用于检测到达边界并触发掉头。
5、纯时间估算:以固定速度运行固定时间估算位置,成本最低但精度一般。

在教学设计中,可以采用“时间估算+段编号”的方式模拟位置:例如每运行2秒位置段编号+1,掉头后编号递减,从而实现“当前位置显示”。若条件允许,则推荐霍尔传感器或编码器方案,提高可靠性。

3.8.2、边界检测与往返控制

为了实现自动往返,必须具备边界检测机制:

  • 两端放置限位开关:碰到开关即掉头
  • 或红外测距传感器检测障碍:检测到墙或边界即掉头
  • 或通过里程判断到达预设距离后掉头

本系统可采用“限位开关+掉头”的方式最直观可靠,且程序简单。


3.9、电源管理模块

3.9.1、供电需求分析

机器人通常采用电池供电,例如:

  • 7.4V锂电池(2S)或12V电池供电电机与水泵
  • 通过降压模块输出5V供单片机与传感器/显示模块

由于电机和水泵工作电流大,建议:

  • 控制部分使用独立稳压输出
  • 驱动部分直接使用电池供电或单独稳压
  • 两者地线共地,保证信号参考一致

3.9.2、保护与滤波

为避免电机启动导致电压跌落,应配置:

  • 电源输入大电解电容(470uF~1000uF)
  • 单片机与显示模块供电旁路电容(0.1uF)
  • 低电量检测扩展(可通过ADC检测电池电压并提示)

4、程序设计

4.1、软件总体架构与模块化设计

喷药机器人属于典型的嵌入式控制系统,程序设计应强调实时性、稳定性与可扩展性。推荐采用“定时任务调度 + 状态机”的结构:

  • 定时器提供系统节拍(如10ms或1ms)
  • 主循环根据标志位执行任务:按键扫描、显示刷新、位置更新、自动往返控制、喷药次数统计、蜂鸣器节奏输出等
  • 系统状态机管理IDLE/RUN/PAUSE/RESET等状态

模块化划分如下:
1、系统初始化模块
2、按键模块(扫描+消抖+事件处理)
3、电机控制模块(前进/后退/转向/停止)
4、喷药控制模块(泵开关+喷药次数统计)
5、位置更新模块(编码器/计时段编号)
6、显示模块(内容格式化+刷新)
7、蜂鸣器模块(节奏提示)
8、往返运动控制模块(边界检测+掉头策略)


4.2、系统初始化模块

4.2.1、初始化内容

1、端口初始化:设置电机控制端口、泵控制端口、蜂鸣器端口为输出,按键端口为输入。
2、定时器初始化:产生10ms节拍,用于任务调度。
3、显示模块初始化:清屏、显示开机提示。
4、变量初始化:位置清零、喷药次数清零、状态设置为待机。
5、安全初始化:关闭电机与泵,防止上电误动作。

4.2.2、初始化原则

  • 先关闭执行机构再初始化控制逻辑。
  • 显示初始化后再进入主循环,避免乱码。
  • 所有计数器和状态变量必须明确赋值,防止随机值导致异常行为。

4.3、按键控制程序模块

4.3.1、按键扫描与消抖

按键容易抖动,因此建议采用定时扫描消抖:

  • 每10ms扫描一次
  • 若连续检测到按下状态超过20ms则确认有效
  • 触发事件后等待按键释放

4.3.2、按键事件逻辑

  • START:在IDLE或PAUSE状态下进入RUN状态
  • PAUSE:在RUN状态下进入PAUSE状态
  • RESET:任何状态下清零并回到IDLE

为了安全,PAUSE应具备最高优先级,确保机器人可随时停机。


4.4、电机运动控制模块

4.4.1、运动控制指令

电机模块应提供统一控制接口:

  • Move_Forward()
  • Move_Backward()
  • Turn_Left()
  • Turn_Right()
  • Move_Stop()

4.4.2、往返运动控制逻辑

在RUN状态下:
1、机器人默认向前运动
2、检测到边界后执行掉头(可原地转180°或后退+转向)
3、改变方向标志并继续前进
4、循环往返

若采用左右轮差速,可以通过“左轮反转+右轮正转”实现原地转向。

4.4.3、速度与喷洒均匀性

喷洒均匀性与运动速度密切相关。若速度波动大,会造成喷洒不均匀。因此建议:

  • 采用PWM调速保持恒速
  • 或在电池电压下降时适当调整PWM占空比
    基础版本也可采用固定PWM输出,保证相对稳定。

4.5、喷药控制模块

4.5.1、喷药启停

喷药控制与运行状态强绑定:

  • RUN状态:喷药泵开启(持续喷药或脉冲喷药)
  • PAUSE/IDLE/RESET状态:喷药泵关闭

4.5.2、喷药次数统计

喷药次数可以理解为“喷药动作次数”或“喷药脉冲次数”。在持续喷药策略下,也可用时间片计数模拟喷药次数,例如:

  • 每喷药1秒计数+1
    这样喷药次数可反映喷药持续时间与累计喷洒量趋势。

在脉冲喷药策略下,每次开启泵一次即可计数+1,更直观。


4.6、位置更新模块

4.6.1、位置参数定义

位置显示可以采用简化方式:

  • position为段编号:每行进固定时间(如1秒)position+1
  • 掉头后position递减,模拟来回运动
    这样即使没有编码器,也能满足“显示当前位置”的需求。

如果使用编码器或霍尔传感器,则位置更新更精确:

  • 每个脉冲对应一定距离
  • position可换算为厘米或米并显示

4.6.2、位置更新节拍

位置更新不需要过快,建议每200ms或1秒更新一次即可,同时保证显示稳定。


4.7、显示模块程序设计

4.7.1、显示内容与格式

显示模块至少显示:

  • 当前位置:POS=xxx
  • 喷药累计次数:SPR=xxx
  • 当前状态:RUN/PAUSE/IDLE

LCD1602可采用两行显示:

  • 第1行:POS:xxx SPR:xxx
  • 第2行:STATE:RUN / PAUSE / IDLE

4.7.2、刷新策略

  • RUN状态:周期刷新(例如500ms一次)
  • 状态切换:立即刷新一次
  • 避免频繁清屏,采用光标定位覆盖更新即可

4.8、蜂鸣器提示模块

4.8.1、运行提示音策略

在RUN状态下蜂鸣器间歇鸣叫,例如:

  • 每1秒响100ms
    在PAUSE或IDLE状态下蜂鸣器保持静音。

4.8.2、扩展策略

后续可扩展:

  • 低电量:快速短鸣
  • 缺药:长鸣+显示提示
  • 卡死:连续鸣叫并停机

4.9、安全保护与复位模块

4.9.1、暂停优先

任何时候按下暂停键必须立即停机:

  • 电机停止
  • 喷药停止
  • 蜂鸣器停止
    这属于安全控制逻辑核心。

4.9.2、复位功能实现

复位不仅是变量清零,更重要的是恢复设备安全状态:

  • 所有执行机构关闭
  • 清零喷药次数与位置
  • 恢复默认方向
  • 显示复位完成

5、关键程序代码示例(模块化实现)

5.1、全局变量与硬件定义

#include <reg52.h>

typedef unsigned char u8;
typedef unsigned int  u16;

// ====== 按键定义(低电平有效) ======
sbit KEY_START = P3^0;
sbit KEY_PAUSE = P3^1;
sbit KEY_RESET = P3^2;

// ====== 蜂鸣器 ======
sbit BEEP = P1^7;

// ====== 喷药泵控制(MOSFET/继电器驱动) ======
sbit PUMP = P1^6;

// ====== 电机驱动控制(示例:左右轮两个方向控制) ======
sbit L_IN1 = P2^0;
sbit L_IN2 = P2^1;
sbit R_IN1 = P2^2;
sbit R_IN2 = P2^3;

// ====== 系统状态 ======
typedef enum {
    ST_IDLE = 0,
    ST_RUN,
    ST_PAUSE
} SysState;

volatile SysState sysState = ST_IDLE;

// ====== 位置与喷药次数 ======
volatile int position = 0;      // 当前位置段编号,可正可负
volatile u16 sprayCount = 0;    // 喷药累计次数

// ====== 方向标志:1向前,0向后(往返) ======
volatile bit dirForward = 1;

// ====== 定时标志 ======
volatile bit flag_10ms = 0;
volatile bit flag_200ms = 0;
volatile bit flag_1s = 0;

5.2、定时器初始化与中断(10ms节拍)

void Timer0_Init(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01;

    // 11.0592MHz,10ms:初值 0xDC00
    TH0 = 0xDC;
    TL0 = 0x00;

    ET0 = 1;
    EA  = 1;
    TR0 = 1;
}

void Timer0_ISR(void) interrupt 1
{
    static u8 cnt200 = 0;
    static u8 cnt1s = 0;

    TH0 = 0xDC;
    TL0 = 0x00;

    flag_10ms = 1;

    cnt200++;
    if(cnt200 >= 20) // 200ms
    {
        cnt200 = 0;
        flag_200ms = 1;

        cnt1s++;
        if(cnt1s >= 5) // 1秒
        {
            cnt1s = 0;
            flag_1s = 1;
        }
    }
}

5.3、电机控制模块

void Motor_Stop(void)
{
    L_IN1 = 0; L_IN2 = 0;
    R_IN1 = 0; R_IN2 = 0;
}

void Motor_Forward(void)
{
    // 左右轮正转
    L_IN1 = 1; L_IN2 = 0;
    R_IN1 = 1; R_IN2 = 0;
}

void Motor_Backward(void)
{
    // 左右轮反转
    L_IN1 = 0; L_IN2 = 1;
    R_IN1 = 0; R_IN2 = 1;
}

void Motor_TurnAround(void)
{
    // 原地掉头:左轮反转,右轮正转
    L_IN1 = 0; L_IN2 = 1;
    R_IN1 = 1; R_IN2 = 0;
}

5.4、喷药控制模块

void Pump_On(void)
{
    PUMP = 1;
}

void Pump_Off(void)
{
    PUMP = 0;
}

// 持续喷药时可用时间计数模拟喷药次数
void Spray_Count_1s(void)
{
    if(sysState == ST_RUN)
    {
        sprayCount++;
    }
}

5.5、蜂鸣器提示模块

void Beep_On(void)  { BEEP = 1; }
void Beep_Off(void) { BEEP = 0; }

// RUN状态每秒短鸣100ms
void Beep_Process_200ms(void)
{
    static u8 beepStep = 0;

    if(sysState != ST_RUN)
    {
        Beep_Off();
        beepStep = 0;
        return;
    }

    beepStep++;
    if(beepStep == 1)
        Beep_On();
    else
        Beep_Off();

    if(beepStep >= 5) // 200ms*5=1s循环
        beepStep = 0;
}

5.6、按键扫描与状态机控制

bit Key_Scan(sbit key)
{
    if(key == 0)
    {
        u16 i;
        for(i=0;i<500;i++); // 简易延时消抖
        if(key == 0)
        {
            while(key == 0); // 等待松手
            return 1;
        }
    }
    return 0;
}

void Key_Process(void)
{
    // RESET优先级最高
    if(Key_Scan(KEY_RESET))
    {
        sysState = ST_IDLE;
        Motor_Stop();
        Pump_Off();
        Beep_Off();
        position = 0;
        sprayCount = 0;
        dirForward = 1;
        return;
    }

    // PAUSE优先
    if(Key_Scan(KEY_PAUSE))
    {
        if(sysState == ST_RUN)
        {
            sysState = ST_PAUSE;
            Motor_Stop();
            Pump_Off();
            Beep_Off();
        }
        return;
    }

    // START键:从IDLE/PAUSE进入RUN
    if(Key_Scan(KEY_START))
    {
        if(sysState == ST_IDLE || sysState == ST_PAUSE)
        {
            sysState = ST_RUN;
            // 启动后立即进入运动与喷药
            if(dirForward) Motor_Forward();
            else Motor_Backward();
            Pump_On();
        }
    }
}

5.7、往返运动与位置更新逻辑(示例:时间估算位置)

void Move_Process_1s(void)
{
    static u8 travelSec = 0;

    if(sysState != ST_RUN) return;

    // 每秒更新位置(模拟)
    if(dirForward) position++;
    else position--;

    // 简单往返:每走10秒掉头一次(示例)
    travelSec++;
    if(travelSec >= 10)
    {
        travelSec = 0;

        // 掉头动作
        Motor_TurnAround();
        // 掉头持续一段时间(简化:用阻塞延时演示)
        // 实际建议用非阻塞计时方式
        {
            u16 i;
            for(i=0;i<30000;i++);
        }

        // 切换方向继续走
        dirForward = !dirForward;
        if(dirForward) Motor_Forward();
        else Motor_Backward();
    }
}

5.8、显示模块示例(LCD1602显示伪函数)

// 以下为显示伪函数,实际项目需要LCD驱动实现:
// void LCD_ShowString(u8 row, u8 col, char *str);

void Display_Process_200ms(void)
{
    char line1[17];
    char line2[17];

    // line1: POS:xxxx SPR:xxxx
    line1[0]='P'; line1[1]='O'; line1[2]='S'; line1[3]=':';
    line1[4]=(position/1000)%10+'0';
    line1[5]=(position/100)%10+'0';
    line1[6]=(position/10)%10+'0';
    line1[7]=(position%10)+'0';
    line1[8]=' ';
    line1[9]='S'; line1[10]='P'; line1[11]='R'; line1[12]=':';
    line1[13]=(sprayCount/100)%10+'0';
    line1[14]=(sprayCount/10)%10+'0';
    line1[15]=(sprayCount%10)+'0';
    line1[16]='\0';

    // line2: STATE:XXX
    line2[0]='S'; line2[1]='T'; line2[2]='A'; line2[3]='T'; line2[4]='E'; line2[5]=':';
    if(sysState==ST_IDLE)
    { line2[6]='I'; line2[7]='D'; line2[8]='L'; line2[9]='E'; }
    else if(sysState==ST_RUN)
    { line2[6]='R'; line2[7]='U'; line2[8]='N'; line2[9]=' '; }
    else
    { line2[6]='P'; line2[7]='A'; line2[8]='U'; line2[9]='S'; line2[10]='E'; }
    line2[16]='\0';

    // LCD_ShowString(0,0,line1);
    // LCD_ShowString(1,0,line2);
}

5.9、主循环框架(任务调度)

void main(void)
{
    Timer0_Init();

    // 上电安全状态
    Motor_Stop();
    Pump_Off();
    Beep_Off();

    // LCD_Init(); // 若使用LCD需初始化
    sysState = ST_IDLE;
    position = 0;
    sprayCount = 0;
    dirForward = 1;

    while(1)
    {
        if(flag_10ms)
        {
            flag_10ms = 0;
            Key_Process();   // 按键扫描
        }

        if(flag_200ms)
        {
            flag_200ms = 0;
            Beep_Process_200ms();     // 蜂鸣器节奏
            Display_Process_200ms();  // 显示刷新
        }

        if(flag_1s)
        {
            flag_1s = 0;
            Spray_Count_1s();   // 喷药次数统计
            Move_Process_1s();  // 位置更新与往返运动
        }
    }
}

6、关键设计要点与工程实现建议

6.1、均匀喷药的关键因素

喷洒均匀性取决于三个主要因素:
1、运动速度稳定:速度越恒定,喷洒密度越均匀。
2、喷药流量稳定:水泵输出压力稳定、喷头雾化稳定。
3、喷药控制策略合理:持续喷药简单稳定,脉冲喷药可精细控制。

在工程实践中,最容易导致喷洒不均的是电池电压变化导致速度变化。为提升均匀性,可以扩展:

  • PWM闭环调速(利用编码器反馈)
  • 电池电压检测(低电压补偿PWM或提醒更换电池)

6.2、安全性与可靠性设计要点

1、暂停键优先级最高:任何时候必须能立即停机停喷。
2、驱动隔离与保护:电机与水泵必须使用驱动电路,并加续流二极管与滤波。
3、供电分区与滤波:防止电机启动造成单片机复位。
4、复位恢复安全状态:复位必须确保执行机构关闭。
5、蜂鸣器提示避免误入:运行中间歇提示,提高现场安全。


6.3、可扩展升级方向

本系统作为基础喷药机器人平台,具备良好扩展性,可进一步加入:
1、循迹或路径规划:通过红外循迹、二维码定位、GPS/北斗定位,实现更智能路径。
2、障碍物检测:超声波/红外测距检测障碍并绕行或停机。
3、自动回充/回仓:低电量自动返回充电或补液点。
4、药液余量检测:液位传感器检测缺药并报警。
5、远程控制与数据上传:蓝牙/WiFi/LoRa通信,实现远程监控。
6、喷量闭环控制:流量传感器+PWM调速,实现精准喷药。


7、总结

基于单片机的自动化农业喷药机器人系统通过按键控制、自动移动喷药、实时显示与蜂鸣器状态提示,实现了农业园区内的无人化喷药作业。系统采用模块化电路设计,包含单片机最小系统、按键控制模块、显示模块、蜂鸣器提示模块、电机驱动模块、喷药泵控制模块及电源管理模块,保证了控制稳定性与驱动安全性。在程序设计上,系统采用定时任务调度与状态机管理思路,实现启动、暂停、复位控制,并在运行状态下完成往返移动、喷药执行、位置更新、喷药次数统计与实时显示,同时通过蜂鸣器间歇提示提醒用户设备处于运行状态。

该设计方案成本低、结构清晰、易实现、可扩展性强,适用于农业温室、果园园区、绿化带等场景的喷药自动化需求,并可进一步升级为具备循迹导航、障碍检测、远程管理与精准喷药能力的智能农业机器人平台。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐