最近一段时间在调试飞控遥控器模块,是基于SBUS,自己在裸机上跑通了,很多细节越值的注意,写这边文章也是给自己做个记录,保持初学者之心,这篇其实跟蓝牙那片有相似方式与文章结构。
本次实验不是只买个蓝牙就能解决的,一般几乎每个人都有一部手机,但不一定没啥事带着一套飞控遥控器,而是市面上遥控器又五花八门,本篇针对特定遥控器开发,最文章最后会附上遥控器链接。
翻了一段时间网上的文章后,总结,sbus就是基于串口的一套传输协议,就像我们平时使用9600波特率的串口一样,在使用它时,只是配置上稍微不同。打个比方,就好像铁轨上能跑绿色铁皮车,动车组,同样也能跑高级些的高铁列车,仔细理解这个比喻,铁轨没变,跑的东西,运输变了。
这个很多文章都说了,要硬件取反,而且时必须硬件取反,软件只能反向数据位,不能反向停止位啥的,所以不要企图走捷径,还是老老实实去焊接个反相器吧。
在使用sbus时候,和普通串口只有一点配置上的区别.
这部分网上说挺多了,大部分都大同小异,只有电阻阻值的不同,都是用NPN的8050三级管来做,建议直接网上淘个,具体链接也放在后面了。
以下出自我灵魂的画手,主要需要注意的是,三极管引脚,不同型号NPN三极管理论上都可以,但是买完后,一定要对下引脚图,要不可能就不好使,一脸懵逼,如下图所示。
同之前测试蓝牙一样,焊借好了后,先不着急写代码,先看看有数据过来没有,接上串口,设置好配置,如下图,是实际逻辑分析仪抓取到的。上半部分是反向完成的数据,下部分是为反向数据。
如下图,是串口抓取到数据。
你的串口工具基本稳定发送如上数据,那么恭喜你,你基本已经走完一半路程。
完成第三步,可以进行下一步了,使用编译器写程序。
1)波特率100000 9bit EVEN 2STOP
2)DMA配置
3)中断配置
1)这个想配置DMA就配置不想 普普通通也行,默认就行
2)中断配置别忘了
我们需要使用printf,帮我们输出一些信息,加入printf重定向,具体可以看我之前写的文章。
https://waka-can.blog.csdn.net/article/details/124452661?spm=1001.2014.3001.5502
简单说,mian.c加入如下代码
#include "stdio.h"
#include "stdint.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
//>>第二步:定义数组
uint8_t u_buf[64];
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//>>第三步:定义输出函数printf
#define printf(...) HAL_UART_Transmit((UART_HandleTypeDef * )&huart4, (uint8_t *)u_buf,\
sprintf((char *)u_buf,__VA_ARGS__),0x200);
具体代码我就不一一列举了,如果需要直接去我代码里去,觉得CSDN要积分的话,可以私信我要代码。
(1)初始化声明下
(2)回调函数
(3)加入中断函数内
(4)加入转化函数:通用代码
void get_sbus_data(uint8_t sbus_data[27], uint16_t sbus_channel[16])
{
sbus_channel[0] = ((sbus_data[1]|sbus_data[2]<<8) & 0x07FF);
sbus_channel[1] = ((sbus_data[2]>>3 |sbus_data[3]<<5) & 0x07FF);
sbus_channel[2] = ((sbus_data[3]>>6 |sbus_data[4]<<2 |sbus_data[5]<<10) & 0x07FF);
sbus_channel[3] = ((sbus_data[5]>>1 |sbus_data[6]<<7) & 0x07FF);
sbus_channel[4] = ((sbus_data[6]>>4 |sbus_data[7]<<4) & 0x07FF);
sbus_channel[5] = ((sbus_data[7]>>7 |sbus_data[8]<<1 |sbus_data[9]<<9) & 0x07FF);
sbus_channel[6] = ((sbus_data[9]>>2 |sbus_data[10]<<6) & 0x07FF);
sbus_channel[7] = ((sbus_data[10]>>5|sbus_data[11]<<3) & 0x07FF);
sbus_channel[8] = ((sbus_data[12] |sbus_data[13]<<8) & 0x07FF);
sbus_channel[9] = ((sbus_data[13]>>3|sbus_data[14]<<5) & 0x07FF);
sbus_channel[10] = ((sbus_data[14]>>6|sbus_data[15]<<2|sbus_data[16]<<10) & 0x07FF);
sbus_channel[11] = ((sbus_data[16]>>1|sbus_data[17]<<7) & 0x07FF);
sbus_channel[12] = ((sbus_data[17]>>4|sbus_data[18]<<4) & 0x07FF);
sbus_channel[13] = ((sbus_data[18]>>7|sbus_data[19]<<1|sbus_data[20]<<9)& 0x07FF);
sbus_channel[14] = ((sbus_data[20]>>2|sbus_data[21]<<6) & 0x07FF);
sbus_channel[15] = ((sbus_data[21]>>5|sbus_data[22]<<3) & 0x07FF);
}
具体本次代码连接:https://download.csdn.net/download/qq_22146161/85826413
这个视频还是放在B站了,有兴趣可以看下。
https://www.bilibili.com/video/BV15G411x7TQ/
查看他人编写的代码时发现,有uart1接收长度为27位,这个应该都行,只要能顺利接收进来就行,也没必要给太长。
查看资料时,发现有个判断断联标志位,这个设计非常好,如果在四轴上,一旦的断联,基本是损害物品,所以这个位需要注意下,最好查查这个位怎么取,怎么用。
自己开始也是小白,从他人哪里获取知识,当然需要标明从哪里获取。
参考连接:https://blog.csdn.net/peach_orange/article/details/52958385
参考连接:https://blog.csdn.net/ReadAir/article/details/102631513
如果你想要keil版本的,在正点原子社区有人做了,自己验证过,可以的。
参考连接:http://www.openedv.com/forum.php?mod=viewthread&tid=332860
网上某宝非常多:8050三极管等