WFLY的WBUS(SBUS)信号探究和在iNAV飞控上的FS功能调试

事情的起因是iNAV从4.0版本开始不再支持PPM信号的接收机,而当时手头仅有的支持SBUS信号输出的接收机有WFLY的RD201W,心想还有机会,结果在设置飞控的FS功能时又犯难了,在发射机关闭的情况下,无论如何都没法让飞行模式跳转到预设的值上.为此,甚至还专门购买了新的ET16S遥控器…折腾到现在,也算是有所收获,在此记录分享.

1.SBUS协议介绍

首先,SBUS协议来自于Futaba,是采用电平反转的串口信号来搭载遥控通道数据,波特率是100000. 一个完整的信号包含25个字节,去除头尾字节和标志位字节,还剩下22个字节,因为它用11个二进制位来表达一个通道值,那么有22*8/11=16,可发送16个比例通道,另外还有两个开关量通道在标志位字节里头,所以最多支持18个通道.
这里的一个关键是在标志位字节,里面包含一个丢帧标志位和失控保护标志位,具体对应如下:
flag byte: [N/A N/A N/A N/A 失控保护 丢帧 ch18 ch17]
SBUS接收机通过标志位向飞控通知当前是否丢掉了遥控信号.

2.SBUS信号的解析

光靠猜没有用,看到信号才眼见为实.为此制作了一个SBUS信号解析模块.
硬件包含一个基于ATmega2560的Arduino开发板(以前做飞控用的),以及一个电平反向电路.SBUS信号通过反向后,连接到串口1.工作过程是单片机解析SBUS信号后,通过串口0打印前八个通道的信号和前面提到的标志位字节.
Arduino代码如下:
//————————–代码开始————————–
#define SBUS_SYNCBYTE 0x0F
#define SBUS_MID_OFFSET 988
static uint16_t sbusIndex=0;
static uint16_t sbus[25]={0};
volatile uint16_t rcValue[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500};
uint8_t spekFrameDone;
uint8_t i;
void setup() {
// initialize both serial ports:
Serial.begin(115200);
Serial1.begin(100000);
UCSR1C |= (1<<UPM11)|(1<<USBS1);
}
void loop() {
while(Serial1.available()){
int val = Serial1.read();
if(sbusIndex==0 && val != SBUS_SYNCBYTE)
continue;
sbus[sbusIndex++] = val;
if(sbusIndex==25){
sbusIndex=0;
//spekFrameFlags = 0x00;
rcValue[0] = ((sbus[1]|sbus[2]<< 8) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[1] = ((sbus[2]>>3|sbus[3]<<5) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[2] = ((sbus[3]>>6|sbus[4]<<2|sbus[5]<<10) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[3] = ((sbus[5]>>1|sbus[6]<<7) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[4] = ((sbus[6]>>4|sbus[7]<<4) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[5] = ((sbus[7]>>7|sbus[8]<<1|sbus[9]<<9) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[6] = ((sbus[9]>>2|sbus[10]<<6) & 0x07FF)/2+SBUS_MID_OFFSET;
rcValue[7] = ((sbus[10]>>5|sbus[11]<<3) & 0x07FF)/2+SBUS_MID_OFFSET;
spekFrameDone = 0x01;
}
}
if(spekFrameDone == 0x01){
spekFrameDone = 0x00;
for(i=0;i<8;i++)
{
Serial.print(rcValue[i]);
Serial.print(“\t”);
}
Serial.print(sbus[23]);
Serial.print(“\n”);
}
}
//————————–代码结束————————–
以上代码参考MWC飞控代码的SBUS信号解析部分.

3.信号分析

首先我用了天7+RD201W的组合,检测方式是首先正常工作,然后关闭发射机,强行进入失控保护状态,通过串口助手接收到的数据如下:
可以看到,在信号丢失以后,通道值跳转到预设的位置上,而这里的标志位字节是一个关键.
打印的是十进制,0不说了,随后:
中间的4 = 0b0000 0100;这个1表示 丢帧
后面的12 = 0b0000 1100;这两个1表示 失控保护+丢帧
到这里,可以说WFLY的WBUS协议和SBUS应该是完全一致的,只是出于叫法的考虑,WFLY把自己的这个兼容协议叫做了WBUS.
另外,还使用ET16S+RF209S的组合进行了测试,标志位字节的4和12和前面的结果一致,而有趣的是通道值似乎并没有跳转到预设的数值上(也可能是没有设置好,暂不展开).

4.iNAV飞控对SBUS信号的解析

以前面的天7+RD201W组合的结果为例,接入F405飞控(运行iNAV4.0固件).
首先,通过前面的解析模块,已经可以确信,在丢无线信号以后,接收机的通道值将跳转到预设的杆量上.而在配置软件中的RX界面,却看不到信号的变化,这里给人一个”接收机失控保护没有工作”的和前面矛盾的假象.
但是,飞控却被触发了FS事件!
结合对iNAV代码粗浅的浏览,可以得出一个推论,SBUS信号中的失控保护标志位告诉飞控”遥控信号已经丢失”,飞控因此将接收机的所有通道值无视,直接进入FS模式.
也就是说,传统的跳转到预设信号值的失控保护的做法,对连接SBUS接收机的iNAV飞控没有作用,为了能够实现可行的失控保护,只能在飞控里配置FS模式下的应对手段,例如返航/降落.
参考资料: