基于Arduino Nano和MQTT的智能晾衣机器人,可检测降雨、追踪阳光,并在干燥区与安全区之间移动衣物
1. 引言
该项目是一款智能晾衣架机器人,旨在作为现实世界自动化晾衣系统概念验证的实现。
这个想法源于一个实际问题。我住在墨尔本,那里的天气变化非常快。曾有几次,我把衣服晾在外面晾干,去上大学后回来发现它们被雨水淋湿了。这个项目旨在探索嵌入式系统如何通过检测环境条件并自动响应,来帮助解决这个问题。
我没有建造一个完整的晾衣架,而是制作了一个小型机器人,用来模拟自动晾衣架的运行过程。这个机器人能够检测光线方向、感应雨水、沿线路移动,并在干燥区和安全区之间穿梭,同时通过MQTT与树莓派仪表板进行通信。
2. 发展方法
我没有一步到位地完成整个机器人的建造,而是逐步进行,并在添加下一部分之前测试每一部分。
开发过程如下:
•我首先组装了机器人的底盘。
•然后我安装了面包板、L298N电机驱动器和6节电池组。
•我使用一个简单的测试脚本对电机和电机驱动器进行了测试。
•底座运动完成后,我在前面加装了三个线路传感器。
•我用一个简单的脚本单独测试了行传感器。
•然后我加装了雨量传感器,并测试了干湿状态的读数。
•之后,我添加了两个BH1750光传感器,并测试了它们的读数。
•一旦传感器能够独立工作,我便开始开发机器人的实际逻辑。
•我首先让机器人朝向更强的光线旋转。
•然后我使用串行监视器命令,让机器人移动到安全且干燥的区域。
•我多次调整了逻辑,直到动作变得可靠。
•之后,我添加了线条追踪和区域检测功能。
•最后,我添加了MQTT通信和树莓派仪表板。
这种方法行之有效,因为每个新模块在成为最终系统的一部分之前都会经过测试。如果出现问题,我就能知道是哪个部分刚刚被添加或修改了。
3. 所用硬件
我主要使用的硬件是:
•Arduino Nano 33 IoT IoT 板
•L298N电机驱动器
•两轮机器人底盘
•两个直流电机
•面包板
•6节AA电池组
•三线传感器
•雨量传感器
•两个 BH17500 光感传感器
•跳线
•双面胶
•用于安装线路传感器的薄型可锻金属板
•树莓派用于后端/仪表盘
在组装过程中我使用了双面胶,因为它让我可以在测试时重新调整零件位置。
4. 电路图与接线概览
在组装完整机器人之前,我已规划好Arduino Nano、L298N电机驱动器、传感器和电池组之间的接线。电路图展示了这些主要模块在安装到机箱之前如何连接。
最重要的接线要点是所有模块都需要共用一个地线。Arduino Nano、L298N电机驱动器、雨传感器、线路传感器、BH1750传感器以及电池供电必须共用地线,以确保信号能够正确读取。
我最终构建中主要使用的连接方式是:
L298N 的 ENA 和 ENBBB 跳线保持安装,因此我没有使用 PWM PWM 引脚进行速度控制。相反,最终代码采用数字脉冲运动方式,使电机动作更平缓。
5. 搭建底盘
第一步是组装基本的机器人底盘。我安装了两个直流电机,装上车轮,并安装了前轮脚轮。
现阶段还没有安装传感器。我只是想确保机器人有一个稳定的底座,并且有足够的空间来后期安装面包板、电机驱动器、电池组和传感器。
6. 安装面包板、L298N和电池组
底盘组装完成后,我安装了面包板、L298N电机驱动器和6节电池组。
我用双面胶将这些部件固定在机箱上,这样在测试时更容易调整元件位置。L298NNN 被安装在电机附近,以便电机线缆能轻松连接。面包板放在上方,便于之后添加 Arduino 和传感器的线路。电池组则安装在合适的位置,以便独立为机器人供电。
此时,机器人已具备运动所需的基本部件:
•电源用电池组;
•L298N 用于电机控制;
•用于布线的面包板;
•使用Arduino Nano作为控制器。
7. 测试电机驱动器
在添加任何传感器之前,我使用一个简单的Arduino脚本测试了电机驱动器和电机。
本次测试的目的是确认:
•左侧电机可以向前和向后移动;
•正确的电机可以向前和向后移动;
•两个电机可以同时运动;
•机器人可以左右旋转;
•停止功能已生效;
•电池和L298N实际上可以为电机供电。
这个阶段很重要,因为电机方向在第一次尝试时并不总是正确。根据电机的接线方式,一侧可能会反向旋转。我调整了电机方向设置,直到机器人能够正确地向前移动、向左旋转、向右旋转并停止。
在我的最终接线中,L298N电机控制引脚是:
我保留了L298N的ENA/ENB跳线,因此机器人没有使用PWM引脚。相反,最终代码采用数字脉冲运动方式,使电机动作更平缓。
8. 添加线路传感器
电机系统运行后,我在机器人的前面加装了三个线路传感器。
三个传感器的排列方式如下:
我用从面包板上剩下的薄可锻金属片将它们固定起来。这种方法效果很好,因为可以稍微弯曲金属片,使传感器朝下放置。我用胶带将传感器和支架固定在原位。
线路传感器已连接到:
此时,我并没有立即添加完整的行跟踪功能。首先,我用一个简单的脚本测试了传感器,该脚本会打印读数。我只使用黑色胶带作为测试表面,以确认传感器能够正确检测暗区和亮区。
这一阶段的目标只是检查每个传感器在经过暗线时是否会产生反应。
9. 添加雨量传感器
在安装并测试了线路传感器后,我加装了雨量传感器。
雨传感器主要有两个部分:
•感应板;
•控制模块。
我将感应板安装在测试时易于触及的位置,控制模块则放置在面包板附近。再次使用双面胶,以便在需要时可调整传感器的位置。
雨传感器输出连接到:
我用一个简单的脚本单独测试了雨传感器,该脚本会打印模拟读数。我将传感器干燥时的数值与湿润时的数值进行比较,这帮助我确定了检测降雨的阈值。
在最终设置中,干区读数大致较高,湿区读数较低,因此最终代码使用阈值来判断是否有降雨。
10. 添加和测试 BH17500 光感传感器
我添加的最后一个传感器是两个BH1750光感传感器。
我在机器人左侧安装了一个BH1750传感器,在右侧也安装了一个。使用垂直支撑使传感器高出机器人机身,这样有助于传感器更好地检测来自不同方向的光线。
两个传感器都使用I2C,因此需要不同的地址:
在编写机器人旋转逻辑之前,我先使用一个简单的测试脚本来确认两个传感器都能正常读取数据。该测试会打印左右两侧的光照强度值,以便我检查当光线指向传感器时,每个传感器是否都能做出响应。
在最终代码中,两个传感器都以如下方式初始化:
这使得机器人在启动时能够检查每个BH1750传感器是否被成功检测到。
11. 让机器人朝向阳光旋转
在确认两个BH1750传感器都能读取数据后,我开始着手处理太阳平衡逻辑。
想法很简单:
最终逻辑比较两个亮度值,并采用死区,以防止机器人在微小差异时发生旋转。
死区很重要,因为如果没有它,机器人即使在光线差异非常小时仍会持续旋转,这使得机器人更加稳定。
太阳追踪功能仅在机器人处于干燥状态且启用洗衣模式时使用。
12. 使用串行命令控制运动
在添加MQTT或仪表板之前,我通过串口监视器命令来控制机器人。这样可以更方便地测试运动,而无需依赖后端服务。
串行命令如下:
命令处理逻辑如下所示:
这个阶段很有用,因为我可以将机器人放置在测试表面上,发送指令,观察其运动,然后调整逻辑。
我多次调整了运动方式,最终才得到一个能正常工作的版本。机器人需要正确旋转、寻找线条、向前移动,并在需要时停止。
13. 开发线传感器逻辑
机器人能够通过简单的串行指令移动后,我开始着手进行线路追踪。
三个线路传感器被读取为一个三位模式:
以下函数读取三个传感器并将它们转换为该模式:
这成为机器人运动逻辑的基础。
总体的运动理念是:
最初的版本过于敏感,机器人有时会过度校正,因为它对每一个微小的传感器变化都会做出反应。我通过添加逻辑来改进这一问题,该逻辑能够容忍短暂的闪烁,并仅在需要时进行校正。
14. 线路追踪与恢复
跟随线路时的一个问题是机器人可能会偏离轨道。当这种情况发生时,需要一种方法重新寻找线路,而不是完全停止。
最终代码采用了一种线迹追踪状态。当机器人检测到左侧或右侧的线时,会锁定该方向并保持朝该方向旋转一段时间,从而有助于减少随机左右移动。
逻辑的简化解释如下:
部分追踪线路的逻辑是:
这是改进机器人运动性能的部分之一,因为它能防止机器人在读取到快速变化的线路信息时不断改变方向。
15. 通过向前发力改善动作
另一个问题是动作迟缓。如果机器人能立即纠正每一个微小的侧向读数,它就会移动得过慢且不均匀。
为了减少这种情况,我采用了一段较短的前向提交时间。当机器人看到中心线时,它会短暂地认为自己已对齐并继续向前移动。除非出现持续的小幅度闪烁,否则会被忽略。
这是一项重要的改进,因为它使机器人运动更加平稳,不再频繁地左右晃动。
16. 开发安全区与干燥区检测
机器人能够沿线移动后,我添加了用于检测安全区和干燥区的逻辑。
机器人通过标记图案来检测区域。其原理是:
就传感器模式而言:
机器人不会信任任何一次读数,而是在等待稳定且重复的读数后,才确认一个区域。
由于传感器读数中的微小误差可能导致区域检测错误,因此该逻辑经过了多次迭代优化。要求重复读取数据使系统更加可靠。
17. 添加雨效果
一旦运动和区域检测功能正常运行后,我便将雨传感器逻辑连接到机器人的行为控制中。
机器人只有在以下情况下才应移动到安全位置:
雨的逻辑是:
这是项目中最重要的部分之一,因为降雨安全由Nano本地处理。仪表盘虽然有用,但机器人无需等待仪表盘判断降雨不安全。
18. 添加MQTT通信
机器人本地运行后,我添加了MQTT通信。
添加了MQTT协议,以便机器人能够远程发送遥测数据并接收指令。Nano将传感器和状态信息发布到公共的MQTT消息代理,而树莓派后端则订阅这些信息。
MQTT 代理是:
主题包括:
Nano 以 JSON JSON 格式发布遥测数据:
这使得仪表板能够显示机器人的当前状态、降雨情况、光照读数、线路图案以及最新事件。
19. 接收MQTT命令
机器人还可以从仪表盘接收MQTT指令。
支持的命令如下:
命令处理器接收纯文本命令或JSON命令。
例如,当接收到 MOVE_TO_SAFE 信号时,机器人会检查自己是否已处于运动关键状态。如果尚未处于该状态,则开始向安全区域移动。
这使得机器人可以从仪表盘进行控制,同时将主要的安全性和运动逻辑保留在Nano上。
20.添加树莓派仪表板
最后一步是添加树莓派仪表板。
仪表盘是在机器人开始运行后添加的,其目的是使系统更易于监控和控制。
仪表盘显示:
•机器人状态;
•目标区域;
•最新活动;
•线传感器图案;
•雨量传感器读数;
•雨情状态;
•左右关节活动度读数;
•MQTTTT 状态;
•洗衣主动模式;
•最近的日志和事件。
它还提供了按钮,用于向机器人发送手动指令,例如移动到安全区域、返回干燥区域、停止机器人运行,以及启用或禁用洗衣主动模式。
树莓派并未取代机器人的本地逻辑。Nano 仍然负责处理雨天响应、线条追踪、区域检测、运动控制以及传感器决策。仪表板主要用于监控、日志记录和远程控制。
21. 将后端迁移到树莓派
在确认 Flask 仪表板在本地运行正常后,我将后端迁移到了树莓派。
仪表板的第一个版本是在笔记本电脑与后端服务器和Nano处于同一本地网络时进行测试的。这帮助我确认了仪表板能够发送命令,且Nano能正确响应。一旦实现这一功能,我就希望后端能够独立运行,不再依赖我的笔记本电脑。
该项目使用了树莓派作为小型常驻服务器。我将Flask后端复制到树莓派上,安装了所需的Python依赖,并从那里运行了仪表板。
树莓派后端负责以下工作:
•运行 Flask Flask 界面;
•接收来自机器人的遥测数据;
•显示机器人状态和传感器数值;
•发送手动命令;
•记录事件和状态;
•无需使用笔记本电脑运行后端,即可保持仪表盘可用。
•这使得树莓派成为最终系统的主后端和监控点。
22. 最终演示与结果
最终的机器人成功演示了智能晾衣架概念的主要功能。当启用洗衣模式时,机器人可留在烘干区域,监测雨量传感器,并比较两个BH1750传感器的光照读数,通过MQTT实时将状态信息发送至树莓派仪表板。一旦检测到并确认降雨,Arduino Nano 33物联网模块会本地处理安全响应。机器人会沿线路追踪,识别正确的区域标记,从烘干区自动移动至安全区,无需依赖仪表板做出决策。仪表板仍可用于监控机器人的状态、查看传感器读数,并发送手动指令,例如移动至安全区、返回烘干区、停止机器人运行或开启/关闭洗衣模式。
本文编译自hackster.io





