模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

904查看 | 1回复

遥控器协议S-BUS 来自知乎沈阳无距科技

[复制链接]
发表于 2022-10-27 11:52:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
无人机中级篇:第十讲:遥控器协议S-BUS 遥控器协议S-BUS 来自知乎沈阳无距科技 无人机,飞控,遥控器,F4,PIX 作者:杰罗姆 6035
沈阳无距科技

工业级无人机的中国名片






今天我们来一起学习遥控器常见通讯协议S-BUS的解析方法。S-BUS其实是一种串口通信协议,采用100000的波特率,数据位点8bits,停止位点2bits,偶效验,即8E2的串口通信。但是S-BUS采用的是反向电平传输,也就是说,在S-BUS的发送端高低电平是反向的,协议中的所有高电平都被转换成低电平,协议中的所有低电平都被转换成高电平。所以在S-BUS的接收端需要增加一个高低电平反向器来进行电平反转,如下图:

遥控器协议S-BUS 来自知乎沈阳无距科技 无人机,飞控,遥控器,F4,PIX 作者:杰罗姆 5035

实际上,我们使用的Pixhawk飞控板上已经集成了这个反向器,所以对于使用Pixhawk的用户来说,可以忽略掉S-BUS的反向机制,但是对于其它没有集成S-BUS反向器的硬件平台上,就需要使用者增加一个反向器来处理数据,否则将无法读取协议数据。
另外,100000的波特率并不是标准的波特率,这在一些只支持标准波特率的系统上无法实现,好在Nuttx支持自定义的波特率,我们可以通过对设备节点的配置实现波特率的设定。在Pixhawk IO上,S-BUS总线的设备节点为/dev/ttyS2,于是我们可以编写一个程序对这个串口节点的波特率进行配置:

遥控器协议S-BUS 来自知乎沈阳无距科技 无人机,飞控,遥控器,F4,PIX 作者:杰罗姆 9603
设置好波特率就可以对标准文件设备进行读取了,也就是通过read()函数来读取串口当中的数据。S-BUS协议在传输过程中还有两种不同的传输模式:
1)高速模式:数据发送周期为4ms,发送频率为250Hz;
2)低速模式:数据发送周期为14ms,发送频率为71.4Hz。
S-BUS协议数据格式如下:

遥控器协议S-BUS 来自知乎沈阳无距科技 无人机,飞控,遥控器,F4,PIX 作者:杰罗姆 7375

需要注意的是S-BUS中用11bits来表示一个遥控器通道的数值,22个字节就可以表示16通道(8 × 22 = 11 ×16)。11个bit可以表示的数值范围为0~2047。例如:我们的遥控器前4个通道数值分别为200、300、400和500,其它通道都为0。它们的二进制数据分别为:
200: 000 1100 1000
300: 001 0010 1100
400: 001 1001 0000
500: 001 1111 0100
其它通道都为:0
S-BUS的16个遥控器通道,每一个通道用11个bit表示,那么这16个通道的二进制数值拼接起来则为:
0001 1001 0000 0100 1011 0000 1100 1000 0001 1111 0100
[0F] 19 04 B0 C8 1F 40 …… 00 [00]
实际上遥控器发送每一个通道的数值在200~1800之间,用来表示遥控器通道的所有数值。但是PX4飞控程序中有效的通道值范围通常是1000~2000,所以就需要将原始数值进行一次转换。接下来我们就来编写S-BUS协议解析的驱动程序:

遥控器协议S-BUS 来自知乎沈阳无距科技 无人机,飞控,遥控器,F4,PIX 作者:杰罗姆 5411
当然,我们需要在驱动程序中启动一个线程来读取并解析S-BUS协议,此进程将使用循环的方式调用int sbus_read_parse(int _fd, uint16_t *val)函数,之后将val数组中的内容使用input_rc.msg消息发布到uORB总线上为其它进程所使用。




发表于 2022-11-24 20:00:20 | 显示全部楼层
看起来高大上,牛蛙牛蛙
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|关于模吧|APP下载|广告报价|手机版|企业会员|商城入驻|联系我们|模吧 ( 黔ICP备2022002348号-1 )

© 2013-2020 Moz8.com 模吧,玩出精彩!