I2c arduino несколько устройств

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими 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(), то адрес регистра соответствует номеру элемента массива.

      Оцените статью
      Много толка
      Добавить комментарий