Как подключить несколько i2c к ардуино
Перейти к содержимому

Как подключить несколько i2c к ардуино

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

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

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

Преимущества:
  • Реализуется возможность подключения до 126 устройств.
    (не рекомендуется присваивать устройствам адреса 0x00 и 0x7F)
  • Не требуются дополнительные модули.
  • Все устройства одинаково подключаются к шине.
  • Каждое ведомое устройство имеет свой уникальный адрес на шине.
Недостатки:
  • Код программы немного сложнее чем для шины UART.
Нам понадобится:
    х 3шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт. х 3шт. x 2шт. x 1шт. x 1шт. x 1шт. х 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.

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

Схема соединения нескольких Arduino по шине I2C

На шине 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 Slave 0x02 включает или выключает светодиод, в соответствии с полученными данными.
    Настройка параметров шины 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(). Указывая в качестве параметров функций, адрес ведомого устройства и номер регистра, можно побайтно читать и записывать данные.

    Как подключить несколько i2c к ардуино

    В предыдущей статье рассматривался пример сбора данных одним контроллером Arduino NANO c двух других таких же контроллеров по шине I2C и отправка их по этой же шине в жидкокристаллический индикатор. Теперь хотелось бы разобраться с двухсторонним почти равнозначным обменом между контроллерами по I2C. Я возьму на этот раз два контроллера Nano. Один будет выступать в роли мастера, другой — слейва. Мастер периодически сначала будет отправлять значение одной переменной integer подчиненному Arduino Nano, после чего делать запрос на значение такой же переменной от него. А слейв при поступлении данных от мастера будет их считывать, а при поступлении запроса будет отправлять один integer.

    Видео по предыдущей статье.

    Программа мастера выглядит следующим образом

    Преобразование данных выполнено по мотивам предыдущей статьи.

    Адрес слейва будет иметь значение 01.

    Отправлять будем целое число 223.

    Программа контроллера — слейва. Arduino i2c несколько устройств

    Слейв Arduino Nano принимает данные от главного контроллера. В нашем случае принимает цифру 223 и выводит её в монитор порта. А при запросе данных от мастера этот Нано отправляет целое число 22. Все запросы от главного обрабатываются при помощи отдельных функций.

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

    Выводы

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

    Мне в следующем проекте будет необходимо подключить 10 Arduino Nano к главному контроллеру. При чем 8 из них должны будут обмениваться с главным двухсторонними данными. Для этого идеально подойдет коммуникация I2C. Так что я в цикле контроллера-мастера буду последовательно, возможно в цикле FOR опрашивать слейвов и посылать им управляющие данные. Будет весело!

    Ремень зубчатый 6 мм 300 мм

    Ремень зубчатый 6 мм 300 мм

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

    Инфракрасный датчик движения HC-SR505

    Инфракрасный датчик движения HC-SR505

    Миниатюрный экономичный датчик движения.Напряжение питания 4,5 . 20 ВТок покоя < 60 мкАВыходные..

    Монтажный провод двойной 22AWG

    Монтажный провод двойной 22AWG

    Сдвоенный провод в изоляции для монтажа различных электронных проектов.Количество в метрах..

    Разъемный коннектор JST

    Разъемный коннектор JST

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

    Arduino основы программирования

    Arduino основы программирования

    Arduino основы программирования Здесь мы научимся писать элементарную программу способную сделать..

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

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

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

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

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

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

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *