ELMduion 라이브러리 이해 하는 가장 빠른 방법은, ELM327 명령을 보내고 응답 받는 간단한 터미널 활용하고, ESP-PRG 연결해서 코드가 실행되는 것을 하나씩 따라 가는 것입니다.
간단한 터미널 예제는 이미 있고, 부분 수정하면 즉시 사용 가능합니다.
(참고예제) https://github.com/PowerBroker2/ELMduino/blob/master/examples/ESP8266_test/ESP8266_test.ino
이제 OBD 명령어(ELM327칩) 전달하고 어떻게 실행되는지 학습할 수 있는 도구가 하나 생겼습니다.
주석문에 나와있는 명령을 하나씩 실행해 보면 엔진 Data 잘 불러오는 것을 확인할 수 있습니다.
이제 코드 학습할 준비가 모두되었습니다.
ELMduino 라이브러리 경우 2개의 파일로 구성됩니다.
참조 :(ELMduino 소스코드) https://github.com/PowerBroker2/ELMduino/blob/master/src/ELMduino.cpp
1)ELMduino.cpp : 2870라인
2)ELMduino.h : 435라인
처음부터 코드 분석(참조)하겠다고 시도했는데, 그저 머리가 멍할뿐이라...
명령을 보내고 응답 받는 과정을 따라가면 핵심 동작을 이해 하는 방향으로 정했습니다.
그동안 준비해 두었던, ESP-PROG나 ESP-32 S3 활용했으며,
아래 ESP32_test.ino의 begin()함수가 첫 관문이며 이부분에 많은 정보가 있습니다.
begin()는 initializeELM()를 불러와서 초기화 혹은 필요한 기능을 셋팅합니다.
시작 및 초기화 과정에 대한 코드 분석 → begin() 필요 파라메터는 총 6개
;6개 파라메터 필요하지만 3개만 입력함.(나머지는 default값 사용)
시작 및 초기화 과정에 대한 코드 분석 → begin()내부에 InitializeELM() 호출
ELMduino.h 파일에 정의된 ELM327 명령 변수(우측 점선내용) 활용하여 sendCommand_Blocking() : (동기식 함수임)
로 명령을 보냅니다.
참고) ELM327 AT 명령 목록 ( https://www.sparkfun.com/datasheets/Widgets/ELM327_AT_Commands.pdf )
첨부 내용 보면, 1.4b 버전 명령이 최상위로 추정컨데 ELM327 v.1.5 기준으로 라이브러리 만든것 같습니다.
돌이켜보니, ELM327 v1.5만 되어도 푸조차량 엔진에 접근가능하므로 높은 버전에 현혹되어 비싸게 구입할 필요없습니다.
오히려 주의할 것은 버전이 높아도 일부 AT 명령이 동작하지 않는 불량 제품입니다.
이제 나머지 함수(총22개)를 하나씩 하나씩 추적해 나갑니다.
실제로는 훨씬 많지만, 대부분은 중복형태(특정 엔진 data를 종류별로 요청하는 형식)이므로 하나만 이해하면 대부분 공통으로 사용 가능합니다.
내용이 너무 많아서 여기서는 자세하게 다루지 않겠지만,
돌이켜보면, 인내심(?) 가지고 하나씩 접근하면서 이해 했던것 같습니다.
(아래 함수 목록 정도만 집중적으로 이해하면 대부분 이해가 되었던 것으로 기억합니다.)
-bool begin(Stream& stream, const bool& debug = false, const uint16_t& timeout = 1000, const char& protocol = '0', const uint16_t& payloadLen = 40, const byte& dataTimeout = 0);
-bool initializeELM(const char& protocol = '0', const byte& dataTimeout = 0);
-void flushInputBuff();
-uint64_t findResponse();
-bool queryPID(const uint8_t& service, const uint16_t& pid, const uint8_t& num_responses = 1);
-bool queryPID(char queryStr[]);
-float processPID(const uint8_t& service, const uint16_t& pid, const uint8_t& num_responses, const uint8_t& numExpectedBytes, const float& scaleFactor = 1, const float& bias = 0);
-void sendCommand(const char *cmd);
-int8_t sendCommand_Blocking(const char *cmd);
-int8_t get_response();
-bool timeout();
-float conditionResponse(const uint8_t& numExpectedBytes, const float& scaleFactor = 1, const float& bias = 0);
아래처럼 하나씩 정리하면서 모두 소화하는데, 2주정도 걸린듯합니다.
그래도 처음 시작했을때 보다는 관련 지식들 점점 쌓여 가는 것이 실감납니다.
<다음편에 계속..>
'Peugeot OBD app 만들기 도전' 카테고리의 다른 글
(1단계 최종)Arduino-psa-diag C++ 활용 ELM327 명령 송수신(2)-5 (2) | 2024.01.08 |
---|---|
(1단계)오픈 소스 :OBD2 C++ 활용 ELM327 명령 보내고 받기(2)-4 (0) | 2024.01.07 |
(1단계)OBDII open 소스 코드 분석 : ELMduino BT/WiFi 통신 문제(2)-2 (0) | 2024.01.05 |
(1단계)OBD open 소스 분석(Mac mini): esp32-S3 디버깅 후기(2)-1 (1) | 2024.01.04 |
(1단계)OBDII open 소스 코드 분석 : ELMduino 사례(2) (1) | 2024.01.03 |