【开源获奖案例】四轴机械臂控制系统

——来自迪文开发者论坛
本期为大家推送迪文开发者论坛获奖开源案例——四轴机械臂控制系统。工程师采用t5l智能屏,基于dgus软件“旋转指示”控件实现机械臂的实时位置显示,并通过串口控制机械臂的运动过程。不同以往只展示机械臂的角度数值,该方案可以实现在屏幕上实时显示机械臂的旋转状态。除此之外,工程师还增加了机械臂自动运动功能。
ui素材展示    ui素材可根据实际的应用进行多样化的设计,工程师设计了一套富有科技感的界面。
ui开发示例      c51代码设计     
(1)获取机械臂当前控制的角度:
//获取机械臂状态
void get_arm_config_status(){    u8 i = 0;    for(i = 0;i < 4;i++)    {        arm_angle_value[i] = read_dgus(0x1100 + i * 2);        //write_dgus(0x1110 + i * 2, va[i]);    }}
(2)机械臂的运动过程设计:使机械臂根据设置的角度,缓慢移动到指定位置。
//设置机械臂角度
void set_arm_angle(){    int i = 0;    for(i = 0;i < 4;i++)  
  {        if(arm_angle_value[i] != arm_angle_value_last[i])     
   {            if(arm_angle_value[i] < arm_angle_value_last[i])          
  {                arm_angle_value_last[i]--;            }          
  else     
       {                arm_angle_value_last[i]++;            }   
         write_dgus(0x1110 + i * 2, arm_angle_value_last[i]);            if(i == 1) //第二轴运动 
           {                u16 armiii_pos_x = 0;                u16 armiii_pos_y = 0;                u16 armiv_pos_x = 0;                u16 armiv_pos_y = 0;                armiii_pos_x = sin((float)(225 - arm_angle_value_last[i]) * trigonometric) * 80 + armii_start_pos[0];                armiii_pos_y = cos((float)(225 - arm_angle_value_last[i]) * trigonometric) * 80 + armii_start_pos[1];                armiv_pos_x = sin((float)(180 - arm_angle_value_last[i+1]) * trigonometric) * 83 + armiii_pos_x;                armiv_pos_y = cos((float)(180 - arm_angle_value_last[i+1]) * trigonometric) * 83 + armiii_pos_y;                armiii_current_pos[0] = armiii_pos_x;                armiii_current_pos[1] = armiii_pos_y;                onesenddata4(armiii_pos_x/256);                onesenddata4(armiii_pos_x%256);                onesenddata4(armiii_pos_y/256);                onesenddata4(armiii_pos_y%256);                write_dgus(0x2100 + 4, armiii_pos_x); //第三轴的位置                write_dgus(0x2100 + 5, armiii_pos_y);                write_dgus(0x2200 + 4, armiv_pos_x); //第三轴的位置                write_dgus(0x2200 + 5, armiv_pos_y);            }
else if(i == 2)         
  {                u16 armiv_pos_x = sin((float)(180 - arm_angle_value_last[i]) * trigonometric) * 83 + armiii_current_pos[0];                u16 armiv_pos_y = cos((float)(180 - arm_angle_value_last[i]) * trigonometric) * 83 + armiii_current_pos[1];                write_dgus(0x2200 + 4, armiv_pos_x); //第三轴的位置                write_dgus(0x2200 + 5, armiv_pos_y);        
    }            break;     
   }    }}(3)按键设计:开发者设计了复位、添加、删除、开始、停止按键功能//获取按键状态
void get_key_status(u16 addr){    u16 va=read_dgus(addr);    //u16 v1=read_dgus(0x0f01);    if(va != 0x0000)   
 {        if(va == 0x0001) //复位    
    {            write_dgus(0x1100 + 0, 0);            write_dgus(0x1100 + 2, 0);            write_dgus(0x1100 + 4, 0);            write_dgus(0x1100 + 6, 90);        }   
     else if(va == 0x0002) //添加      
  {            if(arm_auto_cnt < 5)            {                u8 i = 0;                u8 send_str[30] = {0};                for(i = 0;i = 0x0010 && va delete_select) //有删除的内容         
  {                u8 i = 0;                u8 send_str[30] = {0};                for(i = delete_select;i < arm_auto_cnt - 1;i++)                {                    memcpy(arm_auto_list[i], arm_auto_list[i + 1], 8);                }        
        memset(arm_auto_list[i], 0, 8);                for(i = delete_select;i = 2) //动作必须两个及以上    {        if(memcmp(arm_angle_value, arm_auto_list[auto_start_cnt], 8) != 0) //不等于    
    {            write_dgus(0x1100 + 0, arm_auto_list[auto_start_cnt][0]);            write_dgus(0x1100 + 2, arm_auto_list[auto_start_cnt][1]);            write_dgus(0x1100 + 4, arm_auto_list[auto_start_cnt][2]);            write_dgus(0x1100 + 6, arm_auto_list[auto_start_cnt][3]);        }    
    else if(memcmp(arm_angle_value_last, arm_auto_list[auto_start_cnt], 8) == 0) //当前运动等于目标     
   {            auto_start_cnt++;            if(auto_start_cnt >= arm_auto_cnt)         
   {                auto_start_cnt = 0;            }        }    }}

一项新的研究可能为电子皮肤成为未来的技术提供重要的机会
陶瓷电容器制造商太阳诱电预计华为明年能卖出1亿部5G手机
非预置光纤技术的接续理论、应用优势及应用分析
海康威视对于中兴事件的看法
微软Win7 技术为什么支持停止 Win10?
【开源获奖案例】四轴机械臂控制系统
网线千兆百兆的区别
赛灵思与业界领先的电源管理公司合作提供产品电源要求指南
使用ARM7 LPC2148微控制器构建一个简单的机械臂
智能网联汽车与智慧城市协同发展成果推广活动举行
联发科技将持续携手全球通信行业伙伴共同推动5G与后5G技术的演进
阻尼片是什么材质的_阻尼片的危害
徕尼科技在其官网正式发布了第一代产品徕创全息眼镜及互动协作平台
电阻器的参数特性与应用分析
小米预热众筹新品 让小户型也能拥有4K激光巨幕影院
业内快讯:比亚迪海外市场订单井喷、宁德时代总营收93亿元
指夹式血氧仪的测量原理是什么
为什么区块链的panacea在网络安全中如此迫切需要
「RVBoards-哪吒」首个体验贴?(全志D1,RISC-V 64bit)
多串流MIMO驱动 11ac射频前端迈向28nm