ZeroBug 是由 Raspberry Pi Zero 和 STM32F103 驱动的 3D 打印微型伺服六足机器人。Pi Zero 负责输入法和前端,使机器人可以通过鼠标、键盘、多点触控或简单的蓝牙游戏手柄进行控制。为了让机器人行走,STM32 处理腿部运动、反向运动并控制其 18 个伺服系统。所有这些计算都以 50Hz 的频率运行,使 Hexapod 能够平稳且高精度地移动。其紧凑的框架是完全 3D 打印的。
一些主要功能:
· 自定义运动引擎
· 紧凑的 CAD 设计和 3D 打印组件
· 带有键盘、鼠标和多点触控输入的 Web 界面通过 websocket
· 蓝牙游戏控制器支持
· 用于对象操作的爪
在让机器人行走时,STM32F103 承担了繁重的工作。它计算运动、反向运动学、身体旋转/平移并最终驱动伺服系统。通过简单的串行协议,可以直接发送命令来控制机器人。串行接口也是 Raspberry Pi Zero W 所连接的接口。它正在运行为轮式Zerobot创建的软件的改进版本,该软件拥有用于鼠标和触摸控制的 Web 界面。最重要的是,通过 pygame 支持无线游戏手柄。
硬件方面,定制电路板装有 STM32、PWM 控制器和一些其他组件,而 Raspberry Pi Zero 则插入 PCB 的背面。使用的舵机是便宜的 EMAX ES08A II。除了电子设备和伺服系统之外的任何东西都是 3D 打印的。
结合硬件和软件
将运动代码从 Processing 模拟移植到 STM32 相对简单。必须添加一些安全检查,以防止机器人意外地将其腿相互碰撞。微控制器在不到 20 毫秒的时间内管理运动、旋转、IK 和其他所有内容的计算。当然可以进行一些优化以使其运行更顺畅。
我编写了一个简单的协议来通过 UART 控制 STM32。该协议可用于从 USB 或 Raspberry Pi Zero 接收命令。Raspberry Pi 运行一个 Python 脚本来处理 Websocket 通信、UART 和 pygame。一旦客户端连接到 Pi,就会加载一个网站,该网站可用于通过键盘、鼠标或触摸输入来控制六足动物。Pygame 允许与游戏控制器进行蓝牙连接。Raspberry Pi 翻译命令并通过串行将它们发送到 STM32。Pi 还会发送一个周期性的心跳信号,因此 STM32 可以停止伺服系统,以防 Raspberry Pi 冻结。
Raspberry Pi 和微控制器的这种组合效果非常好。控制六足机器人非常有趣,尤其是使用 Xbox 控制器。您可以在下面看到有关控制器如何映射到六足轴的视频:
总的来说,我对这个项目的结果感到满意。六足动物可以像我想的那样行走,并且可以以惊人的精度进行控制。开发并不总是像阅读这些项目日志时看起来的那样顺利。实际上,我在 2014 年开始研究模拟器,但出于沮丧而搁置了整个项目,几年后才将其挖掘出来。就在今年年初,它真的很受欢迎,我有动力完成这个项目。回想起来,ESP32 可能是 Raspberry Pi 和 STM32 的替代品。性能和与游戏控制器的兼容性可能是一个问题。
转向硬件
模拟完成后,是时候继续使用物理六足机器人了。我开始设计单腿零件并寻找合适的伺服电机。由于该六足机器人需要 18 个舵机,因此它们决定了机器人的总成本。我选择了一些便宜的 Emax ES08A II 微型舵机。它们的尺寸非常强大,到目前为止,它们的塑料齿轮似乎保持良好。我为整套伺服系统支付了大约 80 欧元。当为机器人使用合适的智能伺服系统时,单个单元的成本可能会很高。
虽然它们是“微型”的,但这些伺服器可以吸收大量电流。我本来打算先用锂电池,后来改用 NIMH。巨大的优势是六个 1.2V NIMH 电池加起来很好地达到了伺服系统所需的 6V。锂电池需要稳压器,并且需要大电流,这会使项目不必要地复杂化。
驱动伺服系统需要 18 个 PWM 输出。一开始,我试图找到一个有足够IO的微控制器来直接连接舵机。Teensy 4.0 可能是一个很好的候选者。然而,机器人的电子设备空间非常有限,而且青少年板似乎不合适。STM32F103 是下一个最佳选择,因为它与 Arduino 兼容,而且我已经积累了一些使用宏键盘的经验。由于 IO 和定时器的限制,PCA9685 PWM 驱动器用于控制 16 个舵机,而其余四个可由 STM32 本身处理。您可以在下方查看在宏键盘原型上运行的 hexapod 软件:
选择微控制器后,机器人仍然无法从外部进行控制。为了添加无线连接,我决定添加一个 Raspberry Pi Zero W。对于我的基于 Pi Zero 的Zerobot机器人,我已经为 Web 界面创建了软件,我认为添加蓝牙游戏控制器应该不是问题。选择最重要的部分后,我继续创建 PCB。
在 ZeroBug 板上,微控制器和 Raspberry Pi 通过 UART 连接。我正在使用底部入口针头。这允许非常紧凑的组装,而无需焊接 Raspberry Pi。STM32 可以使用其 USB 接口进行编程,而 Raspberry Pi 则使用其 WIFI 连接通过 SSH 或 VNC 查看器进行访问。
为组件供电很棘手,因为我希望能够通过 USB 连接或电池为电路板供电。这是通过创建一个二极管或电路(见下图)来完成的:仅连接 USB,Pi 提供(几乎)5V,无论如何它内部会下降到 3.3V。此外,STM32 有自己的 3.3V 稳压器。连接电池后,它会通过简单的反极性保护直接为舵机供电。一个额外的 5V LDO 为 Raspberry Pi 和微控制器供电。实际上,这效果很好。只有在电池电量非常低的情况下,Raspberry Pi 可能会在快速移动期间重置。出于这个原因,我正在使用 STM32 测量电池电压。
在定位部件时,必须考虑一些方面:USB 插座必须易于接近。伺服连接器的位置必须尽量减少电线长度。为了让 Raspberry Pi 的天线远离电机和电池,我不得不将其指向地面。最后,摄像头连接器面向机器人的正面,以便稍后连接摄像头。我忽略了伺服器的排针和伺服插头的长度,它们太大而无法装入机器人。因此,必须稍后焊接伺服电缆。
我设法将所有组件安装在两层板上。甚至还有用于 MPU6050 运动传感器和用于 I2C OLED 显示器的连接器的空间。该连接器可用于测试,因为 OLED 屏幕可以显示腿的状态,而无需为伺服系统供电。
我在早期的四足机器人上犯的一个错误是在不知道如何完成软件的情况下构建硬件。对于这个项目,我想在投入时间和金钱到物理原型之前绝对确定我可以让机器人行走。最好的方法是使用模拟。我决定再次使用 Processing,而不是专门的机器人模拟器,我已经用它为我的四足机器人创建了一个模拟器。Processing是一种编程语言和 IDE,与 Arduino 非常相似,只是它基于 Java 而不是 C++。对我来说,最大的好处之一是语言非常相似,为处理桌面应用程序开发的代码只需稍作修改即可轻松移植到 Arduino。
最困难的部分是弄清楚运动。由于运动的速度、方向和旋转是可变的,六足动物必须确定在给定时间将哪些腿移动到什么位置。现在我的运动引擎实现是这样的:
每条腿都有树坐标:默认位置、起始位置及其当前位置。默认是腿将尝试恢复的坐标。在这个默认位置,机器人的每条腿都处于中立姿势。当六足动物开始行走时,它的腿首先与身体相反。这意味着在双腿着地时改变起始位置和当前位置。显然,如果腿不迈出一步,它们将很快超出其运动范围。使用步态序列来确定抬起哪条腿。这只不过是一个查找表,说明哪条腿可以在序列中的什么时间迈出一步。如果轮到腿迈步,则起始坐标被冻结。腿现在沿着起始坐标之间的路径朝向默认位置,直到它到达其目标。台阶高度由沿该路径的进展决定,使腿以倒抛物线的形状移动。当代码循环遍历步态序列时,每条腿都试图跟上身体的运动,试图达到它们的默认位置。
这是我能想到的最简单的方法,足以让机器人移动得非常顺畅。在开发了这个运动功能之后,剩下的就很容易实现了。为了使六足动物静态移动和旋转,腿坐标将围绕身体的中心点平移/旋转。为了确定腿部关节的角度,需要计算反向运动学。虽然这听起来可能很复杂,但这只是必须为每条腿执行的基本数学方程式。
对于模拟器,Processing 的 3D 渲染用于将六足机器人显示为金属丝网或其后期的 CAD 文件。控制机器人是通过鼠标和键盘完成的。这足以了解步行的样子,而无需任何硬件。
联系客服