FPGA/SoC控制机械臂

news2024/9/23 17:14:19

FPGA/SoC控制机械臂

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

ad71334121a48d1da534adcc3bdc5b95.png

介绍

机器人技术与人工智能和机器学习一起处于工业 4.0 和边缘革命的最前沿。

因此,我认为创建一个基础机器人手臂项目会很有趣,我们可以回过头来添加几个功能,例如:

  • 逆运动学 - 确定末端执行器的位置。

  • AI / ML - 操作期间的对象分类。

  • 网络控制——实现边缘远程控制。

585dd5f7d3f1be7a8a3e42f1143b3db3.png

此示例将使用一个机器人手臂,该机器人手臂在 Zynq SoC 的控制六个伺服系统。可以使用简单的软件界面或使用两个操纵杆进行直接控制。

伺服控制

我们需要做的第一件事是弄清楚如何控制伺服位置。伺服电机是最简单的驱动电机之一,也是机器人技术的理想选择,因为只要我们保持相同的驱动信号,它们就能保持相对位置。

40d010317c66114f2896793f7abfbb79.png

那么伺服的驱动信号是什么呢?我们使用的同类伺服系统中的大多数都使用 60Hz PWM 波形。在 60Hz 波形的 16.66 ms 周期中,信号将在 0.5 ms 到 2.5 ms 之间为高电平。信号的持续时间将驱动伺服器在 0 到 180 度之间运动。

0.5 ms 脉冲驱动 0 度位置,而 2.5 ms 脉冲将驱动 180 度位置。因此,可以通过将信号驱动为 1.5 ms 脉冲来维持 90 度。

因此,增加或减少脉冲13.9 us宽度会使舵机移动 1 度。

1dad3efd7371d7b693c302a74bf3e155.png

接下来要解决的是如何生成驱动信号,PWM 扩展板(上图)使用四个 8 位寄存器来驱动每个 PWM 信号。

on 寄存器定义信号变高的计数,off 寄存器定义信号变低的计数。

因此,我们可以将开启时间设置为 0,然后定义关闭信号的计数,以获得所需的信号宽度。

Vivado 构建

0c3ab7bc7471412bcc3b361778b3068f.png
  • Zynq PS - 这是 Zynq 处理系统

  • AXI IIC - 在 PL 中实现的 I2C 接口

一旦完成了PL设计,我们就可以构建设计并将其导出到软件。

软件设计

我们将在软件中开发大部分应用程序。由于我们希望在多种模式下使用它,并在将来进行升级时使用它,因此我们需要一种模块化方法。

因此,为每个关节开发了一个可以根据需要调用和使用的函数。每个关节都能够接收无符号的 8 位值,然后将该 8 位值与 90 度 (1.5 ms) 脉冲宽度相加或相减,以获得所需的角度。

我这样做有几个原因:

  • 单个 RS232 字节可以包含所需的电机位置。

  • 从操纵杆读取的值也是 8 位。

因此,我们需要确保操纵杆和手臂之间的运动对齐。

两个操纵杆中,第一个连接到 JA,第二个连接到 JB(JA和JB是PMOD接口,就是普通的GPIO)。

JA 当沿 X 方向移动时,将向前或向后移动手臂;当沿 Y 方向移动时,它将上下移动手臂。

71a77bcc8ef425fad0922669230a9da4.png 7f7ec74539c855818e433a36b8948191.png

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

4d1962d2d0d24aeaa2e671157a409a28.png 690663b44654e2b20a530cdd22a3efd8.png

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

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 信号。

随着操纵杆的移动,脉冲宽度逐渐从 0.5 ms 变为 2.5 ms。

ea5842347b9c25caff4f7c48c88a052f.png

视频演示

参考代码

!! https://github.com/ATaylorCEngFIET/Hackster

!! https://github.com/ATaylorCEngFIET/Hackster/tree/master/Hexapod_servo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1134558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度

系统架构设计师之使用McCabe方法可以计算程序流程图的环形复杂度

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (二)

这是继上一篇文章 “Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我主要来讲述 ElasticVectorSearch 的使用。 我们的设置和之前的那篇文章是一样的&#xff…

【C++基础入门】43.C++中多态的概念和意义

一、函数重写回顾 父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符&#xff08;::&#xff09;可以访问到父类中的函数 二、多态的概念和意义 面向对象中期望的行为 根据实际的对象类型判断如何调用重写函数父类指针&#xff08;引用…

【蓝桥杯】蓝桥杯双周赛第二场ABCD题

A题&#xff1a;新生 知识点&#xff1a;下一届是第几届蓝桥杯…… 新一届蓝桥杯大赛即将在2024年拉开序! 作为大一新生的小蓝&#xff0c;在听说了这场盛大的比赛后&#xff0c;对其充满了期待与热情。但作为初次参赛的新手&#xff0c;他对蓝桥杯的相关赛制和历史并…

LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux内核的高可用性负载均衡软件。它通过将客户端请求分发到多个后端真实服务器&#xff0c;提高系统性能和可靠性。LVS支持多种调度算法&#xff0c;如轮询、最少连接、源地址哈希等&#xff0c;用于决定…

番外8.2---配置/管理硬盘

""" Step1&#xff1a;清楚磁盘、硬盘&#xff08;HDD&#xff09;、光驱的概念及是否具有包含关系。 Step2&#xff1a;硬件设备&#xff08;IDE、SCSI、SATA、NVMe、软驱等&#xff09;命名方式及在linux系统里对应的文件名称。 Step3&#xff1a;&#xff1…

保存 uboot图像配置

一. 简介 本文学习如何保存经过图像配置&#xff0c;与加载 自己的配置文件。 之前几篇文章学习了&#xff1a;uboot 经过图形化配置 dns 命令功能。地址如下&#xff1a; uboot通过图像化界面配置 dns命令-CSDN博客 uboot通过图像化界面配置 dns命令验证-CSDN博客 二. 保…

微信管理系统的便捷功能:自动回复

宝子们 你有遇到以下头疼的问题吗&#xff1f; 1、每日手动一遍又一遍点“添加”来通过大量好友? 2、每日总要花至少半个或1个小时来回复刚通过的好友? 3、经常切换聊天窗口复制粘贴同样的内容回复客户&#xff1f; 4、一键转发操作多了被系统提示过于频繁&#xff1f; 5、…

虹科 | 解决方案 | 汽车示波器 学校教学方案

虹科Pico汽车示波器是基于PC的设备&#xff0c;特别适用于大课堂的教学、备课以及与师生的互动交流。老师展现讲解波形数据&#xff0c;让学生直观形象地理解汽车的工作原理 高效备课 课前实测&#xff0c;采集波形数据&#xff0c;轻松截图与标注&#xff0c;制作优美的课件&…

Ubuntu22.04 交叉编译阿里oss c-sdk

一、交叉编译openssl Ubuntu20.04 交叉编译openssl 1.0.1f_编译前去除 makefile 中所有的"-m64"字段_qq76211822的博客-CSDN博客文章浏览阅读319次。Ubuntu20.04 交叉编译openssl_编译前去除 makefile 中所有的"-m64"字段https://blog.csdn.net/sz7621182…

windows下使用FFmpeg开源库进行视频编解码完整步聚

最终解码效果: 1.UI设计 2.在控件属性窗口中输入默认值 3.复制已编译FFmpeg库到工程同级目录下 4.在工程引用FFmpeg库及头文件 5.链接指定FFmpeg库 6.使用FFmpeg库 引用头文件 extern "C" { #include "libswscale/swscale.h" #include "libavdevic…

Spring关于注解的使用

目录 一、使用注解开发的前提 1.1 配置注解扫描路径 二、使用注解创建对象 2.1 Controller&#xff08;控制器储存&#xff09; 2.2 Service&#xff08;服务储存&#xff09; 2.3 Repository&#xff08;仓库储存&#xff09; 2.4 Component&#xff08;组件储存&#xff09; …

自研框架跻身全球 JS 框架榜单,排名紧随 React、Angular 之后!

前言 终于实现了一个重要目标&#xff01;我独立研发的 JavaScript 框架 Strve&#xff0c;最近发布了重大版本 6.0.2。距离上次大版本发布已经接近两个月&#xff0c;期间进行了大量的优化&#xff0c;使得框架性能和稳定性都得到了大幅度的提升。在上次的大版本更新中&#…

DevOps持续集成-Jenkins(2)

文章目录 DevOpsDevOps概述Integrate工具&#xff08;centos7-jenkins主机&#xff09;Integrate概述Jenkins介绍CI/CD介绍Linux下安装最新版本的Jenkins⭐Jenkins入门配置安装必备插件⭐安装插件&#xff08;方式一&#xff1a;可能有时会下载失败&#xff09;安装插件&#x…

负载均衡--Haproxy

haproxy 他也是常用的负载均衡软件 nginx 支持四层转发&#xff0c;七层转发 haproxy也可以四层和七层转发 haproxy&#xff1a;法国人开发的威利塔罗在2000年基于C语言开发的一个开源软件 可以支持一万以上的并发请求 高性能的tcp和http负载均衡2.4 1.5.9 haproxy&#…

微服务-Eureka

文章目录 提供者与消费者Eureka注册中心搭建EurekaServer服务注册服务发现项目结构 提供者与消费者 Eureka注册中心 服务消费者该如何获取服务提供者的地址信息&#xff1f; 服务提供者启动时向eureka注册自己的信息 eureka保存这些信息 消费者根据服务名称向eureka拉取提供者信…

10.Z-Stack协议栈移植

一、下载Z-Stack协议栈源文件 安装过程全部默认下一步即可&#xff0c;安装完成后会在C盘根目录下生成一个【Texas Instruments】文件夹 二、删除一些不必要的文件 将【ZStack-CC2530-2.3.0-1.4.0】文件夹&#xff0c;复制到自己放置ZigBee工程的文件夹下进入到【ZStack-CC253…

vue + html + Lodop打印功能

1.官网下载 http://www.lodop.net/download.html 2.解压安装运行 点击CLodop_Setup_for_Win32NT.exe进行安装 3.vue代码实现&#xff08;具体操作见官网&#xff1a;http://www.lodop.net/faq/pp35.html&#xff09; 3.1把官方提供的LodopFuncs.js文件保存到项目某个目录下 …

C# 使用base64编码用于加密和解密

base64编码原理&#xff1a;Base64编码是一种将二进制数据转换为ASCII字符的编码方式。它使用64个字符来表示二进制数据&#xff0c;包括大小写字母、数字和两个符号。将3个字节的二进制数据转换为4个字符的文本数据&#xff0c;如果不足3个字节&#xff0c;则在末尾补0&#x…

el-tree横向纵向滚动条

el-tree未展开时样式 el-tree展开时样式 给容器一个高度&#xff0c;然后样式加上overflow: scroll&#xff0c;这样纵向滚动条就出来了。 <el-card style"height: 528px;overflow: scroll"><el-inputplaceholder"输入关键字进行过滤"v-model&…