Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS)

2023-05-16

原文地址: 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 协议。信号必须先经过反相。
帧格式为8E28 数据位 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 data
    uint8_t i;
    uint8_t sbus_pointer = 0;
    while (sbus_.readable()) {
        uint8_t data = sbus_.getc(); // get data from serial rx buffer
        switch (sbus_pointer) {
            case 0: // Byte 1
                if (data==0x0f) {
                    sbus_data[sbus_pointer] = data;
                    sbus_pointer++;
                }
                break;

            case 24:    // Byte 25 >> if last byte == 0x00 >> convert data
                if (data==0x00) {
                    sbus_data[sbus_pointer] = data;
                    // clear channels[]
                    for (i=0; i<16; i++) {channels[i] = 0;}

                    // reset counters
                    uint8_t byte_in_sbus = 1;
                    uint8_t bit_in_sbus = 0;
                    uint8_t ch = 0;
                    uint8_t bit_in_channel = 0;

                    // process actual sbus data
                    for (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 1
                    if (sbus_data[23] & (1<<0)) {
                        channels[16] = 1;
                    }else{
                        channels[16] = 0;
                    }
                    // DigiChannel 2
                    if (sbus_data[23] & (1<<1)) {
                        channels[17] = 1;
                    }else{
                        channels[17] = 0;
                    }
                    // Failsafe
                    failsafe_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 information
                sbus_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 data
    uint8_t i;
    if (!sbus_passthrough) {
        // clear received channel data
        for (i=1; i<24; i++) {
            sbus_data[i] = 0;
        }

        // reset counters
        uint8_t ch = 0;
        uint8_t bit_in_servo = 0;
        uint8_t byte_in_sbus = 1;
        uint8_t bit_in_sbus = 0;

        // store servo data
        for (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 1
        if (channels[16] == 1) {
            sbus_data[23] |= (1<<0);
        }
        // DigiChannel 2
        if (channels[17] == 1) {
            sbus_data[23] |= (1<<1);
        }        

        // Failsafe
        if (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 out
    for (i=0;i<25;i++) {
        sbus_.putc(sbus_data[i]);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS) 的相关文章

  • WSL2中使用systemctl报错Failed to connect to bus: Host is down

    问题截图 xff1a System has not been booted with systemd as init system PID 1 Can t operate Failed to connect to bus Host is d
  • Spring Config 配置中心和Spring Bus配合使用的一些坑

    个人觉得bus这个东西这是坑多 折腾好一会 xff08 使用actuator bus refresh 而不用bus refresh xff09 首先Config 和 Client 项目都添加如下配置 management endpoints
  • A. Serval and Bus

    outputstandard output It is raining heavily But this is the first day for Serval who just became 3 years old to go to th
  • $CF1153A\ Serval\ and\ Bus$

    看大佬的代码都好复杂 xff08 不愧是大佬 orz 蒟蒻提供一种思路 因为求的是最近的车对吧 qwq 所以我们可以用一个 while 循环所以没必要去用什么 for 至于这是 div2 的第一题还是比较水的 code include lt
  • WSL的CentOS7报错Failed to get D-Bus connection: Operation not permitted解决办法

    WSL的CentOS7使用systemctl和service命令时报错Failed to get D Bus connection Operation not permitted 解决办法是更换systemctl文件 首先备份systemc
  • S.BUS协议

    内容 本篇文章主要是S BUS协议原理介绍 xff0c 并实现了arduino输出S BUS数据 S BUS简介 SBUS是一个接收机串行总线输出 xff0c 通过这根总线 xff0c 可以获得遥控器上所有通道的数据 目前很多模型及无人机电
  • SpringCloud(十一)Bus消息总线、Stream消息驱动

    一 Bus消息总线 需求 xff1a 分布式自动刷新配置功能 xff1b 解决 xff1a SpringCloud Bus配合Spring cloud Config使用可以实现配置的动态刷新 1 概述 定义 xff1a Spring Clo
  • 总线学习(BUS)

    1 总线的概念 总线是指计算机设备和设备之间传输信息的公共数据通道 总线是连接计算机硬件系统内多种设备的通信线路 xff0c 一个重要特征是由总线上的所有设备共享 xff0c 可以将计算机系统的多种设备连接到总线上 如果是某两个设备或设备之
  • ESP8266解析S-BUS协议

    Talk is cheap show you code 编译平台 xff1a Arduino IDE span class token comment 功能 xff1a 软件串口读取S BUS数据 xff1b 解析 xff1b 串口打印 s
  • 计算机组成.零件之间的通信.总线BUS

    总线干嘛的 xff1f 说白了就是用来传输数据的 xff0c 在计算机的各个部件之间 比如我主存里存的数据CPU要用 xff0c 需要一条线路传过去吧 xff0c CPU内部各个寄存器之间 寄存器与ALU CU与各个部件之间等等等等很多地方
  • bus总线

    有时候两个组件也需要通信 xff08 非父子关系 xff09 当然Vue2 0提供了Vuex xff0c 但在简单的场景下 xff0c 可以使用一个空的Vue实例作为中央事件总线 eventBus js放在assets import Vue
  • 从零开始学JetsonTX2----can bus开发

    step by step implementation 搞硬件开发 xff0c 先把技术手册搞到手 这个网页把几乎Jetson tx2的开发资料都汇总了一下 找教程开始配置can所需要系统环境 NIVIDA社区的教程 xff1a https
  • RS232/RS485/CAN_BUS 通信原理总结与通信波形分析

    分析一 xff1a 232串口信号 要点 xff1a RS232 xff0c 全双工 xff0c 采用三线制传输分别为TXD RXD GND xff0c 其中TXD为发送信号 xff0c RXD为接收信号 在RS232中任何一条信号线的电压
  • 【PCIe】3: PCIe BDF(Bus,Device,Function)

    目录 1 概述 2 BUS 总线号 3 Device 设备号 4 Function 功能号 1 概述 PCIe总线中的每一个功能都有一个唯一的标识符与之对应 这个标识符就是BDF Bus Device Function
  • 在原子变量的上下文中什么是总线锁定?

    我使用 C 很长时间了 现在我开始学习汇编并了解处理器的工作原理 不仅仅是为了好玩 而且我必须将其作为测试程序的一部分 在学习汇编时 我开始听到一些在讨论多线程时到处听到的术语 因为我在科学计算中进行了大量的多线程处理 我正在努力了解全貌
  • 将特征用户描述添加到多个自定义 C++ BLE GATT 服务

    我正在尝试使用以下命令将一些特征用户描述添加到我的自定义 BLE GATT 服务中mbed API https developer mbed org teams Bluetooth Low Energy 到目前为止我的工作是基于this h
  • “org.apache.cxf.jaxrs.bus.providers”不工作

    我正在使用 我想保留一些常见的东西 例如 JSON 提供程序 验证拦截器 使用 cxf 总线的异常处理 下面是我的应用程序上下文
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • 我正在使用 SQL 设计公交车时刻表。每条巴士路线都有多个站点,我是否需要为每条路线准备不同的表?

    我正在尝试提出尽可能最有效的数据库 我的巴士路线大约有 10 个站点 巴士从一号站出发 直到到达第十站 然后再返回 这个循环每天发生3次 我真的很困惑如何有效地生成公交车的时间以及应该在哪里存储站点 如果我将所有停靠点放在一个字段中 将时间

随机推荐

  • Qt小程序之QQ登录窗口输入框控件

    代码之路 整体思路即根据focusInEvent和focusOutEvent事件判断焦点是否在输入框中 xff0c 同时重写setPlaceholderText方法 xff0c 把最开始设置的占位字符保存下来 xff0c 然后焦点进入的时候
  • Qt 自定义日志类

    一 前言 C 43 43 中比较不错的日志工具有 log4cxx xff0c log4qt 等 xff0c 但是它们都不能和 qDebug qInfo 等有机的结合在一起 xff0c 所以在 Qt 中使用总觉得不够舒服 xff0c 感谢 Q
  • 在Qt程序中使用C++11线程std::thread处理耗时操作

    Qt界面程序通常什么情况下要使用到线程 xff1f Qt界面程序在调用接口处理时间较长的任务时 如连接网络 复制文件等等耗时操作 xff0c 界面在等待接口返回前会导致卡死 为了不让界面卡死 xff0c 可以使用一个子线程来处理耗时任务 x
  • 学习stm32单片机,必备工具和软件,你知道几个?

    大家好 xff0c 我是华维的麦琪 今天给大家介绍下 xff0c 学习stm32需要用到那些硬件和软件 xff0c 对于学习stm32单片机的学习者 xff0c 要添置必要的学习和开发工具 xff0c 搭建一个最基本的学习平台 xff0c
  • 关于android UI适配的一些思考

    作为前端工程师 xff0c 界面效果 xff0c 效率 肯定是第一要务 面对安卓庞大的机型和屏幕对开发者的要求也就越来越高了 今天笔者就自己对UI适配的一些经验进行一个简短的总结 1 关于xml中写死dp的思考 首先我们应该先把问题抛出 x
  • 单片机编程用什么软件?单片机开发软件有哪些?华维告诉你.

    大家好 xff0c 我是华维 最近有小伙伴问我单片机编程用哪些软件 xff0c 结合我工作10年单片机经验 xff0c 在此回答一下大家的问题 单片机编程软件有很多 xff0c 什么protues仿真 Labview Pycharm等等 x
  • stm32单片机学习秘籍(完整版)

    大家好 xff0c 我是华维麦琪 xff0c 今天来分享下我们华维团队十年经验总结 xff0c 如何能快速学好stm32单片机 xff01 最近看到很多小伙伴学STM32学的一脸懵逼 xff0c 有些甚至学1年都不会 xff0c 有些虽然学
  • 深度解析,单片机运行原理,你知道吗?

    同名回复 入门资料 获取单片机入门到高级进阶教程 单片机是将中央处理单元 xff08 CPU xff09 储存器 输入输出集成在一片芯片上 xff0c 可以说单片机就是一台微型计算机 xff0c 只是和我们平常使用的计算机相比它的功能有所不
  • 玩单片机需要学数电、模电吗?

    首先我们来了解下什么是模电和数电 模拟电路 xff1a 模拟电路是指用来对模拟信号进行传输 变换 处理 放大 测量和显示等工作的电路 模拟信号是指连续变化的电信号 模拟电路是电子电路的基础 xff0c 它主要包括放大电路 信号运算和处理电路
  • 2022年入坑,互联网开发和嵌入式开发,你会选择哪个?

    前言 2022年入坑 xff0c 互联网开发和嵌入式开发 xff0c 你会选择哪个 xff1f 我想很多人会毫不犹豫的选择互联网吧 xff0c 嵌入式没有那么大众化 xff0c 没有那么多关注 xff0c 对它的概念可能没有那么清楚 今天跟
  • 入门必看,51单片机学习三步走

    回想起我初学单片机到现在已经有六年了 学习期间使用了51单片机 XX卡尔单片机 STM16 STM32等单片机 每次接触新的单片机我首先会熟悉它的基本开发 xff0c 然后再通过项目的实现去深入的了解它 大家都知道51单片机是最容易学习的
  • 【华维教学】用STM32Cube和Keil5点亮一个LED

    大家好 xff0c 我是华维 今天我们讲下用STM32CubeMX和Keil5点亮一个LED xff0c 这个项目比较简单 xff0c 大家都可以尝试下 这个就是我们今天的主角 xff0c 这款单片机芯片是STM32F030K6T6 这个开
  • 浅谈ESP8266、ESP32和STM32的区别

    大家好 xff0c 我是华维蔵鹰 xff0c 关注我可以学习更多的单片机知识 今天我们来聊聊ESP8266 ESP32和STM32 乐鑫聚布局联网领域已经有些年头了 xff0c 先是推出了ESP8266这样的低价带有wifi的芯片 xff0
  • 物联网专业未来没有前途了吗?

    大家好 xff0c 我是华维蔵鹰 xff0c 想学习单片机的同学可以关注 私信我 最近在知乎看到一个同学对物联网的前景感觉到迷茫 xff0c 原因是因为某大学的教授去他们那里讲座 xff0c 然后说他们的学校物联网的专业已经没有招新了 xf
  • 面向单片机编程(一)- 单片机该怎么学

    面向单片机编程 xff08 一 xff09 单片机该怎么学 标签 单片机 C51 单片机该怎么学 xff1f 应该从哪里入手 xff1f 要怎么使用单片机实现一个小 xff08 大 xff09 目标 xff1f 下面我也来和大家一起分享一下
  • JAVA中String的底层解析

    JAVA中String 是Final类不能被继承 JAVA 对String的处理和一般Class有所不同 这文章主要是解释一下String的存储模式和java的字符串常量池的机制 xff0c 和几个涉及底层的引用问题解析 首先提出几个问题
  • 面向单片机编程(二)-开端,点亮第一个LED

    上一章中我们已经认识了单片机 xff0c 并且完成了开发环境的搭建 xff0c 这章中我们正式开始进入单片机编程的学习 xff0c 本章的学习目标是点亮一盏LED灯 一 创建一个Keil工程 1 双击运行Keil uVision5 xff0
  • ROS2——创建ROS2工作空间

    ROS2中的工作空间类似我们常说的概念 工程 xff0c 是我们在ROS中开发具体项目的空间 xff0c 所有功能包的源码 配置 编译都在该空间下完成 我们可能会同时开发多个项目 xff0c 就会产生多个工作空间 xff0c 所以工作空间之
  • C++ Primer (暂时完结)

    C 43 43 Primer C 43 43 预备知识泛型编程第二章 开始学习C 43 43 2 1 3 C 43 43 预处理器 和iostream 文件名称空间第二章 输出输入endl控制符换行符规范的书写格式c 43 43 源码风格
  • Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS)

    原文地址 xff1a Futaba S BUS controlled by mbed 代码地址 xff1a SBUS Library Introduction xff08 简介 xff09 The Futaba S BUS protocol