楼主

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
顾问mobangjack
2016-3-12 20:16:48 只看该作者

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
/***************************dbus.h*****************************/
#ifndef _DBUS_H_
#define _DBUS_H_

#define DBUS_BUF_SIZE    18
/* ----------------------- RC Channel Value Definition---------------------------- */
#define CH_VALUE_MIN                   ((uint16_t)364    )
#define CH_VALUE_OFFSET                ((uint16_t)1024   )
#define CH_VALUE_MAX                   ((uint16_t)1684   )  
/* ----------------------- RC Switch Value Definition----------------------------- */
#define SW_UP                          ((uint16_t)1      )
#define SW_MID                          ((uint16_t)3      )
#define SW_DOWN                        ((uint16_t)2      )  
/* ----------------------- PC Mouse Value Definition-------------------------------- */
#define MOUSE_MOVE_VALUE_MIN         ((uint16_t)-32768 )
#define MOUSE_MOVE_VALUE_OFFSET      ((uint16_t)0      )
#define MOUSE_MOVE_VALUE_MAX         ((uint16_t)32767  )
#define MOUSE_BTN_UP                  ((uint8_t)0       )
#define MOUSE_BTN_DN                  ((uint8_t)1       )
/* ----------------------- PC Key Value Definition-------------------------------- */
#define KEY_PRESSED_OFFSET_W         ((uint16_t)0x01<<0)
#define KEY_PRESSED_OFFSET_S         ((uint16_t)0x01<<1)
#define KEY_PRESSED_OFFSET_A         ((uint16_t)0x01<<2)
#define KEY_PRESSED_OFFSET_D         ((uint16_t)0x01<<3)
#define KEY_PRESSED_OFFSET_Q         ((uint16_t)0x01<<4)
#define KEY_PRESSED_OFFSET_E         ((uint16_t)0x01<<5)
#define KEY_PRESSED_OFFSET_SHIFT     ((uint16_t)0x01<<6)
#define KEY_PRESSED_OFFSET_CTRL      ((uint16_t)0x01<<7)  

typedef struct
{
    struct
    {
        uint16_t ch0;
        uint16_t ch1;
        uint16_t ch2;
        uint16_t ch3;
        uint8_t  s1;
        uint8_t  s2;
    }rc;
   
    struct
    {
        uint16_t x;
        uint16_t y;
        uint16_t z;
        uint8_t l;
        uint8_t r;
    }mouse;
   
    struct
    {
        uint16_t v;
    }key;
   
    uint16_t res;
   
}DBUS;

void DBUS_Enc(const DBUS* pdbus,unsigned char* pbuf);
void DBUS_Dec(DBUS* pdbus,const unsigned char* pbuf);

#endif

/***************************dbus.c*****************************/
#include "main.h"

void DBUS_Enc(const DBUS* pdbus,unsigned char* pbuf)
{
    pbuf[0] = pdbus->rc.ch0&0xff;
    pbuf[1] = (pdbus->rc.ch1<<3) | (pdbus->rc.ch0>>8);
    pbuf[2] = (pdbus->rc.ch2<<6) | (pdbus->rc.ch1>>5);
    pbuf[3] = pdbus->rc.ch2;
    pbuf[4] = (pdbus->rc.ch3<<1) | (pdbus->rc.ch2>>10);
    pbuf[5] = (pdbus->rc.s2<<6) | (pdbus->rc.s1<<4) | (pdbus->rc.ch3>>7);
    pbuf[6] = pdbus->mouse.x;
    pbuf[7] = pdbus->mouse.x>>8;
    pbuf[8] = pdbus->mouse.y;
    pbuf[9] = pdbus->mouse.y>>8;
    pbuf[10] = pdbus->mouse.z;
    pbuf[11] = pdbus->mouse.z>>8;
    pbuf[12] = pdbus->mouse.l;
    pbuf[13] = pdbus->mouse.r;
    pbuf[14] = pdbus->key.v;
    pbuf[15] = pdbus->key.v>>8;
    pbuf[16] = pdbus->res;
    pbuf[17] = pdbus->res>>8;
}

void DBUS_Dec(DBUS* pdbus,const unsigned char* pbuf)
{
    pdbus->rc.ch0 = (pbuf[0] | (pbuf[1] << 8)) & 0x07ff;          //!< Channel 0  
    pdbus->rc.ch1 = ((pbuf[1] >> 3) | (pbuf[2] << 5)) & 0x07ff;   //!< Channel 1         
    pdbus->rc.ch2 = ((pbuf[2] >> 6) | (pbuf[3] << 2) |            //!< Channel 2                          
        (pbuf[4] << 10)) & 0x07ff;
    pdbus->rc.ch3 = ((pbuf[4] >> 1) | (pbuf[5] << 7)) & 0x07ff;   //!< Channel 3   
    pdbus->rc.s1 = ((pbuf[5] >> 4) & 0x000C) >> 2;                    //!< Switch left         
    pdbus->rc.s2 = ((pbuf[5] >> 4) & 0x0003);                         //!< Switch right  
    pdbus->mouse.x = pbuf[6] | (pbuf[7] << 8);                    //!< Mouse X axis
    pdbus->mouse.y = pbuf[8] | (pbuf[9] << 8);                    //!< Mouse Y axis
    pdbus->mouse.z = pbuf[10] | (pbuf[11] << 8);                  //!< Mouse Z axis
    pdbus->mouse.l = pbuf[12];                                        //!< Mouse Left Is Press ?
    pdbus->mouse.r = pbuf[13];                                        //!< Mouse Right Is Press ?
    pdbus->key.v = pbuf[14] | (pbuf[15] << 8);                    //!< KeyBoard value   
    pdbus->res = pbuf[16] | (pbuf[17] << 8);                      //!< Reserve
}

/***************************usart1.c*****************************/
#include "main.h"

/*-----USART1_RX-----PB7----*/
//for D-BUS

unsigned char dbus_buf[DBUS_BUF_SIZE];

void USART1_Config(void)
{
    USART_InitTypeDef usart1;
    GPIO_InitTypeDef  gpio;
    NVIC_InitTypeDef  nvic;
    DMA_InitTypeDef   dma;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
   
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource7 ,GPIO_AF_USART1);
   
    gpio.GPIO_Pin = GPIO_Pin_7 ;
    gpio.GPIO_Mode = GPIO_Mode_AF;
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_Speed = GPIO_Speed_100MHz;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB,&gpio);
   
    USART_DeInit(USART1);
    usart1.USART_BaudRate = 100000;   //SBUS 100K baudrate
    usart1.USART_WordLength = USART_WordLength_8b;
    usart1.USART_StopBits = USART_StopBits_1;
    usart1.USART_Parity = USART_Parity_Even;
    usart1.USART_Mode = USART_Mode_Rx;
    usart1.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART1,&usart1);
   
    USART_Cmd(USART1,ENABLE);
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
   
    nvic.NVIC_IRQChannel = DMA2_Stream5_IRQn;
    nvic.NVIC_IRQChannelPreemptionPriority = 0;
    nvic.NVIC_IRQChannelSubPriority = 1;
    nvic.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic);
   
    DMA_DeInit(DMA2_Stream5);
    dma.DMA_Channel= DMA_Channel_4;
    dma.DMA_PeripheralBaseAddr = (u32)&(USART1->DR);
    dma.DMA_Memory0BaseAddr = (u32)dbus_buf;
    dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
    dma.DMA_BufferSize = DBUS_BUF_SIZE;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    dma.DMA_Mode = DMA_Mode_Circular;
    dma.DMA_Priority = DMA_Priority_VeryHigh;
    dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
    dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
    dma.DMA_MemoryBurst = DMA_Mode_Normal;
    dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA2_Stream5,&dma);

    DMA_ITConfig(DMA2_Stream5,DMA_IT_TC,ENABLE);
    DMA_Cmd(DMA2_Stream5,ENABLE);
}

void DMA2_Stream5_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA2_Stream5, DMA_IT_TCIF5))
    {
      
        DMA_ClearFlag(DMA2_Stream5, DMA_FLAG_TCIF5);
        DMA_ClearITPendingBit(DMA2_Stream5, DMA_IT_TCIF5);

        /*******************decode DBUS data*******************/
        DBUS_Dec(&dbus,dbus_buf);
        
    }
}
   

注意:我用的是步兵车的T型板,DR16接收机接入的硬件接口对应的USART通道为USART1

遥控器控制协议V1.4.pdf

262.86 KB, 下载次数: 259

售价: 1 金钱  [记录]

DR16&DT7遥控系统协议说明

跳转到指定楼层
推荐

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
顾问mobangjack
 楼主| 2016-3-12 20:20:01 只看该作者
处理与响应部分是放在一个定时器里面去执行的,以下是部分代码,仅供测试用:
#include "main.h"

void TIM6_Config(void)
{
    TIM_TimeBaseInitTypeDef  tim;
    NVIC_InitTypeDef         nvic;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);

    nvic.NVIC_IRQChannel = TIM6_DAC_IRQn;
    nvic.NVIC_IRQChannelPreemptionPriority = 0;
    nvic.NVIC_IRQChannelSubPriority = 0;
    nvic.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic);

    tim.TIM_Prescaler = 84-1;
    tim.TIM_CounterMode = TIM_CounterMode_Up;
    tim.TIM_ClockDivision = TIM_CKD_DIV1;
    tim.TIM_Period = 50000;
    TIM_TimeBaseInit(TIM6,&tim);
}

void TIM6_Start(void)
{
    TIM_Cmd(TIM6, ENABLE);         
    TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE);
    TIM_ClearFlag(TIM6, TIM_FLAG_Update);       
}

DBUS dbus;
Speed3D speed3D;
Speed4D speed4D;

//control interval : 50ms
void TIM6_DAC_IRQHandler(void)  
{
    if (TIM_GetITStatus(TIM6,TIM_IT_Update)!= RESET)
        {
        TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
        TIM_ClearFlag(TIM6, TIM_FLAG_Update);       
        
        /*******************switch s2 to choose RC mode*********************/
                if(dbus.rc.s2==SW_UP)
                {
                        /*****************body move control*******************/
                        //linearly scale
                        speed3D.speed_x = scale(dbus.rc.ch0,CH_VALUE_MIN,CH_VALUE_MAX,EC60CMIN,EC60CMAX);
                        speed3D.speed_y = scale(dbus.rc.ch1,CH_VALUE_MIN,CH_VALUE_MAX,EC60CMIN,EC60CMAX);
                        speed3D.speed_r = scale(dbus.rc.ch2,CH_VALUE_MIN,CH_VALUE_MAX,EC60CMIN,EC60CMAX);
                        //Speed3D->Speed4D,according to the speed transfer matrix of mecanum wheel
                        MecDecSpeed(&speed3D,&speed4D);
                        //transmit wheel speed to EC60 motor
                        EC60Cmd(speed4D.speed_fr,speed4D.speed_fl,speed4D.speed_bl,speed4D.speed_br);
                       
                        /*****************pan-tilt control*******************/
                       
                        /*****************fire control*******************/
                        if(dbus.rc.s1==SW_UP)
                        {
                                //E310Cmd(1500,1500);
                                RM6025Cmd(2000,2000);
                        }
                        else if(dbus.rc.s1==SW_DOWN)
                        {
                                //E310Cmd(1000,1000);
                                RM6025Cmd(-2000,-2000);
                        }
                        else
                        {
                                RM6025Cmd(0,0);
                        }
                }
    }
}
推荐

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
顾问mobangjack
 楼主| 2016-3-17 21:34:29 只看该作者
baid1995 发表于 2016-3-16 20:00
这儿,我想问问D-BUS信号就是S-BUS么?如果这样的话为什么控制不了NAZA?? ...

RM官方说的DBUS与futaba SBUS信号兼容只是信号通路兼容,数据格式并不兼容。也可以说硬件兼容,软件不兼容。也就是解析部分的代码会不一样
推荐

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
梯队队员dfdsdgdf
2016-3-16 21:46:57 只看该作者
baid1995 发表于 2016-3-16 20:00
这儿,我想问问D-BUS信号就是S-BUS么?如果这样的话为什么控制不了NAZA?? ...

我自己买了个板子,也是S.BUS的,所以也想问下和D.BUS的区别
5#

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
正式队员等你疯
2016-3-14 11:02:35 只看该作者
挺厉害的
回复

使用道具 举报

6#

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
顾问mobangjack
 楼主| 2016-3-14 11:14:46 只看该作者

也是初学不久,一起学习哦
7#

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
英雄baid1995
2016-3-16 20:00:57 只看该作者
这儿,我想问问D-BUS信号就是S-BUS么?如果这样的话为什么控制不了NAZA??
8#

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
英雄baid1995
2016-3-17 10:15:36 只看该作者
dfdsdgdf 发表于 2016-3-16 21:46
我自己买了个板子,也是S.BUS的,所以也想问下和D.BUS的区别

你买的是飞控么??能用发的遥控器控制飞控么?
9#

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
正式队员12345qa
2017-2-26 17:13:04 只看该作者
厉害了,学习
10#

[嵌入式] 【分享帖】DR16&DT7遥控系统协议解析

[复制链接]
工程jafiol
2017-3-18 11:25:59 只看该作者
用什么软件去解析这个信号?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2024 RoboMasters 版权所有 备案号 粤ICP备2022092332号

快速回复 返回顶部 返回列表