zl程序教程

您现在的位置是:首页 >  其他

当前栏目

双轴机械臂串口控制命令开发与测试:STM32F103控制板,简易调试命令集合

2023-09-11 14:15:31 时间

 

01 底层串口控制命令


1.调试说明

本文是继 调试机械臂一体化控制电路 博文中对于 两轴机械臂+机械爪整体控制板设计与机械爪控制调试基于STM32F103双轴机械臂完整电路板 控制下进行串口控制命令编写与调试的过程。

机械臂底层通信协议说明 ,给出了来对双轴机械臂的底层控制命令。为了便于调试,在本文中实现最简易的命令形式。

2.底层调用

用于命令实现的底层调用实现的功能包括以下功能:

  • 肩部运动控制:调用程序接口 :void ShoulderAngleSet(int nAngle);
  • 肘部运动控制:条用程序接口:void ElbowAngleSet(int nAngle)
  • 抓爪运动控制:SetClawAngle(int nNumber);
  • 上下运动控制:ArmMoveUp(); ArmMoveDown;

 

02 简易命令集合


1.指令帧格式

下面给出了指令帧的格式:

帧头指令参数1参数2帧尾
0x55cmdarg1arg20xaa
  • 命令帧头,帧尾是固定的数字0x55, 0xaa
  • 命令,一个字节,所有的命令见后面的“指令定义”部分。
  • 参数1,参数2:定义一个uint16参数, arg=arg1+arg2×256。参数的含义与命令相关。

2.命令定义

指令Hex码含义参数返回
空命令0x00用于测量命令通信链路是否畅通。0x00,0x00
该参数被忽略。
0x5a
设置肩部角度0x01用于设置肩部关节的角度。角度取值:8192 ~ 245760x5a
设置肘部角度0x02用于设置肘关节的角度。角度取值范围:4096 ~ 286720x5a
设置抓爪张开0x03控制抓爪的张开与闭合。0:张开,100:闭合0x5a
机械臂上下运动0x04设置机械臂的上下位置。0:移动到最下端
1:移动到最上端。
注:实际上当参数为非零的时候都是移动到最上端。
0x5a
停止动作0x05未实现0x00,0x000x5a
蜂鸣器0x06未实现0x00,0x000x5a
设置角度传感器波特率0x07设置两个角度传感器波特率
请参见:角度编码器连接与设置
0x00,0x00:对应通道1,肩部角度传感器
0x00,0x01:对应通道2,肘部角度传感器
0x5a
读取角度0x8用于读取两个角度传感器的角度值0x00,0x00ah1,al1,ah2,al2,0x5a
肩部:ah1×0x100+al1
肘部:ah2×0x100+al2

 

▌附录


1.简易命令程序

/*
**==============================================================================
** CMDSIMPLE.H:            -- by Dr. ZhuoQing, 2021-01-06
**
**  Description:
**
**==============================================================================
*/
#ifndef __CMDSIMPLE__
#define __CMDSIMPLE__
//------------------------------------------------------------------------------
#ifdef CMDSIMPLE_GLOBALS
   #define CMDSIMPLE_EXT
#else
   #define CMDSIMPLE_EXT extern
#endif // CMDSIMPLE_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
void CSSInit(void);
//------------------------------------------------------------------------------

#define CSS_NULL            0x00
#define CSS_SHOULDER        0x01
#define CSS_ELBOW           0x02
#define CSS_CLAW            0x03
#define CSS_UPDOWN          0x04
#define CSS_STOP            0x05
#define CSS_BEEP            0x06

//------------------------------------------------------------------------------
CMDSIMPLE_EXT unsigned char g_ucCSStatus;
#define CSS_HEAD            0x0
#define CSS_CMD             0x1
#define CSS_ARG1            0x2
#define CSS_ARG2            0x3
#define CSS_TAIL            0x4

void CSSProcChar(unsigned char ucChar);

CMDSIMPLE_EXT unsigned char g_ucCSSCmd, g_ucCSSArg1, g_ucCSSArg2;

void CSSProcCmdArg(void);

//==============================================================================
//             END OF THE FILE : CMDSIMPLE.H
//------------------------------------------------------------------------------
#endif // __CMDSIMPLE__
D:\zhuoqing\window\ARM\IAR\STM32\Application\XQWF\2020\CNTSTM103\Src\CMDSIMPLE.C
/*
**==============================================================================
** CMDSIMPLE.C:             -- by Dr. ZhuoQing, 2021-01-06
**
**==============================================================================
*/

#include "stm32f1xx_hal.h"
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "stm32f1xxa.h"
#include "serialtxt.h"
#include "stdsub.h"
#include "config.h"
#include "cmdsub.h"
#include "control.h"

//------------------------------------------------------------------------------
#define CMDSIMPLE_GLOBALS        1              // Define the global variables
#include "CMDSIMPLE.H"

//------------------------------------------------------------------------------
void CSSInit(void) {
    g_ucCSStatus = CSS_HEAD;
    g_ucCSSCmd = CSS_NULL;
    g_ucCSSArg1 = 0;
    g_ucCSSArg2 = 0;
}

//------------------------------------------------------------------------------
void CSSProcChar(unsigned char ucChar) {
    switch(g_ucCSStatus) {
        case CSS_HEAD:
            if(ucChar == 0x55) g_ucCSStatus = CSS_CMD;
            break;
            
        case CSS_CMD:
            g_ucCSSCmd = ucChar;
            g_ucCSStatus = CSS_ARG1;
            break;

        case CSS_ARG1:
            g_ucCSSArg1 = ucChar;
            g_ucCSStatus = CSS_ARG2;
            break;

        case CSS_ARG2:
            g_ucCSSArg2 = ucChar;
            g_ucCSStatus = CSS_TAIL;
            break;
            
        case CSS_TAIL:
            g_ucCSStatus = CSS_HEAD;
            if(ucChar == 0xaa) {
                CSSProcCmdArg();   
            }
            break;
    }

}

//------------------------------------------------------------------------------
void CSSProcCmdArg(void) {
    int nValue = g_ucCSSArg2;
    nValue = nValue * 0x100 + g_ucCSSArg1;
    
    if(CSS_NULL                 == g_ucCSSCmd) {
        printf("NULL Command\r\    n");
    } else if(CSS_SHOULDER      == g_ucCSSCmd) {
         ShoulderAngleSet(nValue);
         printf("Shoulder Set:%d\r\n", nValue);
    } else if(CSS_ELBOW         == g_ucCSSCmd) {
        ElbowAngleSet(nValue);
        printf("Elbow Set:%d\r\n", nValue);
    } else if(CSS_CLAW          == g_ucCSSCmd) {
        nValue = 1000 * nValue / 100 + 1000;
        if(nValue < 1000) nValue = 1000;
        if(nValue > 2000) nValue = 2000;
        SetClawAngle(nValue);
        printf("Set claw:%d\r\n", nValue);
    } else if(CSS_UPDOWN        == g_ucCSSCmd) {
        if(nValue == 0) ArmMoveDown();
        else ArmMoveUp();
        
        printf("Move up/donw:%d\r\n", nValue);
    } else if(CSS_STOP          == g_ucCSSCmd) {
        printf("Stop.\r\n");
    } else if(CSS_BEEP          == g_ucCSSCmd) {;
        ON(BEEP);
//        WaitTime(nValue);
        WaitTime(10);
        OFF(BEEP);        
        printf("Beep.\r\n");
    } else {
        printf("Error: %02x\r\n", g_ucCSSCmd);
    }    
    
    UART3SendChar(0x5a);
}

//==============================================================================
//                END OF THE FILE : CMDSIMPLE.C
//------------------------------------------------------------------------------