티스토리 뷰
앞의 글에서 설명한 내용까지 문제없이 진행되었으면, 이제는 수신된 데이터 중에서 필요한 부분만 추출하여 원하는 방법으로 데이터를 처리해 주면 된다.
AK8975 data sheet 문서에 나오는 레지스터 설명은 다음과 같다.
이 중에서 실제 필요한 데이터는 0x03 ~ 0x08까지의 X,Y,Z 축에 대한 데이터이다. 따라서 이 부분만 화면에 출력해 주면 될것이다. 실제로는 이들 세가지 값을 가지고 어느 방향을 가르키는지 방위각을 계산하여야 하지만 그 부분은 지금 다루고 있는 통신과는 다른 주제이므로 여기에서는 생략하기로 하겠다.
X,Y,Z 레지스터 값은 16비트 값으로 되어 있고, little endian으로 제공된다.
이러한 정보를 가지고 컴퓨터 프로그램에서 X,Y,Z 값을 출력해 보도록 하겠다.
AK8975의 결과를 출력하기 위한 CompassPane을 만들었고, 수신된 데이터를 보여지게하는 updateInfo라는 method를 만들었다.
Flag와 CRC 검사를 마친 데이터를 디버거 창에도 출력하고 CompassPane으로도 전달해주는 것을 볼 수 있다. CompassPane으로 전달할 때에는 데이터의 CRC값이 0일때만, 즉, 오류가 없는 패킷에 대해서만 전달해 준다.
빨간색 박스로 표시된 X축에 대한 데이터가 제대로 출력되는 것을 볼 수 있다. 물론 Y,Z값에 대해서도 제대로 출력되었다.
AK8975의 데이터에 대한 패킷 통신이 제대로 되는 것을 확인하였으므로 남은 두개의 센서값에 대한 데이터도 처리하는 기능을 추가해 보도록 하겠다.
지금까지는 계속 AK8975 하나의 센서에 대해서만 데이터를 처리하였기 때문에 당연히 컴퓨터에서 수신된 데이터는 AK8975의 데이터인것을 알고 있었다. 하지만 이제 세개의 센서로부터 들어오는 데이터를 수신하였을때 컴퓨터에서는 어떤 데이터 패킷이 어떤 센서의 데이터 값인지 구분할 수 있을까?
이 문제를 해결하기 위하여 데이터 앞 부분에 어떤 센서의 데이터 패킷인지 알려주면 좋을것 같다. HDLC 프로토콜 포맷의 Start Flag 바로 다음에 이어지는 Address 필드가 이런 역할을 하기 위해서 사용된다고 보면 된다.
그럼 이제, 각각의 센서를 구별할 수 있도록 message ID 값을 하나씩 지정하도록 하겠다. 편의상 센서 이름에 나오는 숫자 부분을 ID로 설정하도록 하겠다.
즉, AK8975는 8975를 할당하고 BMA150은 150을, ITG3200은 3200을 각각 할당하도록 하겠다. ID값이 255보다 큰값이 있으므로 message ID 필드는 2바이트 크기를 할당하여야 된다.
우선, 데이터를 보내주는 AVR 부터 코드를 수정해 보도록 하겠다.
5,10,15번줄을 자세히 보면 센서에서부터 읽어 오는 데이터를 data[] 배열의 세번째 위치에서부터 쓰여지도록 하는것을 볼 수 있다. data[0]과 data[1]에는 각각의 센서들의 ID값을 little endian 방식으로 넣어주도록 하였다.
이렇게 했을때 컴퓨터 프로그램에서는 어떻게 수신하였는지 확인해 보도록 하자.
위 그림의 빨간색 박스가 각 센서들의 ID값들이다. 8975는 헥사값으로 0x230F이고, 150은 0x96이다. 3200은 0x0C80이므로 차례대로 잘 수신된것을 확인할 수 있다.
이 Message ID값을 읽어 어떤 센서의 데이터 패킷인지 구별할 수 있으므로 각각의 센서값들을 분리하여 출력해 보도록 하겠다.
각각의 센서들 데이터들이 잘 분리되어 표시되는 것을 확인할 수 있다.
'심화' 카테고리의 다른 글
Linker Script - 링커 스크립트 (3) | 2016.10.01 |
---|---|
패킷 통신 - Request/Reply (0) | 2016.08.12 |
패킷 통신 - CRC (2) | 2016.08.11 |
패킷 통신 - Start/Stop flag (7) | 2016.08.10 |
패킷 통신 - 바이너리 데이터(Binary data) (0) | 2016.08.03 |