- Введение в CAN
- Сравнение CAN через SPI и I2C
- Приложения протокола CAN
- Как использовать протокол CAN в Arduino
- Необходимые компоненты
- Принципиальная электрическая схема
- Соединение между двумя модулями CAN MCP2515
- Программирование Arduino для связи по CAN
- Расшифровка кода стороны передатчика CAN (Arduino Nano)
- Объяснение кода стороны приемника CAN (Arduino UNO)
- Работа CAN-связи в Arduino
Сегодня в среднем автомобиле используется от 60 до 100 сенсоров для считывания информации и обмена ею. Поскольку производители автомобилей постоянно совершенствуют свои автомобили с помощью таких функций, как автономное вождение, система подушек безопасности, мониторинг давления в шинах, система круиз-контроля и т. Д., Ожидается, что это число будет только расти. В отличие от других датчиков, эти датчики обрабатывают важную информацию, и, следовательно, данные от этих датчиков должны передаваться с использованием стандартных автомобильных протоколов связи. Например, данные системы круиз-контроля, такие как скорость, положение дроссельной заслонки и т. Д., Являются жизненно важными значениями, которые отправляются в электронный блок управления (ЭБУ).чтобы определить уровень ускорения автомобиля, недопонимание или потеря данных здесь может привести к критическим сбоям. Следовательно, в отличие от стандартных протоколов связи, таких как UART, SPI или I2C, разработчики используют очень надежные автомобильные протоколы связи, такие как LIN, CAN, FlexRay и т. Д.
Из всех доступных протоколов CAN наиболее широко используется и популярен. Мы уже обсуждали, что такое CAN и как работает CAN. Итак, в этой статье мы снова рассмотрим основы, а затем, наконец, мы также будем обмениваться данными между двумя Arduinos, используя связь CAN. Звучит интересно! Итак, приступим.
Введение в CAN
CAN, также известная как Controller Area Network, - это шина последовательной связи, разработанная для промышленных и автомобильных приложений. Это протокол на основе сообщений, используемый для связи между несколькими устройствами. Когда несколько устройств CAN соединяются вместе, как показано ниже, соединение образует сеть, действующую как наша центральная нервная система, позволяя любому устройству общаться с любым другим устройством в узле.
CAN - сеть будет состоять только из двух проводов CAN высока и может Низких для двунаправленной передачи данных, как показано выше. Обычно скорость передачи данных по CAN составляет от 50 кбит / с до 1 Мбит / с, а расстояние может варьироваться от 40 метров при 1 Мбит / с до 1000 метров при 50 кбит / с.
Формат сообщения CAN:
При обмене данными по CAN данные передаются по сети в определенном формате сообщения. Этот формат сообщения состоит из множества сегментов, но два основных сегмента - это идентификатор и данные, которые помогают отправлять сообщения в шине CAN и отвечать на них.
Идентификатор или CAN ID: идентификатор также известен как CAN ID или PGN (номер группы параметров). Он используется для идентификации устройств CAN, присутствующих в сети CAN. Длина идентификатора составляет 11 или 29 бит в зависимости от типа используемого протокола CAN.
Стандартный 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 используется кабель витой пары. Один резистор на 120 Ом обычно используется на двух концах сети CAN, как показано на рисунке, это связано с тем, что линия должна быть сбалансирована и подключена к одному и тому же потенциалу.
Сравнение CAN через SPI и I2C
Поскольку мы уже узнали, как использовать SPI с Arduino и IIC с Arduino, давайте сравним возможности SPI и I2C с CAN.
Параметр | SPI | I2C | МОЧЬ |
Скорость | От 3 до 10 Мбит / с | Стандарт: 100 Кбит / с | От 10 Кбит / с до 1 Мбит / с Также зависит от длины используемого провода |
Быстро: 400 Кбит / с | |||
Высокая скорость: 3,4 Мбит / с | |||
Тип | Синхронный | Синхронный | Асинхронный |
Количество проводов | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 провода (SDA, SCL) | 2 провода (CAN_H, CAN_L) |
Дуплекс | Полный дуплекс | Полудуплекс | Полудуплекс |
Приложения протокола CAN
- Благодаря устойчивости и надежности протокола CAN, они используются в таких отраслях, как автомобилестроение, промышленное оборудование, сельское хозяйство, медицинское оборудование и т. Д.
- Поскольку сложность проводки в CAN уменьшается, они в основном используются в автомобильных приложениях, таких как автомобиль.
- Низкая стоимость внедрения, а также цена аппаратных компонентов.
- Легко добавлять и удалять устройства CAN-шины.
Как использовать протокол CAN в Arduino
Поскольку Arduino не имеет встроенного порта CAN, используется модуль CAN под названием MCP2515. Этот модуль CAN взаимодействует с Arduino с помощью связи SPI. Давайте подробнее рассмотрим MCP2515 и его взаимодействие с Arduino.
Модуль CAN MCP2515:
Модуль MCP2515 имеет контроллер CAN MCP2515, который является высокоскоростным трансивером CAN. Связь между MCP2515 и MCU осуществляется через SPI. Таким образом, легко взаимодействовать с любым микроконтроллером, имеющим интерфейс SPI.
Для новичков, которые хотят изучить CAN-шину, этот модуль послужит хорошим началом. Эта плата CAN SPI идеально подходит для промышленной автоматизации, домашней автоматизации и других встраиваемых автомобильных систем.
Особенности и характеристики MCP2515:
- Использует высокоскоростной трансивер CAN TJA1050
- Размер: 40 × 28 мм
- Управление SPI для расширения интерфейса шины Multi CAN
- Кварцевый генератор 8 МГц
- Оконечное сопротивление 120 Ом
- Имеет независимый ключ, светодиодный индикатор, индикатор питания
- Поддерживает работу CAN со скоростью 1 Мбит / с
- Слаботочный режим ожидания
- Можно подключить до 112 узлов
Распиновка CAN модуля MCP2515:
Имя контакта |
ИСПОЛЬЗОВАТЬ |
VCC |
Вход питания 5 В |
GND |
Контакт заземления |
CS |
Контакт выбора SPI SLAVE (активный низкий) |
ТАК |
Главный вход SPI Ведомый выход |
SI |
Главный выход SPI Вход подчиненного устройства |
SCLK |
Вывод тактового сигнала SPI |
INT |
Вывод прерывания MCP2515 |
В этом руководстве давайте посмотрим, как отправлять данные датчика влажности и температуры (DHT11) из Arduino Nano в Arduino Uno через модуль шины CAN MCP2515.
Необходимые компоненты
- Arduino UNO
- Ардуино НАНО
- DHT11
- ЖК-дисплей 16x2
- Модуль CAN MCP2515 - 2
- Потенциометр 10k
- Макетная плата
- Подключение проводов
Принципиальная электрическая схема
Подключение на стороне CAN передатчика:
Компонент - Пин |
Ардуино Нано |
MPC2515 - VCC |
+ 5В |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - SO |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - ИНТ. |
D2 |
DHT11 - VCC |
+ 5В |
DHT11 - GND |
GND |
DHT11 - ВЫХОД |
A0 |
Цепные соединения на стороне CAN-приемника:
Компонент - Пин |
Arduino UNO |
MPC2515 - VCC |
+ 5В |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - SO |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - ИНТ. |
2 |
ЖК-дисплей - VSS |
GND |
ЖК-дисплей - VDD |
+ 5В |
ЖК-дисплей - V0 |
К центральному контакту потенциометра 10K |
ЖК-дисплей - RS |
3 |
ЖК-дисплей - RW |
GND |
ЖК-дисплей - E |
4 |
ЖК-дисплей - D4 |
5 |
ЖК-дисплей - D5 |
6 |
ЖК-дисплей - D6 |
7 |
ЖК-дисплей - D7 |
8 |
ЖК-дисплей - А |
+ 5В |
ЖК-дисплей - K |
GND |
Соединение между двумя модулями CAN MCP2515
H - CAN высокий
L - CAN низкий
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
ЧАС |
ЧАС |
L |
L |
После того, как все подключения были выполнены, мое оборудование выглядело следующим образом:
Программирование Arduino для связи по CAN
Сначала нам нужно установить библиотеку для CAN в Arduino IDE. Взаимодействие модуля CAN MCP2515 с Arduino становится проще благодаря использованию следующей библиотеки.
- Загрузите ZIP-файл библиотеки Arduino CAN MCP2515.
- В среде Arduino IDE: Sketch -> Включить библиотеку -> Добавить библиотеку.ZIP
В этом руководстве кодирование разделено на две части: код CAN-передатчика (Arduino Nano) и код CAN-приемника (Arduino UNO). Обе части можно найти внизу этой страницы. Объяснение тому же следующее.
Перед написанием программы для отправки и получения данных убедитесь, что вы установили библиотеку, выполнив описанные выше действия, и модуль CAN MCP2515 инициализирован в вашей программе следующим образом.
Инициализируйте модуль CAN MCP2515:
Чтобы установить соединение с MCP2515, выполните следующие действия:
1. Установите номер контакта, к которому подключена SPI CS (по умолчанию 10)
MCP2515 mcp2515 (10);
2. Установите скорость передачи данных и частоту генератора.
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Доступные скорости передачи:
CAN_5 кбит / с, CAN_10 кбит / с, CAN_20 кбит / с, CAN_31 кбит / с, CAN_33 кбит / с, CAN_40 кбит / с, CAN_50 кбит / с, CAN_80 кбит / с, CAN_83 кбит / с, CAN_95 кбит / с, CAN_100 кбит / с, CAN_125_125_ кбит / с, CAN_200 кбит / с, CAN_2 50 кбит / с, CAN_200 кбит / с, CAN_2
Доступные тактовые частоты:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Установите режимы.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Расшифровка кода стороны передатчика CAN (Arduino Nano)
В секции передатчика Arduino Nano взаимодействует с модулем CAN MCP2515 через контакты SPI, а DHT11 отправляет данные о температуре и влажности на шину CAN.
Сначала включены необходимые библиотеки, библиотека SPI для использования связи SPI, библиотека MCP2515 для использования связи CAN и библиотека DHT для использования датчика DHT с Arduino . Ранее мы связали DHT11 с Arduino.
#включают
Теперь определено имя вывода DHT11 (вывод OUT), который подключен к A0 Arduino Nano.
#define DHTPIN A0
Кроме того, DHTTYPE определяется как DHT11.
#define DHTTYPE DHT11
А canMsg структуры типа данных для хранения формата CAN сообщений.
struct can_frame canMsg;
Установите номер контакта, к которому подключен SPI CS (по умолчанию 10)
MCP2515 mcp2515 (10);
А также объект dht для класса DHT с выводом DHT с Arduino Nano и типом DHT в качестве инициализированного DHT11.
DHT dht (DHTPIN, DHTTYPE);
Далее в void setup ():
Начните коммуникацию SPI, используя следующую инструкцию
SPI.begin ();
Затем используйте инструкцию ниже, чтобы начать получать значения температуры и влажности от датчика DHT11.
dht.begin ();
Затем MCP2515 перезагружается с помощью следующей команды
mcp2515.reset ();
Теперь для MCP2515 установлена скорость 500 Кбит / с и 8 МГц как часы.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
И MCP2525 установлен в нормальный режим
mcp2515.setNormalMode ();
В цикле void ():
Следующий оператор получает значения влажности и температуры и сохраняет их в целочисленных переменных 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. Здесь Arduino UNO получает температуру и влажность от шины CAN и отображает полученные данные на ЖК-дисплее.
Сначала включены необходимые библиотеки, библиотека SPI для использования связи SPI, библиотека MCP2515 для использования связи CAN и библиотека LiquidCrsytal для использования ЖК-дисплея 16x2 с Arduino .
#включают
Затем определяются выводы ЖК-дисплея, которые используются для подключения к Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; ЖК-дисплей LiquidCrystal (rs, en, d4, d5, d6, d7);
Объявлен тип данных struct для хранения формата сообщения CAN.
struct can_frame canMsg;
Установите номер контакта, к которому подключен SPI CS (по умолчанию 10)
MCP2515 mcp2515 (10);
В void setup ():
Сначала ЖК-дисплей устанавливается в режим 16x2, и отображается приветственное сообщение.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ДАЙДЖЕСТ ЦЕПИ"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); задержка (3000); lcd.clear ();
Начните коммуникацию SPI, используя следующую инструкцию.
SPI.begin ();
Затем выполняется СБРОС MCP2515 с помощью следующей команды.
mcp2515.reset ();
Теперь для MCP2515 установлена скорость 500 Кбит / с и 8 МГц в качестве тактовой частоты.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
И MCP2525 установлен в нормальный режим.
mcp2515.setNormalMode ();
Далее в void loop ():
Следующая инструкция используется для получения сообщения от шины CAN. Если сообщение получено, оно попадает в условие if .
если (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
В условии, если данные принимаются и сохраняются в c anMsg , данные со значением влажности и данные со значением температуры. Оба значения хранятся в целых числах x и y.
int x = canMsg.data; int y = canMsg.data;
После получения значений, значения температуры и влажности отображаются на ЖК-дисплее 16x2 с использованием следующего утверждения.
lcd.setCursor (0,0); lcd.print ("Влажность:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Температура:"); lcd.print (y); задержка (1000); lcd.clear ();
Работа CAN-связи в Arduino
Когда оборудование будет готово, загрузите программу для CAN-передатчика и CAN-приемника (полные программы приведены ниже) в соответствующие платы Arduino. При включении вы должны заметить, что значение температуры, считываемое DHT11, будет отправлено на другой Arduino через связь CAN и отобразится на ЖК-дисплее 2- го Arduino, как вы можете видеть на изображении ниже. Я также использовал свой пульт дистанционного управления переменного тока, чтобы проверить, близка ли температура, отображаемая на ЖК-дисплее, к реальной температуре в помещении.
Полную работу можно найти на видео по ссылке ниже. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев или воспользуйтесь нашим форумом, чтобы задать другие технические вопросы.