Общие сведения:
Trema-модуль расширитель на 8 входов/выходов - позволяет увеличить количество цифровых выводов Arduino. Каждый вывод расширителя является полноценным двунаправленным выводом, а не квазидвунаправленным, то есть его можно использовать как обычный, цифровой, вывод Arduino, без ограничений.
Видео:
Спецификация:
- Напряжение питания: 2,3 ... 5,5 В
- Потребляемый ток: до 175 мкА
- Потребляемый ток в режиме ожидания: до 1 мкА
- Выходной ток на выводах: до 50 мА
- Напряжение на выводах I/O: до 5,5 В
- Общая потребляемая мощьность: до 200 мВт
- Уровень логической 1 на шине I2C: 0.7Vcc ... 5.5 В
- Уровень логического 0 на шине I2C: -0.5 ... 0.3Vcc В
- Частота шины I2C: 100, 400 кГц
- Рабочая температура: -40 ... 85 °С
- Температура хранения: -65 ... 150 °С
- Габариты: 65х30х19 мм (с учётом выводов)
- Вес: 7 г
Подключение:
Модуль подключается к аппаратной или программной шине I2C Arduino.
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ - 1: Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
Способ - 2 : Используя Trema Set Shield
Модуль можно подключить к любому из I2C входов Trema Set Shield.
Способ - 3 : Используя проводной шлейф и Shield
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
При подключении нескольких модулей, установите им разные адреса.
Способ - 4: Подключение к программной шине I2C
При использовании программной шины I2C, модуль можно подключить к любым выводам Arduino, но потребуется дополнительно установить библиотеку iarduino_I2C_Software.h, для создания программной шины I2C, указав номера выбранных вами выводов. О том как это сделать читайте ниже в разделе «Подключение библиотеки», а так же на странице Wiki - Расширенные возможности библиотек iarduino для шины I2C.
Питание:
Входное напряжение питания 5 В, или 3,3 В постоянного тока, подаётся на выводы Vcc и GND модуля.
При питании модуля от напряжения 3,3 В, выводы модуля толерантны к напряжению 5 В.
Подробнее о модуле:
Модуль построен на базе чипа PCA9534D и использует шину I2C, с тактовой частотой до 400 кГц. В модуле реализована аппаратная возможность выбора адреса на шине, от 0x20 до 0x27, что позволяет подключить к одной шине I2C до 8 модулей. Выбор адреса осуществляется установкой трех переключателей в соответствии с таблицей, размещенной на плате модуля. Над таблицей размещены светодиоды, включение которых соответствует единице в таблице.
Для работы с модулем, нами разработана библиотека iarduino_I2C_IO, при использовании которой, Вы можете управлять выводами модуля, используя функции объекта библиотеки, или используя стандартные функции: pinMode()
, digitalWrite()
и digitalRead()
, используемые для управления обычными выводами Arduino.
Подробнее про установку библиотеки читайте в нашей инструкции.
Примеры:
Управление выводами модуля через функции объекта: pinMode, digitalWrite и digitalRead
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_IO. #include <iarduino_I2C_IO.h> // Подключаем библиотеку для работы с модулями. iarduino_I2C_IO modul_1(0x24); // Создаём объект modul_1, указывая установленный адрес на модуле 0x24 iarduino_I2C_IO modul_2(0x26); // Создаём объект modul_2, указывая установленный адрес на модуле 0x26 // Для каждого модуля создаётся свой объект, с указанием адреса модуля void setup() { modul_1.begin(&Wire); // Инициируем работу с 1 модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). modul_2.begin(&Wire); // Инициируем работу с 2 модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). modul_1.pinMode(5, OUTPUT); // Конфигурируем 5 вывод 1 модуля как выход modul_1.pinMode(7, INPUT ); // Конфигурируем 7 вывод 1 модуля как вход modul_2.pinMode(5, OUTPUT); // Конфигурируем 5 вывод 2 модуля как выход modul_2.pinMode(7, INPUT ); // Конфигурируем 7 вывод 2 модуля как вход } void loop(){ modul_1.digitalWrite(5, HIGH); // Устанавливаем на 5 выводе 1 модуля, состояние логической 1 modul_2.digitalWrite(5, LOW); // Устанавливаем на 5 выводе 2 модуля, состояние логического 0 int a = modul_1.digitalRead(7); // читаем состояние 7 вывода 1 модуля в переменную a int b = modul_2.digitalRead(7); // читаем состояние 7 вывода 2 модуля в переменную b }
Управление выводами модуля через стандартные функции: pinMode, digitalWrite и digitalRead
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_IO_Global. #include <iarduino_I2C_IO_Global.h> // Подключаем библиотеку, разрешая использовать обычные функции для управления выводами модуля // При этом, адрес 1 модуля должен быть 0x20, следующего 0x21 и т.д. // Тогда выводы 0-7 принадлежат 1 модулю, 8-15 второму и т.д. // Номера выводов Arduino указываются типом uint8_t, а модулей pinNum. uint8_t i=2; // Создаём переменную i, с типом uint8_t, указывая ей 2 вывод arduino. pinNum j=2; // Создаём переменную j, с типом pinNum , указывая ей 2 вывод модуля. // void setup(){ // iarduino_I2C_IO_Global.begin(&Wire); // Инициируем работу с модулями расширения выводов, указав ссылку на объект для работы с шиной I2C на которой находятся модули (по умолчанию &Wire). pinMode(i, OUTPUT); // Переводим 2 вывод arduino в режим выход. pinMode(j, OUTPUT); // Переводим 2 вывод модуля в режим выход. pinMode((uint8_t) 3, OUTPUT); // Переводим 3 вывод arduino в режим выход. pinMode((pinNum ) 3, OUTPUT); // Переводим 3 вывод модуля в режим выход. } // // void loop(){ // switch((millis()/1000)%8){ // Значение в switch() меняется каждую секунду в пределах 0-7. case 0: digitalWrite(i, HIGH); break; // Устанавливаем на 2 выводе arduino, состояние логической 1. case 1: digitalWrite(i, LOW ); break; // Устанавливаем на 2 выводе arduino, состояние логического 0. case 2: digitalWrite(j, HIGH); break; // Устанавливаем на 2 выводе модуля , состояние логической 1. case 3: digitalWrite(j, LOW ); break; // Устанавливаем на 2 выводе модуля , состояние логического 0. case 4: digitalWrite((uint8_t) 3, HIGH); break; // Устанавливаем на 3 выводе arduino, состояние логической 1. case 5: digitalWrite( uint8_t(3), LOW ); break; // Устанавливаем на 3 выводе arduino, состояние логического 0. case 6: digitalWrite( pinNum(3) , HIGH); break; // Устанавливаем на 3 выводе модуля , состояние логической 1. case 7: digitalWrite((pinNum) 3 , LOW ); break; // Устанавливаем на 3 выводе модуля , состояние логического 0. default: break; // } // } //
В первом примере, обращение к каждому модулю осуществляется через его объект, а во втором, обращение осуществляется через стандартные функции управления цифровыми выводами, при этом, выводы Arduino указываются типом uint8_t, а выводы модулей типом pinNum.
Описание основных функций библиотеки:
В данном разделе описаны функции библиотеки iarduino_I2C_IO для работы с модулем расширителя на 8 входов/выходов.
Библиотека iarduino_I2C_IO может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано ниже в разделе «Подключение библиотеки», а так же на странице Wiki - расширенные возможности библиотек iarduino для шины I2C.
Работа с модулями через стандартные функции:
Подключение библиотеки:
- Если используется аппаратная шина I2C:
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_IO_Global.h #include <iarduino_I2C_IO_Global.h> // Подключаем библиотеку для работы с модулями. // Объекты создавать не нужно! void setup(){ // ... // iarduino_I2C_IO_Global.begin(&Wire); // Инициируем работу с расширителем выводов, указав ссылку на объект для работы с шиной I2C на которой находится расширитель (по умолчанию &Wire). ... // Доступны объекты: &Wire, &Wire1, &Wire2... } //
- Если используется программная шина I2C:
#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_I2C_IO_Global.h SoftTwoWire sWire(3,4); // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL. // #include <iarduino_I2C_IO_Global.h> // Подключаем библиотеку для работы с модулем. // Объекты создавать не нужно! void setup(){ // ... // iarduino_I2C_IO_Global.begin(&sWire); // Инициируем работу с расширителем выводов, указав ссылку на объект для работы с шиной I2C на которой находится расширитель (по умолчанию &Wire). ... // } //
- В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека
Wire.h
(предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы(3-SDA, 4-SCL)
. - Далее подключается библиотека iarduino_I2C_IO_Global без создания объекта.
- В коде
Setup()
, при инициализации работы с модулями указывается ссылка на объект работы с выбранной шиной I2Cbegin(&ШИНА)
. Остальные строки кода одинаковы для любой шины I2C.
Функция begin();
- Назначение: Инициализация работы с модулями на указанной шине I2C.
- Синтаксис: begin( [ &ШИНА ] );
- Параметры:
- &ШИНА - Ссылка на объект для работы с шиной I2C на которой находятся модули.
- Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
- Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
- Параметр является не обязательным, по умолчанию используется ссылка &Wire.
- Возвращаемые значения: Нет.
- Примечание:
- Если все модули находятся на одной шине I2C, то функция вызывается 1 раз в коде setup.
- На одной шине могут находится до 8 модулей, с адресами от 0x20 до 0x27 включительно.
- Но можно создать несколько программных шин или работать с разными аппаратными шинами, тогда на каждой шине можно разместить по 8 модулей. В этом случае функция begin() указывает на ту шину I2C которую нужно сделать активной в данный момент, тогда эта функция может вызываться неоднократно.
- Пример:
pinNum i=0, j=1; iarduino_I2C_IO_Global.begin(&Wire); // Инициируем работу с модулями на шине Wire. digitalWrite( i, LOW ); // Устанавливаем LOW на 0 выводе модуля 0x20 на шине Wire. digitalWrite( j, HIGH ); // Устанавливаем HIGH на 1 выводе модуля 0x20 на шине Wire. iarduino_I2C_IO_Global.begin(&Wire1); // Инициируем работу с модулями на шине Wire 1. digitalWrite( i, LOW ); // Устанавливаем LOW на 0 выводе модуля 0x20 на шине Wire 1. digitalWrite( j, HIGH ); // Устанавливаем HIGH на 1 выводе модуля 0x20 на шине Wire 1.
Стандартные функции pinMode(); digitalRead(); digitalWrite();
- Назначение: Установка режима работы выводов, чтение и установка состояний выводов.
- Параметры:
- №_ВЫВОДА_МОДУЛЯ - число, типа pinNum.
- №_ВЫВОДА_ARDUINO - число, типа uint8_t.
- Примечание:
- Использование других типов, вызовет ошибку.
- Тип pinNum на самом деле является классом и создавая "переменную" с этим типом, вы на самом деле создаёте экземпляр класса, который имитирует поведение переменной. Такие "переменные" поддерживают все стандартные действия (объявление, присвоение, арифметические и логические операции).
- Пример:
digitalWrite( pinNum(25) , digitalRead( pinNum(35) )); // Копируем состояние с 35 вывода модуля на 25 вывод модуля // 25 вывод, это 1 вывод модуля с адресом 0x23 на шине I2C // 35 вывод, это 3 вывод модуля с адресом 0x24 на шине I2C digitalWrite( uint8_t(3) , digitalRead( pinNum(53) )); // Копируем состояние с 53 вывода модуля на 3 вывод Arduino // 53 вывод, это 5 вывод модуля с адресом 0x26 на шине I2C
При использовании стандартных функций работы с выводами, нумерация выводов всех модулей сквозная, по порядку адресов на шине I2C (см. таблицу). Допускается пропускать адреса модулей на шине I2C, например, установить два модуля с адресами 0x21 и 0x23, но и обращаться придется к выводам с номерами 8-15 и 24-31.
Номера выводов, указываемые в стандартных функциях, зависят от адреса модуля на шине I2C:
Адрес модуля: | 0x20 | 0x21 | 0x22 | 0x23 | 0x24 | 0x25 | 0x26 | 0x27 |
---|---|---|---|---|---|---|---|---|
Вход/Выход № 0 | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 |
Вход/Выход № 1 | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 |
Вход/Выход № 2 | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 |
Вход/Выход № 3 | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 |
Вход/Выход № 4 | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 |
Вход/Выход № 5 | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 |
Вход/Выход № 6 | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 |
Вход/Выход № 7 | 7 | 15 | 23 | 31 | 39 | 47 | 55 | 63 |
Описание дополнительных функций библиотеки:
Работа с модулями через объекты библиотеки:
Подключение библиотеки:
#include <iarduino_I2C_IO.h> // Подключаем библиотеку iarduino_I2C_IO exp( АДРЕС ); // Создаём объект exp, с указанием адреса модуля на шине I2C. // Для каждого модуля создаётся свой объект, с указанием адреса модуля. // Примечание: // Допускается создание одного объекта без указания адреса модуля, который сможет работать с любым модулем на шине. // При этом, адрес 1 модуля должен быть 0x20, следующего 0x21 и т.д. // Тогда выводы 0-7 принадлежат 1 модулю, 8-15 второму и т.д.
Подключение библиотеки:
- Если используется аппаратная шина I2C:
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_IO.h #include <iarduino_I2C_IO.h> // Подключаем библиотеку для работы с модулем. // iarduino_I2C_IO exp(0x20); // Создаём объект exp для работы с функциями и методами библиотеки iarduino_I2C_IO, указывая адрес модуля на шине I2C. // iarduino_I2C_IO exp; // Если адрес модуля не известен, то его можно не указывать, он будет найден автоматически. // Если адрес не указан, то на шине должен находиться только один модуль. void setup(){ // ... // exp.begin(&Wire); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). ... // Доступны объекты: &Wire, &Wire1, &Wire2... } //
- Если используется программная шина I2C:
#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_I2C_IO.h SoftTwoWire sWire(3,4); // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL. // #include <iarduino_I2C_IO.h> // Подключаем библиотеку для работы с модулем. iarduino_I2C_IO exp(0x20); // Создаём объект exp для работы с функциями и методами библиотеки iarduino_I2C_IO, указывая адрес модуля на шине I2C. // iarduino_I2C_IO exp; // Если адрес модуля не известен, то его можно не указывать, он будет найден автоматически. // Если адрес не указан, то на шине должен находиться только один модуль. void setup(){ // ... // exp.begin(&sWire); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). ... // } //
- В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека
Wire.h
(предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы(3-SDA, 4-SCL)
. - Далее подключается библиотека и создаются объекты для работы с модулями. Для каждого модуля создаётся свой объект. Стоит отметить, что можно использовать сразу несколько шин I2C, разместив на каждой шине до 8 модулей с адресами от 0x20 до 0x27.
- В коде
Setup()
, при инициализации работы с модулем указывается ссылка на объект работы с выбранной шиной I2Cbegin(&ШИНА)
. Остальные строки кода одинаковы для любой шины I2C.
Функция begin();
- Назначение: Инициализация работы с модулем
- Синтаксис: begin( [ &ШИНА ] );
- Параметры:
- &ШИНА - Ссылка на объект для работы с шиной I2C на которой находится модуль.
- Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
- Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
- Параметр является не обязательным, по умолчанию используется ссылка &Wire.
- Возвращаемые значения: Нет.
- Примечание: Вызывается 1 раз в коде setup.
- Пример:
exp1.begin(&Wire ); // Инициируем работу модуля, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). exp2.begin(&Wire1); // Инициируем работу модуля, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
Функция pinMode();
- Назначение: Установка режима работы вывода модуля (вход или выход).
- Синтаксис: pinMode( №_ВЫВОДА_МОДУЛЯ , РЕЖИМ_РАБОТЫ );
- Параметры:
- №_ВЫВОДА_МОДУЛЯ - число от 0 до 7, соответствующее конфигурируемому выводу.
- РЕЖИМ_РАБОТЫ - устанавливаемый режим работы вывода модуля: (INPUT или OUTPUT).
- Возвращаемые значения: Нет.
- Примечание: Работает как одноимённая функция pinMode.
exp.pinMode(0, INPUT ); // Конфигурируем 0 вывод модуля как вход exp.pinMode(1, OUTPUT); // Конфигурируем 1 вывод модуля как выход
Функция digitalRead();
- Назначение: Чтение логического состояния на выводе модуля (LOW или HIGH).
- Синтаксис: digitalRead( №_ВЫВОДА_МОДУЛЯ );
- Параметры:
- №_ВЫВОДА_МОДУЛЯ - число от 0 до 7, соответствующее выводу модуля, состояние которого требуется прочитать.
- Возвращаемые значения: bool - логическое состояние на выводе (LOW или HIGH).
- Примечание: Работает как одноимённая функция analogRead.
- Пример:
bool val = exp.digitalRead(0); // Читаем состояние нулевого входа модуля в переменную val
Функция digitalWrite();
- Назначение: Установка логического состояния на выводе модуля (LOW или HIGH).
- Синтаксис: digitalWrite( №_ВЫВОДА_МОДУЛЯ , СОСТОЯНИЕ);
- Параметры:
- №_ВЫВОДА_МОДУЛЯ - число от 0 до 7, соответствующее выводу, состояние которого требуется установить.
- СОСТОЯНИЕ - устанавливаемое логическое состояние на выводе (LOW или HIGH).
- Возвращаемые значения: Нет.
- Примечание: Работает как одноимённая функция digitalWrite.
exp.digitalWrite(1, HIGH); // Устанавливаем на первом выводе модуля состояние логической единицы
Нумерация выводов для каждого модуля начинается с 0.
Применение:
- Увеличение количества цифровых входов/выходов Arduino.
- Уменьшение числа проводов, между Arduino и цифровыми устройствами.
- Усиление помехозащищенности, если устройства находятся на значительном удалении от arduino.
Обсуждение