시작에 앞서
저는 본업이 따로 있고 취미로 이것저것 만들기를 좋아하는 사람입니다.
본 정보는 제가 알게된 내용을 정리한 내용이며 완벽하지 않고 저보다 당연히 더 잘 하시는 분들도 많습니다.
이전에 사제 오디오를 위한 캔버스 모니터 만들기 라는 제목으로 자동차 CAN 통신을 확인해서 에어컨 공조기 데이터를 별도로 표시하게 만든 적이 있으니 참고삼아 읽어보시기 바랍니다.
지금은 기어 데이터와,자동차해킹당신도할수있다클리앙 크루즈 컨트롤 데이터를 추가로 확인하여 표기 할 생각이며 궁극적으로는 중간 대시보드에 듀얼모니터 같은 개념으로 설치할 생각입니다.
현재차량상태
올인원 밑에 왼쪽에 커다란 기어표시용 세그먼트가 있고 오른쪽에 공조기 정보 LCD가 있다.
해킹을 해서 작성자는 무엇을 하고 싶었는지 알아보자
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/