迪文科技论坛

 找回密码
 立即注册
搜索
查看: 97|回复: 1

【2025.06.28获奖项目】六轴机械手

[复制链接]

604

主题

175

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13643
发表于 2025-7-7 11:19:38 | 显示全部楼层 |阅读模式
【开源】六轴机械手

一、背景介绍
六轴机械手采用DMG10600C101_03WTC迪文屏,即T5L芯片为主控和六轴机械手之间采用的是modbus tcp协议,不是rtu协议,也不是ascii协议。机械臂实物效果图如下:
二、通信协议
然后modbus tcp协议具有它自己独特的MBAP报文头,如下所示:

1.事务元标识符:其取值为0x00,0x00,一般也理解为包序列号,依次递增的,如果从机验证不严格的话,也可以保持不变的
2.协议标识符:其取值为0x00,0x00,这是协议的固定标识。该标识符用于明确所使用的协议类型
3.长度:其取值需经过计算得出。长度域指明了后续字节的数量,涵盖单元标识符及数据域
4.单元标识符:其取值为0x01。该域主要作为设备站号,即远程从站的唯一识别码,但是在tcp协议中,此字段意义不大

三、工程界面

主界面的布局效果如下:

左侧是获取六轴机械手的关节信息和空间坐标信息的,右侧是控制操作区,机械手是支持移动速度随意调节的。


四、主要代码

  1. <font face="宋体">1.实时获取关节信息和空间坐标信息</font>

  2. if(is_inited&&(get_info_period==GET_INFO_PERIOD))
  3. {
  4.                         get_info_period = 0;
  5.                         //关节信息
  6.                         packet.slave_addr = 0x01;
  7.                         packet.func_code = MODBUS_FUNC_CODE_03;
  8.                         packet.start_addr = 202;
  9.                         packet.data_len = 8;
  10.                         modbus_tcp_packet((u8*)&packet);
  11.                         is_modbus_recv_complete = 0;
  12.                         //笛卡尔坐标信息
  13.                         packet.slave_addr = 0x01;
  14.                         packet.func_code = MODBUS_FUNC_CODE_02;
  15.                         packet.start_addr = 242;
  16.                         packet.data_len = 6;
  17.                         modbus_tcp_packet((u8*)&packet);
  18.                         is_modbus_recv_complete = 0;
  19. }



  20. 2.解析机械手的返回信息

  21. void modbus_msg_handler(u8 *msg,u16 msg_len)
  22. {
  23.         union{
  24.                 float val;
  25.                 u8 bytes[4];
  26.         }info;
  27.         
  28.         msg_len = msg_len;
  29.         if((msg[7]==MODBUS_FUNC_CODE_03)&&(msg[8]==16))
  30.         {
  31.                 info.bytes[0] = msg[9];
  32.                 info.bytes[1] = msg[12];
  33.                 info.bytes[2] = msg[9];
  34.                 info.bytes[3] = msg[10];
  35.                 sys_write_vp(0x2100, (u8*)&info.val, 2);
  36.                 info.bytes[0] = msg[13];
  37.                 info.bytes[1] = msg[16];
  38.                 info.bytes[2] = msg[13];
  39.                 info.bytes[3] = msg[14];
  40.                 sys_write_vp(0x2110, (u8*)&info.val, 2);
  41.                 info.bytes[0] = msg[17];
  42.                 info.bytes[1] = msg[20];
  43.                 info.bytes[2] = msg[17];
  44.                 info.bytes[3] = msg[18];
  45.                 sys_write_vp(0x2120, (u8*)&info.val, 2);
  46.                 info.bytes[0] = msg[21];
  47.                 info.bytes[1] = msg[24];
  48.                 info.bytes[2] = msg[21];
  49.                 info.bytes[3] = msg[22];
  50.                 sys_write_vp(0x2130, (u8*)&info.val, 2);
  51.         }else if((msg[7]==MODBUS_FUNC_CODE_02)&&(msg[8]==12))
  52.         {
  53.                 info.bytes[0] = msg[11];
  54.                 info.bytes[1] = msg[12];
  55.                 info.bytes[2] = msg[9];
  56.                 info.bytes[3] = msg[10];
  57.                 sys_write_vp(0x2140, (u8*)&info.val, 2);
  58.                 info.bytes[0] = msg[15];
  59.                 info.bytes[1] = msg[14];
  60.                 info.bytes[2] = msg[13];
  61.                 info.bytes[3] = msg[14];
  62.                 sys_write_vp(0x2150, (u8*)&info.val, 2);
  63.                 info.bytes[0] = msg[19];
  64.                 info.bytes[1] = msg[20];
  65.                 info.bytes[2] = msg[17];
  66.                 info.bytes[3] = msg[18];
  67.                 sys_write_vp(0x2160, (u8*)&info.val, 2);
  68.         }
  69.         
  70. }


  71. 3.启动按钮的代码

  72. if(btn_val==0x01)
  73.         {
  74.                 packet.slave_addr = 0x01;
  75.                 packet.func_code = MODBUS_FUNC_CODE_05;
  76.                 packet.start_addr = 0x0000;
  77.                 packet.data_len = 0xFF00;
  78.                 modbus_tcp_packet((u8*)&packet);
  79.         }


  80. 4.修改机械手移动速度的代码

  81. else if(btn_val==0x11)
  82. {
  83.                 sys_read_vp(0x2000, (u8*)&speed, 1);
  84.                
  85.                 packet.slave_addr = 0x01;
  86.                 packet.func_code = MODBUS_FUNC_CODE_06;
  87.                 packet.start_addr = 1300;
  88.                 packet.data_len = 1;
  89.                 modbus_tcp_packet((u8*)&packet);
  90.                 sys_delay_ms(1000);
  91.                 //修改速度
  92.                 packet.slave_addr = 0x01;
  93.                 packet.func_code = MODBUS_FUNC_CODE_06;
  94.                 packet.start_addr = 1304;
  95.                 packet.data_len = speed;
  96.                 modbus_tcp_packet((u8*)&packet);
  97.                 sys_delay_ms(100);
  98.                 packet.slave_addr = 0x01;
  99.                 packet.func_code = MODBUS_FUNC_CODE_06;
  100.                 packet.start_addr = 1312;
  101.                 packet.data_len = 1;
  102.                 modbus_tcp_packet((u8*)&packet);
  103. }



  104. 5.然后是机械手关节tcp命令表
  105. MODBUS_TCP_PACKET packet;
  106. u8 J1_P[] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x00, 0xff, 0x00};
  107. u8 J2_P[] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x03, 0x00, 0x01};
  108. u8 J3_P[] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x02, 0xff, 0x00};
  109. u8 J4_P[] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x05, 0x00, 0x00};
  110. u8 is_inited = 0;
复制代码

五、视频演示效果:




备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=12587&extra=page%3D1&_dsign=71741bbb




























本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

3

回帖

63

积分

注册会员

Rank: 2

积分
63
发表于 2025-7-8 17:45:16 | 显示全部楼层
牛B
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-7-31 06:01 , Processed in 0.045732 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表