原文地址: Futaba S-BUS controlled by mbed
代码地址: SBUS-Library


Introduction(简介)

The Futaba S-BUS protocol is a serial protocol to control servos. Up to 16 proportional and two digital channels are available. The protocol is derived from the very known RS232 protocol used everywhere. The signal must be first inverted. The frame is 8E2.

Futaba S-BUS 协议是控制伺服系统的串口协议。
最多可以支持16个比例通道和2个数字(位)通道。
源自家喻户晓的 RS232 协议。信号必须先经过反相。
帧格式为8E2(8 数据位 Even 偶校验 2 停止位)。

This board provide a complete electrical separation of RC gear and mbed controller. The S-BUS serial signal is converted and isolated by optocoppler. To keep control of the plane/car/ship an additional controller (ATTINY13) is on board. It monitors a standard servo signal (Master) and sends the serial S-BUS signal either to the mbed or directly to the servos. A special ‘middle’ position sends the S-BUS data to the servos and the mbed. In this mode the mbed can check stick positions and range without sending data to servos. Because the S-BUS data contains the Master signal, mbed knows about this mode.

这块板为遥控装置和mbed控制器提供了一个完整的电气隔离。
S-BUS 串口信号被光耦合器转变和隔离。
板上有一个额外的控制器(ATTINY13)保持对飞机、车或者船的控制。
它监视着标准伺服信号(主),并将串行 S-BUS 信号发送到mbed或直接发送给伺服系统。
特殊的“中间”位置将 S-BUS 数据发送到伺服系统和mbed。
这个模式下的mbed可以检查摇杆的位置和范围而不需要发送数据给伺服系统。

S-BUS protocol(S-BUS 协议)

The protocol is 25 Byte long and is send every 14ms (analog mode) or 7ms (highspeed mode).
One Byte = 1 startbit + 8 databit + 1 paritybit + 2 stopbit (8E2), baudrate = 100’000 bit/s
The highest bit is send first. The logic is inverted (Level High = 1)

25个字节长的协议每14ms(模拟模式)或者每7ms(高速模式)发送一次。
一个字节 = 1个起始位 + 8个数据位 + 1个奇偶检验位 + 2个停止位 (8E2)。
波特率为 100 000 bit/s(100k bps)。
高位先发送。逻辑是反相的(高电平是逻辑1,RS232高电平是逻辑0)。

[startbyte] [data1] [data2] …. [data22] [flags][endbyte]

startbyte = 11110000b (0xF0)

data 1-22 = [ch1, 11bit][ch2, 11bit] …. [ch16, 11bit] (ch# = 0 bis 2047)
channel 1 uses 8 bits from data1 and 3 bits from data2
channel 2 uses last 5 bits from data2 and 6 bits from data3
etc.

flags =
bit7 = ch17 = digital channel (0x80)
bit6 = ch18 = digital channel (0x40)
bit5 = Frame lost, equivalent red LED on receiver (0x20)
bit4 = failsafe activated (0x10)
bit3 = n/a
bit2 = n/a
bit1 = n/a
bit0 = n/a

endbyte = 00000000b

[起始字节] [数据1] [数据2] .... [数据22] [标志][结束字节]
起始字节 = 11110000b (0xF0)
数据1-22 = [通道1, 11位][ch2, 11bit] .... [ch16, 11bit] (ch# = 0 - 2047)
通道1使用数据1里的8位和数据2里的3位。
通道2使用数据2中的最后5位和数据3中的6位。
以此类推。让我为你们举几个例子。
channel1有11位数据,用第0~A位表示,则收到的数据为 76543210(data1) xxxxxA98(data2)
channel2有11位数据,用第0~A位表示,则收到的数据为 43210xxx(data2) xxA98765(data3)
channel3有11位数据,用第0~A位表示,则收到的数据为 10xxxxxx(data3) 98765432(data4) xxxxxxxA(data5)
channel4有11位数据,用第0~A位表示,则收到的数据为 6543210x(data5) xxxxA987(data6)
channel5有11位数据,用第0~A位表示,则收到的数据为 3210xxxx(data6) xA987654(data7)
channel6有11位数据,用第0~A位表示,则收到的数据为 0xxxxxxx(data7) 87654321(data8) xxxxxxA9(data9)
etc.flags =
位7 = 通道17 = 数字(位)通道 (0x80)
位6 = 通道18 = 数字(位)通道 (0x40)
位5 = 丢帧, 接收机上有相同意义的红灯 (0x20)
位4 = 失效保护被激活 (0x10)
bit3 = n/a
bit2 = n/a
bit1 = n/a
bit0 = n/a结束字节 = 00000000b

S-BUS Library(S-BUS 库)

void FutabaSBUS::update_channels(void) {// Read all received data and calculate channel datauint8_t i;uint8_t sbus_pointer = 0;while (sbus_.readable()) {uint8_t data = sbus_.getc(); // get data from serial rx bufferswitch (sbus_pointer) {case 0: // Byte 1if (data==0x0f) {sbus_data[sbus_pointer] = data;sbus_pointer++;}break;case 24:    // Byte 25 >> if last byte == 0x00 >> convert dataif (data==0x00) {sbus_data[sbus_pointer] = data;// clear channels[]for (i=0; i<16; i++) {channels[i] = 0;}// reset countersuint8_t byte_in_sbus = 1;uint8_t bit_in_sbus = 0;uint8_t ch = 0;uint8_t bit_in_channel = 0;// process actual sbus datafor (i=0; i<176; i++) {if (sbus_data[byte_in_sbus] & (1<<bit_in_sbus)) {channels[ch] |= (1<<bit_in_channel);}bit_in_sbus++;bit_in_channel++;if (bit_in_sbus == 8) {bit_in_sbus =0;byte_in_sbus++;}if (bit_in_channel == 11) {bit_in_channel =0;ch++;}}// DigiChannel 1if (sbus_data[23] & (1<<0)) {channels[16] = 1;}else{channels[16] = 0;}// DigiChannel 2if (sbus_data[23] & (1<<1)) {channels[17] = 1;}else{channels[17] = 0;}// Failsafefailsafe_status = SBUS_SIGNAL_OK;if (sbus_data[23] & (1<<2)) {failsafe_status = SBUS_SIGNAL_LOST;}if (sbus_data[23] & (1<<3)) {failsafe_status = SBUS_SIGNAL_FAILSAFE;}}break;default:  // collect Channel data (11bit) / Failsafe informationsbus_data[sbus_pointer] = data;sbus_pointer++;}}
}
void FutabaSBUS::update_servos(void) {// Send data to servos// Passtrough mode = false >> send own servo data// Passtrough mode = true >> send received channel datauint8_t i;if (!sbus_passthrough) {// clear received channel datafor (i=1; i<24; i++) {sbus_data[i] = 0;}// reset countersuint8_t ch = 0;uint8_t bit_in_servo = 0;uint8_t byte_in_sbus = 1;uint8_t bit_in_sbus = 0;// store servo datafor (i=0; i<176; i++) {if (servos[ch] & (1<<bit_in_servo)) {sbus_data[byte_in_sbus] |= (1<<bit_in_sbus);}bit_in_sbus++;bit_in_servo++;if (bit_in_sbus == 8) {bit_in_sbus =0;byte_in_sbus++;}if (bit_in_servo == 11) {bit_in_servo =0;ch++;}}// DigiChannel 1if (channels[16] == 1) {sbus_data[23] |= (1<<0);}// DigiChannel 2if (channels[17] == 1) {sbus_data[23] |= (1<<1);}        // Failsafeif (failsafe_status == SBUS_SIGNAL_LOST) {sbus_data[23] |= (1<<2);}if (failsafe_status == SBUS_SIGNAL_FAILSAFE) {sbus_data[23] |= (1<<2);sbus_data[23] |= (1<<3);}}// send data outfor (i=0;i<25;i++) {sbus_.putc(sbus_data[i]);}
}

Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS)相关推荐

  1. bus总线 java_用RxJava实现事件总线(Event Bus)

    目前大多数开发者使用EventBus或者Otto作为事件总线通信库,对于RxJava使用者来说,RxJava也可以轻松实现事件总线,因为它们都依据于观察者模式. 不多说,上代码 /** * RxBus ...

  2. Mbed Crypto 和 MbedTLS 使用方法

    看了下这两个库的源码,好像是一样的,MbedTLS更新的时间比较近一些,先用这个库试试. 试了下,想用这个库,至少留20k内存给它. 什么是 Mbed Crypto Mbed Crypto 的是一个开 ...

  3. Mbed Studio编辑L-Tek FF-LPC546XX

    新软件,新MCU,开始新征程 Mbed Stuidio L-Tek FF-LPC546XX板子 概述 特性 NXP LPC546XX微处理器 外设 原型设计 开始使用 样板程序内存使用情况 进展情况 ...

  4. linux下bus、devices和platform的基础模型

    转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义: kobject是Linux2.6引入的设备管理机制,在内 ...

  5. Java Review - 使用Event Bus实现目录变化的监控

    文章目录 Pre 需求 Event Bus案例实战 小结 Pre Java Review - Java进程内部的消息中间件_Event Bus设计模式 需求 监控文件的实时变化 , 就这一句话??? ...

  6. Java Review - Java进程内部的消息中间件_Event Bus设计模式

    文章目录 概述 EventBus架构类图 Code Bus接口 (定义注册topic以及发送event接口) 自定义注解-回调方法及topic 同步EventBus 异步EventBus Subscr ...

  7. bus.js非父子组件之间通讯

    bus.js非父子组件之间通讯 区别: bus.js就是一个公共的vue实例专门处理emit和on事件. vuex.js是做全局数据处理的,是指限定了对公共数据的使用处理方法,统一管控 vue中非父子 ...

  8. linux内核组件分析之--设备驱动模型之bus

    前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起.本节就来看看设备驱动模型中起枢纽作用的bus.本节的头文件 ...

  9. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪

    Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...

最新文章

  1. Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
  2. linux 进程 地址空间 内存分布 简介
  3. python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例
  4. ZOJ - 2972 Hurdles of 110m(记忆化搜索/动态规划)
  5. DotNet 资源大全
  6. “约见”面试官系列之常见面试题之第八十一篇之webpack(建议收藏)
  7. VS2010安装MSDN Library
  8. 西安工程大学计算机是几本专业,2016年西安工程大学计算机科学与技术(卓越班)专业在陕西录取分数线...
  9. 服务器cpu最多几核心,决定虚拟服务器所需要的CPU核心数量是一件非常复杂的事情...
  10. springboot过滤器配置
  11. 安装IIS以及配置ASP.NET流程
  12. 从遗传力到肠菌力:概念及研究进展
  13. 使用get-pip.py 安装python2 的pip
  14. CheatSheet——OpenCV
  15. python笔记一:海龟画图
  16. android 设置系统壁纸,Android HttpURLConnection下载网络图片设置系统壁纸
  17. 服务器虚拟化的未来展望,IT号外:未来展望之拥抱虚拟化3.0
  18. 数字经济、数字资产、数据货币
  19. 「2B」的产品到底是什么
  20. Zeroc-Ice(ice-Touch)详解与配置应用

热门文章

  1. 2023.3.20杭州亚信科技JAVA实习一面面经
  2. HTML期末作业-绿色果蔬商城购物网模板(HTML+CSS+JavaScript)
  3. 美学心得(第二百四十五集) 罗国正
  4. 算法模板(7):计算几何(2)
  5. 服务器部署easymock
  6. Selenium ChromeDriver 截图标记指定元素的方法
  7. 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)
  8. 「JavaDay27 反射」
  9. 小公司请多做减法,少谈管理
  10. SQL Server 2016 KB2919355 安装失败