5150|13

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

四轴视觉机械臂——基于F350下位机 [复制链接]

 
本帖最后由 tinnu 于 2018-10-20 00:23 编辑

(一)软硬件结构
上位机:连接摄像头,进行图像识别、用户交互
下位机:指令解析,信息上报,传感器信息采集,电机脉冲控制,空间位置顺解逆解
机械结构:3轴+1轴+1夹持架。





(二)机械结构部分介绍
底部三轴采用步进电机控制,保证精度;
主要负重的主轴和副轴采用42bygh48,旋转轴采用42bygh34。
(关于这个电机的问题真的坑啊……我设计的机械臂有点太大了,不断加传动比都很容易出现力矩不够的情况,1.0版的机械臂1:3.5的传动比,一直换到42bygh48都不行,42bygh48基本是市面上常见的步进里面力矩最大的……而且这个步进电机也是贼贵,几个几个的买真的吃不消……最后不行,改版弄出了一个2.0般的机械臂,1:5的传动比)
末端旋转轴采用mg996舵机控制;
夹持架采用mg996

(三)硬件结构
一开始是用cnc shield控制板+一块自己焊的接口板(接角度传感器+限位开关):

后来自己画了一块:

黑油板是不是很酷?其实因为我犯了个很难受的错误,导致一些地线没接上,所以其实这个板子背后有好几根飞线来着……


舵机供电也是个巨坑,我设计了两个供电方案保证成功:
LM7805从12V转到5V:

还有一个就是直接usb供

(四)下位机功能
1、传感器信息采集
步进电机这种东西虽然常用于开环控制,但奈何那都是力矩经过验算的情况,我这个容易遇到力矩大的角度的机械臂不知道什么时候就失步了,所以用两个mpu6050反馈主轴和副轴的角度信息。
不过这个反馈并非数控传统意义上的闭环控制,只是运动结束之后同步一下。
此外,如果传感器损坏或者接触不良等恶劣情况下系统也会转为开环控制。
程序设计中也为adxl345提供了接口,不过因为时间关系还没来得及实现,不过相比于mpu6050,前者还是比较实惠的,虽然mpu6050可以姿态融合,但奈何对采集速度要求严格,间隔一大就读不出来,结果还是直接读角度算了。
2、信息上报:
下位机接口有两个,USART2的串口和基于USART1的esp8266无线模块,可以通过SERIAL交互、tcp socket交互
上报设计了专门的上报体系,不会影响电机控制算法。
3、电机脉冲控制:
保证电机脉冲控制的优先度最高,采用定时器生成时基、控制时基单元数量控制电机运动速度的方式。
4、指令解析:
为了保证指令的识别度我没用标准的NC指令,自己设计了一套:
指令以_&为开始,以;结束,包含直接传入xy坐标、前后左右、旋转、夹持、翻转、复位、查询:
  1. int command_operate(u8 *USART_RX_BUF,u16 USART_RX_STA)
  2. {
  3.         double x_dis=x_current,y_dis=y_current;                //保存临时路程变量
  4.         u16 speed;                                                                        //保存临时速度参数
  5.         
  6.     char SearchChar[USART_REC_LEN];
  7.         char command[3]="0";
  8.     double command_num[3]={0};
  9.         
  10.         u16 len = USART_RX_STA&0x3fff;
  11.         u8 CommandCount = 0;
  12.         
  13.         //1、获取指令、参数
  14.         memcpy(SearchChar, USART_RX_BUF, len);
  15.         CommandCount = search4(SearchChar, command, command_num);
  16.         
  17.         if(CommandCount <= 0){
  18.                 ReportStruct.Uart1ReportFlag.VerifyError = 1;
  19.                 ReportStruct.Uart2ReportFlag.VerifyError = 1;
  20.                 return -1;
  21.         }
  22.         
  23.         //2.2、确定路程参数
  24.         switch(command[0])
  25.         {
  26.                 case 'F':
  27.                         x_dis = x_current+command_num[0];
  28.                         break;
  29.                 case 'B':
  30.                         x_dis = x_current-command_num[0];
  31.                         break;
  32.                 case 'U':
  33.                         y_dis = y_current+command_num[0];
  34.                         break;
  35.                 case 'D':
  36.                         y_dis = y_current-command_num[0];
  37.                         break;
  38.                 case 'R':
  39.                         rotation_angle_distance = command_num[0];
  40.                         break;
  41.                 case 'X':
  42.                         x_dis = command_num[0];
  43.                         if(command[1] == 'Y')
  44.                                 y_dis = command_num[1];
  45.                         break;
  46.                 case 'C':
  47.                         click_num = command_num[0];
  48.                         break;
  49.                 case 'T':
  50.                         turn_num = command_num[0];
  51.                         break;
  52.                 case 'S':
  53.                         break;
  54.                 case 'E':
  55.                         break;
  56.                 default:
  57.                         ReportStruct.Uart1ReportFlag.VerifyError = 1;
  58.                         ReportStruct.Uart2ReportFlag.VerifyError = 1;
  59.                         return -2;
  60.         }
  61.         
  62.         if(CommandCount == 2 && command[1] == 'S')
  63.         {
  64.                 speed = (u16)command_num[1];
  65.         }
  66.         else if(CommandCount == 3 && command[0] == 'X'  && command[1] == 'Y' && command[2] == 'S')
  67.         {
  68.                 speed = (u16)command_num[2];
  69.         }
  70.         else
  71.                 speed = 150;
  72.                
  73.         //3、执行
  74.         if(command[0] == 'R'){
  75.                 point_to_point_rotation(rotation_angle_distance,speed);
  76.                 ReportStruct.Uart1ReportFlag.VerifySuccess = 1;
  77.                 ReportStruct.Uart2ReportFlag.VerifySuccess = 1;
  78.         }
  79.         else if(command[0] == 'C'){
  80.                 click_pwm();
  81.                 ReportStruct.Uart1ReportFlag.ExecuteFinish = 1;
  82.                 ReportStruct.Uart2ReportFlag.ExecuteFinish = 1;
  83.         }
  84.         else if(command[0] == 'T'){
  85.                 turn_pwm();
  86.                 ReportStruct.Uart1ReportFlag.ExecuteFinish = 1;
  87.                 ReportStruct.Uart2ReportFlag.ExecuteFinish = 1;
  88.         }
  89.         else if(command[0] == 'S'){
  90.                 Limit_Disable();
  91.                 io_init();
  92.                 locate_init();
  93.                 Limit_Enable();
  94.                 ReportStruct.Uart1ReportFlag.ExecuteFinish = 1;
  95.                 ReportStruct.Uart2ReportFlag.ExecuteFinish = 1;
  96.         }
  97.         else if(command[0] == 'E'){
  98.                 if(!(prime_run_flag||vice_run_flag||rotation_run_flag))
  99.                 {
  100.                         ReportStruct.Uart1ReportFlag.ExecuteFinish = 1;
  101.                         ReportStruct.Uart2ReportFlag.ExecuteFinish = 1;
  102.                 }
  103.                 else
  104.                 {
  105.                         ReportStruct.Uart1ReportFlag.VerifySuccess = 1;
  106.                         ReportStruct.Uart2ReportFlag.VerifySuccess = 1;
  107.                 }
  108.         }
  109.         else{
  110.                 point_to_point_xy(x_dis,y_dis,speed);
  111.                 ReportStruct.Uart1ReportFlag.VerifySuccess = 1;
  112.                 ReportStruct.Uart2ReportFlag.VerifySuccess = 1;
  113.         }
  114.         
  115.         return 1;
  116. }
复制代码


至于识别算法可以具体参考我的工程文件里面的communicate文件
下位机程序: GD_TARM.rar (3.41 MB, 下载次数: 6)

(五)上位机
上位机程序基于qt和opencv,是跨平台应用,我实现了基于x86的win、linux和基于arm的linux版本。
双目摄像头目前采用的是两个廉价的UVC摄像头拼成,目标识别算法采用yolo v2
基于串口的win上位机:链接:
链接已隐藏,如需查看请登录或者注册
提取码:c23t
基于tcp socket的win上位机: TARM_V4.exe (124 KB, 下载次数: 1)
基于tcp socket的安卓的上位机: tarm.apk (1.55 MB, 下载次数: 0)

(六)手动控制
这个演示当时采用的是1.0般机械臂,电机是42bygh40,传动比只有1:3.5,所以很容易出现力矩不够的情况:
整体概况:
前后左右(1.0版本是很脆弱,不敢让它动作太大,不然一下子就啪的掉下来了):
触碰限位(可以看到它压了几次都没压到限位(捂脸)后面那个位置力矩是真的不够):
(七)重头戏——自动识别水杯搬运
这个2.0版的力矩大些,但也是很难伺 候,拆了调好久,所以没用他来演示手动控制。
桌面放不下机械臂来演示,没办法,只能用rk3288的arm开源硬件来控制,win远程登录,rk3288的性能可以从视频中中途尴尬的静默看出来(捂脸),一开始用树莓派当上位机,结果程序一跑直接崩溃……
至于这个画质……学校校园网刚禁止的无线网络,没wifi用,只能用手机传……
(八)ps
演示效果挺差强人意,整块捣鼓下来真的费劲(口袋也吃不消,下面那个底座打印件、电机都贼贵……那个性能拆墙任意的rk3288也不便宜……)
虽然有让朋友帮忙弄机械结构,但大部分都是我自己动手的,加上上位机、硬件、下位机,各种bug,这段时间真的折腾……

此帖出自GD32 MCU论坛

最新回复

光耦隔离芯片TLP521  详情 回复 发表于 2019-3-5 16:53

赞赏

1

查看全部赞赏

点赞 关注(3)
 

回复
举报

5263

帖子

239

TA的资源

管理员

来自 2楼
 
附给评委补充材料:

经验分享
tinnu
F350串口那些事
问题讨论
tinnu
F350的pwm配置不成功


此帖出自GD32 MCU论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

684

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
不错,给学习者一个经验积累...
谢谢分享!
此帖出自GD32 MCU论坛
 
 
 

回复

693

帖子

7

TA的资源

版主

4
 
楼主,不知道你的舵机电路解决没,我这儿有一个调试好的舵机电路图,如果您需要的话,我就发给你看看用不用的上
此帖出自GD32 MCU论坛

点评

我目前主要的pwm传输距离有些问题,我之前为这个搞了挺久的,别人推荐我用开关电路,但也只能传输40cm左右,多一点就不稳。如果版主有方案那就太好了,不过这两个月正在赶着考研复习,等十二月之后再请教可行:loveli  详情 回复 发表于 2018-11-19 19:37
 
 
 

回复

6423

帖子

17

TA的资源

版主

5
 
这个好复杂的样子
此帖出自GD32 MCU论坛
 
个人签名training
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

6
 
不错,支持下
此帖出自GD32 MCU论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
真心求合作,我有个差不多的项目,仿生机械的
此帖出自GD32 MCU论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
一定不要忽视我啊,我辣么可爱的
此帖出自GD32 MCU论坛

点评

呃……主要是这两个月都要赶着考研复习进度,现在我的复习进度非常尴尬……如果可以的话十二月之后再交流?  详情 回复 发表于 2018-11-19 19:39
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

9
 
bqgup 发表于 2018-10-20 18:05
楼主,不知道你的舵机电路解决没,我这儿有一个调试好的舵机电路图,如果您需要的话,我就发给你看看用不用 ...

我目前主要的pwm传输距离有些问题,我之前为这个搞了挺久的,别人推荐我用开关电路,但也只能传输40cm左右,多一点就不稳。如果版主有方案那就太好了,不过这两个月正在赶着考研复习,等十二月之后再请教可行
此帖出自GD32 MCU论坛

点评

[attachimg]388046[/attachimg] 舵机光耦隔离原理图  详情 回复 发表于 2018-11-19 19:53
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

10
 
特效化妆师 发表于 2018-11-1 16:16
一定不要忽视我啊,我辣么可爱的

呃……主要是这两个月都要赶着考研复习进度,现在我的复习进度非常尴尬……如果可以的话十二月之后再交流?
此帖出自GD32 MCU论坛
 
 
 

回复

693

帖子

7

TA的资源

版主

11
 
tinnu 发表于 2018-11-19 19:37
我目前主要的pwm传输距离有些问题,我之前为这个搞了挺久的,别人推荐我用开关电路,但也只能传输40cm左 ...


舵机光耦隔离原理图
此帖出自GD32 MCU论坛

点评

对了,这个光耦IC是用什么型号的?  详情 回复 发表于 2019-3-4 17:51
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(初级)

12
 

不错,支持下
此帖出自GD32 MCU论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

13
 
bqgup 发表于 2018-11-19 19:53
舵机光耦隔离原理图

对了,这个光耦IC是用什么型号的?
此帖出自GD32 MCU论坛

点评

光耦隔离芯片TLP521  详情 回复 发表于 2019-3-5 16:53
 
 
 

回复

693

帖子

7

TA的资源

版主

14
 
tinnu 发表于 2019-3-4 17:51
对了,这个光耦IC是用什么型号的?

光耦隔离芯片TLP521
此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表