[목차]
① CAN통신 프로그래밍 1/3 - https://makeutil.tistory.com/93 - CAN 통신 개요
② CAN통신 프로그래밍 2/3 - https://makeutil.tistory.com/94 - 라즈베리파이에서 CAN 장치 설정
③ CAN통신 프로그래밍 3/3 - https://makeutil.tistory.com/95 - CAN 통신 샘플코드
필자가 지금 생각하고 있는 라즈베리파이 카테고리에는 UART와 CAN, EtherCAT을 다루고자 한다. 물론, 이미 문서로는 모두 작성이 끝나있지만, 문서 전체의 배포는 제휴관계에 따라 어려울 것같고 기본적인 개념과 프로그래밍 방법에 관해서는 이미 공개된 내용이므로 공개해도 무방할 것으로 사료되어 독자 분들께 도움이 되고자 가능한 기술해보려 한다. 문제는 EtherCAT인데... 경험이 없어서인지 테스트할 네트워크는 구성해 보았으나 관련된 장비들 모두 갖추질 못해봐서 그 이상 해볼수는 없었다. 그래서 EtherCAT은 나중으로 미루기로 하고..
필자가 이전 회사에서 i.MX6을 이용한 프로젝트를 진행한 적이 있다. 필자가 시스템을 구성했던 그 프로젝트가 양산까지가서 몇년뒤 전군에 배포된다는 뉴스를 보았다. 물론, 양산간다는것은 이미 알고 있었지만... 필자 입으로 말하긴 좀 그렇고 지뢰 찾아주고 제거해주고, 탐색 및 구인에 사용되는 뭐 그런 로봇의 메인프로세서보드의 시스템 소프트웨어를 담당했었다. 그러한 로봇이나 자동차 및 자동화 기계에서 자주 사용되는 것이 CAN과 EtherCAT이다. 그런데 이더켓은 좀... 그들만의 리그(머신러닝과 공장자동화쪽)가 분명히 존재하는 것 같고 자동차 분야와 건축물, 철도 등에는 CAN과 Ethernet이 주로 사용되는 것 같다. 어쨋거나 이더켓은 이야기 하기로 하고 CAN에 대해서는 위키등을 통해서 자세히 알아보시고 필자는 기본적인 내용에 대해서만 문서를 요약해서 기록하고자 한다.
첨언하자면, 필자가 CAN과 관련된 프로젝트를 앞서 언급한 로봇 이외에 한번 더 진행하였다. 자동차 만드는 관련 회사에서 진행한 내용(군수용)으로 FPGA를 이용하여 Intel Processor기반에서 CAN과 CAN-FD 다수채널을 이용할 수 있도록 윈도우 및 리눅스 드라이버 개발건이었다. 해당 개발건을 진행하면서 알게 된 내용을 언급해보면 다음과 같다.
- 국내에서 차량의 ECU등 통신은 CAN을 주로이용
- 해외차량은 CAN 뿐만 아니라 FlexRay도 같이 사용함.
그래서인지 CAN-FD관련 과제를 진행했는데, CAN은 FlexRay에 비해서 속도가 느리다. 일반적인 CAN의 최대 속도는 1Mbps이고, CAN-FD는 8MBps인데도 FlexRay는 CAN과 호환되지 않지만, CAN-FD는 CAN과 호환할 수 있다는 것이다. 독자 여러분께서 디바이스마트나 이런데서 CAN 모듈을 구매해서 실제 테스트 해보면 1MBps는 속도가 나오지 않을 것이다. 필자가 사용해본 여러 모듈증 1MBps 확인 된 모듈은 해외제품 10만원 이상하는거랑, MKDEV의 CAN모듈 두 종류 밖에 없었다. 요즘엔 좀 더 나왔을래나 모르겠지만...
1. CAN의 개요
CAN은 Controller Area netowrk)의 약자이다. 자동차 내부의 2개이상의 전자제어장치인 ECU(Electric Control Unit)통신을 위해 벤츠의 요구에 따라 보쉬(Bosch)가 개발하였다. CAN은 두가닥의 Twisted Pair Wire를 사용하며, RS-485와 같은 차동평형연결을 구성할 수 있다. 초기에는 차량용 데이터(제어)용으로 주로 사용되었으나, 최근에는 산업용 임베디드 시스템에 많이 사용된다.
(1) CAN의 통신 방식
초기 CAN은 ECU간 통신을 위해 UART 방식을 고려했으나, UART는 P2P통신이므로 서로다른 2개이상의 통신을 위해 Bus방식을 사용하여 다중통신을 할 수 있도록 구성하여야 했다.
(2) CAN의 통신 속도
CAN은 최대 40M까지 최대 1Mbit/s의 속도를 가지며, 길이에 따라 속도와 안정성이 감소되는데, 1KM까지에서는 50kbps까지 가능하며 그 이상은 리피터를 이용하여야 한다. 아래는 CAN과 통신거리의 상관관계이다. 하지만 실제로는 모듈을 어떻게 만들었냐에 따라서 아래의 이론적인 수치보다 낮아질 수 있다.
(3) ECU 연결 방법의 변화
과거 연결방법은 P2P형태로 구성이 되어므로, 중첩된 연결이 필요할 수 밖에 없는 구조였다. 그러하니 당연히 통신의 신뢰도와 부품 비용등 많은 부분에서 문제가 있었다. 아래의 2가지 연결 방식은 자동차에서 사용하는 연결 방식이었다고 한다. 필자는 자동차 관련 개발을 해본적이 없어서 실제 과거와 현재의 방식이 어느시점에서 변경되었는지 확실하게는 알수 없다. 다만, 여러 문서를 확인하고 리소스를 이미지로 연결방식을 정리하여 그렸다. 혹시 아래 부분에서 필자가 오해하고 있는 부분이 있다면 별도로 알려주길 바란다.
- 과거의 ECU 연결 방식
- 현재의 ECU 연결 방식
(4) 버스와 종단저항
CAN은 120옴의 종단 저항을 이용하여 버스의 시작과 끝을 구분한다. 아래는 그 예를 단순화 시켜 졍리하여 그렸다. 물론, 과제 진행중 갑님들께서 부분 성형 네트워크를 구성해야 한다고 우겨서 돌아오는데 다소 많은 시간이 소요된 적이 있었다. CAN버스를 구성하는 CANH와 CANL 양 종단에 저항을 두어서 버스의 시작과 끝을 정할 수 있다.
(5) CAN의 규격
1992년도에 CAN, 1992년도 CANKingdom, 1993년 ISO11898... 됐고, 1995의 CAN2.0B, 1996년 CANopen로 마지막 2가지 정도가 본 문서에서 담고 있는 내용이다. CAN은 CAN 2.0A/B로 나뉘는데 구분은 11비트 식별자 A버전과 29비트 식별자 B버전이고 이는 ISO 규격에 따라 물리계층에서 차이가 있으며 통신속도로 구분된다.
따라서, CAN 2.0A는 B에 데이터를 보낼 수 있지만, CAN 2.0B는 A에 데이터를 보낼 수 있다.
(6) CAN의 표준 프레임
CAN은 아래와 같은 데이터 표준 프레임을 사용한다. 문서에는 필드별로 설명을 해뒀지만 블로그상에 넣지니, 내용이 너무 길어진다. 필자는 라이브러리를 사용하여 예제를 만들 거라서 프로토콜을 건드리지 않는 독자분들 께서는 필드 내용까지 알아야 할 것 같지는 않으니 넘어가도록 한다.
(7) CAN으 버스 형태
CAN은 CANH(CAN High)와 CANL(CAN Low) 두가지 신호를 이용한 차동방식으로 동작된다. 그리고 Diminat는 Logical 0의 상태를 의미하며 아래의 경우와 같고, Recessive는 locaical 1의 상태를 의미한다. 필자와 함께 개발했던 하드웨어 개발자가 중요한 기본내용이라고 해서 문서에 포함되었으므로 필자도 남긴다.
- Diminant(Logical 0)
CAN_H > CAN_L
CAN_H = 3.5V, CAN_L = 1.5V
- Recessive(Logical 1)
CAN_H = CAN_L = 2.5V
(8) CAN 프로토콜 계층의 상호작용
CAN의 경우 OSI 레이어중 다음과 같은 레이어를 기반으로 사용된다.
(9) CAN Connector
흔하게 사용되는 DSUB 9pin, Mini-c 5Pin, ODB-II등이 있다. 자세한 내용은 구글 검색 이용하기 바란다.
(10) CAN 적용 예시
- 자동차
엔진 매니저 시스템, 브레이크, 기어제어, 액티브 서스펜션, 파워트레인, 계기, 조명....
- 중장비
일반적인 기능은 자동차와 유사, 목적에 따라 건선용 차량, 지게차 트랙터등 파워 트레인과 수압제어등...
- 열차
가속, 브레이크, 도어제어 및 진단, 오류메시지 처리와 전자하위 시스템 제어장치간 데이터교환등.
- 건축물
난방, 에어컨, 조명 감시 및 엘리베이터와 에스컬레이터 제어등...
- 의료
컴퓨터 단층촬영 및 X-ray와 같은 시스템에서 사용.
- 산업
많은 종류의 자동제어장치를 연결하는 방법으로 센서, 엑추에이터 뿐만 측정값 실제값 교환 및 진단에 사용..
최근댓글