1月17日
代码部分
我们先要明确下思路,我们现在想要做的是想要将小车的底盘利用遥控器控制驱动,所以我们要完成的部分是:
- 遥控器数据的接收
- 遥控器数据的处理
- 电机数据的接收
- 电机数据的处理(pid,而且只用速度环)
- 电机速度的发送(遥控器和电机速度的关系和遥控器和运动方向的关系)
- 利用的灯显示系统状态
然后接下来我先说下我的代码习惯
1.每一个功能分开写在不同的.c文件中,而且每个.c文件中都会用一个.h文件,主要用于函数的接口和相对应的结构体定义
2.结构体类型的变量会是_S_的形式,枚举类型变量将会是_e_
3.尽量使用嵌套结构体,除非实在是太麻烦的东西就不用,尤其我会用一个超级结构体把所有变量涵盖起来
4.里面我会经常使用#ifdef来选择性编译,方便所有东西的调试,
5.其中还会有一个GOD函数,来对所有参数的调试,方便操作
然后就是具体的代码部分了,我先将整体的结构体表示出来(这里只表示底盘相关的,而云台,舵机之类的将会在以后补充)
所有涉及战队机密代码的部分我会省略
/*
------------------------------------------------------------------------
| 文件名 :robot.h
| 文件描述 :本文件用于RM战车的结构体和robot.c的函数接口
| 作者 : pinocchio
| 创建时间 :1.18
------------------------------------------------------------------------
修改日期 :1.20
修改人 :pinocchio
------------------------------------------------------------------------
**************************************************************************
* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有
* 4.请勿转载!!!!!!!!!!!
*
* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
**************************************************************************
*/
#ifndef ROBOT_H_
#define ROBOT_H_
typedef struct
{
struct
{
struct
{
int ch0;
int ch1;
int ch2;
int ch3;
int s1;
int s2;
}Rc;
struct
{
int x;
int y;
int z;
int press_l;
int press_r;
int key;
}Mouse;
enum
{
Auto,
Manual
}Shoot_Mode;
enum
{
RC_Stop,
RC_Remote,
RC_MouseKey,
}Robot_Mode;
}Remote;
struct CHASSIS_t
{
struct
{
float KP;
float KI;
float KD;
short Fd_Speed;
int Ref_Speed;
int output;
int OutputMAX;
int error[3];
}Speed_Pid;
}Chassis_A,Chassis_B,Chassis_C,Chassis_D;
}ROBOT;
extern ROBOT Robot1;
void INIT_ROBOT(void);
#endif
然后此时我们写一个初始化函数将所有数据初始化
/*
------------------------------------------------------------------------
| 文件名 :robot.h
| 文件描述 :本文件用于战车所有数据的初始化函数,以及后续调试(当还有其他功能是会补充)
| 作者 : pinocchio
| 创建时间 :1.18
------------------------------------------------------------------------
修改日期 :未修改
修改人 :无
------------------------------------------------------------------------
**************************************************************************
* 1. 本代码基于STM32F427IIH(2018RM开发板A型)开发,编译环境为keil,基于freetos操作系统
* 2. 本代码只适用于Robomaster 2019步兵机器人,不建议用于其他用途
* 3.本代码最终解释权归哈尔滨工业大学(深圳)南工晓鹰所有
* 4.请勿转载!!!!!!!!!!!
*
* Copyright (c) 2019哈尔滨工业大学(深圳)南工晓鹰战队 版权所有
**************************************************************************
*/
#include "robot.h"
ROBOT Robot1;
void INIT_ROBOT()
{
Robot1.Chassis_A.Speed_Pid.error[0] =0;
Robot1.Chassis_A.Speed_Pid.error[1] =0;
Robot1.Chassis_A.Speed_Pid.Fd_Speed = 0;
Robot1.Chassis_A.Speed_Pid.KD= 0;
Robot1.Chassis_A.Speed_Pid.KI= 0;
Robot1.Chassis_A.Speed_Pid.KP= 0;
Robot1.Chassis_A.Speed_Pid.output= 0;
Robot1.Chassis_A.Speed_Pid.OutputMAX= 0;
Robot1.Chassis_A.Speed_Pid.Ref_Speed= 0;
Robot1.Chassis_B.Speed_Pid.error[0] =0;
Robot1.Chassis_B.Speed_Pid.error[1] =0;
Robot1.Chassis_B.Speed_Pid.Fd_Speed= 0;
Robot1.Chassis_B.Speed_Pid.KD= 0;
Robot1.Chassis_B.Speed_Pid.KI= 0;
Robot1.Chassis_B.Speed_Pid.KP= 0;
Robot1.Chassis_B.Speed_Pid.output= 0;
Robot1.Chassis_B.Speed_Pid.OutputMAX= 0;
Robot1.Chassis_B.Speed_Pid.Ref_Speed= 0;
Robot1.Chassis_C.Speed_Pid.error[0] =0;
Robot1.Chassis_C.Speed_Pid.error[1] =0;
Robot1.Chassis_C.Speed_Pid.Fd_Speed= 0;
Robot1.Chassis_C.Speed_Pid.KD= 0;
Robot1.Chassis_C.Speed_Pid.KI= 0;
Robot1.Chassis_C.Speed_Pid.KP= 0;
Robot1.Chassis_C.Speed_Pid.output= 0;
Robot1.Chassis_C.Speed_Pid.OutputMAX= 0;
Robot1.Chassis_C.Speed_Pid.Ref_Speed= 0;
Robot1.Chassis_D.Speed_Pid.error[0] =0;
Robot1.Chassis_D.Speed_Pid.error[1] =0;
Robot1.Chassis_D.Speed_Pid.Fd_Speed= 0;
Robot1.Chassis_D.Speed_Pid.KD= 0;
Robot1.Chassis_D.Speed_Pid.KI= 0;
Robot1.Chassis_D.Speed_Pid.KP= 0;
Robot1.Chassis_D.Speed_Pid.output= 0;
Robot1.Chassis_D.Speed_Pid.OutputMAX= 0;
Robot1.Chassis_D.Speed_Pid.Ref_Speed= 0;
Robot1.Remote.Mouse.key= 0;
Robot1.Remote.Mouse.press_l= 0;
Robot1.Remote.Mouse.press_r= 0;
Robot1.Remote.Mouse.x= 0;
Robot1.Remote.Mouse.y= 0;
Robot1.Remote.Mouse.z= 0;
Robot1.Remote.Rc.ch0= 0;
Robot1.Remote.Rc.ch1= 0;
Robot1.Remote.Rc.ch2= 0;
Robot1.Remote.Rc.ch3= 0;
Robot1.Remote.Rc.s1= 0;
Robot1.Remote.Rc.s2= 0;
Robot1.Remote.Robot_Mode= RC_Stop ;
Robot1.Remote.Shoot_Mode= Manual ;
}