- CAN 소개
- CAN over SPI 및 I2C 비교
- CAN 프로토콜 애플리케이션
- Arduino에서 CAN 프로토콜을 사용하는 방법
- 필요한 구성 요소
- 회로도
- 2 개의 MCP2515 CAN 모듈 간 연결
- CAN 통신을위한 Arduino 프로그래밍
- CAN 송신기 측 코드 설명 (Arduino Nano)
- CAN 수신기 측 코드 설명 (Arduino UNO)
- Arduino에서 CAN 통신 작동
오늘날 모든 자동차는 정보를 감지하고 교환하기 위해 약 60 ~ 100 개의 센서 유닛으로 구성됩니다. 자동차 제조업체는 자율 주행, 에어백 시스템, 타이어 압력 모니터링, 크루즈 컨트롤 시스템 등과 같은 기능을 통해 지속적으로 차를 더욱 스마트하게 만들고 있습니다.이 수치는 높아질 것으로 예상됩니다. 다른 센서와 달리 이러한 센서는 중요한 정보를 처리하므로 이러한 센서의 데이터는 표준 자동차 통신 프로토콜을 사용하여 통신해야 합니다. 예를 들어 속도, 스로틀 위치 등과 같은 크루즈 컨트롤 시스템 데이터는 전자 제어 장치 (ECU)로 전송되는 중요한 값입니다.자동차의 가속 수준을 결정하기 위해 여기에서 통신 오류 또는 데이터 손실이 심각한 오류로 이어질 수 있습니다. 따라서 UART, SPI 또는 I2C와 같은 표준 통신 프로토콜과 달리 설계자는 LIN, CAN, FlexRay 등과 같은 훨씬 안정적인 자동차 통신 프로토콜을 사용합니다.
사용 가능한 모든 프로토콜 중에서 CAN이 더 많이 사용되고 널리 사용됩니다. CAN이 무엇이며 어떻게 작동하는지 이미 논의했습니다. 따라서이 기사에서는 기본 사항을 다시 살펴본 다음 마지막으로 CAN 통신을 사용하여 두 Arduino간에 데이터를 교환 할 것 입니다. 흥미 롭군요! 자, 시작합시다.
CAN 소개
CAN (Controller Area Network) 은 산업 및 자동차 애플리케이션 용으로 설계된 직렬 통신 버스입니다. 여러 장치 간의 통신에 사용되는 메시지 기반 프로토콜입니다. 아래 그림과 같이 여러 CAN 장치가 함께 연결되면 연결은 중추 신경계처럼 작동하는 네트워크를 형성하여 모든 장치가 노드의 다른 장치와 통신 할 수 있도록합니다.
CAN 네트워크는 두 개의 와이어로 구성 될 것이다 CAN CAN 높고 낮음 위와 같이 양방향 데이터 전송. 일반적으로 CAN의 통신 속도는 50Kbps에서 1Mbps이며 거리는 1Mbps에서 40 미터에서 50kpbs에서 1000 미터까지 다양합니다.
CAN 메시지 형식:
CAN 통신에서 데이터는 특정 메시지 형식으로 네트워크에서 전송됩니다. 이 메시지 형식은 많은 세그먼트를 포함하지만 두 개의 주요 세그먼트는 CAN 버스에서 메시지를 보내고 응답하는 데 도움 이되는 식별자와 데이터 입니다.
식별자 또는 CAN ID: 식별자는 CAN ID 또는 PGN (파라미터 그룹 번호)이라고도합니다. CAN 네트워크에 존재하는 CAN 장치를 식별하는 데 사용됩니다. 식별자의 길이는 사용 된 CAN 프로토콜 유형에 따라 11 또는 29 비트입니다.
표준 CAN: 0-2047 (11 비트)
확장 CAN: 0-2 29 -1 (29 비트)
데이터: 한 장치에서 다른 장치로 전송해야하는 실제 센서 / 제어 데이터입니다. 크기 데이터의 길이는 0-8 바이트입니다.
데이터 길이 코드 (DLC): 존재하는 데이터 바이트 수에 대해 0 ~ 8.
CAN에서 사용되는 전선:
CAN 프로토콜은 정보를 송수신하기 위해 CAN_H와 CAN_L 이라는 두 개의 와이어로 구성됩니다. 두 와이어 모두 차동 라인 으로 작동 합니다. 즉, CAN 신호 (0 또는 1)는 CAN_L과 CAN_H 간의 전위차로 표시됩니다. 차이가 양수이고 특정 최소 전압보다 크면 1이고 차이가 음수이면 0입니다.
일반적으로 트위스트 페어 케이블은 CAN 통신에 사용됩니다. 하나의 120ohm 저항은 일반적으로 이미지와 같이 CAN 네트워크의 두 끝에서 사용됩니다. 이는 라인이 균형을 이루고 동일한 전위에 연결되어야하기 때문입니다.
CAN over SPI 및 I2C 비교
Arduino와 함께 SPI를 사용하고 Arduino와 함께 IIC를 사용하는 방법을 이미 배웠으므로 SPI와 I2C의 기능을 CAN과 비교해 보겠습니다.
매개 변수 | SPI | I2C | 할 수있다 |
속도 | 3Mbps에서 10Mbps | 표준: 100Kbps | 10KBps ~ 1MBps 사용 된 와이어 길이에 따라 다름 |
빠름: 400Kbps | |||
고속: 3.4Mbps | |||
유형 | 동기식 | 동기식 | 비동기 |
전선 수 | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 선 (SDA, SCL) | 2 선 (CAN_H, CAN_L) |
듀플렉스 | 전이중 | 반이중 | 반이중 |
CAN 프로토콜 애플리케이션
- CAN 프로토콜의 견고성과 신뢰성으로 인해 자동차, 산업 기계, 농업, 의료 장비 등과 같은 산업에서 사용됩니다.
- CAN에서 배선 복잡성이 감소함에 따라 주로 자동차와 같은 자동차 애플리케이션에 사용됩니다.
- 구현 비용이 저렴하고 하드웨어 구성 요소 가격도 저렴합니다.
- CAN 버스 장치를 쉽게 추가하고 제거 할 수 있습니다.
Arduino에서 CAN 프로토콜을 사용하는 방법
Arduino에는 내장 CAN 포트 가 없으므로 MCP2515 라는 CAN 모듈 이 사용됩니다. 이 CAN 모듈은 SPI 통신을 사용하여 Arduino와 인터페이스됩니다. MCP2515에 대해 자세히 알아보고 Arduino와 어떻게 연결되는지 살펴 보겠습니다.
MCP2515 CAN 모듈:
MCP2515 모듈에는 고속 CAN 트랜시버 인 CAN 컨트롤러 MCP2515가 있습니다. MCP2515와 MCU 간의 연결은 SPI를 통해 이루어집니다. 따라서 SPI 인터페이스가있는 모든 마이크로 컨트롤러와 쉽게 인터페이스 할 수 있습니다.
CAN Bus를 배우고 자하는 초보자에게이 모듈은 좋은 출발점이 될 것입니다. 이 CAN SPI 보드는 산업 자동화, 홈 자동화 및 기타 자동차 임베디드 프로젝트에 이상적입니다.
MCP2515의 특징 및 사양:
- 고속 CAN 트랜시버 TJA1050 사용
- 치수: 40 × 28mm
- 다중 CAN 버스 인터페이스 확장을위한 SPI 제어
- 8MHZ 수정 발진기
- 120Ω 종단 저항
- 독립 키, LED 표시기, 전원 표시기 있음
- 1Mb / s CAN 작동 지원
- 저 전류 대기 작동
- 최대 112 개 노드 연결 가능
MCP2515 CAN 모듈의 핀아웃:
핀 이름 |
사용하다 |
VCC |
5V 전원 입력 핀 |
GND |
접지 핀 |
CS |
SPI SLAVE 선택 핀 (액티브 로우) |
그래서 |
SPI 마스터 입력 슬레이브 출력 리드 |
시 |
SPI 마스터 출력 슬레이브 입력 리드 |
SCLK |
SPI 클록 핀 |
INT |
MCP2515 인터럽트 핀 |
이 튜토리얼에서는 CAN 버스 모듈 MCP2515 를 통해 Arduino Nano에서 Arduino Uno로 습도 및 온도 (DHT11) 센서 데이터 를 전송 하는 방법을 살펴 보겠습니다.
필요한 구성 요소
- Arduino UNO
- Arduino 나노
- DHT11
- 16x2 LCD 디스플레이
- MCP2515 CAN 모듈 – 2
- 10k 전위차계
- 브레드 보드
- 전선 연결
회로도
CAN 송신기 측 연결:
구성 요소-핀 |
Arduino Nano |
MPC2515-VCC |
+ 5V |
MPC2515-GND |
GND |
MPC2515-CS |
D10 (SPI_SS) |
MPC2515-SO |
D12 (SPI_MISO) |
MPC2515-SI |
D11 (SPI_MOSI) |
MPC2515-SCK |
D13 (SPI_SCK) |
MPC2515-INT |
D2 |
DHT11-VCC |
+ 5V |
DHT11-GND |
GND |
DHT11-출력 |
A0 |
CAN 수신기 측의 회로 연결:
구성 요소-핀 |
Arduino UNO |
MPC2515-VCC |
+ 5V |
MPC2515-GND |
GND |
MPC2515-CS |
10 (SPI_SS) |
MPC2515-SO |
12 (SPI_MISO) |
MPC2515-SI |
11 (SPI_MOSI) |
MPC2515-SCK |
13 (SPI_SCK) |
MPC2515-INT |
2 |
LCD-VSS |
GND |
LCD-VDD |
+ 5V |
LCD-V0 |
10K 전위차계 센터 PIN에 |
LCD-RS |
삼 |
LCD-RW |
GND |
LCD-E |
4 |
LCD-D4 |
5 |
LCD-D5 |
6 |
LCD-D6 |
7 |
LCD-D7 |
8 |
LCD-A |
+ 5V |
LCD-K |
GND |
2 개의 MCP2515 CAN 모듈 간 연결
H – CAN 높음
L – CAN 낮음
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
엘 |
엘 |
모든 연결이 완료되면 하드웨어가 아래와 같이 보입니다.
CAN 통신을위한 Arduino 프로그래밍
먼저 Arduino IDE에 CAN 용 라이브러리를 설치해야합니다. 다음 라이브러리를 사용하면 MCP2515 CAN 모듈과 Arduino의 인터페이스가 더 쉬워집니다.
- Arduino CAN MCP2515 라이브러리의 ZIP 파일을 다운로드합니다.
- Arduino IDE에서: 스케치-> 라이브러리 포함->.ZIP 라이브러리 추가
이 튜토리얼에서 코딩은 CAN 송신기 코드 (Arduino Nano)와 CAN 수신기 코드 (Arduino UNO)의 두 부분으로 나뉩니다. 두 부분 모두이 페이지 하단에서 찾을 수 있습니다. 이에 대한 설명은 다음과 같습니다.
데이터 송수신 프로그램을 작성하기 전에 위의 단계에 따라 라이브러리를 설치했는지 확인하고 CAN 모듈 MCP2515가 다음과 같이 프로그램에서 초기화되었는지 확인하십시오.
MCP2515 CAN 모듈 초기화:
MCP2515와의 연결을 생성하려면 다음 단계를 따르십시오.
1. SPI CS가 연결된 핀 번호를 설정합니다 (기본값: 10).
MCP2515 mcp2515 (10);
2. 전송 속도 및 오실레이터 주파수 설정
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
사용 가능한 전송 속도:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS, CAN_200KBPS, CAN_250KBPS, CAN_500KBPS, CAN_1000KBPS.
사용 가능한 클록 속도:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. 모드를 설정합니다.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
CAN 송신기 측 코드 설명 (Arduino Nano)
송신기 섹션에서 SPI 핀 및 DHT11을 통해 MCP2515 CAN 모듈과 인터페이스 된 Arduino Nano 는 온도 및 습도 데이터 를 CAN 버스로 보냅니다.
먼저 필요한 라이브러리, SPI 통신을 사용하기위한 SPI 라이브러리, CAN 통신을 사용하기위한 MCP2515 라이브러리 및 Arduino와 함께 DHT 센서를 사용하기위한 DHT 라이브러리가 포함됩니다 . 우리는 이전에 DHT11을 Arduino와 인터페이스했습니다.
#포함
이제 Arduino Nano의 A0에 연결된 DHT11 (OUT 핀)의 핀 이름이 정의되었습니다.
#define DHTPIN A0
또한 DHTTYPE 은 DHT11 로 정의됩니다.
#define DHTTYPE DHT11
canMsg CAN 메시지 포맷을 저장하기위한 데이터 구조체 타입.
구조체 can_frame canMsg;
SPI CS가 연결된 핀 번호 설정 (기본값: 10)
MCP2515 mcp2515 (10);
또한 DHT11과 같은 Arduino Nano 및 DHT 유형의 DHT 핀이있는 DHT 클래스의 객체 dht가 초기화됩니다.
DHT dht (DHTPIN, DHTTYPE);
다음으로 void setup ():
다음 문을 사용하여 SPI 통신을 시작합니다.
SPI.begin ();
그런 다음 아래 문을 사용하여 DHT11 센서에서 온도 및 습도 값을 수신하기 시작합니다.
dht.begin ();
다음으로 MCP2515는 다음 명령을 사용하여 RESET됩니다.
mcp2515.reset ();
이제 MCP2515는 클럭으로 500KBPS 및 8MHZ 속도 로 설정 되었습니다.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
MCP2525는 일반 모드로 설정되어 있습니다.
mcp2515.setNormalMode ();
void loop ()에서:
다음 문은 Humidity 및 Temperature 값을 가져와 정수 변수 h 및 t에 저장합니다.
int h = dht.readHumidity (); int t = dht.readTemperature ();
다음으로 CAN ID는 0x036 (선택에 따라)으로, DLC는 8로 주어지며 h와 t 데이터를 데이터 와 데이터에 제공 하고 모든 데이터를 0 으로 놓습니다.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; //canMsg.data의 습도 값 업데이트 = t; //canMsg.data의 온도 값 업데이트 = 0x00; // 0으로 모두 휴식 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
결국 CAN BUS에 메시지 를 보내기 위해 다음 명령문을 사용합니다.
mcp2515.sendMessage (& canMsg);
이제 온도 및 습도 데이터가 CAN 버스에 메시지로 전송됩니다.
CAN 수신기 측 코드 설명 (Arduino UNO)
수신기 섹션에서 Arduino UNO는 MCP2515 및 16x2 LCD 디스플레이와 인터페이스되었습니다. 여기서 Arduino UNO는 CAN 버스에서 온도 및 습도를 수신하고 수신 된 데이터를 LCD에 표시합니다.
먼저 필요한 라이브러리, SPI 통신을 사용하기위한 SPI 라이브러리, CAN 통신을 사용하기위한 MCP2515 라이브러리 및 Arduino와 함께 16x2 LCD를 사용하기위한 LiquidCrsytal 라이브러리가 포함됩니다 .
#포함
다음으로 Arduino UNO와 연결하는 데 사용되는 LCD 핀이 정의됩니다.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
구조체 데이터 타입은 저장 선언 CAN 메시지 포맷.
구조체 can_frame canMsg;
SPI CS가 연결된 핀 번호 설정 (기본값: 10)
MCP2515 mcp2515 (10);
무효 설정에서 ():
먼저 LCD가 16x2 모드로 설정되고 환영 메시지가 표시됩니다.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("ARDUINO 가능"); 지연 (3000); lcd.clear ();
다음 문을 사용하여 SPI 통신을 시작합니다.
SPI.begin ();
다음으로 MCP2515는 다음 명령을 사용하여 RESET됩니다.
mcp2515.reset ();
이제 MCP2515는 클럭으로 500KBPS 및 8MHZ 속도로 설정되었습니다.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
그리고 MCP2525는 일반 모드로 설정됩니다.
mcp2515.setNormalMode ();
다음 void loop ():
다음 문장은 CAN 버스에서 메시지를 수신하는 데 사용됩니다. 메시지가 수신되면 if 조건이됩니다.
if (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
에서 만약 조건 데이터를 수신하고, (C)에 저장된 anMsg 온도 값이 습도 값 데이터가 데이터. 두 값 모두 정수 x와 y에 저장됩니다.
int x = canMsg.data; int y = canMsg.data;
값을받은 후 온도 및 습도 값은 다음과 같은 문장을 사용하여 16x2 LCD 디스플레이에 표시됩니다.
lcd.setCursor (0,0); lcd.print ("습도:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("온도:"); lcd.print (y); 지연 (1000); lcd.clear ();
Arduino에서 CAN 통신 작동
하드웨어가 준비되면 각 Arduino 보드에 CAN 송신기 및 CAN 수신기 용 프로그램 (전체 프로그램은 아래에 제공됨)을 업로드합니다. 전원이 공급되면 DHT11에서 읽은 온도 값이 CAN 통신을 통해 다른 Arduino로 전송되고 아래 이미지에서 볼 수 있듯이 두 번째 Arduino 의 LCD에 표시됩니다. 또한 AC 리모컨을 사용하여 LCD에 표시된 온도가 실제 실내 온도와 가까운 지 확인했습니다.
전체 작업은 아래 링크 된 비디오에서 찾을 수 있습니다. 질문이 있으시면 댓글 섹션에 남겨 주시거나 다른 기술 질문에 대한 포럼을 사용하십시오.