국방로봇대회를 준비하면서 CAN통신을 하게 되었다.
메인 PC로 사용하고 있는 Intel NUC에서 CAN 통신으로 모터 드라이버에 명령을 보내고 데이터를 받는 일을 하였다.
일반 PC에는 대부분 CAN 통신 포트가 뚫려있지 않기 때문에, CAN통신을 하려면 별도의 장치가 필요하다.
대표적으로 peak system의 pcan을 많이 사용하는 것 같다.
Intel NUC 역시 CAN통신을 하려면 CAN통신 장치가 필요한데,
CANable이라는 장치를 구매해 사용해보았다.
CANable USB-to-CAN 보드를 사용해서 CAN통신을 하는 법을 알아보자.
** 준비물 **
1. CANable(CAN to USB) 보드
2. ST-Link V2 mini
1. CANable

An Open-Source USB to CAN Adapter - CANable
Overview The CANable is a small low-cost open source USB to CAN adapter. The CANable shows up as a virtual serial port on your computer and acts as a serial-line to CAN bus interface. With the alternative candleLight firmware, the CANable enumerates as a n
canable.io
CANable 보드는 USB to CAN 어댑터이다.
이 장치를 PC의 USB 포트에 연결해서 CAN통신을 한다.
엄지손가락 정도의 크기로 매우 작다.
자세한 원리나 스팩은 잘 모르니, 궁금하다면 위의 홈페이지를 방문해서 알아보도록 하자.
1.1 구매처
홈페이지에 가면 제품을 구매하는 Store 가 있는데,
2021년 5월 현재 SOLD OUT 상태다.
오픈소스 보드이기 때문에,
동일한 보드를 자체적으로 만들어 판매하는 곳이 많다.
내 경우에는 국내의 '가치창조기술' 이라는 사이트에서
39,500원에 구매하였다. 판매처 링크
CANUSB 모듈 -CANtact, CANABLE (CAN-USB Module) lawicel
상품결제정보 결제는 신용카드, 실시간 계좌이체, 무통장 입금 등을 선택하여 진행하실 수 있습니다. 세금계산서 발행을 요청하실 경우에는 결제방법을 무통장 입금으로 선택하시고 사업자등
vctec.co.kr
구매 사이트에 들어가 보면 공식 홈페이지의 사진과는 다소 다르다.
또 알리익스프레스 등에서도 구매할 수 있는 듯 하다.
판매처 링크1
판매처 링크2
판매처 링크3

실제로 수령한 제품은 위 사진처럼 빨간색 PCB였다.
PCB 색상은 임의로 발송된다고 한다.
2. 부트로더 업로드
구매한 CANable이 도착한 뒤, 테스트 해보기 위해 노트북에 연결하였는데,
이상하게 Power LED가 켜지지 않았다.
그러려니 하고 일단 넘어갔다.
구매 사이트에 다음과 같은 참고사항이 안내되어 있었다.

2번을 보면,
linux slcan 및 socketcan으로 사용하기 위해서는 펌웨어 업데이트를 해주어야 한다고 되어있다.
이걸 보고, 나는 linux 환경에서 socket can 방식으로 사용할 계획이었기 때문에,
펌웨어를 업데이트 해야겠다고 생각했다.
그래서 안내되어 있는 공식홈페이지 링크를 타고가서, 업데이트를 시도해보았다.
업데이트 방법은 공식홈페이지에 나와 있는데,
어차피 나는 이 방법으로 실패했으므로 따로 설명하지는 않으려고 한다.
업데이트를 시도했을 때, dfu interface를 찾을 수 없다는 에러가 떴는데, 이걸 이해하지 못해서 구매처에 문의를 했다.
구매 페이지에
알림: 오픈소스 하드웨어로 제품의 사용방법/테스트 및 펌웨어 업데이트 방법 등을 교육수준으로
설명드리거나 하고 있지 않사오니 구매전 참고 부탁 드립니다.
라는 문구가 있어서, 친절히 답해주지 않을 거라는 예상을 했지만, 무릅쓰고 문의글을 남겨보았다.
돌아온 답변은
"사용자가 직접 ST link를 이용해서 부트로더를 can-usb의 mcu에 프로그래밍을 하여야 LED도 켜지고, 제품을 사용할 수 있다."
"그러니 ST link를 이용해서 부트로더를 탑재한 후 사용해라."
라는 것이었다.
기본 펌웨어가 탑재된 보드를 원한다면, 이 사이트 말고 알리익스프레스 등 다른 판매처를 알아보자.
그러나 만약 국내 구매을 원해서 이 보드를 구매한다면, 아래 방법을 따라하면 된다.
2.1 ST-Link 준비
2023-01-19 추가
22년 말 쯤 부터 현재까지 시중에서 가장 쉽게 구할 수 있는 Canable 보드는 MakerBase의 MKS Canable 장치인 듯 하다.
3D 프린팅 관련 업계에서 Canable을 사용하는 것으로 보이는데, 이 덕분에 국내에서 저렴한 가격으로 쉽게 Canable을 구매할 수 있게 되었다. 예전에 알리익스프레스에서 판매하는 Canable은 구매하면 펌웨어가 이미 올라가 있어서, 별도로 펌웨어를 구울필요없이 바로 사용이 가능했는데, MKS Canable은 아쉽게도 기본 펌웨어가 올라가있지 않은 경우가 많은 것 같다.
따라서 아래의 ST-Link를 이용해 펌웨어를 굽는 내용은 이전에는 선택사항이었지만, MKS Canable을 사용한다면 거의 필수사항이라고 보아야 할 것이다.
부트로더를 올리기 위해, ST-Link 장치를 구매하였다.
ST-link는 STM칩이 탑재된 보드에 펌웨어를 개발할 때 사용하는 장치라고 한다.
원래는 아래 사진처럼 생긴 장치인데

이 장치를 더욱 간소화 시킨
ST-LInk V2 mini라는 장치를 구매하였다.

2.2 ST Link Utility 프로그램 준비
다음으로 ST Link utility 라는 프로그램이 필요하다.
윈도우 환경에서 아래 링크로 들어가면 프로그램을 받을 수 있는데,
라이센스 동의 후, 이메일 인증을 거쳐 받게 되어있다.
https://www.st.com/en/development-tools/stsw-link004.html
STSW-LINK004 - STMicroelectronics
STSW-LINK004 - STM32 ST-LINK utility (replaced by STM32CubeProgrammer), STSW-LINK004, STMicroelectronics
www.st.com
설치 파일을 받아서 프로그램을 설치해준다.

위와 같은 ST-Link Utility 프로그램을 설치한다.
2.3 펌웨어 파일 준비
이제 보드에 업로드 할 펌웨어 파일을 받아야한다.
https://canable.io/builds/slcan-firmware/
위 링크에서 canable-xxxxxx.hex 파일을 다운로드한다.
나중에 링크로 들어갈 수 없게 될 경우를 대비해서, 해당 파일을 첨부하였다.
2.4 장치 연결
이제 PC와 ST link와 CANable 연결해준다.
전체적인 연결 모습은 아래와 같다.

ST link와 CANable 보드는 암-암 점프선으로 연결해준다.
아래와 같이 연결해 준다. 다만 제품마다 핀 위치가 다를 수 있으므로 주의한다.

2.5 펌웨어 업로드
이제 ST-link utility 프로그램을 실행하자.
아래와 같은 화면이 나올 것이다.

Connect to the Target 버튼을 누르면 현재 연결되어 있는 CANable 장치가 인식될 것이다.

지우개 모양의 Full Chip Erase 버튼을 눌러서 STM32 칩에 저장된 데이터를 초기화시킨다.

Open File 버튼을 눌러서

아까 다운받았던 canable-xxxxxx.hex 파일을 불러오자.

메뉴바에서 Target -> Program & Verify 를 눌러서 펌웨어를 보드에 업로드한다.

하단 출력창에 Verification . . .OK 가 떴다면 성공적으로 업로드 된 것이다.
3. Linux Socket CAN으로 CAN통신하기
CANable로 CAN통신을 하는 가장 기본적인 방법은 Socket CAN방식을 이용하는 것이다.
CANable 공식 홈페이지의 Getting Started 에 CANable을 사용하는 다양한 방법이 설명되어 있다.
Socket CAN이란 ?
Socket CAN이란
socketcan은 CAN(Controller Area Network) 프로토콜의 Linux 용 구현이다.
CAN은 자동화, 임베디드 기기에 널리 사용되는 네트워킹 기술이다.
Linux 기반의 character device로 구현된 CAN 구현도 있지만 socket CAN은 버클리 소켓 API와 리눅스 네트워크 스택을 사용하며, CAN 디바이스 드라이버를 네트워크 인터페이스로 구현하고 있다.
TCP / IP 프로토콜과 최대한 유사하게 구현되어 있으므로, 기존 네트워크 프로그래밍과 비슷하게 사용할 수 있다.
[출처] Socket CAN|작성자 호떡
참고링크
CANable 장치를 Socket CAN 방식으로 이용하기 위해서 다음과 같은 초기 설정이 필요하다.
$ sudo slcand -o -c -s0 /dev/ttyACM0 can0 $ sudo ifconfig can0 up $ sudo ifconfig can0 txqueuelen 1000
이때 내가 원하는 CAN 통신속도(bit rate)에 따라서 첫번째 slcand 명령의 -s0 대신 다른 파라미터를 넣어준다.
참고 : CAN bitrate에 대한 -s 파라미터
- -s0 = 10k
- -s1 = 20k
- -s2 = 50k
- -s3 = 100k
- -s4 = 125k
- -s5 = 250k
- -s6 = 500k
- -s7 = 750k
- -s8 = 1M
내 경우 250kbps로 사용하기 위해 -s5 로 바꿔주었다.
이 설정은 PC를 껐다 켜거나, CANable 장치를 usb포트에서 뺐다 끼울 때마다 해주어야 하는 것 같다. (확실하지는 않음)
그래서 나는 <stdlib.h>라이브러리의 system( ) 함수를 사용해서
CAN통신 프로그램을 시작할 때마다 이 설정을 해 줄 수 있도록 했다.
3.1 장치 동작 확인
SocketCAN 코드를 작성하기 전에
CANable장치가 잘 동작하는지 확인해보는게 좋을 것이다.
리눅스에서 쉽게 SocketCAN을 사용해볼 수 있는 도구인
can-utils 를 이용해서 테스트해보자.
3.1.1 can-utils 설치
$ sudo apt-get install can-utils
3.1.2 CAN 데이터 보내기
(ID 999번 장치에 DEADBEAF라는 데이터를 보내는 명령)
$ cansend can0 999#DEADBEEF
3.1.3 CAN 데이터 받기
can0 장치로 들어오는 모든 트래픽을 보여주는 명령
$ candump can0
당연히 CAN 데이터를 보내거나 받는 것을 테스트하기 위해서는
CAN통신 TxRx가 가능한 제 2의 장치가 있어야 할 것이다.
내 경우는 다행히 CAN통신을 보내고 받는 테스트를 쉽게 할 수 있는
CAN_talker 장치를 빌려서 테스트를 할 수 있었다.

만약 이와 같이 CAN 통신을 테스트 해 볼 수 있는 장치가 없다면
루프백(Loop back) 테스트를 시도해보자.
통신 장치를 테스트할 때 사용되는 방법이라고 하는데,
Tx에서 나온 통신선을 같은 장치의 Rx에 연결해서,
Tx에서 보낸 데이터가 그대로 자기 자신의 Rx로 돌아오도록 하는 것이다.
rs485 통신과 같은 시리얼 통신에서는 확실히 가능한 방법으로 알고 있는데,
CAN 통신에서도 사용할 수 있는 방법인지는 확실하지 않다. 추후에 해보고 업데이트 할 계획이다.
4. Socket CAN 코드 작성
구글에 'Socket CAN 예제', 'Socket CAN example' 등을 검색하면 Socket CAN 예제가 많이 있다.
나는 이 블로그 의 예제를 참고해서 코드를 작성하였다. Github
추가 참고 사이트
https://python-can.readthedocs.io/en/master/interfaces/socketcan.html
https://netmodule-linux.readthedocs.io/en/latest/howto/can.html