双轴机械臂串口控制命令开发与测试: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 | 帧尾 |
---|---|---|---|---|
0x55 | cmd | arg1 | arg2 | 0xaa |
- 命令帧头,帧尾是固定的数字0x55, 0xaa
- 命令,一个字节,所有的命令见后面的“指令定义”部分。
- 参数1,参数2:定义一个uint16参数, arg=arg1+arg2×256。参数的含义与命令相关。
2.命令定义
指令 | Hex码 | 含义 | 参数 | 返回 |
---|---|---|---|---|
空命令 | 0x00 | 用于测量命令通信链路是否畅通。 | 0x00,0x00 该参数被忽略。 | 0x5a |
设置肩部角度 | 0x01 | 用于设置肩部关节的角度。 | 角度取值:8192 ~ 24576 | 0x5a |
设置肘部角度 | 0x02 | 用于设置肘关节的角度。 | 角度取值范围:4096 ~ 28672 | 0x5a |
设置抓爪张开 | 0x03 | 控制抓爪的张开与闭合。 | 0:张开,100:闭合 | 0x5a |
机械臂上下运动 | 0x04 | 设置机械臂的上下位置。 | 0:移动到最下端 1:移动到最上端。 注:实际上当参数为非零的时候都是移动到最上端。 | 0x5a |
停止动作 | 0x05 | 未实现 | 0x00,0x00 | 0x5a |
蜂鸣器 | 0x06 | 未实现 | 0x00,0x00 | 0x5a |
设置角度传感器波特率 | 0x07 | 设置两个角度传感器波特率 请参见:角度编码器连接与设置 | 0x00,0x00:对应通道1,肩部角度传感器 0x00,0x01:对应通道2,肘部角度传感器 | 0x5a |
读取角度 | 0x8 | 用于读取两个角度传感器的角度值 | 0x00,0x00 | ah1,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
//------------------------------------------------------------------------------
相关文章
- 使用win10自带的微软远程桌面,远程控制不同局域网的电脑【无需公网IP、无需进入路由器】
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
- [转]在html中控制自动换行
- Spring源码分析(九)lazy-init 在Spring中是怎么控制加载的
- hibernate建表一对多 一的一方控制多的方
- Perl流程控制语句
- Qt编写安防视频监控系统61-子模块5设备控制
- 进程控制块 与 task_struct
- SpringBoot+Mybaits搭建通用管理系统实例八:系统权限控制实现
- STC8H8K系列汇编和C51实战——按键允许按键计数(利用下降沿中断控制)
- 【正点原子MP157连载】 第十一章 触摸按键控制LED灯实验【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
- 今年应用手势控制与眼动追踪的传感器市场价值将近50亿美元
- 如何在低速行驶状态下完美的控制摩托车
- 如何远程控制电脑
- 【Unity入门计划】用双血条方法控制伤害区域减血速度