자동차의 ECU와 캔통신을 해서 속도와 RPM등을 추출하기 위한 OBD2 프로토콜에 대해서 알아보기!(녹칸다의 CAN통신 시즌2 5편)
프로그래밍/캔통신시즌2(SN65HVD230) 2023. 12. 20. 23:13
https://youtube.com/live/zpZL-lgc9xA
자동차의 ECU와 캔통신을 해서 속도와 RPM등을 추출하기 위한 OBD2 프로토콜에 대해서 알아보기!(녹칸다의 CAN통신 시즌2 5편)
녹칸다의 캔통신 시즌2 시리즈이다!
ESP32보드를 이용해서 CAN통신을 해보는 내용이다!
(시즌1에서는 아두이노 우노와 MCP2515를 활용했다)
시즌2에서 사용할 CAN통신 모듈은 SN65HVD230이다.
아두이노 우노를 활용하지 않고 ESP32보드를 활용하는 이유는 SN65HVD230모듈이 3.3V 로직레벨로 통신을 하기 때문이다.
레벨컨버터를 활용하면 되지만 연결하는게 복잡해지고 그럴바에는 ESP32나 ESP8266을 활용하는게 더 좋아 보였다.
(나중에 IoT관련 예제로 응용도 가능할 것 같음!)
녹칸다의 캔통신 시즌2의 최종목표는 자동차와 통신하는 것이다.
자동차에는 다양한 제어시스템이 있고 제어시스템간 CAN BUS로 통신을 한다.
OBD2 프로토콜을 이용해서 차량내 정보를 아두이노에서 다양하게 활용할 수 있다.
결국 CAN통신을 알아야 그것이 가능한 것이다.
크게보면 아래와 같은 목차가 있다.
(1) ESP32보드간 1:1단방향 통신
(2) ESP32보드간 1:1양방향 통신(반이중방식)
(3) ESP32보드간 1:N양방향 통신
(4) 컴퓨터와 ESP32보드간 1:N양방향 통신
(5) ESP32와 자동차간 통신(자동차쪽은 OBD2 시뮬레이터 활용)
(주의!) 녹칸다는 OBD2를 접근하는 방법에 대해서 공부해보자는 것이지 실제 자동차에 작동하는 코드를 공유하는것이 아님!
데이터를 잘못 설정하게 되면 자동차 내부에 문제를 야기할 수 있기 때문에 정확히 이해를 하고 접근해야함!
그러므로 실제 자동차에 연결해서 발생할 수 있거나 이미 발생한 문제는 스스로 해결하기 바람!
이번편은 제일 마지막 내용인 자동차와 CAN통신을 목표로 한다!
그러나 실제 자동차를 갖다놓고 할 수는 없기에 자동차의 데이터를 모사하는 시뮬레이터를 활용해보도록 한다!
(문제는 시뮬레이터를 녹칸다가 직접 만든것이기에 확실히 자동차와 동일하다고 장담은 못함)
어떻게 하는지 원리를 함께 알아보고 실제로 어떻게 할 것인지는 스스로 하는 것이다!
자동차에서 다루는 대표적인 데이터는 속도, 엔진회전수, 냉각수 온도 등등이 있고 그러한 정보는 ECU에서 관리한다!
여기서 ECU란 것은 자동차 내부 컴퓨터 같은 것이라 생각하면 된다!
자동차 내부의 디바이스들끼리 CAN 네트워크로 통신을 하게 되는데 외부와 통신을 하기 위한 인터페이스가 존재한다!
운전석 왼쪽 무릎 근처에 보면 뭔가 커넥터같은것이 노출되어있다!
자동차의 전기적인 문제를 점검하는 진단포트이기도 하지만 이 커넥터를 통해서 차량 내부 정보를 읽어올 수 있다!
(컴퓨터의 USB포트 같은 것이다)
12개핀에 다양한 통신이 존재하는데 우리가 필요로 하는 것은 CAN통신이다!
그리고 데이터 송수신 프로토콜은 OBD2로 정의되어있다!
전세계 차량이 공통적으로 정의해놓은 standard정보가 있고 각 차량회사마다 가진 고유한 확장정보가 있다!
확장정보는 차량 회사마다 서로 다르기도 하지만 거의 정보가 숨겨져있다!
(그러나 스탠다드한 정보는 모두 오픈되어있다)
ESP32보드에서 캔통신으로 자동차 내부 정보를 읽어 올 것인데, 어떤 정보를 요청할 것인가를 PID로 정의한다!
냉각수 온도에 대한 PID를 요청하면 ECU가 냉각수온도를 캔통신으로 응답하는 것이다!
(대략 해야할 목차)
1.OBD2 프로토콜에 대해서 알아보기!(형식, 커넥터구조, 송수신 데이터 형식 등등)
2.자동차 내부에서 사용하는 CAN통신 설정에 대해서 알아보기!
3.OBD2에서 사용하는 PID에 대해서 알아보기!
4.마스터장비에서 캔 프로토콜을 체크 하는 방법에 대해서 알아보기!
5.시뮬레이터를 이용해서 몇가지 데이터를 읽어오는 방법 알아보기!
6.읽어온 정보를 활용해서 FND모듈이나 LCD에 출력해보기!
(송수신 데이터 프레임 구조)
REQUEST(ID:11bit, DATA:8bytes)
0x7DF 02 01 0C 00 00 00 00 00
RESPONSE(ID:11bit, DATA:8bytes)
0x7E0 : Engine Control Module (ECM)
0x7E1 : Transmission Control Module (TCM)
0x7E2 : ABS Module (ABS)
0x7E0 04 41 0C AA BB 00 00 00
RPM : AA*256 + BB
(29bit Exteneded ID일 경우)
18DB33F1 (Request)
18DAF110 (ECM)
18DAF118 (TCM)
18DAF128 (ABS)
(PID참고자료)
https://en.wikipedia.org/wiki/OBD-II_PIDs
(Calculated engine load)
1.PID가 16진수로하면 0x04이고 10진수로 해도 4이다!
2.슬레이브로부터 반환되는 값이 1byte라는 의미이다!
(슬레이브가 반환하는 값이 1byte라도 캔통신의 기본 데이터 단위가 8byte이기 때문에 8byte로 전송된다)
3.값의 범위가 0~100사이이다!
4.위키피디아 매뉴얼상에서 응답데이터의 제일 첫번째 바이트를 A라하고 두번째를 B라하고 이어서 C,D,E...순이다!
5.(100/255)이라는 공식의 의미는 자동차에서 A라는 값을 응답으로 마스터장비에 전송을 할텐데 그 값에서 100을 곱하고 255를 나누면 엔진이 얼만큼 열심히 일을 하고있는지의 데이터가 계산되는 것이다!
6.만약 자동차가 1byte의 값으로 128이라는 값을 전송했다면 대략 50.2%정도로 엔진이 작동하고 있다는 의미이다!
(자동차의 현재 속도가 100km/h일때 자동차에 request하고 response데이터의 예시를 보이시오)
1.자동차의 캔통신은 id와 8byte의 데이터로 구성된다!
2.마스터가 자동차에 REQUEST할때 11bit주소체계면 ID를 0x7DF로 해야하고 29bit주소체계이면 0x18DB33F1로 보내야한다!
(REQUST)
(ID) (갯수) (SERVICE) (PID) (나머지 5개는 사용안함)
0x7DF 02 01 0D 00 00 00 00 00
(RESPONSE)
(ID) (갯수) (응답코드) (PID) (A) (나머지 4개는 사용안함)
0x7E0 03 41 0D 64 00 00 00 00
(퀴즈)
1.냉각수 온도에서 수신한 데이터 자체를 온도값으로 하면되지 왜 -40을 빼느냐?
ㅡ데이터통신할때 소프트웨어적으로는 byte단위로 데이터가 주고받아지고 byte는 음수를 표현할 수 없다!
ㅡ자동차의 냉각수 온도가 -20도이면 어떡할래?
2.대부분 다른것들은 응답데이터가 1byte인데 왜 RPM은 2byte를 사용하느냐?
ㅡ1byte로 담을수 있는 정보의 양은 0~255까지이다!
ㅡ엔진 RPM의 경우 국산차는 대략 0~8000RPM정도를 표현해야하는데 1byte로는 담을 수 있다!
ㅡ엔진RPM의 값을 전송을 하려면 최소 2byte가 필요하다!
(녹칸다의 참고자료)
1.캔통신은 ID와 DATA필드로 크게 구분된다!
2.ID는 스탠다드(11bit)와 확장(29bit)로 구분된다!
3.ID와 OBD2에서 말하는 PID는 전혀다른 개념이고 PID가 스탠다드이냐 확장이냐는 또 다른이야기이다!
4.스탠다드 PID는 전세계 자동차의 공통항목이고 확장 PID는 제조사마다 다를 수 있고 비공개이다!
5.때때로 엄청나게 숨겨져있는 고급스러운 확장PID를 발굴해냈다면 돈이 될 수 있다!
6.스탠다드 PID가 0인 request는 현재 자동차의 PID중에 0x01~0x20범위에 PID를 지원하는지 안하는지를 bit로 표현해서 응답하고 0이면 지원안함 1이면 지원함이다!
7.PID 0의 request의 response(응답)데이터가 필요로 해서 전송하는게 아니라 모든 자동차는 스탠다드 PID의 0번을 응답하도록 디자인되어있기 때문에 프로토콜 체크할때 활용할 예정이다!
8.녹칸다가 초반에 소개했던 ELM327이라는 칩도 프로토콜 체크를 PID가 0x00인것으로 한다!
(예제순번)
1.녹칸다가 미리 만들어둔 ESP32의 Request & Response예제를 활용해서 자동차의 속도를 조회하는 예시를 실험삼아 구현해보시오!(한쪽보드는 진단장비, 한쪽보드는 가상의 자동차)
2.마스터장비가 자동차의 프로토콜을 체크하는 예제를 구현해보시오!(다음에 해결하기)
3.녹칸다가 미리 만들어둔 가상의 자동차(ESP32+CAN)를 이용해서 마스터쪽에서 변화하는 속도값을 측정하시오!
4.현재 엔진의 RPM을 측정해서 시리얼 모니터에 출력하시오!(원래 수식은 (256*A+B)/4인데 녹칸다가 4로 나눠서 전송하는것을 빼먹었다 참고)
5.자동차속도와 엔진 RPM을 동시에 출력하려면 어떻게 해야겠는가?