单线 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 TX 和 RX 通道均被使用,因此不能将备用引脚再用作其他设备的 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 是半双工串行协议,TX 和 RX 共用一条线路,以固定 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 保留给接收机内部测得的电压,因此剩余 0x1 至 0xF。
传感器获知地址后,只需回显该消息:
/--------\
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 会发送可表示的全部数据;当前为电压、温度和油门值。