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