2016년 5월 23일 월요일

OBD-II (On-Board Diagnostics) 로 자동차 정보 보기 - 2편 (Arduino OBD 탐구)

Freematics 사의 OBD-II Adpater 는 OBD-II PIDs 중에 Mode 01 을 parsing 할 수 있게 해 준다. github 에서 설명하는 PIDs 는 이렇다.
https://github.com/stanleyhuangyc/ArduinoOBD
OBD-II PIDs 외에도 GPS, Accelerometer, SD Logger, Display 를 한 제품군 (Kit) 으로 만들어서 제공하는 것이 이 회사의 특징이다. 그래서 Display 와 GPS 관련 제품도 같이 판매하고 있다.
하지만 난 OBD-II 만 있어도 충분한데, github 에는 obd 만을 사용할 예제는 찾기 힘들다.

OBD-II 예제는 2가지로 나뉘는데, 적은 메모리, 작은 Display Size 를 위한 'Nano logger' 와 큰 메모리 좀 더 큰 Display Size 를 위한 'Mega logger' 가 그것이다. 이름에서 예상 가능하지만 arduino nano 와 mega 를 위해 2가지 version 이 있는 것이다. Multi LCD 라는 library 도 같이 포함되어 있는데 이 회사에서 판매하는 다양한 크기의 display 를 모두 지원하는 것 처럼 기술되어 있지만 nano logger 에 한가지 모델 (1.3인치 I2C OLED Module), mega logger 에 한가지 모델 (3.5인치 TFT Touch LCD) 만 동작하게 되어 있다.

Display 는 구매할 맘조차 없었는데 오로지 배송비 아까워서 구매했던 2.2 인치 TFT LCD 로는 아무것도 할 수가 없었다. 뭔가 배가 아프고 약간의 오기가 발동하여 코드를 고쳐서 써 보기로 했다.
arduino uno 에 2.2 인치 TFT LCD 를 달아서 작업을 시작했다.
github 에서 사용할 수 없는 조합 (uno + 2.2 TFT LCD)
우선 nano logger 코드를 수정하기 시작했다.
config.h 파일에 보면 LCD model 을 선택하는 코드가 있다.

/**************************************
* Choose LCD model here
**************************************/
+ LCD_ILI9341 lcd;
//LCD_SSD1289 lcd;
//LCD_SH1106 lcd;
//LCD_SSD1306 lcd;
//LCD_Null lcd;

여기에 2.2 TFT LCD 에 해당하는 IL19341 을 추가해 줬다.
그리고 uno 에 업로드 해서 확인하면 이렇게 나온다.
Display module type 만 바꿔서 올려본 obd
N 과 OX, AX ???
이것이 무엇일까? 코드를 살펴보니 'lcd.println("NanoLogger");' 의 N 이었다.
O 는 'OBD', A 는 'ACC' 였다. 전부 첫글자만 나오도 다 짤리는 현상이 있는 것이다.

이 문제를 해결하기 위해 IL19341 의 write 코드를 좀 살펴봤더니,

ILI9341.cpp
....
382 size_t LCD_ILI9341::write(uint8_t c)
383 {
384     /*if (c == '\n') {
385         m_y += (m_font + 1) << 3;
386         return 0;
387     } else if (c == '\r') {
388         m_x = 0;
389         return 0;


390     }*/
....

개행문자를 처리하는 저 코드 때문에 무조건 return 해 버리고 있었다. 과감히 주석처리를 했다.
그랬더니~ 아주 잘 나왔다.
bug 수정하고 잘 동작하는 모습
OBD 'X' 라고 나오는 이유는 OBD 를 연결하지 않았기 때문에 data 가 들어오지 않는 다는 의미이다. 단숨에 주차장으로 달려가서 차와 연결해 봤다.
Nano logger 동작 모습
1.3 인치에서 보여주기 위한 nano logger 이기 때문에 속도, RPM, 온도 같은 간단한 정보만 보여주지만 주행해 보니 잘 동작한다. 아.. 주의 할 점은 UART 로 동작 시키기 위해 TX/RX 를 직접 연결 했다.

자.. 내친 김에 'Mega logger' 까지 동작 시켜 볼까!
음... 의욕은 좋았는데 막상 시작하니 손볼 곳이 많았다. 기본적으로 Mega 메모리 size 에 맞춰 작성된 코드를 최대한 다이어트 해야 했다. 불필요한 image 출력을 줄이고 GPS 및 기타 사용하지 않는 코드를 모두 제거 했는데도 SD 카드 logger 는 Enable 시킬 수 없었다. 뭐.. logging 할 생각은 없었으니 아쉽지만 disable 시켜 버리고 Display type 도 바꿔 준 뒤 시연을 해 봤다.
Mega logger 를 수정해서 실행한 모습
확실히 nano logger 보다는 추가적인 data 를 확인할 수 있다.

이로써 github 의 코드를 동작시키는데 무리없는 환경까지 구축을 했다. 그런데 항상 그렇지만 이제 이걸로 뭘 할지 결정을 해야 하는데, 이번에도 번쩍이는 아이디어는 떠오르지 않는다. 이것도 며칠 사용해 보면서 정리해 나가야 겠다.

댓글 없음: