Arduino Leonardo + Can Bus Shield 를 통해서 CAN통신 데이터를 취득하고 출력하는것이 이번 장난의 목표이다.
그간 줄기차게 나를 괴롭히던 "init fail"은 Leonardo Can BUS로인해 해결이 된상태이며 초기화 성공 및 Sample 코드로 전송/수신 역시 문제없이 확인을 할 수 있었다.
(나중에 알았지만 Can Shiled를 레오에 쓰기위해서는 몇개의 핀을 조작했어야 했다. 해당 쉴드는 UNO보드에는 정상 작동 하였다 ㅠ.ㅠ , 시작은 우노로 하는것이 정답인것 같다)
또한 남는 Leonardo Can BUS를 ECU처럼 반응하게 만들어놓고 집안에서도 어느정도 테스트환경을 갖출수 있었다.(Ecu emulator 따윈 없으니 말이다..)
( Leonardo Can Bus )
CAN 통신의 자세한 프로토콜 스펙을 알면 좋겠지만 궂이 당장 알 필요는 없을것 같다.
중요한 CAN Device ID와 PID 와 오는 값을 어떻게 해석해야하는지 정도만 알면되니까 말이다.
우선 wiki 사이트를 통해서 공개된 CANII PID를 먼저 확인하고 출력테스트를 해보면 될것 같다.
Wiki CAN II PID information : http://en.wikipedia.org/wiki/OBD-II_PIDs
간단히 냉각수온도(PID=05)를 조회해보기로 하였다.
CAN ID에는 7DF 를 데이터는 8바이트로 "02 01 05 55 55 55 55 55" 를 전송했으며 값 또한 수신이 되었다.
수신값은 "000007E8 03 41 05 6D xx xx xx xx" 형태로 반환이 되었다.
05 | 1 | Engine coolant temperature | -40 | 215 | °C | A-40 |
Wiki Site에서 확인된 정보로는 값의 계산식은 A-40이다. A는 첫번째 값필드를 의미한다. 위 반환값에서는 6D를 의미한다.
이 6D에서 40을 빼면 냉각수 온도가 되는것이다. 계산을 해보면 69℃ 가 나온다
반환값중 앞에 7E8은 이 명령에 응답한 ECU가 보내준 리턴코드이다 통상 자신의 ID에서 8 혹은 9 를 더해서 보내준다.
7E8이므로 7DF+9 가 될것 같다. 그리고 몇가지 명령어를 보니 7E8 , 7E9 한명령어이지만 두개의 ID로 반환이되었다.
여러개의 ECU가 해당 명령어 동시 반응을 하는 걸로 추측이 된다. (실제 high-scanner로 보니 MD에는 18개의 ECU가 존재했다)
"03 41 05 6D 00 00 00 00" 중 03은 데이터의 길이다. 이후 나오는 31 05 6D 가 바로 유효한 값이라는 의미가 된다.
41은 전송할때 보냈던 명령어 코드 01 에 +40을 한 값이다. 전송시에 02 01 .. 식으로 보냈을때도 역시 02는 데이터의 길이 였으며 01이 바로 요구하는 정보의 형태를 말한다 05가 바로 PID였다.. 리턴값에서도 05를 볼수있다..
결국 리턴값에는 CANID(+8) 과 데이터의길이(03), 요구정보(+40), PID , 값~ 식으로 반환을 하는걸로 확인 된다.
근데 연료량(pid=52)를 전송해보니 값이 잘 오지 않았다. 몇가지 확인을 해보니 7DF 에 반응하지 않고 있었다.
리턴명령어중에 7E9가 있는걸보니 7E1이 해당 ID일것 같아서 찾았는데 빙고였다. 명령은
"7E1 02 01 05 55 55 55 55 55" 으로 변경되었고 테스트로 할 냉각수(05), RPM(0C), 속도(0D)의 반환을 확인하였다.
이제 들어온 값을 읽어서 CNK-HUD에 출력하는 것이 1차 목표에 남은 일인 것 같다.
CNK-HUD를 잘 이용해야 할 것 같다.
'Information > MICOM & SBC' 카테고리의 다른 글
아두이노(Arduino) 부트로더 기록하기.. (0) | 2014.10.05 |
---|---|
아두이노(Arduino) 만들어 볼까? (자작아두이노) (6) | 2014.10.05 |
아두이노(arduino) Can Bus Shield 초기화 성공 (0) | 2014.10.04 |
아두이노(arduino) Can Leonardo 보드 구매 (0) | 2014.10.04 |
아두이노(Arduino)-Leonardo 에서 CAN Shield 를 사용해보자 (1) | 2014.10.03 |