我的机器人由 ArduinoMEGA2560 控制。
使用了 MEGA2560 的所有功能:3 个串行接口、I2C、SPI、PWM、ADC 和 2 个中断。这就是为什么我选择了提供如此多接口的MEGA2560。但请注意,MEGA2560 在中断方面有一点限制,因为如果使用 I2C 和 Serial2,则 6 个中断中有 4 个不可用。
MEGA2560 唯一缺少的功能是蓝牙和 WIFI 连接。为此,我添加了一个 nRF52832 来处理蓝牙和一个 ESP8266 来处理 WIFI。第一个管理从 Android 上运行的用户界面接收到的命令,第二个将数据和图片发送到 Raspberry PI。
最初我还使用了一个 ESP8266 来管理从我的 Windows PC 接收到的命令,但是 WIFI 太耗电了,所以我已经将这部分迁移到 Android 和 BLE 蓝牙,所以现在命令是从我的手机发送的。
现在让我们更详细地讨论所实施的设备。在设备列表下方。
nRF52832
ESP8266
4 motors
2 H-bridges
2 Contact sensors
Sharp IR
Servo for IR
3 ToF
Compass
LCD
RGB led
Buzzer
Camera
Tilt&Pan servos for Camera
SD Card
RTC
Brightness sensor
Temperature & Humidity sensor
Motion sensor
Sound sensor
首先,有 4 个电机由 2 个 H 桥控制,使用 PWM 和数字引脚进行管理。他们有专用的锂离子电池,以免干扰 MEGA2560,但不要忘记接地,否则 PWM 将无法工作。
为了让机器人能够独立运行,实现了以下装置:
每 165 毫秒(33*5:nb 样本测量),Front TOF 测量机器人与潜在障碍物之间的距离。
如果距离小于Distance minimum,则机器人向没有障碍物的方向转45°,如果检测到左右两侧有障碍物则返回。安装在 Tilt&Pan 上的 IR Sharpis 用于检查周围的障碍物。连接到 I2C 的罗盘提供方向以控制转弯。如果接触传感器检测到提示,机器人也会遵循此过程。
如果距离介于 Distanceminimum 和 Distance nominal 之间,则机器人会检查左右 TOF 测量的距离,并通过加速/减速一侧的电机将其推向最佳方向。
如果距离大于标称的距离,则机器人继续直线向前运行。
机器人还可以检查环境并在异常变化时发出警报。监测的参数如下:
· 运动由触发 MEGA2560 中断的传感器检测。所以这个警报是实时的。
· 连接到 Digitalpin 的温度和湿度可以检测温度或湿度的异常变化
· 亮度也由连接到 I2C 的传感器监控
· 我已经尝试了几种声音传感器,但是没有一个是足够的:当我增加扬声器的音量时,它们不会检测到。不要犹豫,推荐一个!
在出现警报的情况下,机器人会使用安装在倾斜盘上的相机拍照。因此相机可以水平和垂直从-180°到+180°移动。相机连接到 Serial3,Tilt pan 的 2 servos 由 PWM 控制。
图片存储在与 SPI 连接的 SD 卡上的 jpeg 文件中。然后 MEGA2560 通过 Serial1 以 38400 波特将它们发送到 ESP8266 客户端,然后通过 WIFI 将机器人捕获的数据发送到 Raspberry PI
Raspberry PI 上有 PHP 程序,将接收到的数据存储在 TXT 文件和 MySQL 数据库中。如果出现警报,Raspberry PI 会发送包含这些数据和相应图片的电子邮件。
除了所有这些设备之外,还有一些其他组件可以监控系统:连接到数字引脚的 RGB LED 和蜂鸣器、连接到 I2C 的实时时钟 RTC 和 LCD。
主要用于实时了解系统在做什么,因为当机器人运行时不再连接和记录到 IDE 标准串口。日志被写入 SD 卡上的一个文件中,带有跟踪和 RTC 时间戳,因此可以在以后进行分析。
该机器人可以独立运行,但也可以通过在 Android 或 Windows 上运行的用户界面 UI 进行管理。
在 Windows 上,UI 是使用 google widgets 用 HTML/jQuery 编写的。如前所述,命令通过 WIFI 发送到专用的 ESP8266 服务器,该服务器在通过 Serial2 发送命令之前中断 MEGA2650。所以 MEGA2650 不会阻塞等待命令,但他可以在需要时尽快管理它。
响应被传输回 ESP8266,然后传输到 UI。请注意,ESP8266 最大的不便之处在于功耗,大约 80mAh。所以几个小时后 LIPO 780mAh 就没电了,所以我需要在不再需要任何 UI 时手动关闭 ESP8266 服务器。
这就是为什么我又建立了一个基于安卓和蓝牙的界面的原因。
这个 UI 是使用 MIT App Inventor 编写的,可以轻松地为 Android 创建软件应用程序。命令通过 BLE 蓝牙使用串行服务发送到 nRF52832,在通过串行 2 发送命令之前中断 MEGA2650。所以 MEGA2650 不会阻塞等待命令,但他可以在需要时尽快管理它。
请注意,与 WIFI 相比,蓝牙缓冲区非常小(20 字节)。
命令如下:
ESP8266 Client负责通过WIFI向树莓派发送数据和图片。
为了降低功耗,它始终处于深度睡眠模式,并在通过串行接口发送任何数据或图片之前,由 Arduino 触发的 pinDTR/RTS 的 10ms 低脉冲唤醒。请注意,由于 ESP 启动过程也使用串行来记录一些信息,ESP 的启动有时会被阻止,我在启动后立即交换 ESP 的串行引脚以避免与 Arduino 发生冲突。
发送数据后,Arduino 立即向 ESP 发送睡眠命令以返回深度睡眠模式。
在软件方面,我用 C++ 为每个设备编写了一个库,并且有一个主程序Robot处理 MEGA2560 的核心处理并调用库中的函数。
最后这个程序非常大,希望 MEGA 2560 有足够的内存来运行它,但你肯定不能在 Uno 上运行它。请注意,所有用于记录的字符串都存储在闪存中以赢得数据存储器空间。
此外,还有 2 个主要程序用于ESP 服务器(基于蓝牙或 WIFI )和ESP 客户端。
还有一些工具:
大多数代码源已在网上找到(感谢开源!),然后进行定制/改进。一个关键点是大多数时候在网上找到的资源没有正确处理错误,所以我完成了这部分,主要是在 I2C 部分。
每个设备在集成到核心程序之前都经过专用草图单独测试。这对于更好地理解行为和了解限制非常有用。例如,有时设备会提供不稳定的测量结果,因此获取测量样本并计算中位数会更加安全。
初始化部分也非常关键,我在这个阶段为每个设备添加了一些测试用例,以便在开始之前验证一切是否准备就绪。例如,更改 TOF 的 I2C 地址以避免总线冲突。
我还构建了一个库来定义 nRF、ESP 和 Arduino 之间的协议,以确保串行接口上的传输质量良好并避免死锁。这是强制性的,因为串行接口不安全,如果串行缓冲区已满且读取器未准备好,一些字节可能会丢失。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !