树莓派作为服务器,接收手机/PC端发送的控制指令后,通过UART串口将控制指令进行转发,这里对指令协议进行说明
通讯协议
数据编号 | 数据内容 | 含义 |
---|---|---|
0 | 0x55 | 包头 |
1 | command | 控制指令 |
2 | speed | 速度 |
每帧数据都包含了3个字节的数据,分别为包头、控制指令和速度,其中包头均以0x55
开头,可以在接收数据时做简单的校验。
控制指令
第二个字节控制指令主要包括了:
- 前进
0x01
- 后退
0x02
- 伸张
0x03
- 收缩
0x04
- 停止
0x05
下位机在接受数据时,根据第二字节数据判断指令内容
速度
第三个字节是速度,范围是[0x00,0x64]
(即十进制的0~100)。
下位机在接收到数据时,可以根据速度对电机的转速进行相应的控制
下位机程序参考
下位机使用ARM系列芯片,实现对机器人的控制,这里主要对串口协议部分给出程序参考
中断部分
1 | unsigned char Re_buf[11],counter=0; |
主程序
在主程序中,根据指令的内容,进行不同的控制1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32u16 speed;
extern unsigned char Re_buf[11],counter;
extern unsigned char sign;
while (1)
{
if(sign)
{
sign = 0;
if(Re_buf[0]==0x55) //检查帧头
{
speed = speedMap(Re_buf[2]); //写一个函数,将0~100映射到0~999
switch(Re_buf[1])
{
case 0x01: //标识前进
Motor1_control(0,speed) //前进
break;
case 0x02: //标识后退
Motor1_control(speed,0) //前进
break;
case 0x53: //标识伸长
Motor2_control(900,0); //直接900的速度伸长,忽略速度
break;
case 0x54: //标识收缩
Motor2_control(0,900);直接900的速度收缩,忽略速度
break;
case 0x55: //标识停止
GPIO_ResetBits(GPIOC,GPIO_Pin_7); //拉低使能端
break;
default: break;
}
}
}
注意点
收缩和伸展均以较高的速度进行,原因在于原程序中使用了编码器检测速度变化的方式,来自动停止伸缩和伸长。
当速度较低的时,会影响其正常工作,且一般伸长、收缩需要尽快完成。