Подключаем микроконтроллер arduino к шине bus can для сети

Farnswort › Блог › Подключение связки Arduino Mega+ can-bus shield к автомобилю

В этих ваших Интернетах довольно много информации по контроллерам на платформе Arduino. Это интересная и увлекательная вещь, на основе которой можно сделать туеву хучу разных разностей. Правда, основная направленность большинства поделок, это всякие игрушки типа роботов-машинок и девайсов для «умного» дома. Однако есть примочки интересные и любителям покопаться в своих автомобилях. В первую очередь это «can-bus shield», позволяющий невозбранно подключиться к мозгам современного авто и сделать там всякие разные вещи. По вопросам теории распыляться не буду, наверняка вас не во всех поисковиках забанили, а остановлюсь только лишь на конкретике подключения связки Arduino Mega+ can-bus shield к автомобилю. Подвигло меня на написание этого текста тот факт, что я не нашел цельного последовательного изложения порядка действий, а на задаваемые вопросы на том же www.pccar.ru местные «гуру» (безусловно все как один уважаемые люди), сквозь зубы цедили что-то типа «всё это сложно…».
Итак, Ардуина-Мега у меня уже была, can-bus shield v. 1.2 купил на Али (ru.aliexpress.com/item/DC…AN-SPI-9/32844412638.html).
Дальше начал разбираться что к чему.
1. Скачиваем программную среду для программирования Ардуины от сюда www.arduino.cc/en/Main/Software
Не забудьте проверить во вкладке “Инструменты” правильность подключения платы Ардуины, выбор самой платы и номера cjm-порта.
2. Вопросы физического подключения шилда можно посмотреть здесь wikihandbk.com/wiki/Элект…мпонент:Шилд_CAN-BUS_V1.2. Библиотеку для шилда берем здесь github.com/Seeed-Studio/CAN_BUS_Shield. Нужно обратить внимание на то, что тактовый кварц в моём шилде 16 МГц, поэтому ему подходят стандартные библиотеки. Есть шилды с кварцем на 8 МГц, и библиотека для них другая.
3. Для проверки работоспособности шилда используется скетч (скажу сразу, скетчи сам не писал, брал готовые из примеров Ардуины и из других источников, на авторство не претендую)

#include
#include “mcp_can.h”
const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
void setup()
<
Serial.begin(9600);
START_INIT:
if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
<
Serial.println(“CAN BUS Shield init ok!”);
>
else
<
Serial.println(“CAN BUS Shield init fail”);
Serial.println(“Init CAN BUS Shield again”);
delay(100);
goto START_INIT;
>
>
void loop()
<
unsigned char len = 0;
unsigned char buf[8];
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
<
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
unsigned char can >Serial.println(“—————————–“);
Serial.println(“get data from ID: “);
Serial.println(canId);
for(int i = 0; i

Это значит шилд работает. Бывает, что неисправен контроллер.
Надо обратить внимание на параметр
const int SPI_CS_PIN = 10;
Это номер контакта инициализации шилда, вот пояснение
// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
т.е. версии 0.9 и 1.0 для инициализации используют D10, версия 1.1 – D9. У меня версия 1.2, и мне подошел D10, хотя во многих готовых скетчах прописан D9. Так что если в мониторе
CAN BUS Shield init fail
меняем значение.
4. Подключаем шилд к кан-шине машины.
5. Загружаем скетч:

#include
#include “mcp_can.h”
const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
void setup()
<
Serial.begin(115200);
while (CAN_OK != CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
<
Serial.println(“CAN BUS Shield init fail”);
Serial.println(” Init CAN BUS Shield again”);
delay(100);
>
Serial.println(“CAN BUS Shield init ok!”);
>
void loop()
<
unsigned char len = 0;
unsigned char buf[8];
if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming
<
CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf
unsigned long can >Serial.println(“—————————–“);
Serial.print(“Get data from ID: 0x”);
Serial.println(canId, HEX);
for(int i = 0; i

ВНИМАНИЕ!
Заметил странную хрень, которая происходит с текстом, который размещен в блоге Драйва. При копировании текста происходит рандомное искажение текста, изменение регистра написания (а в скетче это важно), к ссылкам добавляются какие-то дополнительные символы, после чего ссылка не открывается и т.д.
Так что при копировании будьте внимательны!

Arduino bus can: заставляем микроконтроллер общаться по шине

В любой системе управления важно настроить линии связи. Без них не будет работать ни один исполнительный механизм. В электронике много интерфейсов передачи данных; у каждого из них есть свои недостатки и преимущества. Но сегодня хочу рассмотреть интерфейс промышленной связи CAN.

Определение:

CAN – control area network, в переводе звучит что-то вроде «сети устройств управления и связи».

Сети с его использованием можно встретить в различных областях техники, начиная от современных автомобилей – на них с помощью Can шины осуществляется связь между блоками управления автомобилем, а также на промышленных объектах в любой сфере производства.

Микроконтроллеры Arduino can шину в обычном виде не поддерживают – для этого нужно использовать дополнительные блоки преобразования сигналов.

Как заставить Arduino общаться по can?

Во-первых, для связи по ардуины нужно использовать модуль mcp2515 или TJA1050. Это устройство выступает в роли посредника между контроллером и сетью, то есть вы отправляете битовые последовательности на него, указываете адресата, а он перенаправляет данные в нужном порядке и форме.

Связь ардуино и этой платы осуществляется по SPI интерфейсу.

Определение:

SPI – Serial Peripheral Interface, на русском языке это звучит так – последовательный интерфейс периферии.

Для связи нужно четыре цифровых сигнала (соответственно, 4 пина ардуины):

  • MOSI – выход ведущего устройства;
  • MISO – вход ведущего;
  • SCLK – последовательный тактовый сигнал;
  • CS (SS) – выбор кристалла или микросхемы (crystal select).

На схеме вы видите, что все сигналы, кроме SS(CS), – общие, а последний индивидуален для каждого устройства в системе, и нужен для определения устройства, с которым ведётся обмен данным. Когда сигнал 0 – устройства взаимодействуют, а когда 1 – нет. То есть управление производится инверсным сигналом, иначе говоря – низким уровнем, об этом свидетельствует полоса над надписью SS, в математике и электронике так обозначаются инвертированные (умноженные на минус единицу) значения чисел.

Для работы Arduino bus can системы нужно использовать соответствующую библиотеку для Arduino ide (https://github.com/Seeed-Studio/CAN_BUS_Shield), а для большего удобства – шилд, кстати, библиотека написана под такой шилд.

Варианты применения

В быту с помощью can шины вы можете построить бортовой компьютер на ардуино или устройство диагностики автомобилей. Для разработчиков умных систем с её помощью можно осуществлять связь между удалёнными блоками вашей системы посредством проводной или радиопередачи данных.

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Arduino и MCP2515 – интерфейс CAN для Arduino

Arduino и MCP2515: принцип работы, подключение, схема, код

CAN (Controlled Area Network) – это стандарт шины, который позволяет микроконтроллеру и его периферийным устройствам обмениваться данными без необходимости использования хост-устройства или компьютера. Протокол CAN, разработанный Robert Bosch GmbH, в основном используется в автомобилях для связи между блоком управления и его компонентами.

Например, блок управления двигателем является основным средством управления, используемым в автомобиле. Этот блок подключен ко многим датчикам и исполнительным механизмам, таким как механизмы контроля потока воздуха, давления, температуры, управления клапанами, двигатели для контроля воздуха и т. д. Связь между этими модулями и блоком управления осуществляется через шину CAN. В этом проекте мы узнаем о модуле контроллера CAN MCP2515, о том, как связать контроллер шины CAN MCP2515 с Arduino, и, наконец, о том, как обеспечить связь между двумя платами Arduino с помощью двух контроллеров CAN MCP2515 и самого протокола CAN.

Модуль MCP2515

Контроллер шины CAN MCP2515 – это простой модуль, который поддерживает протокол CAN версии 2.0B и может использоваться для связи со скоростью 1 Мбит/с. Для того, чтобы настроить полную систему связи, вам потребуется два модуля шины CAN. Модуль, используемый в проекте, показан на рисунке ниже.

Этот конкретный модуль основан на ИС контроллера CAN MCP2515 и ИС приемопередатчика TJA1050. Микросхема MCP2515 представляет собой автономный контроллер CAN и имеет встроенный интерфейс SPI для связи с микроконтроллерами. Что касается микросхемы TJA1050, она действует как интерфейс между ИС контроллера MCP2515 и физической шиной CAN.

MCP2515 – это основной контроллер, который состоит из трех основных подкомпонентов: модуля CAN, логики управления и блока SPI. Модуль CAN отвечает за передачу и прием сообщений на шине CAN. Логика управления управляет настройкой и работой MCP2515, взаимодействуя со всеми блоками. Блок SPI отвечает за интерфейс связи SPI.

На следующем рисунке показана схема CAN-модуля MCP2515, а также показано, как микросхема MCP2515 и TJA1050 подключены к модулю.

Схема подключения Arduino и MCP2515

На следующем рисунке показана принципиальная схема подключения модуля CAN MCP2515 с Arduino и связь между двумя Arduino по протоколу CAN.

Код программы для взаимодействия Arduino и MCP2515

Прежде чем углубляться в код, вам необходимо скачать библиотеку для модуля MCP2515. Есть много библиотек, но здесь мы использовали эту: https://github.com/Seeed-Studio/CAN_BUS_Shield. Загрузите ее и поместите извлеченное содержимое в каталог библиотек Arduino. Поскольку сеть CAN включает в себя модуль передатчика и модуль приемника, код также делится на код передатчика и код приемника.

Код передатчика CAN

Код приемника CAN

Работа этого проекта очень проста, так как вся работа выполняется библиотеками (SPI и CAN). Поскольку CAN является связью на основе сообщений, вам необходимо отправить сообщение в диапазоне от 0 до 8 байтов.

В этом проекте передатчик отправляет сообщение 1 1 2 3 0 5 6 7. Это сообщение передается по шине CAN, и получатель получает это сообщение, что отображается на его последовательном мониторе. Кроме того, 0-й и 4-й биты, то есть 1 и 0 в вышеуказанной последовательности, извлекаются приемником отдельно и включают и выключают светодиод, подключенный к контакту 2 платы Arduino.

Mazda 3 #BackInBlack › Бортжурнал › Типа “бортовой компьютер” на Arduino. Часть 2. Чтение с CAN-шины

Первая статья с «теорией». В этой расскажу об основных компонентах, которые понадобятся и расскажу немного о работе с CAN-шиной, но пока без конечной реализации.

Предисловие
Никакой необходимости в том, что я сделал у меня не было. Мне просто было интересно попробовать.

Видел на Drive несколько статей про «ботовые компьютеры» на базе Arduino, а так как сам недавно начал изучить микроконтроллеры на примере данной «платформы», мне стало интересно попробовать сделать нечто подобное самому.

Очень коротко о главном
Нужно получать информацию от узлов автомобиля и выводить её на штатный LCD-дисплей (на котором информация с магнитолы отображается). Основные компоненты это Arduino Nano и CAN Bus Модуль MCP2515.

В комментариях к первой части, у меня с Red-ICE возникло некое недопонимание, возможно больше с моей стороны, поэтому я считаю нужным пояснить что же расположенно на плате этого модуля, а точнее что такое MCP2515 и TJA1050 и для чего они.

Стоит упомянуть сетевую модель OSI (open systems interconnection basic reference model — базовая эталонная модель взаимодействия открытых систем), так как CAN — это стандарт промышленной сети и он соответствует этой модели. Если коротко и о главном, то модель OSI описывает уровни взаимодействия, что и на каком уровне должно происходить. Если мы говорим о CAN-шине, то это канальный и физический уровень.

Канальный уровень предназначен для обеспечения взаимодействия сетей на физическом уровне. Полученные с физического уровня данные, представленные в битах, устройство упаковывает в кадры (о них будет ниже). Т. е. устройство, которое работает на этом уровне фактически не взаимодействует с сигналами, а организует это взаимодействие (как если бы Вашему начальнику нужны были какие-либо документы, но сам бы он не пошёл, а послал Вас, рассказав где и у кого их забрать). Так же это устройство получает битовые последовательности и отправляет их. Этим и занимается MCP2515.

Физический уровень — это нижний уровень модели OSI, который определяет метод передачи данных, представленных в двоичном виде, от одного устройства к другому. Устройства, которые работают на этом уровне, осуществляют передачу электрических или оптических сигналов в кабель или в радиоэфир и, соответственно, их приём и преобразование в биты данных. Этим занимается TJA1050. Вот одна строчка из datasheet к TJA1050 «The TJA1050 is the interface between the Controller Area Network (CAN) protocol controller and the physical bus».

С этим я думаю всё более-менее понятно.

Про подключение CAN Bus Модуль MCP2515 к Arduino Nano
Модуль подключается к Arduino по SPI (Serial Peripheral Interface, SPI bus — последовательный периферийный интерфейс, шина SPI). В SPI используются четыре цифровых сигнала:
MOSI — выход ведущего, вход ведомого (Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
MISO — вход ведущего, выход ведомого (Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
SCLK — последовательный тактовый сигнал (Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
CS или SS — выбор микросхемы, выбор ведомого (Chip Select, Slave Select).
В Arduino Nano аппаратно установленные следующие цифровые выводы для подключения SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).
На изображении модуля (выше) видно, что контакты J4 имеют немного другую маркировку, но это не меняет из назначения.

Подключаем следующим образом (имя на модуле — номер вывода на Arduino):
SCK — 13
SI — 11
SO — 12
А вот вывод CS (он же SS) устанавливается программно в скетче. Почему так?

Потому что к шине SPI можно подключить несколько устройств Slave. И если сигналы SCK, MOSI, MISO являются «общими» для всех устройств Slave, то SS должен соответствовать своему устройству (отсюда и название Slave Select), т. е. Master подключается к каждому Slave отдельным проводом SS сигнала.
VCC и GND — питание (5 В) и земля, соответственно. Причём имеет смысл чтобы Arduino и модуль были на земле OBD разъёма.
INT на модуле не нужен, если не планируется работать с прерыванием. Я пока не планирую, поэтому я его не использовал.
К CAN-шине модуль подключается в соответсвии с маркировкой L (LOW) и H (HIGH) (J2 и J3 на модуле) к соответствующим контактам на разъёме OBD-II.

Ещё немного про CAN-шину
CAN (Controller Area Network — сеть контроллеров) — стандарт промышленной сети, ориентированный прежде всего на объединение в единую сеть различных исполнительных устройств и датчиков. Режим передачи — последовательный, широковещательный, пакетный… Передача ведётся кадрами, которые принимаются всеми узлами сети.
Это значит, что моё устройство будет получать все сообщения (кадры), которые «гуляют» по шине, а так же сможет отправлять сообщения, которе будет получать адресат, т.е. LCD-дисплей.
Кадры имеют определённый «формат» — последовательность битов, условно разделенных на группы по «смыслу». Подробно я не буду рассказывать, потому что для моей задачи это не нужно, ну и потому что я не разбирался с этим до конца. Кому интересно, информации полно.
Всего есть четыре вида кадров, но меня интересует только кадр данных, так как этот кадр передаёт «полезную» информацию.

Что нужно знать про кадр данных (в рамках моей задачи)
Как я написал выше, режим передачи в CAN-шине широковещательный. Это означает, что все устройства на шине получают сообщения от других устройств. Чтобы фильтровать сообщения и выбирать только нужные применяется идентификатор сообщения и маска. Идентификатор сообщения — это 11 бит в кадре (в расширенном 29, но у нас будет 11). Чтобы выбрать нужные сообщения, устройство указывает драйверу CAN-шины (через который оно подключено), последовательность бит идентификатора и последовательность бит маски и драйвер получает только «нужные» сообщения. Подробно описывать не буду, но те кто знаком с понятием IP-адреса и маски подсети поймут, принцип такой же.
Резюмируя: чтобы дисплей получил и отобразил сообщение, мы должны знать какой идентификатор (для отправки маску знать не нужна) указать в кадре.

Выясняем нужный(е) нам идентификатор(ы)
Первый способ (им я проверил правильность второго) — это подключиться к CAN-шине и «читать» сообщения, а потом заняться их расшифровкой. Долго и сложно.
Второй способ, и самый очевидный и простой — искать в интернете. И оно там есть, потому что нашлись те, кто воспользовался первым способом.
Тут www.madox.net/blog/projects/mazda-can-bus/ есть немножко информации в самой статье, но самое полезное в комментариях к статье. Вот тут docs.google.com/spreadshe…eieBFiGY/edit?usp=sharing более полный и подробный перечень того что «гуляет» по MS-CAN. Там есть вся информация, которая нам нужна, чтобы отправить «правильное» сообщение для LCD-дисплея.
Посмотрев перечень сообщений MS-CAN мы увидим, что для дисплея определено 3 идентификатора. 0x28F нам не сильно сейчас интересен, а вот 0x290 и 0x291 нужно объяснить отдельно.
LCD-дисплей может отобразить 12 символов. А вот кадр данных может передавать только 8 байт данных (каждый ASCII символ будет занимать 1 байт), т. е. мы сможет передать дисплею только 7 символов. Почему 7? Потому что первый байт в сообщениях с идентификаторами 0x290 и 0x0291 занят каким-то служебным значением, которое менять нельзя. И так, получается, чтобы заполнить 12 символьный экран (а пробел, ну или пустой символ, это тоже символ) нужно отправить 2 сообщения: в первом указываем первые 7 символов, а во втором 5 оставшихся (тут я нагло вру, читай правду в конце). Как это выглядит, я покажу ниже.

Ближе к практике
Так как CAN-шина она везде CAN-шина, то имея два Arduino (Nano и Uno) и два CAN Bus модуля я соединил оба Arduino и начал писать скетч. А точнее два, для отправки и получения сообщений. Как я писал выше, оба CAN Bus модуля можно было подключить к одному Arduino, но я сделал отправку и чтения на разных, а ниже покажу для чего.

Программировал я в стандартном Arduino IDE. Для работы с MCP2515 нужна библиотека, но правильная. Что значит правильная? Есть «официальная» библиотека Seeed-Studio/CAN_BUS_Shield, однако она не подойдёт, т. к. в ней поддерживается только работа на 16 МГц, а у меня плата с кварцевым генератором 8МГц. А правильной библиотекой будет эта (эту, крайне полезную информацию, я прочитал в статье у Red-ICE . Я думаю это сэкономило мне значительно времени).

Ну а дальше программирование. Не люблю использовать готовые примеры, всегда стараюсь писать сам, но подглядеть не брезгую. Не законченные скетчи я выкладывать не буду, возможно в следующей части, когда всё будет работать чётко.

Сделав «черновые» скетчи и залив их на Arduino, я взял ту, которая читает с CAN-шины, взял переходник для OBD-II (который я упомянул в первой части) и пошёл в автомобиль проверять.
Так как ноутбука у меня нет, я подключал Arduino к смартфону. Вот так выглядит «это».

Источники:

http://arduinoplus.ru/arduino-bus-can/

http://digitrode.ru/computing-devices/mcu_cpu/1788-arduino-i-mcp2515-interfeys-can-dlya-arduino.html

http://www.drive2.ru/l/460733581140951184/

http://electrik.info/microcontroller/1496-kakie-byvayut-displei-dlya-arduino-i-kak-ih-podklyuchit.html

Ссылка на основную публикацию