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通讯相关推荐

  1. 开源自制的6通道航模遥控器(二)-Arduino接收机增加SBUS输出

    前言 前几天开源了自制的6通道航模遥控器(开源自制的6通道航模遥控器,超简单不超过100行代码),受到许多粉丝的关注,美中不足的是只实现了6个通道的PWM输出,没有SBUS输出,接线太复杂.经过一段时 ...

  2. 用stm32读取遥控器接收机PPM信号各通道值

    引言 无人机遥控器接收机接收方式可以在遥控上设置成PPM模式和S.BUS模式,用示波器观察接收机信号输出引脚可以得到一系列的方波,很像PWM方波,而我们所需要的是七,八个或更多的通道信号,多路的PWM ...

  3. 通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题

    通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题 参考文章: (1)通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯 ...

  4. 西门子200smart与台达MS300变频器和欧姆龙E5CC温控器通讯程序 触摸屏与plc以太网通讯,PLC本体com口与变频器通讯485口相连,扩展模块SB CM01与欧姆龙温控器485通讯

    西门子200smart与台达MS300变频器和欧姆龙E5CC温控器通讯程序 器件:西门子s7 200 smart PLC,扩展模块SB CM01,台达MS300变频器,欧姆龙E5cc 温控器,昆仑通态 ...

  5. STM32 IO口模拟串口通讯

    转自:http://ziye334.blog.163.com/blog/static/224306191201452833850647 前阵子,调项目时需要用到低波特率串口通讯(300的波特率),才发 ...

  6. 富斯遥控器/接收机的PWM/PPM/iBUS/SBUS通道设置

    富斯遥控器FS-i6X拥有10通道输出,富斯接收机FS-iA10B拥有10通道输入,两者都有PWM/PPM/iBUS/SBUS协议,但是PPM和iBUS协议最高只支持8通道,而SBUS协议可以支持10 ...

  7. WFLY 2.4G 遥控器接收机 STM32F1x开发

    一.遥控器和接收头类型 1.1 天地飞 WFT06X-A 2.4GHz 6通道遥控器 商品规格:六通道2.4G 1.2 WFR06S 2.4G 6通接收机 ■产品规格: 频 段: 2.400GHz-2 ...

  8. 20120726-分析解决“STM8L101单片机IO口模拟串口通讯发生的奇怪现象”

    近日因工作关系,需要用STM8L101F3P6这款单片机用IO口模拟串行通讯,波特率2400bps,前辈同事已经写完了程序,我需要拿来研究一下该款MCU的低功耗的情况,而在调试的过程中,发现1个奇怪的 ...

  9. readfile读取串口数据_西门子PLC-1200-串口Modbus RTU通讯实例

    西门子PLC-1200的基于232串口的Modbus RTU通讯实例 这里先讲一下Modbus和232,232和485串口是一种串口接法,这种接法实际能实现十几种的协议通讯,有基于串口的Modbus ...

  10. stm32如何读取并口_CH374T STM32模拟并口总线读写U盘

    | |-- ARM32: 32位指令ARM单片机 | | |-- LIB9: U盘文件级子程序库,ADS V1.2,小端数据格式 | | | |-- EXAM1: C示例源程序,查询方式 | | | ...

最新文章

  1. sed 格式化输出df -h
  2. pLSA概率潜在语义分析
  3. python嵌套列表知多少
  4. 福州java培训哪里好_福州自学考试培训班哪里比较好
  5. form表单中的input有哪些类型
  6. Nginx Parsing HTTP Package、header/post/files/args Sourcecode Analysis
  7. LINGO编程简介与实例
  8. 注册表修改系统显示时间
  9. 【应用实例】基于Icepak油泵系统热仿真
  10. VidMasta:搜索和观看在线电影、电视剧的神器
  11. 富文本编辑器NicEdit的使用
  12. 向量空间模型(vector space model)
  13. ngx_http_core_module模块提供的变量
  14. Mac OSX: 有线共享WiFi
  15. 乐鑫Esp32学习之旅② 巧用eclipes编辑器,官方教程在Windows下搭建esp32开发环境,打印 “Hello World”。
  16. 12864c与语言字符显示,大家看看该怎么改才能让12864液晶显示屏显示21个字符啊?...
  17. leetcode_middle_2_406. Queue Reconstruction by Height
  18. 华为机试练习(七)书籍叠放问题
  19. steam 平台 饥荒 联机版 Linux云服务器 搭建教程
  20. ipados 蓝牙 android,iPadOS13.4如何连接蓝牙鼠标 iPadOS13.4蓝牙鼠标连接使用教程

热门文章

  1. Cesium 纹理贴图
  2. android荣耀v20圆角适配,AR新玩法 让荣耀V20成为你随身的尺子
  3. Scrapy爬取起点中文网小说信息 绝对领域cosplay
  4. 【数学建模】元胞自动机(CA)详解+Matlab代码实现
  5. FishC笔记—15 讲 字符串:格式化
  6. Intel600P三星sm951pm961nvme等固态硬盘安装WIN7教程
  7. linux文件类型elf,ELF文件格式的三种类型
  8. SiteMesh框架
  9. 安卓版 网易云音乐 6.4.3
  10. 简明python教程电子书下载_简明Python教程PDF电子书免费下载