이번 동아리 전시회 때 로봇축구의 팀원으로 RF 통신을 해보았다.
RF 모듈은 Radiometrix(
http://www.radiometrix.co.uk )의 BIM-433모델을 사용했다. RF 통신으로 흔히 사용되는 모듈로 우리나라에서도 흔히 쓰이는 듯하다.
'BIM-433-40'은 Euro Version이고, 'BIM-418-40'은 UK Version이다. 기능은 똑같아서 쌍으로 사용하면 된다.
기본적으로 컴퓨터 Serial Port에 연결하여 송신하고, 로봇에서 수신하는 방식을 사용하기로 했다. 단방향은 전환 시간이라든지 노이즈가 가장 덜 타기 때문에 사용이 쉽다고 한다.
송신부를 회로를 보면 'Transmitter Enable'로 설정되어 항상 데이터를 전송하고 있다. 그래서 수신부의 'Carrier Detect' 핀을 찍어보면 항상 Low로 떨어져 있다.
"RS232" Serial Data 전송 방법은 데이터시트 뒷부분에 나오나 Radiometrix사이트 App note에 자세히 나온다.
http://www.radiometrix.co.uk/apps/apnt101.htm 실제 데이터를 전송하기 전에 아래의 순서로 헤더 코드를 붙여준다.
Preamble -> UART Sync -> Start Code
Preamble - '0x55(고주파 데이터)'를 대략 3ms 이상 전송한다.
UART Sync - '0xFF'를 1, 2 바이트 전송한다.
Start Code - 고유한 시작코드를 전송한다. 수신부에서는 이 신호를 기점으로 실제 데이터를 받을 준비를 한다.
RF 통신의 특성상 데이터가 저주파성분(0xFF나 0x00)을 띨 때 노이즈가 생길 확률이 높아진다. 따라서 0(mark), 1(space) 비트 비율이 50:50이 되도록 맞추길 강조한다. 그래서 데이터시트에서는 3가지의 인코딩 방법을 추가로 설명해 주었다. 총 전송 데이터의 양이 늘어나는 대신 에러율이 적어 속도를 높일 수 있다.
일단 로봇축구에서는 많은 데이터나 높은 속도가 요구되지 않기 때문에 인코딩 방법은 추가로 사용하지 않았다.
CPU로 사용된 TMS320F2808의 SCI 핀과 RF 모듈을 연결하였으나 문제가 발생했다. CPU의 SCI핀은 기본 HIGH 상태에서 LOW로 떨어지는 시점을 시작으로 인식했으나, BIM-433의 RXD(RF->CPU)핀은 기본이 LOW였다. 신호의 극성은 맞으나 초기상태가 틀려 문제가 발생했다.
RXD Pin을 풀업해도 BIM-433의 내부저항으로 신호가 풀업이 되는 것이 아니고 중간에 뜨게 된다. 그래서 버퍼를 사용하려 했느나 'Enable'을 연결할 핀이 없어 못하는 중에 동아리 선배분이 도와주었다^^.
문제점은 CPU(TMS320F2808)에서 SCI(UART) 에러 처리를 하지 않았던 것. 첫 비트가 HIGH->LOW가 아니라서 Rx 오류가 발생하게 되는 데, 이 오류를
클리어 해주면 다음 데이터 부터는 정상적으로 받을 수 있다는 것이다. 즉, Rx 에러 비트를 클리어해줌으로서 첫 바이트는 오류로 버리고 다음 바이트부터 데이터를 정상적으로 받을 수 있었다.
또한 PC와 CPU간의 통신 시 데이터 형을 구조체로 선언하여 바이트 오더와 정렬을 하여 간편하게 받아오고 싶었으나, TMS320F2808의 데이터 크기와 메모리 구조가 PC와 차이점이 커서 결국 변수 하나하나 넣어주는 방식을 사용하게 되었다. TMS320F2808에서 sizeof의 크기가 일반적인 것과 달라 고생했다. 결국 하윤이형이 찾아 줘서 넘어갔다.
Note: TMS320C28x Byte Is 16 Bits
By ANSI/ISO C definition, the sizeof operator yields the number of bytes required
to store an object. ANSI/ISO further stipulates that when sizeof is applied to char,
the result is 1. Since the TMS320C28x char is 16 bits (to make it separately
addressable), a byte is also 16 bits. This yields results you may not expect; for
example, size of (int) = = 1 (not 2). TMS320C28x bytes and words are equivalent
(16 bits).
Trackback URL : http://yarmini.com/blog/suneung/trackback/95
완전초딩센스!!!