Анализ и передача данных по шине CAN автомобиля с помощью Arduino


Шина Controller Area Network (CAN) — это «стандарт автомобильной шины, разработанный для того, чтобы микроконтроллеры и устройства могли связываться друг с другом внутри транспортного средства без главного компьютера». Эти устройства также могут называться электронными блоками управления (ЭБУ или ECU от Electronic Control Unit). По сути, шина CAN — это набор связанных ЭБУ в автомобиле, которые обмениваются данными с каждым другим устройством на основе широковещательной передачи. Каждый ECU перехватывает каждую трансляцию, но индивидуально решает, реагировать на нее или нет.

Например:
Давайте представим, что есть один ECU, который управляет стоп-сигналами, один ECU, который управляет автомобильным звуковым сигналом, и один ECU, который управляет тормозной системой. Каждый раз, когда пользователь нажимает звуковой сигнал, ЭБУ звукового сигнала отправляет широковещательное сообщение по сети CAN-шины на каждый ЭБУ, к которому он подключен, включая ЭБУ стоп-сигнала и ЭБУ тормозной системы. ЭБУ стоп-сигнала перехватывает это широковещательное сообщение, но предпочитает игнорировать его, поскольку оно не имеет для него значения. ЭБУ стоп-сигнала только ожидает сообщения от ЭБУ тормозной системы. Кроме того, ЭБУ звукового сигнала не реагирует на ЭБУ тормозной системы.

Эта система вещания разбита на различные компоненты; два наиболее важных — это идентификатор сообщения и данные сообщения.
Подумаем об идентификаторе сообщения как об адресе блока управления двигателем. Данные сообщения — это содержание. Обычно он больше идентификатора и составляет около 8 байт.

Ниже пример:

ID сообщения: 620 Данные: 10 80 FF FF 80 20 00 80
ЭБУ обмениваются данными друг с другом по витой паре проводов, поддерживающих высокий уровень CAN (CAN +) и низкий уровень CAN (CAN-). CAN-high и CAN-low доступны через порт OBD-II, обычно под рулевым колесом.
У Volkswagon есть хорошее руководство по работе сети CAN Bus: http://www.volkspage.net/technik/ssp/ssp/SSP_238.pdf

Материалы:
1- Arduino UNO R3
2- Sparkfun (или другой) CAN Bus Shield или на АлиCAN Bus Shield
Плата расширения CAN Bus Sparkfun также имеет джойстик (вверх, вниз, влево, вправо, по центру), слот для micro SD и поддержку модулей GPS и LCD.
3-3-проводная пара или кабель Sparkfun от OBD-II к DB9;
4-Штыревой разъем;
Плата расширения поставляется без припаянных штыревых разъемов. На плату нужно припаять два разъема по 8 контактов, два разъема по 6 контактов и один разъем на 4 контакта.

После сборки обязательно нужно загрузить библиотеку CAN Bus Library для использования с Arduino IDE.
Библиотека и файлы примеров находятся ниже:
https://github.com/sparkfun/SparkFun_CAN-Bus_Ardui…
Ссылка для скачивания библиотеки и примеров :
https://github.com/sparkfun/SparkFun_CAN-Bus_Ardu…
Библиотека в папке src /
Примеры Sparkfun (и авторские) находятся в папке examples /
Инициализация экрана шины CAN:
 Показать / Скрыть текст#include <Canbus.h> // don't forget to include these #include <defaults.h> #include <global.h> #include <mcp2515.h> #include <mcp2515_defs.h> void setup() { Serial.begin(9600); //Initialise MCP2515 CAN controller at the specified speed if(Canbus.init(CANSPEED_500)) Serial.println("CAN Init ok"); else Serial.println("Can't Init CAN"); delay(1000); }
Инициализация платы потребуется для всех задач. Здесь определяется битрейт CAN и импортируется библиотека. Каждый автомобиль может использовать разные скорости передачи данных. В данном примере используется 500 кбит / с.

Доступные варианты:
CANSPEED_125 //CAN speed at 125 kbps
CANSPEED_250 //CAN speed at 250 kbps
CANSPEED_500 //CAN speed at 500 kbps
Возможно, для автомобиля другого производителя значения будут другие.
Дальше читаются сообщения CAN-шины:
 Показать / Скрыть текстvoid loop() { tCAN message; if (mcp2515_check_message()) { if (mcp2515_get_message(&message)) { Serial.print("ID: "); Serial.print(message.id,HEX); Serial.print(", "); Serial.print("Data: "); for(int i=0;i<message.header.length;i++) { Serial.print(message.data[i],HEX); Serial.print(" "); } Serial.println(""); }} }
Дальше фильтруем данные:
 Показать / Скрыть текстvoid loop() { tCAN message; if (mcp2515_check_message()) { if (mcp2515_get_message(&message)) { if(message.id == 0x631) //filtering based on CAN bus message ID. { Serial.print("ID: "); Serial.print(message.id,HEX); Serial.print(", "); Serial.print("Data: "); for(int i=0;i<message.header.length;i++) { Serial.print(message.data[i],HEX); Serial.print(" "); } Serial.println(""); }}} }
message.header.length — это размер сообщения CAN.
Вышеупомянутые данные были отфильтрованы по идентификатору сообщения. Также можно фильтровать по данным сообщения.
 Показать / Скрыть текстif(message.id==0x631 and message.data[3]==0x04 and message.data[4]==0x0F)
При этом сообщения могут быть длиннее 3-х цифр.
Чтобы написать сообщение CAN Bus, нужно сначала собрать компоненты сообщения: идентификатор сообщения, размер сообщения и данные сообщения. Сообщение разбито по message.id, message.header.rtr, message.header.length и
 Показать / Скрыть текстmessage.data []. void loop() { tCAN message; message.id = 0x631; //formatted in HEX message.header.rtr = 0; message.header.length = 8; //formatted in DEC message.data[0] = 0x40; message.data[1] = 0x05; message.data[2] = 0x30; message.data[3] = 0xFF; //formatted in HEX message.data[4] = 0x00; message.data[5] = 0x40; message.data[6] = 0x00; message.data[7] = 0x00; mcp2515_bit_modify(CANCTRL, (1<<REQOP2)|(1<<REQOP1)|(1<<REQOP0), 0); mcp2515_send_message(&message); delay(1000); }
Идентификатор сообщения и данные записываются в HEX (например, 0xFF), в том же формате, в котором прочитываются пользователем.


Прикрепленный файл CAN_read_sample предназначен для простого чтения всех сообщений. Мастер закомментировал фильтрацию, поэтому ее легко можно изменить, включив фильтрацию идентификатора сообщения и данных.

Он также прикрепил файл CAN_write_sample для написания сообщения.

Есть два варианта подключения Arduino к линиям CAN-high и CAN-low автомобиля:
1 — Разрезаем любую пару проводов и подключаем CAN-H и CAN-L на плате расширения к порту OBD-II.
CAN-H (shield) <——> CAN-high (OBD-II)
CAN-L (shield) <——> CAN-low (OBD-II)
2- Приобрести кабель OBD-II — DB9 Sparkfun и подключаться непосредственно к шине.
Дальше подключаем Arduino к машине и компьютеру, загружаем код, открываем монитор последовательного порта.
Код ниже.
CAN_read_sample.ino
CAN_write_sample.ino
Теперь можно управлять устройствами автомобиля по CAN-шине.

Например:
-Разблокировать и заблокировать автомобиль
-Открыть багажник
-Открывать и закрывать окна
-Включать сигнализацию
-Блокировать автомобиль
-Включать и выключать сигнальные огни, повороты, ближний и дальний свет фар и т.д.
Источник (Source)

Источник: usamodelkina.ru

Добавить комментарий