Общие сведения
Модули с технологией Flash-I2C являются модулями полностью совместимыми с протоколом I²C, но, в отличии от многих других обычных модулей I²C, позволяют задавать адреса на шине, что означает, что на шине может находится более 100 одинаковых или разных модулей линейки Flash-I2C с адресами, заданными пользователем. Адрес хранится в энергонезависимой памяти модуля, это означает он сохранится и после отключения питания. Так же ко всем модулям Flash-I2C (кроме модуля Установщик адресов Flash-I2C) есть библиотеки для Arduino и ко многим модулям библиотеки Python для Raspberry Pi. Узнать о наличии библиотеки для Raspberry Pi можно зайдя в wiki соответствующего модуля.
Особенности работы с модулями Flash-I2C
Программная часть
Все модули линейки Flash-I2C поставляются с заданным по умолчанию адресом 0x09 (девять в шестнадцатеричной системе счисления). Если Вы используете более одного модуля в проекте, то каждому модулю необходимо выставить уникальный адрес на шине. Адрес должен находиться в диапазоне от 0x08 до 0x1E (от 8 до 126 в шестнадцатеричной системе счисления). Сделать это можно тремя способами, в зависимости от ситуации:
- Программно, при помощи функции changeAddress() библиотеки работы с модулем. Библиотека разработанная для работы с модулем, может менять адреса только тех модулей для которых она разработана.
- Программно, при помощи функции changeAddress() или оператора присвоения (=) библиотеки iarduino_I2C_Address. Эта библиотека позволяет менять адреса любых модулей линейки Flash I2C, а главное - автоматически сортировать адреса модулей даже если на шине есть устройства с одинаковыми адресами.
- Аппаратно, при помощи Установщика адресов I2C.
Смена адреса программно, библиотекой для работы с модулем:
В примерах используется модуль Flash-I2C реле.
C++ (Arduino)
// Подключаем библиотеку для работы с модулем Flash-I2C реле #include <iarduino_I2C_Relay.h> // Инстанцируем (создаём) объект библиотеки iarduino_I2C_Relay relay(0x09); // Создаём переменную с новым адресом const uint8_t newAddress = 0x0A; void setup() { Serial.begin(9600); // Инициируем модуль relay.begin(); // Меняем адрес модуля if (relay.changeAddress(newAddress)) { Serial.println("Адрес изменён"); } else { Serial.println("Не удалось изменить адрес. Проверьте подключение модуля"); } } void loop() { ; }
Python (Raspberry Pi)
# Подключаем библиотеку для работы с модулем Flash-I2C реле from pyiArduinoI2Crelay import * # Инстанцируем (создаём) объект библиотеки relay = pyiArduinoI2Crelay(0x09) # Создаём переменную с новым адресом newAddress = 0x0A # Меняем адрес модуля if relay.changeAddress(newAddress): print("Адрес изменён") else: print("Не удалось изменить адрес. Проверьте подключение модуля")
Так как библиотека iarduino_I2C_Relay предназначена для работы с реле и силовыми ключами, то она способна менять только их адреса и не будет работать с иными модулями.
Смена адреса программно, универсальной библиотекой iarduino_I2C_Address:
C++ (Arduino)
uint8_t newAddress = 0x09; // Назначаемый модулю адрес (0x07 < адрес < 0x7F). // #include <iarduino_I2C_Address.h> // Подключаем библиотеку для работы с адресами модулей линейки I2C-flash. iarduino_I2C_Address module; // Объявляем объект module для работы с любым модулем I2C-flash. Адрес модуля будет определен автоматически. // Если адрес модуля известен, то его можно указать при создании объекта, например, iarduino_I2C_Address module(0xA0); void setup(){ // Serial.begin(9600); // Инициируем передачу данных по шине UART на скорости 9600 бит/сек. module.begin(); // Начинаем работу с модулем. while( !module ){;} // Запрещаем дальнейшую работу если модуль не обнаружен. Serial.print("Найден модуль 0x"); // Serial.println( module, HEX ); // Выводим текущий адрес модуля. module=newAddress; // Меняем адрес модуля на newAddress. if(module==newAddress){ // Проверяем новый адрес модуля. Serial.println("Адрес модуля изменён"); // Успех записи нового адреса можно проверить по результату присвоения: if( module=newAddress ){/*успешно*/;}else{/*провал*/;} } // Serial.print("Текущий адрес модуля 0x"); // Serial.println( module, HEX ); // Выводим текущий адрес модуля. } // // void loop(){ // } //
Библиотека iarduino_I2C_Address разработана для получения, смены и сортировки адресов любых модулей линейки Flash I2C. Больше примеров по работе с данной библиотекой вы найдёте в статье wiki - Программная установка адресов модулей FLASH-I2C.
Смена адреса аппаратно, при помощи установщика адресов Flash-I2C:
Подключите Установщик адресов I2C Change Address (далее Установщик) к обесточенной шине i2c с другими модулями или с одним модулем, адрес которого необходимо изменить.
Подайте питание на шину. Установщик включит два средних сегмента 7-ми сегментного дисплея ("- -")
Нажмите кнопку "ПОИСК".
В течении нескольких секунд установщик будет показывать количество найденных модулей на шине, затем переключится на отображение адреса первого устройства.
Для навигации по устройствам нажимайте левую или правую кнопки
Для переход в режим установки адреса одновременно нажмите левую и правую кнопки
Начнёт мигать нижний сегмент первой цифры дисплея
Кнопками выберете новый адрес модуля и снова нажмите одновременно левую и правую кнопки
Адрес установлен
Аппаратная часть
Модули линейки Flash-I2C подключаются к шине I2C и могут работать как от 5В так и от 3В постоянного тока. При этом уровни логической "1" на выводах SCL и SDA будут соответствовать напряжению питания.
На всех модулях Flash-I2C колодка выполнена в едином формате, это четыре пина с шагом 0,1 дюйма (2,54 мм), выводы GND, +5V, SDA, SCL
На примере датчика освещённости:
Функции библиотек, общие для всех модулей Flash-I2C
Функция begin();
- Назначение: Инициализация работы с модулем.
- Синтаксис: begin();
- Параметры: Нет.
- Возвращаемое значение: bool - результат инициализации (true или false).
- Примечание: По результату инициализации можно определить наличие модуля на шине.
- Пример:
if( Obj.begin() ){ Serial.print( "Модуль найден и инициирован!" ); } else { Serial.print( "Модуль не найден на шине I2C" ); }
Функция reset();
- Назначение: Перезагрузка модуля.
- Синтаксис: reset();
- Параметры: Нет.
- Возвращаемое значение: bool - результат перезагрузки (true или false).
- Пример:
if( Obj.reset() ){ Serial.print( "Модуль перезагружен" ); } else { Serial.print( "Модуль не перезагружен" ); }
if Obj.reset(): print("Модуль перезагружен") else: print("Модуль не перезагружен")
Функция changeAddress();
- Назначение: Смена адреса модуля на шине I2C.
- Синтаксис: changeAddress( АДРЕС );
- Параметр:
- uint8_t АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
- Возвращаемое значение: bool - результат смены адреса (true или false).
- Примечание:
- Адрес модуля сохраняется в энергонезависимую память, а значит будет действовать и после отключения питания.
- Текущий адрес модуля можно узнать функцией getAddress().
Пример:
Arduino
if( Obj.changeAddress(0x12) ){ Serial.print( "Адрес модуля изменён на 0x12" ); } else { Serial.print( "Не удалось изменить адрес" ); }
Python (Raspberry Pi)
if Obj.changeAddress(0x12): print("Адрес модуля изменён на 0x12") else: print("Не удалось изменить адрес")
Функция getAddress();
- Назначение: Запрос текущего адреса модуля на шине I2C.
- Синтаксис: getAddress();
- Параметры: Нет.
- Возвращаемое значение: uint8_t АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
- Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
- Пример:
Arduino
Serial.print( "Адрес модуля на шине I2C = 0x" ); Serial.println( Obj.getAddress(), HEX );
Python (Raspberry Pi)
print("Адрес модуля на шине I2C = 0x", end='') print(Obj.getAddress())
Функция getVersion();
- Назначение: Запрос версии прошивки модуля.
- Синтаксис: getVersion();
- Параметры: Нет
- Возвращаемое значение: uint8_t ВЕРСИЯ - номер версии прошивки от 0 до 255.
- Пример:
Arduino
Serial.print( "Версия прошивки модуля " ); Serial.println( Obj.getVersion() );
Python (Raspberry Pi)
print("Версия прошивки модуля ", end='') print(Obj.getVersion())
Функция setPullI2C();
- Назначение: Управление внутрисхемной подтяжкой линий шины I2C.
- Синтаксис: setPullI2C( [ФЛАГ] );
- Параметр:
- bool ФЛАГ требующий установить внутрисхемную подтяжку линий шины I2C (true или false).
- Возвращаемое значение:
- bool - результат включения / отключения внутрисхемной подтяжки (true или false).
- Примечание:
- Вызов функции без параметра равносилен вызову функции с параметром true - установить.
- Флаг установки внутрисхемной подтяжки сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Внутрисхемная подтяжка линий шины I2C осуществляется до уровня 3,3 В, но допускает устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния внутрисхемной подтяжки модуля.
- Пример:
Arduino
if( Obj.setPullI2C(true ) ){ Serial.print( "Внутрисхемная подтяжка установлена." ); } if( Obj.setPullI2C(false) ){ Serial.print( "Внутрисхемная подтяжка отключена." ); }
Python (Raspberry Pi)
if Obj.setPullI2C(True): print("Внутрисхемная подтяжка установлена.") if Obj.setPullI2C(False): print("Внутрисхемная подтяжка отключена.")
Функция getPullI2C();
- Назначение: Запрос состояния внутрисхемной подтяжки линий шины I2C.
- Синтаксис: getPullI2C();
- Параметры: Нет.
- Возвращаемое значение: bool - ФЛАГ включения внутрисхемной подтяжки (true или false).
- Пример:
Arduino
if( Obj.getPullI2C(true) ){ Serial.print( "Внутрисхемная подтяжка включена." ); } else { Serial.print( "Внутрисхемная подтяжка отключена." ); }
Python (Raspberry Pi)
if Obj.getPullI2C(True): print("Внутрисхемная подтяжка включена.") else: print("Внутрисхемная подтяжка отключена.")
Список Wiki модулей
- Датчик освещенности, люксметр, i2c-flash (Trema-модуль)
- Датчик температуры и влажности, i2c-flash (Trema-модуль)
- Модуль реле, 2 канала, i2c
- Модуль твердотельное реле, 4 канала, i2c
- Модуль силовых ключей, 4P канала, i2c
- Модуль силовых ключей, 4N канала, i2c
- Модуль силовых ключей, 4P канала с измерением тока, i2c
- Модуль силовых ключей, 4N канала с измерением тока, i2c
- Датчик освещенности, люксметр, i2c-flash (Trema-модуль)
- Датчик температуры и влажности, i2c-flash (Trema-модуль)
- Бампер с 7 датчиками линий, i2c - flash
- Энкодер, потенциометр, i2c
- Расширитель выводов, i2c - flash (Trema-модуль)
- Расширитель выводов, i2c - flash (Trema-модуль)
- Шина I2C, краткое руководство
Обсуждение