I2c как подключить два устройства arduino

Урок 1. Двусторонняя связь между двумя Arduino с использованием I2C.

При разработке проектов на Arduino часто возникает потребность в увеличении возможности, а пинов не достаточно. Также бывает необходимость объединить несколько работающих узлов для обмена данными, т.е. реализовать двухстороннюю связь между двумя Arduino. Для реализации двусторонней связи между двумя Arduino отлично подойдёт шина I2C.

Интерфейс I 2 C (или по-другому IIC) — это достаточно широко распространённый сетевой последовательный интерфейс, придуманный фирмой Philips и завоевавший популярность относительно высокой скоростью передачи данных, дешевизной и простотой реализации.

Шина I2C синхронная, состоит из двух линий: данных (SDA) и тактов (SCL). При проектировании есть 2 типа устройств: ведущий (master) и ведомый (slave). Инициатором обмена всегда выступает ведущий, обмен между двумя ведомыми невозможен. Всего на одной двухпроводной шине может быть до 127 устройств.

Такты на линии SCL генерирует ведущий (master). Линией SDA могут управлять как мастер, так и ведомый (slave), в зависимости от направления передачи. Единицей обмена информации является пакет, обрамленный уникальными условиями на шине, именуемыми стартовым и стоповым условиями. Мастер в начале каждого пакета передает один байт, где указывает адрес ведомого и направление передачи последующих данных. Данные передаются 8-битными словами. После каждого слова передается один бит подтверждения приема приемной стороной.

Ведущее устройство инициирует связь с ведомым устройством. Для начала разговора требуется адрес ведомого устройства. Подчиненное устройство реагирует на ведущее устройство, когда к нему обращается ведущее устройство.

I 2 C используется во многих приложениях, таких как чтение RTC (часы реального времени), доступ к внешней памяти EEPROM. Он также используется в сенсорных модулях, таких как гироскоп, магнитометр и т. д.

Контакты Arduino I2C.

Выводы I2C расположены следующим образом на плате Arduino Uno.

Для других моделей плат соответствие выводов такое:

Источник

Digitrode

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

Как подключить к Arduino несколько устройств I2C с одним адресом с помощью TCA9548

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

Но не каждый датчик или коммутационная плата позволяет использовать протокол SPI. Так что можно сделать? Просто используйте мультиплексор I2C, вроде микросхемы TCA9548A от Texas Instruments. Это устройство доступно в качестве коммутационной платы для облегчения процесса подключения.

Итак, у этого компонента 8 каналов, это означает, что мы можем подключить до 8 датчиков к шине I2C. Хотя, на самом деле гораздо большею Давайте подробнее рассмотрим это устройство и способы его использования.

Этот мультиплексор TCA9548A вы можете подключать его к своему Arduino, как и любое другое устройство I2C. Вот его линии для подключения к Arduino:

Остальные 16 контактов подключены к 8 каналам мультиплексора. Таким образом, контакты SD0 и SC0 соответствуют линии данных (SDA) и линии синхронизации (SCL) от первой шины I2C, контакты SD1 и SC1 соответствуют линиям от второй шины I2C и т. д.

Каждая шина I2C мультиплексора независима друг от друга, и, как и шина I2C от вашего Arduino, вы можете подключить несколько устройств с разными адресами I2C к каждой шине мультиплексора.

В этом простом руководстве вы увидите, как подключить и запрограммировать мультиплексор на четыре датчика BME280, у которых один и тот же адрес I2C (0x77). Мы хотим подключить четыре платы, приведенные на следующем изображении, к Arduino Uno по протоколу I2C.

Давайте сначала соединим их друг с другом. Сначала соедините все контакты GND всех плат друг с другом (синие провода). Поскольку все платы работают от 5 В или 3,3 В, мы можем использовать любой из этих уровней для питания всех плат. Итак, давайте подключим 5V ко всем платам красными проводами.

Теперь подключим первый датчик к первой шине I2C от мультиплексора. Для этого подключите вывод SDI датчика к SD0 мультиплексора. Теперь подключите SCK от датчика к SC0 от мультиплексора.

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

Наконец, подключите линии данных и часов от Arduino Uno к мультиплексору. В этом случае вывод A4 от Arduino идет на вывод SDA мультиплексора, а вывод A5 от Arduino подключается к выводу SCL мультиплексора. Как упоминалось ранее, мы используем 5 В для питания всех плат. Таким образом, вывод 5V от Arduino идет на вывод VIN мультиплексора, а также выводы VCC от каждой платы (красные провода). И конечно, соедините все контакты GND друг с другом (синие провода).

Датчики и мультиплексор теперь успешно подключены друг к другу и к Arduino Uno, поэтому теперь приступим к программированию. Мультиплексор TCA9548A не требует какой-либо библиотеки, а датчик BME280 требует. Если вы этого еще не сделали, скачайте библиотеку сейчас по этой ссылке. Если вы хотите подключить мультиплексор к другому датчику, просто пропустите этот шаг. Далее приведен код программы Arduino для взаимодействия с TCA9548 и получения данных от датчиков BME280.

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

Источник

Подключаем несколько i2c экранов к arduino

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

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

Вся суть управления разными экранами в изменении i2c адреса одного из них. Для этого надо запаять вместе площадки внутри квадрата А0, А1, А2 на i2c переходнике (а можно и комбинировать, те А0 и А2 вместе). На картинке контакты изображены под синим потенциометром.

Теперь установите Liquid crystal i2c библиотеку.

Загружаем скетч i2c сканера на arduino и открываем монитор com порта.

Здесь мы получили i2c адрес экрана. Можно пометить на задней стороне.

Теперь переходим к прошивке. Здесь надо объявить два экрана с разными адресами и именами и обращаться к конкретному экрану. Прошивка есть на github.

Вот наш результат.

Любые вопросы и предложения пишите в комментариях. Буду рад!

Источник

Урок 26.3 Соединяем две arduino по шине I2C

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

В этом уроке мы научимся соединять две arduino по аппаратной шине I2C.

Преимущества:

  • Реализуется возможность подключения до 126 устройств.
    (не рекомендуется присваивать устройствам адреса 0x00 и 0x7F)
  • Не требуются дополнительные модули.
  • Все устройства одинаково подключаются к шине.
  • Каждое ведомое устройство имеет свой уникальный адрес на шине.

Недостатки:

  • Код программы немного сложнее чем для шины UART.

Нам понадобится:

  • Arduino х 3шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
  • Trema Shield х 3шт.
  • Trema кнопка x 2шт.
  • Trema светодиод x 1шт.
  • Trema потенциометр x 1шт.
  • Trema I2C Hub x 1шт.
  • Шлейф «мама-мама» (4 провода) для шины I2С х 4шт.

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
  • Библиотека iarduino_I2C_connect (для удобства соединения нескольких arduino по шине I2C).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki — Работа с символьными ЖК дисплеями.

Видео:

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

На шине i2С находятся 4 устройства: 3 arduino и 1 LCD дисплей. Все устройства шины I2C соединены через Trema I2C Hub. Для подключения Arduino используются аппаратные выводы шины I2C.

  • Arduino master — к цифровому выводу D2 подключена trema кнопка.
  • Arduino slave 0x01 — к цифровому выводу D2 подключена trema кнопка.
  • Arduino slave 0x02 — к цифровому выводу D13 подключён trema светодиод, к аналоговому выводу A0 подключён Trema потенциометр.
  • LCD I2C дисплей — является устройством slave 0x27.

На шине I2C не используются дополнительные подтягивающие резисторы (для линий SDA и SCL), так как они интегрированы в LDC I2C дисплее.

Код программы:

Arduino master:
Arduino slave 0x01:
Arduino slave 0x02:

Алгоритм работы:

  • Arduino master проверяет состояние собственной кнопки.
  • Arduino master опрашивает две Arduino Slave.
    • Arduino Slave 0x01 возвращает состояние кнопки.
    • Arduino Slave 0x02 возвращает значение падения напряжения плеча потенциометра.
  • Arduino master мастер отправляет состояние своей кнопки в Arduino Slave 0x02.
    • Arduino Slave 0x02 включает или выключает светодиод, в соответствии с полученными данными.
  • Arduino master отправляет данные о состояниях кнопки Arduino Slave 0x01 и потенциометра Arduino Slave 0x02 на LCD I2C дисплей.

Настройка параметров шины I2C:

Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/16 от тактовой частоты.

Библиотека Wire позволяет устанавливать скорость передачи данных через функцию setClock(), которую требуется вызвать до функции begin().

Библиотека Wire позволяет аппаратно подключить Arduino к шине I2C с указанием роли Arduino на шине: ведущий или ведомый.

  • Wire.setClock(400000); // скорость передачи данных 400 кБит/с.
  • Wire.begin(); // подключение к шине I2C в роли ведущего.
  • Wire.begin(адрес); // подключение к шине I2C в роли ведомого, с указанием адреса.

Функции библиотеки iarduino_I2C_connect:

В библиотеке iarduino_I2C_connect реализованы 4 функции: 2 для ведущего и 2 для ведомого.

На ведомом устройстве достаточно вызвать функцию begin() с указанием массива, данные которого требуется сделать доступными для мастера. Далее можно работать с этим массивом, «забыв» про шину I2C. Мастер обращаясь к ведомому сможет получать и изменять данные элементов указанного массива (обращаясь к номеру элемента массива как к номеру регистра).

Если требуется запретить мастеру менять значения некоторых ячеек массива, то достаточно вызвать «необязательную» функцию writeMask() с указанием маскировочного массива, каждый элемент которого является флагом, разрешающим запись в соответствующий элемент массива доступного по шине I2C.

На ведущем устройстве доступны функции readByte() и writeByte(). Указывая в качестве параметров функций, адрес ведомого устройства и номер регистра, можно побайтно читать и записывать данные.

Функции для ведомого:

begin():

  • Назначение: указание массива, элементы которого будут доступны для чтения/записи по шине I2C.
  • Синтаксис: begin(массив); // тип данных массива — byte.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде функции Setup().

writeMask():

  • Назначение: указание маскировочного массива, каждый элемент которого является флагом разрешения записи по шине I2C.
  • Синтаксис: writeMask(маскировочный_массив); // тип данных массива — bool.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде функции Setup().
  • Пример:
    #include
    #include
    iarduino_I2C_connect ccc;
    byte aaa[5]; // объявляем 5 элементов массива, к которому разрешим доступ.
    bool bbb[5] = <0,1,1,1,0>; // объявляем 5 элементов маскировочного массива.
    Wire.begin(0x33); // подключаемся к шине I2C в роли ведомого с адресом 0x33.
    ccc.begin(aaa); // разрешаем доступ к массиву aaa по шине I2C.
    ccc.wtiteMask(bbb); // маскируем разрешение на запись в массив aaa.
    • В соответствии со значениями массива bbb, мастер сможет записывать данные в ячейки 1,2,3 массива aaa, а попытка записи в 0 и 4 элементы будет проигнорирована.
    • Если массив aaa имеет больше элементов чем массив bbb, то попытка мастера записать данные в «лишние» элементы будет проигнорирована.
    • Если не объявлять маскировочный массив (не вызывать функцию writeMask() вообще), то все элементы массива aaa будут доступны для записи мастером.
Функции для ведущего:

readByte():

  • Назначение: Чтение одного байта данных из устройства на шине I2C.
  • Синтаксис: readByte(адрес_устройства, адрес_регистра);
  • Возвращаемые значения: uint8_t байт — данные считанные из указанного адреса, указанного устройства.
  • Примечание: Если производится чтение по шине I2C из массива объявленного функцией begin(), то адрес регистра соответствует номеру элемента массива.

Источник

Adblock
detector