Drone FW using STM32CubeIDE/4. Transmitter_Receiver

[Drone Firmware using STM32CubeIDE] 4-1. i-Bus Protocol

anhy0923 2021. 8. 2. 17:04

 i-Bus 프로토콜은 조종기의 조작 정보가 담긴 FlySky 사의 자체 통신 규약이다. i-Bus 프로토콜은 정식 문서가 없어서 설명하는 내용이 100% 정확한 내용은 아니다. 강의에서 배운 내용을 토대로 작성해보겠다.

 

 i-Bus Message Frame Structure

 i-Bus 메시지의 프레임 구조는 다음과 같다.

i-Bus Message Frame Structure

  • 모든 메시지 프레임은 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진수) 코드를 분석하면 다음과 같다.

 

i-Bus Channel Data Binary Structure

  • 한 채널 정보 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 메시지를 다룰 때와 거의 비슷하다. 

  1. SYNC CHAR 검사
    • Byte0, Byte1이 각각 0x20 0x40 인지 검사
  2. 메시지 수신
    • Byte31 까지 모든 메시지 프레임을 수신하여 임시 버퍼에 저장
  3. Checksum 검사
    • Byte0 ~ Byte29 까지 체크섬 계산
    • 계산한 체크섬 LSB와 Byte30 비교
    • 계산한 체크섬 MSB와 Byte31 비교 
  4. 구조체 변수에 파싱
    • Byte2 ~ Byte29 -> 구조체 변수에 파싱