КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Общие особенности модулей линейки FLASH-I2C

Общие сведения

Модули с технологией 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 модулей




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями