# DJI_DRIVER **Repository Path**: Ljunius/dji_-driver ## Basic Information - **Project Name**: DJI_DRIVER - **Description**: C610,C620驱动板,可驱动m3508和m2006 - **Primary Language**: C - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 3 - **Created**: 2020-10-28 - **Last Updated**: 2024-11-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 大疆驱动板v1使用说明 ## 前言 > 此驱动板代码基于东北大学action实验室开源项目,[rm3508_can_opensource](https://github.com/NEUACTION/rm3508_can_opensource) > > 可用于大疆rm3508和m2006电机的控制,最多可控制4个电机(可拓展到8个) ## 控制逻辑图 ![1](https://gitee.com/Ljunius/dji_-driver/raw/master/1.png) ## 使用方法 #### 驱动板设置 > 配置电机名称 > > 修改ctrl.c文件下的motorType数组,代表控制的4个电机。 > > ```C > int motorType[8] = { > M_2006, > M_2006, > M_2006, > M_2006, > NONE, > NONE, > NONE, > NONE > }; > ``` > > ```C >typedef enum > { > RM_3508 = 1, > M_2006 = 2, > NONE = 3 //none > > }MotorType_TypeDef; > ``` #### 主控板设置 > 加入dji_ctr.c和dji_ctr.h文件 > > 可直接用dji_ctr.h中的控制函数发送相应命令 > > 控制命令如下 > > ![2](https://gitee.com/Ljunius/dji_-driver/raw/master/2.png) > > 如要读取信息还需修改两处 > > 1. can_utils.c文件的can过滤数组 > > ```C > uint32_t std_id[] = {1,0x281}; > ``` > > 2. 同时在can_func.c中增加接受函数 > > ```C > //添加接收canId > void can_func_init() { > #ifdef SL_DEBUG > can_callback_add(1, can_suc_rx); > can_callback_add(325, can_show_button); > can_callback_add(324, can_show_rocker); > #endif > can_callback_add(0x281, can_read_motor); > } > //增加接收函数 > void can_read_motor(can_msg *data) > { > int id = (data->in[0])>>16; > int index = ((data->in[0])<<16)>>16; > > if(index == 0x00005850){ > //位置信息 > int num = data->in[1]; > Motor[id].pos = num; > uprintf("motor %d's pos =%d\r\n",id,num); > > } > else if(index == 0x00005856){ > //速度信息 > int num = data->in[1]; > Motor[id].vel = num; > uprintf("motor %d's vel =%d\r\n",id,num/1000); > } > else if(index == 0x00005149){ > //电流信息 > float num = data->fl[1]; > Motor[id].cur = (int)num; > uprintf("motor %d's cur =%f\r\n",id,num); > } > } > ``` > > can_func.h中增加定义 > > ```C > void can_read_motor(can_msg *data); > ``` ## 调试 #### 主控板 > 在cmd_func.c中增加调试指令 > > ```C > //增加头文件 > #include "dji_ctr.h" > > //cmd_func_init中增加 > cmd_add("sendmsg","set id",cmd_send_msg); > > //增加调试函数 > void cmd_send_msg(int argc, char *argv[]){ > if(strcmp(argv[1],"motoron")==0){ > uprintf("motor%d is on\r\n",atoi(argv[2])); > MotorOn(CAN1 , atoi(argv[2])); > } > else if(strcmp(argv[1],"motoroff")==0){ > uprintf("motor%d is off\r\n",atoi(argv[2])); > MotorOff(CAN1 , atoi(argv[2])); > } > else if(strcmp(argv[1],"velcfg")==0){ > uprintf("motor%d's mode changes to velloopmode\r\n",atoi(argv[2])); > VelLoopCfg(CAN1, atoi(argv[2]), 0, 0); > } > else if(strcmp(argv[1],"poscfg")==0){ > uprintf("motor%d's mode changes to posloopmode,maxv is %d\r\n",atoi(argv[2]),atoi(argv[3])); > PosLoopCfg(CAN1, atoi(argv[2]), 0, 0, atoi(argv[3])); > } > else if(strcmp(argv[1],"curcfg")==0){ > uprintf("motor%d's mode changes to curloopmode\r\n",atoi(argv[2])); > CurLoopCfg(CAN1, atoi(argv[2])); > } > else if(strcmp(argv[1],"velctr")==0){ > uprintf("motor%d's speed is set to %d\r\n",atoi(argv[2]),atoi(argv[3])); > VelCrl(CAN1, atoi(argv[2]), atoi(argv[3])); > } > else if(strcmp(argv[1],"posctr")==0) > { > uprintf("motor%d's pos is set to %d\r\n",atoi(argv[2]),atoi(argv[3])); > PosCrl(CAN1, atoi(argv[2]), ABSOLUTE_MODE, atoi(argv[3])); > } > else if(strcmp(argv[1],"curctr")==0){ > uprintf("motor%d's pos is set to %d\r\n",atoi(argv[2]),atoi(argv[3])); > CurCrl(CAN1, atoi(argv[2]), atoi(argv[3])); > } > else if(strcmp(argv[1],"qcur")==0) > { > uprintf("query for motor%d's cur\r\n",atoi(argv[2])); > ReadActualCur(CAN1, atoi(argv[2])); > } > else if(strcmp(argv[1],"qpos")==0){ > uprintf("query for motor%d's pos\r\n",atoi(argv[2])); > ReadActualPos(CAN1, atoi(argv[2])); > } > else if(strcmp(argv[1],"qvel")==0){ > uprintf("query for motor%d's vel\r\n",atoi(argv[2])); > ReadActualVel(CAN1, atoi(argv[2])); > } > else if(strcmp(argv[1],"setallvel")==0){ > if(argc < 6){ > uprintf("parameter error\r\n"); > return; > } > uprintf("set all vel"); > uint16_t vel[4]; > for(int i = 0; i < 4 ; i++){ > vel[i] = atoi(argv[2+i]); > uprintf("%d ",vel[i]); > } > uprintf("\r\n"); > velCtrAll(vel); > } > else if(strcmp(argv[1],"setallpos")==0){ > if(argc < 6){ > uprintf("parameter error\r\n"); > return; > } > uprintf("set all pos"); > uint16_t pos[4]; > for(int i = 0; i < 4 ; i++){ > pos[i] = atoi(argv[2+i]); > uprintf("%d ",pos[i]); > } > uprintf("\r\n"); > posCtrAll(pos); > } > } > ``` #### 驱动板 >驱动板中有串口调试命令,默认串口3 > >见usart.c > >例如: JV=1000000 > >可用 tool_box示波器调试,用指令:WV=num(num为电机id1~8,0为关闭)打开示波器