시작에 앞서
저는 본업이 따로 있고 취미로 이것저것 만들기를 좋아하는 사람입니다.
본 정보는 제가 알게된 내용을 정리한 내용이며 완벽하지 않고 저보다 당연히 더 잘 하시는 분들도 많습니다.
이전에 사제 오디오를 위한 캔버스 모니터 만들기 라는 제목으로 자동차 CAN 통신을 확인해서 에어컨 공조기 데이터를 별도로 표시하게 만든 적이 있으니 참고삼아 읽어보시기 바랍니다.
지금은 기어 데이터와, 크루즈 컨트롤 데이터를 추가로 확인하여 표기 할 생각이며 궁극적으로는 중간 대시보드에 듀얼모니터 같은 개념으로 설치할 생각입니다.
현재차량상태
해킹을 해서 작성자는 무엇을 하고 싶었는지 알아보자
1. 공조기 모니터를 작게 만들고 싶다. 성공!
2. 기어 상태를 커다랗게 보고 싶다. 진행중~
3. 스마트키를 스마트폰으로 대체 하고 싶다. 진행예정
4. 크루즈 컨트롤을 최신 차량 같이 보고 싶다. 진행중~
자동차 CAN통신을 들여다보자
부품구입
제가 CAN통신을 위해 사용했던 것은 다름아닌 아두이노 입니다.
아두이노에 MCP2515를 연결하면 CAN통신을 할 수 있습니다.
아두이노는 우노 기준으로 대략 10,000원, MCP2515는 국내 사이트 기준 5,000원
총 15,000원 + @(점퍼와이어 등)에 기본 구성을 할 수 있습니다.
구성방법
아두이노에 MCP2515를 연결하고 MCP2515 라이브러리를 이용하면 CAN 데이터를 시리얼 통신으로 볼수 있습니다.
연결 방법은 MCP2515 - 아두이노 순으로 아래와 같습니다.
VCC - 5V, GND - GND, CS - D10, SO - D12, SI - D11, SCK - D13, INT - D2
코딩은 어떻게 하느냐
아두이노 IDE 를 다운받으면 됩니다.
https://www.arduino.cc/en/software
여기서 본인의 맞는 운영체제에 프로그램을 다운받아서 설치하면 됩니다.
사전작업
https://github.com/omarKmekkawy/Arduino_CANHacker
위 사이트에 들어가면 2가지 라이브러리를 알려줍니다.
해당 라이브러리르 아두이노 라이브러리 폴더에 풀어줍니다.
아두이노IDE에서 샘플에서 softwareserial_debug를 선택하여 열고 본인의 MCP2515의 클럭 스피드를 체크한뒤 사이트에 예시처럼 8, 16, 20를 중간 코드를 삽입하여 줍니다.
업로드 버튼을 하여 아두이노에 펌웨어를 입혀주고 사이트 중간에 CANHacker 프로그램을 받아 설치하여 줍니다.
아두이노IDE와 CANHacker 프로그램의 호스트가 겹치므로 아두이노IDE를 종료하고 CANHacker에서 셋팅에 아두이노 COM(숫자)가 확인되면 성공.
번개 표시를 눌러 연결을 할 수 있습니다.
자동차와 통신 시작
위에 글 올렸던 것을 보았는데 차량을 뜯어야 합니까?
그렇지 않습니다.
본인의 차량이 2007년도 이후에 출시된 차량이라면 OBD단자라는 것이 있습니다.
OBD 단자는 차량마다 위치가 다르니 각 차량의 OBD 단자라는 이름으로 검색해보시길 바랍니다.
이곳에서 차량마다 조금 다를수는 있지만 제가 타는 차량에서는 아래와 같다고 하네요.
이곳에서는 C-CAN 이라는 것이 보이는데 저는 M-CAN, B-CAN도 필요해서 차량을 뜯었습니다.
현대 기아 기준으로 3개의 CAN통신선이 있고 다른 차들은 잘 모릅니다.
현대 기아는 GSW 현대 사이트에서 가입을 하면 여러 회로 정보도 볼 수 있기 때문에 본인의 차량에 더 분석을 원하면 가입해서 확인하시기 바랍니다.
그럼 차에서 CAN HI 부분에 MCP2515 HI를 연결하고 LOW는 LOW에 연결하여 봅니다.
그러면 이렇게 데이터가 뜨는 것을 볼 수 있습니다.
그럼 분석을 시작해 봅시다.
OPENDBC데이터를 활용하자
콤마라고 오픈파일럿을 개발하는 회사이며 여기에 OPENDBC라고 데이터를 공개하고 있습니다.
https://github.com/commaai/opendbc
여기에 각 차량에 CAN데이터들이 있습니다.
예를 하나 가져와서 제가 설명해 보겠습니다.
중간에 보면 hyundai_kia_generic.dbc가 있고 해당 데이터 중에 크루즈 데이터를 확인하기 위해 제가 분석했던 부분입니다.
제 차량에 연결했을때 이런 CAN 데이터가 있습니다.
ID | LEN | Data
이 숫자는 8 빼고 다 16진수 입니다.
0x260은 16진수 10진수로 608 입니다.
그럼 260은 위에 608하고 일치하네요
DBC 항목에 파란색으로 표기된 0|8, 8|8, 16|8, 24|1, 25|1, 26|1, 27|1, 28|3 라는 부분이 있습니다.
이 데이터는
0비트부터 8개,
8비트부터 8개,
16비트부터 8개,
24 비트부터 1개,
25 비트부터 1개,
26 비트부터 1개,
27비트 부터 1개,
28 비트 부터 3개 라는 뜻입니다.
03 04 13 30 FF 6F 5F 37 데이터에 위 항목을 적용봅시다.
03은 7,6,5,4,3,2,1,0 ←
04는 15,14,13,12,11,10,9,8 ←
13은 23,22,21,20,19,18,17,16 ←
30은 31,30,29,28,27,26,25,24 ← 순번으로 이어집니다.
각 항목마다 8개의 데이터가 있는겁니다.
이중 크루즈 데이터가 있는 24부터 31의 데이터를 위 데이터에 적용해보겠습니다.
16진수인 30을 2진수로 변환하면 110000인데 8개로 맞춰야하니 앞에 00을 붙여봅니다.
그럼 0011 0000 이렇게 됩니다.
그러면 하나씩 보아
0(31:없음),
0(30:엔진스타트),
1(29:엔진스타트),
1(28:엔진스타트),
0(27:퓨얼컷인),
0(26:크루즈셋) ,
0(25:크루즈메인),
0(24:GLOW_ST) 로 해석되고
크루즈 전원을 넣으면 0011 0010 으로 변해 16진수로는 32
크루즈 셋을 하면 0011 0110 으로 16진수로는 36이 됩니다.
이 데이터를 기준으로 크루즈가 켜졌는지 속도 설정이 되었는지 확인이 가능합니다.
다른 데이터 들중 0|8은 해당 데이터를 다 사용하고 2진수 나눌 필요없이 10진수로 데이터 해석을 하는 것이 편하니 차근차근 알아보시면 됩니다.
이렇게 나와있는 데이터가 본인에 차량과 같으면 쉽게 데이터를 확인 할 수 있고 없으면 노가다로 찾으면 됩니다.
M-CAN 같은 경우는 현대 기아의 미디어 통신선을 위한 것으로 노가다가 필요하겠죠
이정도 데이터를 알게 되면 어려분들도 쉽게 데이터를 확인해서 원하는 정보를 얻고 활용 할 수 있을 것 같습니다.
그럼 자동차 해킹 한 번 해보시지 않겠어요?
저 처럼 1602 LCD에 정보를 표시하고 싶다면 아래의 MCP CAN라이브러리를 이용해서 데이터를 가공하고
https://github.com/coryjfowler/MCP_CAN_lib
하단의 LiquidCrystal I2C 라이브러리를 이용해 표시하는 것을 추천드립니다!
https://www.arduino.cc/reference/en/libraries/liquidcrystal-i2c/
귀찮아서 그냥 모듈사서 설치했지만 원하는 항목 커스텀해서 쓰기에는 충분히 메리트 있어 보입니다.
차는 있는데요..ㅋㅋ
읽기만 쉽네요..
이걸 우리는 "트립보드"라고 부릅니다. ^^*
쓰기는 안 하시는게 좋습니다.
Canalyzer 같은 전용 도구와 벤더의 최신 dbc 없이 뭔가 쓰기를 시도하다가, 다른 제어기의 통신을 방해 하거나 하면 고장과 사고의 원인이 될 수 있습니다.
목적이던 기어단수는 찾았는데 하다보니 다른 데이터들도 궁금해져서 파보고 있습니다.
짤은 연료량(T=70), 외기온도(O=15/2 = 7.5도), D는 ACC ON 후의 분 시간이 카운트되더군요.어디에 쓰는지는 모르겠지만....
dbc 활용 할줄 안다면 can 시그널을 좀 더 쉽게 읽을수 있습니다.
현대 순정으로 휠 타이어 온도를 찾고 싶은데…
하… 한계를 느낍니다.
감사합니다 ㅜㅜ
댓글 남기기 전에 open dbc 에서 공개된 프로젝트별 dbc 를 좀 봤습니다만, 현재는 CANFD 를 사용해서 메세지 ID 등이 다르거나, EthCC 등으로 CAN 과 아예 다른 통신 방식을 사용하는 차량이 많아 최근 차량일수록 따라하기 어려운 부분이 많다는 걸 읽으시는 분들께서 감안하시면 좋을 것 같습니다.
또한 기존 CAN 도 같은 CAN 이어도 세대에 따라 메세지 ID 가 다른 경우가 있습니다.
글 내용 자체는 너무 재미있고 좋습니다.
저도 한번.. (기절 yo)
그니저나 종단쪽에 120 저항 안주면 노이즈좀 끼는걸로 알고 있는데...
전 라즈베리파이에 2517 붙여서 이리 저리 가지고 놀다가 현재는 홀딩하고 있는데...
이리 저리 장난감 만들기엔 좋더군요.
모뎀 달고 제어까지 해 보시는 것도... 아님 BLE를 통한 제어도 괜찮구요.
뭐 구형 차종들은 캔 건드린다고 뭔가를 할 수 있을 것 기대하는 것도 그냥 편의사양 만드는 정도는 될겁니다.
업무 외에는 별로 관심을 안가지는데
대단하십니다
본문의 내용과는 상관없는 작업을 하시려는 것 같아요
(C-CAN/P-CAN/M-CAN/B-CAN..등등 CAN종류가 많은데, OBD단자와 필요한 CAN 단자에 개별 MCP2515모듈을 연결하여 사용하신 건가요?)
이상하게시리 차량에 연결하면 아무런 값도 불러오질 못해서 며칠동안 이리저리 끙끙대다가 포기했네요...ㅠ
그리고 b-can 배선을 다른 하네스 분기점(?)에서 따왓는데 배선을 따오는 위치에서 문제가 발생하지는 않겠죠?
그리고 속도는 B-CAN 의 속도는 100일거로 예상됩니다.
저도 B-CAN 으로 스마트키 대체 작업을 빨리 시작해봐야겠어요
말씀하신대로 속도 다시한번 체크해서 연결해보니까 되네요^^
그리고 마침 차에 단방향 사제 경보기가 달려있어서 이를 통해 시동까지 걸수있게 되었네요ㅎㅎ
mqtt와 아두이노 무선통신을 활용해서 블루링크 처럼 휴대폰을 사용하여 원거리 원격제어를 구현해볼 예정입니다
아 그리고 내친김에 공조기 제어까지 가능할까 싶어서 c캔을 따서 값을 찾아봣는데 공조기 작동상태에 관해서만 확인이 가능하고 제어는 안되는건지 제가 못찾는건지 거의 포기상태입니다 ㅜ
그건 좀더 알아봐야겠네요.
애프터 블로우가 그런식으로 돌리는건지 알았는데 강제 전원 공급 일 수도 있겠네요.
애프터 블로우는 말씀하신대로 강제 전원 공급 방식일겁니다 모듈에 내장된 배터리의 전력으로 돌리는 모양이더라구요