Меню

Arduino читаем 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 включает в себя модуль передатчика и модуль приемника, код также делится на код передатчика и код приемника.

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

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

Источник

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 шины вы можете построить бортовой компьютер на ардуино или устройство диагностики автомобилей. Для разработчиков умных систем с её помощью можно осуществлять связь между удалёнными блоками вашей системы посредством проводной или радиопередачи данных.

Источник

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

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

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

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

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

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

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

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

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

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

Читайте также:  Шина bridgestone blizzak dm v2 235 55 r19 105t

Так же это устройство получает битовые последовательности и отправляет их. Этим и занимается 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 — 13SI — 11SO — 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-шине и «читать» сообщения, а потом заняться их расшифровкой. Долго и сложно.Второй способ, и самый очевидный и простой — искать в интернете. И оно там есть, потому что нашлись те, кто воспользовался первым способом.

CAN – шина, CAN – интерфейс

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

Протокол CAN был разработан для автомобильной промышленности и впоследствии стал стандартом в области создания бортовых сетей автомобилей, железнодорожного транспорта и т.д. CAN позволяет создавать сети с развитыми средствами контроля ошибок, скоростью передачи до 1Мбит/с и пакетами содержащими не более восьми байтов данных.

Не дай своей идее погаснуть

Канальный и физический уровни CAN

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

осуществляет формирование пакетов сообщений, ограничение распространения ошибок, подтверждение приема и арбитража.

Есть конечно и распространенные стандарты прикладного уровня например CANopen, но если нет необходимости обеспечивать взаимодействие между оборудованием различных производителей, то лучше использовать внутренний протокол.

Структура узла сети CAN

Рассматриваемый нами узел сети CAN состоит из микроконтроллера, CAN контроллера и приемопередатчика (рисунок 1).

Чаще всего мы используем микроконтроллеры с встроенным CAN контроллером для упрощения схемы, но иногда используется автономный контроллер CAN с интерфейсом SPI (MCP2510).

Далее приемопередатчик подключается к витой паре, на концах которой размещены согласующие резисторы (терминатор) с сопротивлением 120 Ом.

Для формирования логической единицы в витой паре, или свободной шине, на оба провода подается напряжение, равное половине разности напряжения между 0 или Vcc. Логическому нулю соответствует подача на провода линии дифференциального напряжения (рисунок 2).

Рисунок 2 – Логические уровни на CAN-шине

Шина CAN позволяет передавать данные со скоростью 1 Мбит/c при длине кабеля не более 40 м. В обучающей литературе написано, что при снижении скорости передачи до 10кбит/с можно добиться длины сети в 1.5км.

Пакет сообщения CAN

Формат сообщения CAN показан на рисунке 3.

Рисунок 3 – Пакет сообщения CAN

По факту пакет сообщения формируется CAN контроллером, а прикладное ПО только устанавливает идентификатор сообщения, длину сообщения и предоставляет байты данных, поэтому полностью рассматривать пакет не будем, а посмотрим на данные которые мы изменяем при работе с CAN шиной.

Поле Диапазон
Идентификатор (11 – битный ) 0 – 0x7FF
Или идентификатор (29 – битный) 0 – 0x1FFFFFFF
Длина сообщения 0 – 8
Данные пакета от 0 до 8 байт данных в пакете

Идентификатор сообщения используется для идентификации данных, отправленных в этом пакете.

Каждое отправленное сообщение принимается всеми узлами сети и в данном случае идентификатор позволяет понять конкретному устройству, необходимо ли обрабатывать данное сообщение.

Максимальная длина сообщения 8 байт, но можно уменьшить это значение для сохранения пропускной способности шины CAN. Для примера ниже по тексту есть несколько скриншотов CAN сообщений из автомобильной сети.

Читайте также:  Зимние шины 225 70 r16 шипы

Арбитраж на шине CAN

Если без подробностей, то первым по шине CAN всегда передается сообщение с наименьшим идентификатором.

Настройка скорости передачи данных по шине CAN

Скорость передачи данных по CAN шине настраивается за счет формирования квантов времени, а не как во многих других протоколах последовательной передачи данных за счет делителя скорости.

В большинстве случаев используются скорости 10Кбит/c, 20Кбит/c, 50Кбит/c, 100Кбит/c, 125Кбит/c, 500Кбит/c, 800Кбит/c, 1MBaud и настройки для этих скоростей уже посчитаны.

На рисунке 4 изображено окно выбора скорости в программе PcanView.

Рисунок 4 – Выбор скорости передачи данных в программе PcanView

Как мы видим при установке стандартной скорости настройки проставляются автоматически, но бывают случаи когда необходимо использовать другую скорость передачи данных. Например бортовой CAN автомобиля может работать со скоростью 83Кбит/c.

В этом случае придется провести расчет настроек самостоятельно или поискать специализированный калькулятор скорости в интернете.

Для самостоятельного расчета скорости необходимо понимать, что для передачи одного бита сообщения используется несколько квантов, а интервал передачи состоит из трех сегментов (рисунок 5).

Рисунок 5 – Время передачи одного бита

Первый сегмент всегда фиксирован и равняется одному кванту. Далее идет два сегмента Tseg1 и Tseg2 и количество квантов в каждом сегменте определяется пользователем и может быть равно от 8 до 25. Точка выборки находится между Tseg1 и Tseg2, т.е.

в конце первого и в начале второго сегмента.

Так же пользователь может определить ширину скачка синхронизации (Synchronization Jump Width – SJW) для подстройки битовой скорости принимающего устройства, который может быть в диапазоне 1 – 4 квантов времени.

Теперь приведем формулу расчета скорости (Пример расчета скорости для CAN контроллера SJA1000):

BTR = Pclk/(BRP * (1 + Tseg1 + Tseg2))

BTR – скорость передачи данных,

Pclk – частота работы CAN контроллера,

BRP – значение предделителя частоты генератора скорости передачи

Для проверки возьмем уже посчитанную скорость 125Кбит/c и попробуем получить настройки вручную. Pclk возьмем 16 МГц.

BRP = 16МГц /(125K * (1 + Tseg1 + Tseg2))

Затем подбираем интервал передачи бита находящийся в диапазоне от 8 до 25 квантов времени, так что бы получилось целое значение BRP. В нашем случае если взять (1 + Tseg1 + Tseg2) = 16, то BRP будет равен 30.

Далее нужно подобрать соотношение между Tseg1 и Tseg2, которое даст нам желаемое положение точки выборки (Sample Point – SP).

SP = ((1 + Tseg1 + Tseg2) * 70)/100

Подставляем значения и получаем 16 * 0.7 = 11.2, что соответствует соотношению Tseg1 = 10, Tseg2 = 5, т.е. 1 + 10 + 5 = 16. Далее смотрим если Tseg2 >= 5, то SJW = 4, если Tseg2 Читайте также: Безлопастной вентилятор с нуля своими руками

Если после подключения и настройки адаптера сообщения не приходят, то в первую очередь попробуйте поменять между собой CANH CANL и проверить включено ли зажигание.
Далее запускаем программу PcanView, в открывшемся окне настроек устанавливаем Baudrate = 125Кбит/c и нажимаем ОК (рисунок 4).

В следующем окне устанавливаем Message filter = Standard, диапазон адресов от 000 до 7FF и нажимаем ОК (рисунок 6).

Рисунок 6 – Настройка CAN фильтра

Если все сделано правильно, то мы увидим сообщения от кресел (рисунок 7), а при нажатии кнопки наклона спинки на пульте управления мы увидим еще одно сообщение с адресом 1F4 идущее от пульта к креслу (рисунок 8).

Рисунок 7 – CAN сообщения от кресла с электроприводом

Рисунок 8 – CAN сообщения от кресла с электроприводом и сообщение от пульта управления к креслу

Теперь мы знаем какие должны быть адрес, длина и данные в CAN пакете для имитации нажатия кнопки изменения положения спинки. Во вкладке Transmit нажимаем NEW и в открывшемся окне создаем копию пакета 1F4, т.е. Length = 3, Data = 40 80 00. Period можно оставить 0 ms, тогда сообщения будут отправляться по факту нажатия кнопки пробел (рисунок 9).

Рисунок 9 – Создание CAN сообщения

На рисунке 10 отображено поле Transmit главного окна содержащее все отправляемые сообщения в CAN и информацию о них. При выделении сообщения и нажатии кнопки пробел произойдет отправка пакета в CAN сеть и кресло немного сдвинется в нужном направлении.

Рисунок 10 – Поле Transmit

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

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

Пример работы с бортовым CAN автомобиля на скорости 83кбит/c

Настройка модуля CAN на микроконтроллере STM32F103. Часть 1

Заказал как-то в Китае такую вот отладочную плату.

На ней имеется USB/UART конвертер на микросхеме PL2303, две кнопки для экспериментов, кнопка питания, кнопка сброса, два светодиода для экспериментов, светодиод питания, стабилизатор на 3.

3В, два разъема мини-USB, разъем JTAG для подключения отладчика, например J-Link. В комплекте также шел USB-кабель, изображенный на фото. Плата питается от USB-порта компьютера.

Сегодня я попробую написать драйвер для модуля CAN и поделиться своими наработками.

Сразу скажу, что разжевывать информация что такое CAN шина не буду, но приведу пару документов, где можно почитать о CAN шине на русском языке:

1986ВЕ9х, К1986ВЕ9х и MDR32F9Qx – это Российские аналоги микроконтроллеров STM32. Но все же модуль CAN, описанный в документации, немного отличается от модуля CAN для STM32.

Еще одно важное замечание: изначально на плате нет драйвера CAN-шины (микросхемы, согласующей уровни сигналов шины и цифровые уровни микроконтроллера). Я запаял микросхему MCP2551, но есть и другие аналоги, подходящие по ногам.

Итак начнем. Проект я буду создавать в среде CooCox IDE версии 1.7.8. Здесь сразу можно выбрать нужные библиотеки и они автоматически добавятся в проект. Из всего изобилия я выбираю только CMSIS core и CMSIS_boot.

Признаться четсно, библиотека от STM32 stm32f10x_stdperiph_lib мне не нравится из-за своей избыточности, хотя я частенько подсматриваю код ее исходников, когда разбираюсь с каким-либо новым модулем.

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

CMSIS core содержит описание всех регистров микроконтроллера, а также обработчики прерываний по умолчанию и т.д. В CMSIS_boot содержатся все необходимы функции для инициализации контроллера, те, что выполняются до запуска функции main. Здесь происходит настройка системы тактирования.

Очень приятная вещь, контроллер уже сразу настраивается на тактирование от внешнего генератора 8МГц и частота шины SYSCLK выбирается максимальная 72 МГц. При желании можно покопаться в файле system_stm32f10x.

c и настроить другую частоту, а также выбрать другой источник тактирования.

Вообще можно написать и свою функцию настройки системы тактирования RCC. Обычно я пользуюсь для этого двумя программами-калькуляторами. Первая – это STM32generator. В ней можно настраивать еще и DMA, USART, порты ввода-вывода, а также она может генерировать сразу готовый код программы.

Вторая – программа с оффициального сайт ST Electronics STM32CubeMX.

Это визуальный конструктор программы для STM32 микроконтроллера, она позволяет выбрать необходимые модули, настроить их конфигурации и генерирует готовые проекты в самых популярных IDE на основе конечно же StdPeriph_lib.

Она нам еще понадобится для расчета скорости CAN. А пока пример настройки системы RCC. Что в ней очень удобно, так это то, что можно сразу же вбить в поле HCLK нужную частоту и программа автоматически просчитает все остальные настройки RCC.

В нашем проекте мы не будем перенастраивать систему тактирования и остановимся на частоте SYSCLK = 72 МГц.

Читайте также:  Зимние шины р16 215 65 в самаре

Инициализация

Как обычно начинаем с инициализации модуля CAN1. Здесь нужно выполнить следующие действия:

  • Разрешить тактирование модуля CAN1;
  • Войти в режим инициализации (после сброса модуль находится в спящем режиме);
  • Настроить скорость передачи данных в регистре CAN_BTR;
  • Выбрать режим работы модуля один из трех (обычный, только приема, режим петли);
  • По необходимости включить/выключить дополнительные функции, такие как автоматическое пробуждение при появлении на шине данных, блокировка FIFO при переполнении и другие.
  • Выйти из режима инициализации.

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

Самым сложным пунктом здесь является настройка скорости передачи. Но на самом деле сложного ничего нет, нужно руководствоваться несколькими правилами. Как известно, максимальная скорость передачи CAN-шины может достигать 1 Мбит/с. Т.е. время минимального битового интервала определяется по формуле:

TBIT = 1/Скорость передачи

Выходит, что для скорость передачи данных 1 Мбит/с битовый интервал долже быть равен 1 мкс (или 1000 нс).

Битовый интервал рабивается еще на более мелкие интервалы, называемые квантами TQ (Time Quanta). Обязательным условием правильной настройки бит тайминга (скорости передачи) является равенство TBIT = 8…25TQ. Из мануала следует, что битовый интервал состоит из трех частей:

  • SYNC_SEG;
  • BIT SEGMENT 1;
  • BIT SEGMENT 2;

Что это такое можете почитать подробно в мануале на контроллер. Из илюстрации видно, что SYNC_SEG всегда равен 1TQ

Arduino. Контакты и шины

Если к вам в руки уже попала Arduino, то Вы, наверняка обращали внимание на большое количество надписанных черных разъемов (далее пинов), расположенных по краям платы. Какой же выход для чего предназначен? Какой компонент куда подключать? Попробуем ответить на этот вопрос.

Сразу оговорюсь, что буду рассматривать самую распространенную плату Arduino Uno. На остальных назначение некоторых выводов может отличаться http://pighixxx.com/test/pinoutspg/boards вот ссылка на ресурс, где можно посмотреть назначение пинов конкретно для Вашей платы. Итак, поехали..

Большинство пинов может работать как на вход (считывать данные с подключенных устройств), так и на выход (выдавать сигналы на подключенные устройства). Соответственно, это пины, помеченные как 0-13 и АО-А5. По-умолчанию все пины работают на выход. Чтобы изменить их режим мы можем использовать функцию pinMode.

Пины питания и земля.

Из школьного курса физики Вы должны знать, что, во-первых любая электрическая цепь должна быть замкнута, а во-вторых, постоянный ток течет от “+” к “-“. В данном случае в роли “+” выступают пины “3.3V” и “5V”, которые выдают напряжение соответственно 3.

3 и 5 вольт. Сила тока на этих пинах будет не больше 100 мА. В роли “-” выступают пины с обозначением “GND” (земля). На Uno этих пинов 2 (на старых версиях) или 3.

Таким образом, вам надо запомнить, что каждая наша схема должна начинаться с пинов питания и заканчиваться землей.

Пин VIN.

Этот пин служит для подачи питания непосредственно на плату, минуя USB или разъем питания. Зачем? Ну, например, если в вашем проекте используется источник в 4.5 вольт (или батарейный отсек) и вы не хотите использовать громоздкие импульсные адаптеры или USB-разъемы.

Аналоговые пинв А0-А5.

В отличие от цифровых пинов, эти выходы подключены к микроконтроллеру через шестиканальный аналого-цифровой преобразователь (АЦП) и имеют разрешение 10 бит.

Это говорит о том, что при подключении к этим пинам мы будем получать значения от 0 до 1023. Основным применением этих пинам является чтение с аналовых датчиков.

В то же время при нехватке цифровых выходов мы можем использовать аналоговые выходы в качестве цифровых (аналогичным пинам 0-13).

Давайте чуть подробнее рассмотрим функции, закрепленные за цифровыми пинами.

ШИМ или PWM.

Обратили внимание, что пины с номерами 3,5,6,9,10 и 11 на плате помечены знаком “#” или “

”? Это пины, работающие с широтно-импульсной модуляцией. Что же скрывается за этим названием? Все очень просто: цифровой выход Arduino может выдавать или 0 вольт, или 5 вольт. Промежуточные значения, например, в ШИМ.

На рисунке выше мы видим, как получается сигнал: часть времени подается напряжение в 0В, часть 5В, а в среднем мы получаем в 0В, 1.25В, 2.5В, 3.75В и 5В (сверху вниз). Именно благодаря ШИМ мы можем задать значение напряжения от 0 до 5 В с шагом примерно в 0.019В.

Как это сделать видно на том же рисунке: в функцию analogWrite передаются значения от 0 (0 вольт) до 255 (5 вольт). В частности, значение 191 соответствует 3.75В.

I2C.

Контакт А4 и А5 используются для работы с I2C-шины. Что она из себя представляет? грубо говоря, используя 4 провода (питания, земля, линию данных SDA и линию тактирования SCL) мы можем подключить до 112 устройств. Не просто 112 различных устройств, а 112 различных устройств одновременно.

Достигается это благодаря тому, что каждая модель устройства имеет свой уникальный адрес, по которому к нему и осуществляется обращение.

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

Таких устройств, с поддержкой шины I2C множество: “часы” RTC, дисплеи, датчик и многое другое. Более того, написано множество библиотек под такие устройства, позволяющие не указывать напрямую адрес устройства, а обращаться к нему, как самостоятельному датчику.

SPI.

Еще одна последовательная шина. На ней может располагаться одно ведущее устройство (в нашем случае Arduino) и несколько ведомых. Помимо линий питания и земли использует 4 канала:

  1. SCLK (пин 13) – тактовый.
  2. MOSI (пин 11) – данные, передаваемые от ведущего устройства к ведомому.
  3. MISO (пин 12) – наоборот, данные от ведомого к ведущему.
  4. SS (обычно пин 10, но его функцию может выполнять любой цифровой пин) – выбор ведомого устройства, с которым в данный момент будет осуществляться обмен данными. В отличие от остальных линии SS для каждого устройства своя. Например, если мы хотим подключить к Arduino 4 устройства по линии SPI, нам нужно будет задействовать 7 проводов, а для одного – 4 провода.

SPI или I2C?

В чем отличие SPI от I2C и что выбрать? SPI требует больше проводов и поддерживает меньше одновременно подключенных устройств.

Используя SPI, мы можем подключить практически любое устройство, а для использования шины I2C выбор устройств довольно ограничен (хотя весьма велик).

Также скорость передачи по SPI значительно (более чем в 5 раз) выше I2C. Есть ещё рад отличий, выходящих за рамки нашего рассмотрения.

RX/TX.

На UNO это пины 0 и 1 (на большинстве плат они как раз соответствующий помечены). Это линии последовательного порта (также известного как UART). Например, вы можете использовать их для подключения GSM-модема или терминала.

С теорией закончили и в следующей статье мы попробуем сделать простейшую (но просто расширяемую) сетевую метеостанцию, чтобы продемонстрировать возможность Arduino и закрепить вышеизложенное.

Источник

Adblock
detector