使用FPGA控制机械臂

今天研究如何使用 Python + 低成本 FPGA 开发高性能、精密的机械臂。

7f6ea8df0cbd55ef68c110beb5283dba.png

简介

由于 FPGA 具有并行特性,它在精密电机控制和机器人领域表现出色。本文是探索开发基于 ROS2 的解决方案,让机器人可以在白板上自主书写文字。

在这个项目中,将展示如何创建一个具有以下功能的机械臂应用程序:

  • 通过 FPGA 控制手臂上的 6 个轴关节

  • 通过远程机器上运行的 Jupyter Lab 实现对机械臂的控制

  • 通信链路为 RS232 - 可使用 LwIP 扩展到以太网

  • 在 Jupyter Lab 中跟踪轴定位信息

  • 能够将手臂的位置存储在文件中

  • 能够重放存储的文件,以根据应用程序的要求驱动手臂完成一系列动作

  • 能够控制选定的关节从一个位置移动到另一个位置

设计流程

本项目将采用的方法是在 FPGA 逻辑中创建 AMD MicroBlaze™ V 处理器,处理器将执行命令行解释器(CLI),接收关节的角度并更新特定关节的驱动逻辑。

使用这种方法,可以轻松更新 CLI 以支持使用 LwIP 和以太网命令,实现长距离远程连接。

手臂上的每个关节将被标记为 A ~ F,通过 UART 链路发送的协议是:

<joint> <angle> <cr><lf>

其中 Joint 为 A~F,angle 为 0 到 180,CR 为回车符,LF 为换行符。

在 FPGA 内部,使用一个简单的 RTL IP ,生成控制电机所需的 PWM 信号。这就要求在处理器上将角度转换为驱动信号。

伺服器以 50 Hz PWM 周期(20 ms)运行。在这 20 ms中,PWM 周期标称开启时间为 1.5 ms,将使伺服器位置处于 90 度点,通常称为中性位置。将开启时间减少到 1 ms将使伺服器移动到 0 度点,而将其增加到 2 ms将使伺服器移动到 180 度点。

因此,该伺服机构有 180 度的潜在运动,粒度为每度 1 ms/180 = 5.555 us。

接线

所选的机械臂使用 Arduino 接口板与 Digilent Arty A7 / S7 板连接。它可以通过接口板从外部供电,也可以通过接口板上的连接器提供的 5V 供电。

1c55be9e2d7ce85eab8de20bc406c3ae.jpeg

由于 5V 电流通过接口板连接器会限流,并且电机可能要求较高,因此本次使用外部DC电源为机械臂本身供电。

3c1aa87ef72f34648342ca45152e6696.jpeg d7d8c8aabaa55f66da31c05348d229be.jpeg

Vivado设计

Vivado设计比较简单,添加 AMD MicroBlaze V 处理器及其外设即可。

d4a447375c9006145c4086a5bc4e0386.png

AMD MicroBlaze V 添加后,单击运行自动化设计。

79da2b86dbf3fc0e375b318c47db5772.png

按照下图进行处理器设置:

  • 64 KB Local Memory

  • 启用调试模块

  • 启用外围 AXI 端口

  • 启用新的中断控制器和时钟向导

78e83b03918fdd2e1de737d332007e25.png

完成后如下:

d8a7d19c2e71dce061b8de2d225758a8.png

下一步是获取 Digilent Vivado 库,然后添加 PWMV2 IP 。

https://github.com/Digilent/vivado-library

342b286b06ae5290d27ad1be7c2023ef.png

该 IP 非常适合 PWM 生成,并且支持多种 PWM 输出。

cfad6dbea75cb4b444ac462ed84b2813.png

将该IP进行如下设置:

  • 六个PWM输出

2875869bf7ebd80d7a52e285a82dba1c.png

要添加的倒数第二个 IP 是 AXI UART。

08d4fae797ced0403fbc10932e16ae84.png

最后需要添加一个设置为逻辑高电平的常量IP来驱动机械臂扩展版上的软启动引脚。

7e07f62c8c4fcdec0f5d579fbd79b341.png

然后按照板卡硬件将时钟引入到系统里即可。

完整的设计如下所示。

339c69509474e0604f1886a618e6cdd3.png

然后生成顶层文件和添加约束:

set_property IOSTANDARD LVCMOS33 [get_ports {pwm_0[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pwm_0[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pwm_0[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pwm_0[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pwm_0[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pwm_0[0]}]
set_property PACKAGE_PIN T11 [get_ports {pwm_0[0]}]
set_property PACKAGE_PIN T14 [get_ports {pwm_0[1]}]
set_property PACKAGE_PIN T15 [get_ports {pwm_0[2]}]
set_property PACKAGE_PIN M16 [get_ports {pwm_0[3]}]
set_property PACKAGE_PIN V17 [get_ports {pwm_0[4]}]
set_property PACKAGE_PIN U18 [get_ports {pwm_0[5]}]

set_property IOSTANDARD LVCMOS33 [get_ports {soft_start[0]}]
set_property PACKAGE_PIN R17 [get_ports {soft_start[0]}]

本次设计的扩展板的原理图:

https://store.arduino.cc/products/tinkerkit-braccio-robot?

4e0db74467bafc01166a822b340d008b.png

最后生成bit后导出到Vitis。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值