Типа “бортовой компьютер” на Arduino. Часть 2. Чтение с CAN-шины — бортжурнал Mazda 3 #BackInBlack 2012 года на DRIVE2
Первая статья с «теорией». В этой расскажу об основных компонентах, которые понадобятся и расскажу немного о работе с CAN-шиной, но пока без конечной реализации.
Предисловие
Никакой необходимости в том, что я сделал у меня не было. Мне просто было интересно попробовать.
Видел на Drive несколько статей про «ботовые компьютеры» на базе Arduino, а так как сам недавно начал изучить микроконтроллеры на примере данной «платформы», мне стало интересно попробовать сделать нечто подобное самому.
Очень коротко о главном
Нужно получать информацию от узлов автомобиля и выводить её на штатный LCD-дисплей (на котором информация с магнитолы отображается). Основные компоненты это Arduino Nano и CAN Bus Модуль MCP2515.
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 — 13SI — 11SO — 12
А вот вывод CS (он же SS) устанавливается программно в скетче. Почему так?
Подключение по SPI
Потому что к шине 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-шине и «читать» сообщения, а потом заняться их расшифровкой. Долго и сложно.Второй способ, и самый очевидный и простой — искать в интернете. И оно там есть, потому что нашлись те, кто воспользовался первым способом.
Источник: https://www.drive2.ru/l/460733581140951184/
CAN – шина, CAN – интерфейс
В данной статье не будем полностью расписывать CAN протокол, а обратим внимание лишь на вещи, которые надо обязательно знать и понимать для использования или разработки электронных устройств с поддержкой CAN.
Протокол CAN был разработан для автомобильной промышленности и впоследствии стал стандартом в области создания бортовых сетей автомобилей, железнодорожного транспорта и т.д. CAN позволяет создавать сети с развитыми средствами контроля ошибок, скоростью передачи до 1Мбит/с и пакетами содержащими не более восьми байтов данных.
Не дай своей идее погаснуть
Канальный и физический уровни CAN
В протоколе CAN нет строгого определения физического уровня, поэтому для передачи сообщений может использоваться, например, витая пара или оптоволокно. По сути дела CAN реализует канальный уровень, т.е.
осуществляет формирование пакетов сообщений, ограничение распространения ошибок, подтверждение приема и арбитража.
Есть конечно и распространенные стандарты прикладного уровня например CANopen, но если нет необходимости обеспечивать взаимодействие между оборудованием различных производителей, то лучше использовать внутренний протокол.
Структура узла сети CAN
Рассматриваемый нами узел сети CAN состоит из микроконтроллера, CAN контроллера и приемопередатчика (рисунок 1).
Чаще всего мы используем микроконтроллеры с встроенным CAN контроллером для упрощения схемы, но иногда используется автономный контроллер CAN с интерфейсом SPI (MCP2510).
Далее приемопередатчик подключается к витой паре, на концах которой размещены согласующие резисторы (терминатор) с сопротивлением 120 Ом.
Рисунок 1 – Узел сети CAN
Для формирования логической единицы в витой паре, или свободной шине, на оба провода подается напряжение, равное половине разности напряжения между 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 сообщений из автомобильной сети.
Арбитраж на шине 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 – значение предделителя частоты генератора скорости передачи
Tseg1 – первый сегмент
Tseg2 – Второй сегмент
Для проверки возьмем уже посчитанную скорость 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 < 5, то SJW = (Tseg2 – 1). В нашем случае SJW = 4.
Итого для получения скорости 125Кбит/c необходимо в параметрах указать, BRP = 30, Tseg1 = 10, Tseg2 = 5, SJW = 4.
P.S. Конфигурирование baud rate значительно отличается между старыми модулями USB-CANmodul (GW-001 и GW-002) с контроллером SJA1000 и новыми модулями sysWORXX с контроллером AT91SAM7A3. В статье описывающей работу с бортовым CAN автомобиля на скорости 83кбит/c приведен расчет скорости для контроллера AT91SAM7A3.
Пример получения и передачи данных по CAN-интерфейсу
В примере будем использовать CAN-адаптер с программой PcanView от SYSTEC и подключимся к салонному CAN автомобиля, работающему со скоростью 125Кбит/с. Рассматриваемый нами автомобиль оснащен креслами с электроприводом и поэтому исследуем данные отвечающие за положение кресел и постараемся изменить положение спинки подменив пакет с помощью компьютера .
Для начала на схеме автомобиля находим наиболее удобно расположенный разъем с линиями CANH и CANL и подключаем к нему наш адаптер. Если разъем и провода найти не получилось, то можно подлезть к блоку управления кресла, найти там два скрученных между собой провода и аккуратно надрезав провода подключить адаптер.
Если после подключения и настройки адаптера сообщения не приходят, то в первую очередь попробуйте поменять между собой 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, т.е. ID = 1F4, Length = 3, Data = 40 80 00. Period можно оставить 0 ms, тогда сообщения будут отправляться по факту нажатия кнопки пробел (рисунок 9).
Рисунок 9 – Создание CAN сообщения
На рисунке 10 отображено поле Transmit главного окна содержащее все отправляемые сообщения в CAN и информацию о них. При выделении сообщения и нажатии кнопки пробел произойдет отправка пакета в CAN сеть и кресло немного сдвинется в нужном направлении.
Рисунок 10 – Поле Transmit
Понятное дело, что добиться полноценного управления креслом в таком случае не получиться, т.к. мы не можем исключить из сети пакеты заводского пульта управления, но эта проблема вполне решаема.
Итог
Мы увидели как при определенных усилиях и навыках можно создавать собственные электронные системы с использованием высокотехнологичного протокола CAN и как можно подключаться, исследовать и управлять устройствами подключенными к автомобильной CAN шине.
Пример работы с бортовым CAN автомобиля на скорости 83кбит/c
Источник: http://embeddedsystem.ru/index.php?page=can-bus-can-interface
Настройка модуля 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 МГц.
Инициализация
Как обычно начинаем с инициализации модуля 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
Источник: http://hamlab.net/mcu/stm32/can_part1.html
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 канала:
- SCLK (пин 13) – тактовый.
- MOSI (пин 11) – данные, передаваемые от ведущего устройства к ведомому.
- MISO (пин 12) – наоборот, данные от ведомого к ведущему.
- 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 и закрепить вышеизложенное.
автор: ansealk (Пикабу)
Источник: https://MindWork.su/arduino/arduino-kontakti-i-shini/