CAN-BUS

벨로스터N(Veloster N) CAN-BUS Part .6 - CAN Decoding

Mapsosa 2021. 6. 6. 16:10

can decoding을 할 때 가장 좋은 것은 RaceChrono Pro 앱입니다

여러 가지로 방법을 찾아보았으나

CANable pro에서는 내 조작에 따라 움직이는 값만을 기록하고 어떻게 움직이는지에 대해서는 RaceChrono로 보는 게 훨씬 편합니다.

 

일단은 candump결과에서 CAN ID 만을 추출합니다.

CAN ID 십진수 값을 전체 선택하고 데이터에서 내림차순 정렬 후 중복된 값 제거를 하게 되면

64, 66, 67, 68, 127, 128, 129, 339, 356, 399, 447, 512, 544, 593, 608, 688, 764, 781, 790, 809, 832, 897, 899, 902, 903, 909, 913, 916, 1008, 1015, 1040, 1067, 1078, 1155, 1157, 1170, 1181, 1184, 1191, 1193, 1253, 1254, 1255, 1265, 1280, 1281, 1287, 1292, 1294, 1312, 1322, 1342, 1345, 1349, 1351, 1353, 1363, 1365, 1366, 1367, 1369, 1407, 1414, 1415, 1419, 1427, 1440, 1456, 1460, 1486, 1487, 1491, 1530, 1952, 1960, 1988, 1996, 2001, 2004, 2009, 2012, 2016, 2017, 2024

위와 같이 CAN ID가 전부 추출됩니다.

이제 그걸 RaceChrono에 전부 등록할 겁니다.

 

먼저 OBDLINK MX+를 Other Device에 CAN-BUS로 추가해 줍니다.

그리고 Vehicle Profile에 아무 이름이나 넣고 프로파일을 생성하고

CAN BUS Channel 칸에 +를 눌러 모든 CAN ID를 추가합니다. 저는 Analog로 하니까 편하더군요

Equation은 raw로 놓고 PID만 바꿔서 등록해줍니다.

위에 Veiw more 누르면 Post fix가 나옵니다. 저는 전부 아날로그로 등록했기 때문에

Postfix에 넘버만 바꿔서 추가했습니다.

그러면 이런 식으로 추가가 다 됐겠죠?

여기서 Test Connection을 누르면 전체 canbus에 대한 값을 수신받습니다.

이제 아무도 없는 공터에서 주행하면서 값 하나하나 눌러서 들어가면서 값이 어떻게 변하는지 보면 됩니다.

 

예를 들어 CAN ID 1170은 여러 가지 값을 담고 있겠지만 특히 주행 중에만 나타나는 Gear에 대한 정보가 있습니다.

5번째 바이트가 그런데요

 

완전히 차가 멈춘 상태에서는 B8로 나타나고 N단이나 반클러치 상태에서는 80 1단 88 2단 90 3단 98 4단 A0 5단 A8 6단 B0으로 나타납니다

이걸 십진수로 바꾸면 차량 정지 184 N단 128 1단 136 2단 144 3단 152 4단 160 5단 168 6단 176이 되겠지요

이렇게 숫자가 크고 이해하기 어려운 경우에는 Byte 단위로 쪼개지 말고 Bit 단위로 쪼개 보세요

 

16진수를 이진수로 바꾸면 차량 정지 10111000 N단 10000000 1단 10001000 2단 10010000 3단 10011000 4단 10100000 5단 10101000 6단 10110000으로 나타납니다.

그러면 5번째 자리까지만 사용하는 걸 알 수 있죠?

 

//6월 15일 수정

수정 전 내용은 접은 글 참조

더보기

40번째 비트부터 5번째 비트까지만 사용해봅시다

정지 10111 N단 10000 1단 10001 2단 10010 3단 10011 4단 10100 5단 10101 6단 10110입니다.

 

자 이제 좀 간단해진 거 같으니 십진수로 바꿔봅시다.

 

정지 23 N단 16 1단 17 2단 18 3단 19 4단 20 5단 21 6단 22

딱 1 단위로 올라가네요

N단은 0단으로 하는 게 좋겠네요.

그러면 Racechrono의 equation에 bitstouint(raw,40,6)-16을 하게 되면 단수가 나옵니다. 그런데 차량 정지가 7단으로 나오는 문제가 있잖아요. 그래서 lowpass를 사용해줍니다.

lowpass((bitstouint(raw,40,6)-16),6)을 해주게 되면 6단 이상은 NaN으로 나오게 됩니다.

42번째 비트부터 3번째 비트 까지만 사용해봅시다.

정지 111 N단 000 1단 001 2단 010 3단 011 4단 100 5단 101 6단 110입니다.

이걸 10진수로 바꾸면 정지 7 N단 0 1단 1 2단 2 3단 3 4단 4 5단 5 6단 6으로 아주 간단하게 나타납니다.

정확한 단수가 나오네요.

그러면 RaceChrono의 Equation에 bitstouint(raw,42,3)을 해주게 되면 단수가 나옵니다. 근데 차량 정지가 7단으로 나오는 문제가 있잖아요. 그래서 Lowpass를 사용해줍니다.

Lowpass((bitstouint(raw,42,3),6)을 해주게 되면 6단 이상은 NaN으로 나오게 되어 정확한 단수가 나옵니다.

 

근데 제가 오랫동안 지켜본 결과 10111000에서 10111000이 맨 앞에 10은 절대 안 움직인다는 걸 알았습니다.

지금처럼 3비트만 쓰게 되면 7단까지 밖에 표시를 못합니다. 앞에 1은 알 수 없는 값이니 제외하고 1 뒤에 0은 뭔가 8단을 사용하는 벨로스터N DCT에서는 사용이 될 것 같은 느낌입니다. 그래서 저는 계산식을 Lowpass((bitstouint(raw,41,4),6)로 하여 41번째 비트부터 4개의 비트를 사용하여 정지 0111 N단 0000 1단 0001 2단 0010 3단 0011 4단 0100 5단 0101 6단 0110으로 인식하도록 하였습니다. 이렇게 해도 앞자리가 0이기 때문에 값은 똑같습니다.

혹시 벨로스터N DCT 타시는 분들은 이 값이 제대로 지시하는지 알려주시면 감사하겠습니다. DCT는 아마도 TCU와 액츄에이터가 있으니 이 기어 단수 지시 말고 다른 캔 통신 ID가 있겠지만 여하튼 제가 추측해볼 수 있는 것은 여기까지 입니다.

 

 

이런 식으로 조작을 했을 때 움직이는 값을 스크린샷을 찍어 표시를 하면 좋습니다.

값을 보았을 때 00 00에서 FF FF 가 자기 마음대로 움직이면 플러스 마이너스가 있는 Signed 값입니다.

혹은 저 equation 란에 bytetouint를 넣었는데 리니어 하게 안 올라가고 값이 커졌다 작아졌다 하면 Signed 값입니다.

 

그리고 브레이크 포지션처럼 00 00 일 때 00 01부터 올라가야 할 텐데 앞에서부터 01 00 이렇게 올라간다면 Little Endian(LE) 값입니다.

제가 해보니 보통 모든 16비트짜리 값은 보통 LE 값입니다.

https://cryptii.com/pipes/integer-encoder

 

Integer encoder: Hex to 8, 16, 32-bit (un)signed integers

In computer science, an integer is a data type that represents mathematical integers. They may be of different sizes and may or may not be allowed to contain negative values. In a computer they are commonly represented as a group of binary digits.

cryptii.com

16진수 및 LE랑 친하지 않으신 분은 여기서 계산해보시면 됩니다.

 

위와 같이 파란 네모에서 CAN 16진수 값이 00 이면 8bit 00 00 이런 식이면 16비트로 하셔서 Hexadecimal에 입력하시면 십진수로 변경해서 출력됩니다.

빨간 네모에서는 Big Endian인지 Little Endian인지 설정해주시면 되겠습니다.

 

https://canhacker.ru/%D0%BA%D0%B0%D0%BA-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F/kia-rio-2017-can-%D1%88%D0%B8%D0%BD%D0%B0/

 

KIA Rio 2017 CAN шина - CAN Hacker

Выдалось время немного поработать со свеженькой панелью приборов от KIA Rio 2017 года выпуска. Задачу перед собой поставили такую: Изучить какая

canhacker.ru

또한 몇몇 값은 위 사이트에서 도움을 얻을 수 있습니다. 구글 번역기를 활용하세요.

 

https://docs.google.com/spreadsheets/d/1nDxmM4uLwufTUaGpi_X94d79ptCv5niia4NZ-SJZmJ8/edit#gid=0

 

Kona EV CAN Messages

P-CAN Hyundai Kona EV (US) ,Known Data,Unknown Data,Fixed P-CAN Messages 7-0,15-8,23-16,31-24,39-32,47-40,55-48,63-56 ID,Byte 0,Byte 1,Byte 2,Byte 3,Byte 4,Byte 5,Byte 6,Byte 7,Notes 0x109,265,0x00,0x01,0xFD,0xFF,0xFF,0xFF,0x0F,Unknown (6 bits) erratic 0x1

docs.google.com

레딧에서 hyundai CAN을 검색하다가 위의 링크의 스프레드 시트를 발견했습니다.

해당 스프레드 시트는 코나 EV의 CAN메시지 해독이지만 스티어링 앵글과 휠 스피드는 벨로스터N에도 적용이 되더군요.

그리고 저런 식으로 정리하는 게 정말 도움이 되더라고요. 저도 저걸 보기 전엔 노트에 이 can id에 몇 번째는 뭐고 몇번째는 뭐고 이런 식으로 정리했었는데 저걸 본 후에 엑셀에 정리하기 시작했습니다.

 

가장 찾기 힘든 값은 온도입니다. 다른 값은 본인의 조작에 따라 결과가 나오기 때문에 쉽게 유추가 가능하고 직관적으로 알 수 있는데. 온도는 스스로 올라가고 스스로 내려가는 것이라 알기가 어렵습니다. 

 

CAN 통신 케이블 한쪽에는 OBDLink MX+ 꽂고 레이스 크로노 켜시고 한쪽에는 일반 OBD2어댑터 꽂고 RaceChrono에 OBD2로 등록 후 대조해야 합니다.

 

일단은 RaceChrono에서 bytetouint(raw,시작값,바이트)로만 등록하셔서 레이스 크로노 Start 버튼 누르시고 타보시기 바랍니다. 일단 타보시면 세션 창에서 그래프로 보실 수 있습니다.

 

이렇게 말이죠.

아무래도 오르락내리락하면 온도가 아닐 가능성이 크고 주행에 따라 지속적으로 우 상향하고(빠르게 달렸을 때 제외) 차량 시동을 끄고 오래 뒀다가 다시 켰을때 값이 떨어져 있다면 온도일 가능성이 높습니다.

냉각수 온도는 계산식이 OBD의 값과 똑같습니다. -40입니다.

하나 또 냉각수 온도와 비슷한 값이 있는데

 

CAN으로 나오는 값들 중에 OBD에도 있는 것은 OBD랑 같이 레이스 크로노에 등록하고 플로팅 해보면 알기가 쉽습니다.

그걸 위해 OBDLink MX+ 말고 다른 OBD2 어댑터를 하나 샀습니다.

이게 vLinker MC+라는 건데 OBDLink와 같은 STN명령어를 지원한대서 캔 통신도 될까 해서 사봤는데 반쪽짜리입니다. CAN 통신을 읽을 수는 있는데 제대로 읽지를 못합니다. 몇몇 값들은 아예 뜨지가 않네요.

가격은 비싼데 CAN 통신을 읽지 못하면 이건 솔직히 쓰레기입니다 더 저렴한 가격에 좋은 OBD 어댑터가 많습니다.

저는 이미 샀으니 그냥 쓰지만 혹시 구매를 생각하시는 분은 다른 것도 고려해보세요.

하여튼 CAN 통신용 OBDLink MX+ 말고 다른 OBD를 레이스 크로노에 등록 후 사용해 봤는데요

저 파란색은 OBD에서 얻은 값이고 보라색은 CAN에서 받은 온도로 유추되는 값 중에 하나입니다.

RaceChrono에서 여러 가지를 플로팅 해보던 중 높이는 다르지만 기울기가 거의 비슷한 값을 찾았는데요.

178-85 해서 93만 빼주면 될 줄 알았는데..

해당 온도에서는 맞지만 다른 온도에서는 차이가 벌어집니다.

그저 마이너스로만 해줄 수 있는 게 아니라 뭔가 다른 거죠

다른 방법을 써야 하네요.

레이스 크로노 차량 프로파일에서 OBD2 Show Standard channel을 활성화하면 OBD2 스탠다드 채널 목록이 나오는데요

거기서 Coolant Temperature 등을 누르면 계산식을 볼 수 있습니다. -40이죠

그러니까 저 플롯에서 파란색 85도는 원래는 85+40 해서 125인 거죠

그래서 이런 식으로 값을 구해보니 0.702247191이라는 값이 나옵니다.

그래서 해당 채널에 *0.702247191-40을 해보니

1도 정도 차이기는 해도 그나마 괜찮은 값이 나오네요. 근데 애매합니다. 이게 값이 올라가거나 내려오면 값이 조금씩 틀려집니다. 계산식이 틀린 것 같습니다만 일단은 저는 여기가 한계네요.

 

저는 원래는 OBD에 안 나타나는 Brake 밟은 양, 기어 단수, 오일 온도 정도만 있어도 좋다고 생각하고 시작했는데 브레이크 양이랑 기어 단수를 찾아서 너무 좋은데 오일 온도를 못 찾았습니다.

오일 온도야 어썸 잇이나 어썸 커넥트를 이용하면 볼 수 있고 또 내비게이션에서 퍼포먼스 게이지를 들어가면 보이긴 하지만 RaceChrono 상에서 CAN이랑 같이 플로팅 시켜보려면 OBD PID를 알아야 하는데 제가 그걸 모릅니다. 그래서 오일 온도가 미궁이에요.

 

6/6 오후 내용 추가

그래서 노가다로 퍼포먼스 게이지에서 올라갈 때 올라가고 내려갈 때 내려가는 값을 찾았는데요

퍼포먼스 게이지에 Oil 값을 띄우시면 오일 온도를 볼 수 있습니다.

 

저기 Oil로 표시된 값을 보세요 오일온도 같아서 bytestouint만 해놓은 건데 172를 지시합니다.

아까 냉각수 온도 계산한 것과 마찬가지로 OBD Standards에 들어가서 보니 Oil 온도 또한 -40이 더군요

그러니까 퍼포먼스 게이지에서 나오는 89도라는 온도는 원래 값에서 -40 된 값이라고 보고

원래 값은 89+40 = 139라는 결론이 나오는군요.

그래서 위와 같이 139/172를 계산해보면 0.75가 나옵니다.

그럼 원시 값*0.75-40을 해주면 Oil 온도가 나옵니다.

오일 온도를 찾아서 너무 좋네요.

 

일단은 제가 해독한 CAN-Bus 값을 미천하게나마 조만간에 공개를 할 텐데 혹시 벨로스터N 타시는 분은 같이 연구를 해보시죠.

 

https://racechrono.com/support/equations

 

Equations reference – RaceChrono

 

racechrono.com

레이스 크로노의 계산 방법을 꼭 읽어보시고 원하는 값 찾아내시길 바라겠습니다.

 

반응형