Python-OBD에 비해 Python-CAN이 훨씬 복잡하고 어려워보입니다.
다행인 것은 Python-OBD로 대략적인 개념도 잡고..
CAN data를 어떻게 주고 받는지 알게 되었으므로 전보다는 접근하기가 쉬워졌습니다.
처음엔 엄두가 안났지만, 지금은 도전해 볼 가치가 있어서 시도했고,
설치시 참조한 내용은 다음과 같습니다.
https://python-can.readthedocs.io/en/stable/installation.html
https://python-can.readthedocs.io/en/master/_modules/index.html
https://python-can.readthedocs.io/en/master/api.html
https://github.com/hardbyte/python-can <-- 설치 파일
자동차, 트럭, 보트, 휠체어 등에 사용가능며, Python 개발자를 위한 컨트롤러 영역 네트워크 지원을 제공하는 다양한 모듈이 있습니다.
아래 모듈을 하나씩 호출해서 돌려보면 대충 어떤 동작을 하는지 알 수 있는데, 이것 저것 공부하면서 돌려보는데 대략 2주정도 걸렸습니다.
https://python-can.readthedocs.io/en/master/_modules/index.html
돌려봐도 잘 이해가 안가는 모듈도 있네요.. 일단, 모르는것은 일단 패스...
위 모듈들을 잘 활용하면 거의 모든(?) 운송 수단(심지어 농기계나 로봇에도..) 통신이 가능 하다고 하니 신기합니다.
무엇보다 다행인 것은, 현재 가지고 있는 CAN 하드웨어 장치를 모두 지원하는 것으로 나옵니다.
(Seeed studio USB-CAN 분석기, CANalyst-II.. 등등) 상당히 도움이 많이 되는 오픈 소스임은 틀림없군요.
1. PC에서 가상 ECU와 가상 진단기로 연습
(1) seeed studio USB-CAN 분석기 연결하여 query와 response용으로 사용
https://python-can.readthedocs.io/en/stable/interfaces/seeedstudio.html
우선 USB port 확인 필요 → 터미널 띄우고 아래 명령어 넣고 엔터 입력하면...
USB Serial이 정상 동작하는지 확인해야 하며.. 찾는 방법은 아래와 같이 두가지 명령을 터미널에서 입력해 보면 알 수 있습니다.(Mac OS 기준)
1) USB Serial 포트 찾기
❯ system_profiler SPUSBDataType <-- 엔터
(실행결과)
다음으로 아래 명령 입력하면 코드 작성시 입력해야 하는 CAN bus로 사용한 Cannel 이름을 알 수 있습니다.
❯ ls /dev/tty.* ← 엔터
/dev/tty.usbserial-1330 /dev/tty.usbserial-120
이제 두개의 USB Serial port에 대한 정보를 얻을 수 있으며 이를 이용해 CAN 연결 가능합니다.(하나만 있어도 됩니다.)
두개를 구성한 이유는 PC에서 연습용으로 (Query vs Response) Frame Id를 주고 받을 수 있도록 구성하기 위함입니다.
2) 예제 실행히 보기 --> python-can 모듈에 있는 예제를 하나 가자와서 돌려보면...
# import the library
import can
# create a bus instance using 'with' statement,
# this will cause bus.shutdown() to be called on the block exit;
# many other interfaces are supported as well (see documentation)
with can.Bus(interface='seeedstudio',
channel='/dev/tty.usbserial-1330',
receive_own_messages=True) as bus:
# send a message
message = can.Message(arbitration_id=0x7df, data=[0x02, 0x01, 0x0C], is_extended_id=False)
bus.send(message, timeout=0.2)
# iterate over received messages
for msg in bus:
data = bytearray(msg.data)
data_str = ' '.join(format(x, '02X') for x in data)
print(f"{msg.arbitration_id:X}: {data_str}")
# or use an asynchronous notifier
notifier = can.Notifier(bus, [can.Logger("recorded.log"), can.Printer()])
--------------------- 실행 결과 -------------------------------------------------
7DF: 02 01 0C 00 00 00 00 00 <-- query
7E8: 07 41 0C 14 90 00 00 00 <-- response
3) 이런 방법으로 모든 예제를 돌려보면, 어떤 기능이 있는지 감 잡을 수 있습니다.
Python-can을 학습하면 서두에서 언급한 것 처럼...
PC에 직접 가상의 엔진 시뮬레이터(ECU-response)와 가상 진단기(Query)를 만들수도 있습니다.
실제로 간단하게 아래 처럼 구성해서 돌려봤는데 동작하는 것을 확인했습니다.
이제 푸조 엔진에 맞게 코딩하고 연결하는 것만 남았습니다.
(휴.... 지금까지... 삽질이 장난 아니였습니다....)
그래도 맨땅에 헤딩한 결과가 있어서 다행입니다.
2. 실제 푸조 508 엔진 ECU에 연결 하기
이제 푸조 엔진에 맞게 Query : Frame Id(또는 PID) = 688로 구성후 다양한 명령( 아래 표에 "data"에 기록된 바이트 데이타)을 던지면 (붉은색), Response : Frame Id =6A8로 응답하는 것을 확인할 수 있습니다. 오!!!!
물론 이글을 현 시점에서는 Data란의 바이트 내용에 대해 어느 정도 무엇인지 알지만,
(3개월 정도 지난 시점에서 자료 정리차원에서 정리중입니다.)
당시에는 비록 통신에는 성공했지만 어떤 의미인지 하나도 몰러서 엄청 당황했던 기억이 납니다
어쨌든, 당시 성공했을 때 날아갈것 같은 기분...
"이제 내 푸조 엔진이랑, 대화를 할 수 있다고!!!!!!"
'Peugeot 차량 DIY CAN 통신 해보자!(508기준)' 카테고리의 다른 글
(11) Python-OBD로 푸조 엔진 ECU에 연결 실패...(좌절..) (0) | 2023.10.19 |
---|---|
(10)-2 ELM327 사용기(Tera term으로 ECU 명령 보내고 받기 ) (1) | 2023.10.18 |
(10)-1 OBD용 ELM327에 대하여... (1) | 2023.10.18 |
(9) 드디어, 푸조 엔진 ECU에 연결 시도하다!!! (2) | 2023.10.17 |
(8) 나름 고급형?? CAN 분석기 : CANalyst-II pro (1) | 2023.10.17 |