[Drone Firmware using STM32CubeIDE] 4-1. i-Bus Protocol
i-Bus 프로토콜은 조종기의 조작 정보가 담긴 FlySky 사의 자체 통신 규약이다. i-Bus 프로토콜은 정식 문서가 없어서 설명하는 내용이 100% 정확한 내용은 아니다. 강의에서 배운 내용을 토대로 작성해보겠다.
i-Bus Message Frame Structure
i-Bus 메시지의 프레임 구조는 다음과 같다.
- 모든 메시지 프레임은 2byte의 SYNC CHAR(헤더)로 시작 : 0x20 0x40
- 그 후 CH1 ~ CH14까지의 데이터가 각각 2byte씩 Little Endian으로 전송
- 마지막 2byte는 체크섬
- 각 채널의 데이터는 2byte 부호없는 정수 형태로 표현 (unsigned short)
- 체크섬은 0xffff 에서 CHKSUM 2byte를 제외하고 SYNC CHAR을 포함한 모든 데이터를 뺀 결과
- 메시지의 길이는 전체 32byte로 고정
- 사용되지 않는 채널의 데이터는 0xDC 0x05로 고정
- UART Parameter는 8N1-115200 변경 불가.
i-Bus 메시지 구조 상, 송신기와 수신기의 채널 수와 상관없이 14채널 정보데이터가 수신된다. 사용할 송신기(조종기)는 FlySky사의 FS-i6 으로 최대 6채널 사용이 가능하다. (펌웨어 업데이트 시, 10ch 까지 사용 가능) 따라서 i-Bus 메시지에서 CH1부터 CH6를 제외한 CH7~CH14의 데이터는 "0xDC 0x05" 로 고정되어 전송된다.
i-Bus Channel Data Binary Structure
i-Bus 메시지 구조에서 각 채널 데이터의 바이너리(2진수) 코드를 분석하면 다음과 같다.
- 한 채널 정보 16비트는 4비트 상태 데이터와 12비트 조작 데이터로 구분됨.
- 하위 12비트는 짐벌 조작량 (0~2047까지의 정수 중 기본 1000~2000 사용)
- 상위 4비트는 수신기의 상태를 나타내는 플래그 비트 -> Fail-safe 상태가 표시됨.
i-Bus Checksum Calculation
i-Bus 메시지의 체크섬 계산방식은 UBX 메시지의 방식과는 다르다. i-Bus 메시지의 체크섬은 0xffff에서 SYNC CHAR과 채널 데이터를 Byte 단위로 모두 빼는 방식으로 계산한다. 또한 체크섬 변수는 16bit 부호없는 정수, 즉 unsigned short (2byte)형 이다.
체크섬 계산 알고리즘은 다음과 같다.
unsigned char iBus-message[32];
unsigned short chksum = 0xffff;
for (int i=0; i<30; i++) {
chksum =- iBus-message[i];
}
실제로 i-Bus 메시지를 받아와서 받아온 메시지로 직접 체크섬 계산을 해보면 다음과 같다.
== 추후 작성 예정 ==
FS-i6 송신기 Channel 설정
FlySky사의 "FS-i6" 송신기는 사용 가능한 최대 채널이 6채널이다. 6채널 중 4채널은 디폴트로 송신기의 방향 컨트롤 스틱 바로 설정되어 있다. "Sticks mode"에서 각 스틱의 채널의 변경이 가능하다. 나머지 2개의 채널은 "Aux. channels"에서 임의로 설정하면 된다. FS-i6에는 스틱 바 외에 채널을 설정할 수 있는 키가 몇 개 있는데, 4개의 스위치 바와 송신기 중앙의 2개의 가변저항이 있다. 그 중 Ch5를 스위치 A, Ch6를 스위치 B로 설정하였다. FS-i6의 총 6개의 채널에 대한 정보는 다음과 같다.
Process for i-Bus Message Reception and Parsing
메시지를 수신하고 파싱하는 과정은 UBX 메시지를 다룰 때와 거의 비슷하다.
- SYNC CHAR 검사
- Byte0, Byte1이 각각 0x20 0x40 인지 검사
- 메시지 수신
- Byte31 까지 모든 메시지 프레임을 수신하여 임시 버퍼에 저장
- Checksum 검사
- Byte0 ~ Byte29 까지 체크섬 계산
- 계산한 체크섬 LSB와 Byte30 비교
- 계산한 체크섬 MSB와 Byte31 비교
- 구조체 변수에 파싱
- Byte2 ~ Byte29 -> 구조체 변수에 파싱