FPGA/SoC控制的机械臂

机器人技术处于工业4.0、人工智能和边缘革命的前沿。让我们来看看如何创建FPGA控制的机器人手臂。

FPGA/SoC控制的机械臂 - 第1张

这个项目中使用的东西

硬件组件: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信号进行电平转换。

FPGA/SoC控制的机械臂 - 第2张

接下来要解决的是如何驱动信号,PWM屏蔽使用四个8位寄存器来驱动每个PWM信号。

PCA9685屏蔽上的设备使用4096位计数器。开寄存器定义了信号高点的计数和信号低点的关计数。

因此,我们始终可以将on time设置为0,然后定义关闭信号的计数,以给我们所需的信号宽度。

Vivado构建

为了能够与Pmod操纵杆和PWM屏蔽接口,我们首先需要在Vivado中创建一个设计。此设计将包含以下IP块

  • Zynq PS - 这是Zynq处理系统
  • Pmod操纵杆2 - Pmod的接口
  • AXI IIC - 在PL中实现的I2C接口
FPGA/SoC控制的机械臂 - 第3张

要使用Pmod IP内核,我们需要将Digilent Vivado库映射为IP存储库。如果您没有它,您可以在这里获取存储库,您还需要安装Cora板定义,如果您缺少这些,您可以在这里下载它们。

一旦我们完成方块图,我们就可以构建设计并将其导出到软件中。

软件设计

我们将在软件中开发大部分应用程序。由于我们想在几种模式下使用它,并将来返回升级,因此我们需要一种模块化的方法。

因此,我为每个关节开发了一个功能,可以根据需要调用和使用。每个关节都能接受一个无符号的8位值,然后从90度(1.5毫秒)的脉冲宽度中加减去或减去这个8位值,以获得所需的角度。

我这样做有几个原因:

  • 单个RS232字节可以包含所需的电机位置。
  • 从操纵杆读取的值也是8位。

我们如何使用操纵杆很有趣,它们可以直接控制手臂。因此,我们需要确保操纵杆和手臂之间的运动对齐。

在两个操纵杆中,第一个与JA相连,第二个与JB相连。

JA在X方向移动时会向前或向后移动手臂,在Y方向移动时会上下移动手臂。

FPGA/SoC控制的机械臂 - 第4张
FPGA/SoC控制的机械臂 - 第5张

JB在X方向移动时会旋转手腕,在Y方向移动时会上下移动手腕。

FPGA/SoC控制的机械臂 - 第6张
FPGA/SoC控制的机械臂 - 第7张

如果你仔细注意,你会认为我们没有解决手臂围绕其底座的旋转或抓手的操作。

我们通过使用触发器来控制这些,然而,当Pmods连接到Arm时,很难到达下面的触发器。

相反,我们将使用向下推操纵杆本身。如果我们按下JB,那么末端夹持器将关闭并保持关闭,直到我们释放它。

为了围绕底座旋转,我们使用相同的技巧,按下JA,向Y方向旋转将使手臂围绕其底座旋转。

每个运动函数的代码都非常相似,并且可以在我的GitHub上找到,但是,为了参考,下面提供了上下函数

  1. void up_dwn(u8 YData){
  2. SendBuffer[0] = 0x0A;
  3. SendBuffer[1] = 0x00;
  4. XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
  5. SendBuffer[0] = 0x0B;
  6. SendBuffer[1] = 0x00;
  7. XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
  8. SendBuffer[0] = 0x0C;
  9. u16 signal;
  10. if( YData < 128 ){
  11. signal = 122 + (YData * 1.91);
  12. }
  13. else if (YData == 128){
  14. signal = 369;
  15. }
  16. else{
  17. signal = 369 + ((YData - 128) * 1.91);
  18. }
  19. u8 cent_l_off, cent_h_off;
  20. cent_l_off = (u8)signal;
  21. cent_h_off = (u8) (signal>>8);
  22. SendBuffer[1] = cent_l_off;
  23. XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
  24. SendBuffer[0] = 0x0D;
  25. SendBuffer[1] = cent_h_off;
  26. XIic_Send(iic.BaseAddress,IIC_SLAVE_ADDR,(u8 *)&SendBuffer, sizeof(SendBuffer),XIIC_STOP);
  27. }

软件应用结构的其余部分是:

  • 初始化PWM屏蔽和Pmod操纵杆。
  • 对手臂进行自我测试,并将所有伺服定位在90度。
  • 输入外观以通过RS232接收命令或从操纵杆接收命令。

当然,如果我们想要命令中的硬代码来执行重复性任务,我们也可以。

初始测试

一旦Vivado构建和初始软件可用,下一步就是确保软件能够正确移动伺服。我在将伺服连接到PWM屏蔽之前就做了这个,以防我有什么不正确的地方。

使用示波器,当我移动操纵杆时,我能够测量PWM信号。

随着操纵杆的移动,脉冲宽度从0.5毫秒逐渐移动到2.5毫秒。

FPGA/SoC控制的机械臂 - 第8张

当我把这个放在一起时,手臂按预期工作,我们可以在运动包络内随意控制它。

正如下面视频中所看到的,Arm在Zynq SoC的控制下愉快地移动。

未来工作

我们将在未来的项目中回到这个部门,以增加逆运动学等功能。如果有人想看它的动作或使用操纵杆驾驶它,我也会考虑把它带到我正在参加的会议上。

您可以在此处找到与此项目相关的文件:

Https://github.com/ATAylorCEngFIET/黑客

在这里查看以前的项目

本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/9164.html

"愿我的文字能带给您一丝美好"

还没有人赞赏,支持一下

评论

A 为本文作者,G 为游客总数:0
加载中…

提交评论

游客,您好,欢迎参与讨论。

我的购物车

购物车为空

优惠券

没有优惠券