FPGA/SoC控制的机械臂
机器人技术处于工业4.0、人工智能和边缘革命的前沿。让我们来看看如何创建FPGA控制的机器人手臂。
这个项目中使用的东西
硬件组件:Z7-10、Adafruit 16通道PWM/伺服屏蔽、Digilent Pmod操纵杆2*2
软件应用程序和在线服务:AMD Vivado设计套件
手工工具和制造机器:PicoScope 3000
介绍
机器人技术与人工智能和机器学习一起处于工业4.0和边缘革命的最前沿。
因此,我认为创建一个基础机器人手臂项目会很有趣,我们可以回来添加几个功能,例如:
- 逆运动学-确定末端效应器的位置。
- AI/ML-操作期间的对象分类。
- 网络控制-在边缘启用远程控制。
本例将使用一个机器人手臂,该机械臂在Zynq SoC的控制下使用六个伺服。它将可以使用简单的软件界面或使用两个Pmod操纵杆来进行直接控制。
伺服控制
我们需要做的第一件事是解决如何控制伺服位置。伺服是最简单的驱动电机之一,对于机器人来说,它们的想法是,只要我们保持相同的驱动信号,它们也会保持位置。
那么,伺服的驱动信号是什么?我们使用的大多数伺服使用60Hz PWM波形。在60Hz波形的16.66毫秒周期中,信号将在0.5毫秒到2.5毫秒之间高。信号的持续时间将以0到180度的运动范围驱动伺服。
驱动0.5毫秒的脉冲驱动0度位置,而2.5毫秒将导致180度。因此,通过将信号高驱动1.5毫秒来维持90度。
因此,增加或减少脉冲宽度13.9 us,使伺服移动1度。
虽然我们有三重计时器计数器,能够提供必要的PWM信号。在此应用中,我们还需要以6伏的电压提供伺服电源,因此使用Adafruit PWM Shield是最简单的方法。这不仅提供6v功率,还对PWM信号进行电平转换。
接下来要解决的是如何驱动信号,PWM屏蔽使用四个8位寄存器来驱动每个PWM信号。
PCA9685屏蔽上的设备使用4096位计数器。开寄存器定义了信号高点的计数和信号低点的关计数。
因此,我们始终可以将on time设置为0,然后定义关闭信号的计数,以给我们所需的信号宽度。
Vivado构建
为了能够与Pmod操纵杆和PWM屏蔽接口,我们首先需要在Vivado中创建一个设计。此设计将包含以下IP块
- Zynq PS - 这是Zynq处理系统
- Pmod操纵杆2 - Pmod的接口
- AXI IIC - 在PL中实现的I2C接口
要使用Pmod IP内核,我们需要将Digilent Vivado库映射为IP存储库。如果您没有它,您可以在这里获取存储库,您还需要安装Cora板定义,如果您缺少这些,您可以在这里下载它们。
一旦我们完成方块图,我们就可以构建设计并将其导出到软件中。
软件设计
我们将在软件中开发大部分应用程序。由于我们想在几种模式下使用它,并将来返回升级,因此我们需要一种模块化的方法。
因此,我为每个关节开发了一个功能,可以根据需要调用和使用。每个关节都能接受一个无符号的8位值,然后从90度(1.5毫秒)的脉冲宽度中加减去或减去这个8位值,以获得所需的角度。
我这样做有几个原因:
- 单个RS232字节可以包含所需的电机位置。
- 从操纵杆读取的值也是8位。
我们如何使用操纵杆很有趣,它们可以直接控制手臂。因此,我们需要确保操纵杆和手臂之间的运动对齐。
在两个操纵杆中,第一个与JA相连,第二个与JB相连。
JA在X方向移动时会向前或向后移动手臂,在Y方向移动时会上下移动手臂。
JB在X方向移动时会旋转手腕,在Y方向移动时会上下移动手腕。
如果你仔细注意,你会认为我们没有解决手臂围绕其底座的旋转或抓手的操作。
我们通过使用触发器来控制这些,然而,当Pmods连接到Arm时,很难到达下面的触发器。
相反,我们将使用向下推操纵杆本身。如果我们按下JB,那么末端夹持器将关闭并保持关闭,直到我们释放它。
为了围绕底座旋转,我们使用相同的技巧,按下JA,向Y方向旋转将使手臂围绕其底座旋转。
每个运动函数的代码都非常相似,并且可以在我的GitHub上找到,但是,为了参考,下面提供了上下函数
void up_dwn(u8 YData){
SendBuffer[0] = 0x0A;
SendBuffer[1] = 0x00;
XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
SendBuffer[0] = 0x0B;
SendBuffer[1] = 0x00;
XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
SendBuffer[0] = 0x0C;
u16 signal;
if( YData < 128 ){
signal = 122 + (YData * 1.91);
}
else if (YData == 128){
signal = 369;
}
else{
signal = 369 + ((YData - 128) * 1.91);
}
u8 cent_l_off, cent_h_off;
cent_l_off = (u8)signal;
cent_h_off = (u8) (signal>>8);
SendBuffer[1] = cent_l_off;
XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
SendBuffer[0] = 0x0D;
SendBuffer[1] = cent_h_off;
XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
}
软件应用结构的其余部分是:
- 初始化PWM屏蔽和Pmod操纵杆。
- 对手臂进行自我测试,并将所有伺服定位在90度。
- 输入外观以通过RS232接收命令或从操纵杆接收命令。
当然,如果我们想要命令中的硬代码来执行重复性任务,我们也可以。
初始测试
一旦Vivado构建和初始软件可用,下一步就是确保软件能够正确移动伺服。我在将伺服连接到PWM屏蔽之前就做了这个,以防我有什么不正确的地方。
使用示波器,当我移动操纵杆时,我能够测量PWM信号。
随着操纵杆的移动,脉冲宽度从0.5毫秒逐渐移动到2.5毫秒。
当我把这个放在一起时,手臂按预期工作,我们可以在运动包络内随意控制它。
正如下面视频中所看到的,Arm在Zynq SoC的控制下愉快地移动。
未来工作
我们将在未来的项目中回到这个部门,以增加逆运动学等功能。如果有人想看它的动作或使用操纵杆驾驶它,我也会考虑把它带到我正在参加的会议上。
您可以在此处找到与此项目相关的文件:
"愿我的文字能带给您一丝美好"
分享海报

FPGA/SoC控制的机械臂
机器人技术处于工业4.0、人工智能和边缘革命的前沿。让我们来看看如何创建FPGA控制的机器人手臂。…
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
FPGA在线学习平台
评论
A 为本文作者,G 为游客总数:0