跳到主要内容

单线 FlySky IBus 遥测

现在可在同一 FC UART 的单个引脚上组合 Serial RX 和 IBus 遥测。

以下接法将 FS-iA6B 接收机的 IBus 端口通过一个二极管和一个电阻组合:

+---------+
| FS-iA6B |
| |
| Ser RX |---|<---\ +------------+
| | | | FC |
| Sensor |---[R]--*-------| Uart TX |
+---------+ +------------+

R = 10Kohm,二极管为 1N4148 或同类器件。

注意(2018-07-27):部分情况下串联电阻阻值过大,降低至 1Kohm 可能获得更好结果。

图示

UART TXRX 通道均被使用,因此不能将备用引脚再用作其他设备的 RX。

将串口配置如下,即可在同一端口使用 Serial RX 和 IBus 遥测:

serial 1 4160 115200 57600 115200 115200

仍可像以前一样,将 Serial RX 和 IBus 遥测运行在两个 UART 上,例如:

serial 1 64 115200 57600 0 115200
serial 2 4096 115200 57600 115200 115200

信号波形如下: 图示

技术细节

IBus Telemetry 是半双工串行协议,TXRX 共用一条线路,以固定 115200 波特率运行。IBus 接收机每 7ms 发起一次查询。IBus 支持多个传感器菊花链连接;该功能已实现但尚未测试,因为作者没有可供测试的其他传感器。

_______
/ \ /---------\
| STM32 |--UART TX-->[Bi-directional @ 115200 baud]\<--| IBUS RX |
| uC |--UART RX--x[not connected] \---------/
\_______/

协议由 IBus 接收机驱动,目前为 IA6B 或 IA10。全部 IBus 流量均为小端字节序。首先,IBus 接收机查询总线上的传感器:

/---------\
| IBUS RX | > Hello sensor at address 1, are you there?
\---------/ [ 0x04, 0x81, 0x7A, 0xFF ]

0x04 - 数据包长度
0x81 - 位 7-4:命令(1000 = 发现传感器)
位 3-0:地址(0001 = 地址 1)
0x7A, 0xFF - 校验和,0xFFFF - (0x04 + 0x81)

由于支持菊花链,该问候包也会告知传感器其地址(链中的位置)。IBus 有 16 个地址,但地址 0 保留给接收机内部测得的电压,因此剩余 0x10xF

传感器获知地址后,只需回显该消息:

/--------\
Yes, i'm here, hello! < | Sensor |
[ 0x04, 0x81, 0x7A, 0xFF ] \--------/

0x04, 0x81, 0x7A, 0xFF - 回显接收的数据包

收到响应后,IBus 接收机请求传感器类型:

/---------\
| IBUS RX | > Sensor at address 1, what type are you?
\---------/ [ 0x04, 0x91, 0x6A, 0xFF ]

0x04 - 数据包长度
0x91 - 位 7-4:命令(1001 = 请求传感器类型)
位 3-0:地址(0001 = 地址 1)
0x6A, 0xFF - 校验和,0xFFFF - (0x04 + 0x91)

传感器以其详细信息响应:

/--------\
Yes, i'm here, hello! < | Sensor |
[ 0x06 0x91 0x00 0x02 0x66 0xFF ] \--------/

0x06 - 数据包长度
0x91 - 位 7-4:命令(1001 = 请求传感器类型)
位 3-0:地址(0001 = 地址 1)
0x00 - 测量类型(0 = 内部电压)
0x02 - 未知,始终为 0x02
0x66, 0xFF - 校验和,0xFFFF - (0x06 + 0x91 + 0x00 + 0x02)

IBus 接收机继续查询下一个地址;在第一个无响应地址处停止发现。

随后,IBus 接收机持续循环,向每个已发现传感器请求测量值:

/---------\
| IBUS RX | > Sensor at address 1, please send your measurement
\---------/ [ 0x04, 0xA1, 0x5A, 0xFF ]

0x04 - 数据包长度
0xA1 - 位 7-4:命令(1010 = 请求测量)
位 3-0:地址(0001 = 地址 1)
0x5A, 0xFF - 校验和,0xFFFF - (0x04 + 0xA1)

/--------\
I'm reading 0 volts < | Sensor |
[ 0x06 0xA1 0x00 0x00 0x5E 0xFF ] \--------/

0x06 - 数据包长度
0xA1 - 位 7-4:命令(1010 = 请求测量)
位 3-0:地址(0001 = 地址 1)
0x00, 0x00 - 测量值
0x58, 0xFF - 校验和,0xFFFF - (0x06 + 0xA1 + 0x00 + 0x00)

由于 IBus 可表示的遥测数据类型有限,Betaflight 会发送可表示的全部数据;当前为电压、温度和油门值。