SIYI AK28 遥控器接收机的SBUS口与STM32通讯
SBUS介绍
SBUS是Futaba公司定义的一种串口通信协议,Futaba的产品应用越来越广泛,不论是航模,无人机,还是机器人,遥控车,总能有它的身影。SBUS是一个接收机串行总线输出,通过这根总线,可以获得遥控器上所有通道的数据。目前很多模型及无人机电子设备都支持SBUS总线的接入。使用SBUS总线获取通道数据,效率高的,而且节省硬件资源,只需要一根线即可获取所有通道的数据。
官网网址:
https://os.mbed.com/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/
硬件介绍
和TTL串口信号相比,sbus的逻辑电平是反的,并且是硬件取反,软件取反是无效的;硬件取反的电路图如下:
协议介绍
串口配置为波特率100kbps,8位数据,偶校验(even),2位停止位,无流控。
链接https://mbed.org/users/Digixx/notebook/futaba-s-bus-controlled-by-mbed/说明了S-bus帧格式。每帧25个字节,按照如下顺序排列:
[startbyte] [data1] [data2] … [data22] [flags][endbyte]
起始字节startbyte = 11110000b (0xF0),但实际上STM32(ARM核)收到的是0x0F。中间22个字节就是16个通道的数据了,为什么是16个通道?因为22x8=11x16,每个通道用11bit表示,范围是0-2047。波形图如下:
基本而言,data1为ch1的低8位,data2的低3位为ch1的高三位,data2的高5位是ch2的低5位,data3的低6位是ch2的高6位,以此类推,如下图所示:
代码介绍
sbus.c#include "sbus.h"==说明:我所用的遥控器通过推动摇杆得到的最小值是193、中间值是993、最大值是1793==#define RC_CHANNEL_MIN (-800)#define RC_CHANNEL_MAX 800#define SBUS_MIN_OFFSET 193#define SBUS_MID_OFFSET 993#define SBUS_MAX_OFFSET 1793/***@brief 这是一个C语言版的MAP函数(映射函数)*@param val:实际通道值; I_Min:输入最小值; I_Max:输入最大值;O_Min:输出最小值;O_Max:输出最大值*@retval 实际输出值;*@note none*/int output[16]={0};float map(float val, float I_Min, float I_Max, float O_Min, float O_Max){return(((val-I_Min)*((O_Max-O_Min)/(I_Max-I_Min)))+O_Min);}/***@brief 协议转换*@param none*@retval none*@note none*/void sbusPreparePacket(void){uint16_t SBUS_channels[16]={0};if(Usart6_rx_buffer[0]==0x0f&& Usart6_rx_buffer[24]==0x00) //校验收到的数据是否正确{SBUS_channels[0] = (( Usart6_rx_buffer[1]| Usart6_rx_buffer[2]<<8) & 0x07FF);SBUS_channels[1] = (( Usart6_rx_buffer[2]>>3 | Usart6_rx_buffer[3]<<5) & 0x07FF);SBUS_channels[2] = (( Usart6_rx_buffer[3]>>6 | Usart6_rx_buffer[4]<<2 | Usart6_rx_buffer[5]<<10) & 0x07FF);SBUS_channels[3] = (( Usart6_rx_buffer[5]>>1 | Usart6_rx_buffer[6]<<7) & 0x07FF);SBUS_channels[4] = (( Usart6_rx_buffer[6]>>4 | Usart6_rx_buffer[7]<<4) & 0x07FF);SBUS_channels[5] = (( Usart6_rx_buffer[7]>>7 | Usart6_rx_buffer[8]<<1 | Usart6_rx_buffer[9]<<9) & 0x07FF) ;SBUS_channels[6] = (( Usart6_rx_buffer[9]>>2 | Usart6_rx_buffer[10]<<6) & 0x07FF) ;SBUS_channels[7] = (( Usart6_rx_buffer[10]>>5| Usart6_rx_buffer[11]<<3) & 0x07FF) ;SBUS_channels[8] = (( Usart6_rx_buffer[12] | Usart6_rx_buffer[13]<<8) & 0x07FF) ;SBUS_channels[9] = (( Usart6_rx_buffer[13]>>3| Usart6_rx_buffer[14]<<5) & 0x07FF) ;SBUS_channels[10] = (( Usart6_rx_buffer[14]>>6| Usart6_rx_buffer[15]<<2| Usart6_rx_buffer[16]<<10) & 0x07FF) ;SBUS_channels[11] = (( Usart6_rx_buffer[16]>>1| Usart6_rx_buffer[17]<<7) & 0x07FF) ;SBUS_channels[12] = (( Usart6_rx_buffer[17]>>4| Usart6_rx_buffer[18]<<4) & 0x07FF) ;SBUS_channels[13] = (( Usart6_rx_buffer[18]>>7| Usart6_rx_buffer[19]<<1| Usart6_rx_buffer[20]<<9) & 0x07FF) ;SBUS_channels[14] = (( Usart6_rx_buffer[20]>>2| Usart6_rx_buffer[21]<<6) & 0x07FF) ;SBUS_channels[15] = (( Usart6_rx_buffer[21]>>5| Usart6_rx_buffer[22]<<3) & 0x07FF) ;}else {SBUS_channels[2]=993;SBUS_channels[3]=993; }for(char i=0;i<16;i++){output[i]=map(SBUS_channels[i],SBUS_MIN_OFFSET,SBUS_MAX_OFFSET, RC_CHANNEL_MIN, RC_CHANNEL_MAX); //具体到通道值}}/***@brief 输出PWM(混控)*@param offset_y:实际通道1的值;offset_x:实际通道2的值;c:给定常数*@retval none*@note none*///应用到具体的通道 实现pwm输出//以通道3为y轴,通道4为x轴int a,b, pwm1_channels[2]={0};void PWM_Out(int offset_y,int offset_x,float c ){ sbusPreparePacket();if(offset_y>=0){a=(c*offset_y*offset_y+800*offset_x)/(800+c*offset_y); //电机1b=(c*offset_y*offset_y-800*offset_x)/(800+c*offset_y); //电机2pwm1_channels[0]=map(a,0,800,1500,2000);pwm1_channels[1]=map(b,0,800,1500,2000);}if(offset_y<0){a=(1-2*0.25)*offset_y-0.25*(100+offset_x);b=(1-2*0.25)*offset_y-0.25*(100-offset_x);pwm1_channels[0]=map(a,-800,0,1000,1500);pwm1_channels[1]=map(b,-800,0,1000,1500);}pwm_out1( pwm1_channels[0]);pwm_out2( pwm1_channels[1]);}
sbus.h#ifndef __SBUS_H#define __SBUS_H#include "main.h"#include "usart.h"#include "tim.h"#include <stdbool.h>extern int output[16];#define pwm_out1(pwm) __HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_1,pwm)#define pwm_out2(pwm) __HAL_TIM_SET_COMPARE(&htim15,TIM_CHANNEL_2,pwm) uint16_t PWM_OUT1(uint16_t pwm_channel);uint16_t PWM_OUT2(uint16_t pwm_channel);float map(float val, float I_Min, float I_Max, float O_Min, float O_Max);void sbusPreparePacket(void);void GET_SBUSDATA(void);void sbus_control(void);void PWM_Out(int offset_y,int offset_x,float c );#endif
完结
SIYI AK28 遥控器接收机的SBUS口与STM32通讯相关推荐
- 开源自制的6通道航模遥控器(二)-Arduino接收机增加SBUS输出
前言 前几天开源了自制的6通道航模遥控器(开源自制的6通道航模遥控器,超简单不超过100行代码),受到许多粉丝的关注,美中不足的是只实现了6个通道的PWM输出,没有SBUS输出,接线太复杂.经过一段时 ...
- 用stm32读取遥控器接收机PPM信号各通道值
引言 无人机遥控器接收机接收方式可以在遥控上设置成PPM模式和S.BUS模式,用示波器观察接收机信号输出引脚可以得到一系列的方波,很像PWM方波,而我们所需要的是七,八个或更多的通道信号,多路的PWM ...
- 通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题
通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题 参考文章: (1)通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯 ...
- 西门子200smart与台达MS300变频器和欧姆龙E5CC温控器通讯程序 触摸屏与plc以太网通讯,PLC本体com口与变频器通讯485口相连,扩展模块SB CM01与欧姆龙温控器485通讯
西门子200smart与台达MS300变频器和欧姆龙E5CC温控器通讯程序 器件:西门子s7 200 smart PLC,扩展模块SB CM01,台达MS300变频器,欧姆龙E5cc 温控器,昆仑通态 ...
- STM32 IO口模拟串口通讯
转自:http://ziye334.blog.163.com/blog/static/224306191201452833850647 前阵子,调项目时需要用到低波特率串口通讯(300的波特率),才发 ...
- 富斯遥控器/接收机的PWM/PPM/iBUS/SBUS通道设置
富斯遥控器FS-i6X拥有10通道输出,富斯接收机FS-iA10B拥有10通道输入,两者都有PWM/PPM/iBUS/SBUS协议,但是PPM和iBUS协议最高只支持8通道,而SBUS协议可以支持10 ...
- WFLY 2.4G 遥控器接收机 STM32F1x开发
一.遥控器和接收头类型 1.1 天地飞 WFT06X-A 2.4GHz 6通道遥控器 商品规格:六通道2.4G 1.2 WFR06S 2.4G 6通接收机 ■产品规格: 频 段: 2.400GHz-2 ...
- 20120726-分析解决“STM8L101单片机IO口模拟串口通讯发生的奇怪现象”
近日因工作关系,需要用STM8L101F3P6这款单片机用IO口模拟串行通讯,波特率2400bps,前辈同事已经写完了程序,我需要拿来研究一下该款MCU的低功耗的情况,而在调试的过程中,发现1个奇怪的 ...
- readfile读取串口数据_西门子PLC-1200-串口Modbus RTU通讯实例
西门子PLC-1200的基于232串口的Modbus RTU通讯实例 这里先讲一下Modbus和232,232和485串口是一种串口接法,这种接法实际能实现十几种的协议通讯,有基于串口的Modbus ...
- stm32如何读取并口_CH374T STM32模拟并口总线读写U盘
| |-- ARM32: 32位指令ARM单片机 | | |-- LIB9: U盘文件级子程序库,ADS V1.2,小端数据格式 | | | |-- EXAM1: C示例源程序,查询方式 | | | ...
最新文章
- sed 格式化输出df -h
- pLSA概率潜在语义分析
- python嵌套列表知多少
- 福州java培训哪里好_福州自学考试培训班哪里比较好
- form表单中的input有哪些类型
- Nginx Parsing HTTP Package、header/post/files/args Sourcecode Analysis
- LINGO编程简介与实例
- 注册表修改系统显示时间
- 【应用实例】基于Icepak油泵系统热仿真
- VidMasta:搜索和观看在线电影、电视剧的神器
- 富文本编辑器NicEdit的使用
- 向量空间模型(vector space model)
- ngx_http_core_module模块提供的变量
- Mac OSX: 有线共享WiFi
- 乐鑫Esp32学习之旅② 巧用eclipes编辑器,官方教程在Windows下搭建esp32开发环境,打印 “Hello World”。
- 12864c与语言字符显示,大家看看该怎么改才能让12864液晶显示屏显示21个字符啊?...
- leetcode_middle_2_406. Queue Reconstruction by Height
- 华为机试练习(七)书籍叠放问题
- steam 平台 饥荒 联机版 Linux云服务器 搭建教程
- ipados 蓝牙 android,iPadOS13.4如何连接蓝牙鼠标 iPadOS13.4蓝牙鼠标连接使用教程
热门文章
- Cesium 纹理贴图
- android荣耀v20圆角适配,AR新玩法 让荣耀V20成为你随身的尺子
- Scrapy爬取起点中文网小说信息 绝对领域cosplay
- 【数学建模】元胞自动机(CA)详解+Matlab代码实现
- FishC笔记—15 讲 字符串:格式化
- Intel600P三星sm951pm961nvme等固态硬盘安装WIN7教程
- linux文件类型elf,ELF文件格式的三种类型
- SiteMesh框架
- 安卓版 网易云音乐 6.4.3
- 简明python教程电子书下载_简明Python教程PDF电子书免费下载