Расширитель выводов, i2c - flash (Metro-модуль)

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

Модуль Metro - Расширитель выводов - является устройством ввода/вывода с подключением по шине I2С. У модуля имеются 4 вывода GPIO, каждый из которых может работать в качестве: цифрового входа, цифрового выхода, аналогового входа, или выхода с ШИМ, так же все выводы позволяют управлять сервоприводами.

Модуль можно использовать в любых проектах где требуется большое число выводов, как цифровых, так и аналоговых.

Видео:

Спецификация:

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 6 мА.
  • Напряжение логических уровней: 3,3 В (все выводы толерантны к 5 В).
  • Напряжение аналоговых уровней: до 3,3 В (все выводы толерантны к 5 В).
  • Разрешение АЦП: 12 бит (значение от 0 до 4095).
  • Разрешение ШИМ: 12 бит (значение от 0 до 4095).
  • Частота ШИМ: 1 - 12'000 Гц (по умолчанию 490 Гц).
  • Количество цифровых выводов: 4 (работают как на вход, так и на выход).
  • Количество аналоговых входов: 4 (АЦП).
  • Количество выходов с поддержкой ШИМ: 4.
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
  • Рабочая температура: от -40 до +85 °C.
  • Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
  • Вес: 7 г.

Подключение:

У модуля имеются две колодки выводов: IN (вход) - штыревой разъем и OUT (выход) гнездовой разъем. Все модули подключаются друг к другу соединяя выход предыдущего модуля со входом следующего, образуя состав из модулей Metro в котором первым «вагоном» является плата управления Metro Leonardo или Metro ESP.

Подключение к управляющей плате Metro Leonardo:

К плате Metro Leonardo можно подключить только расширители выводов или чередовать их с другими модулями Metro в любой последовательности.

Подключение к управляющей плате Metro ESP:

К плате Metro ESP можно подключить только расширители выводов или чередовать их с другими модулями Metro в любой последовательности.

Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.

Вместо платы управления Metro Leonardo или Metro ESP можно использовать платы Arduino или Piranha, у которых будут задействованы 2 вывода шины I2C (SCL и SDA), 2 вывода питания (5V и GND) и один вывод установки адреса ADR, по умолчанию используется вывод D12 (можно менять в скетче).

Питание:

Входное напряжение питания 5 В постоянного тока, подаётся на выводы 5V и GND модуля.

Модуль сохраняет работоспособность при снижении напряжения питания до 3,3 В.

Подробнее о модуле:

Модуль Metro - Расширитель выводов построен на базе микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. У модуля имеются 4 вывода GPIO размещённые на белой колодке, каждый вывод пронумерован. Рядом с выводами GPIO есть два вывода питания (+5V - красная колодка и GND - чёрная колодка). Все выводы GPIO могут работать как цифровые входы/выходы, аналоговые входы, или выходы с ШИМ на аппаратном уровне. На каждом выводе GPIO установлена схема защиты микроконтроллера от напряжений выше 3,3 В.

Модуль позволяет выполнять следующие действия на любом выводе GPIO:

  • Считывать или задавать логические уровни.
  • Считывать аналоговый уровень (12 бит АЦП).
  • Задавать сигнал ШИМ с указанным коэффициентом заполнения (12 бит).
  • Задавать частоту ШИМ от 1 до 12'000 Гц (по умолчанию 490 Гц).
  • Управлять сервоприводами.

Специально для работы с модулями Metro нами разработана библиотека iarduino_Metro, одна библиотека для всех модулей линейки Metro. Библиотека сама определяет наличие и тип модулей на шине I2C, присваивает им адреса и создаёт массив объектов для работы с найденными модулями. Стоит отметить что пользователю даже не обязательно знать адреса присвоенные модулям, так как для обращения к любому модулю достаточно знать его номер по порядку от платы управления Metro Leonardo или Metro ESP.

    Количество элементов массива Metro совпадает с количеством найденных модулей:
  • Metro[0] - объект для управления первым модулем (ближайшим к управляющей плате);
  • Metro[1] - объект для управления вторым модулем (следующим после первого);
  • Metro[2] - объект для управления третьим модулем (и т.д. до последнего модуля).

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Чтение и установка логических уровней:

#include <Wire.h>                             // Подключаем библиотеку Wire.
#include <iarduino_Metro.h>                   // Подключаем библиотеку iarduino_Metro.
                                              //
void setup(){                                 //
    iarduino_Metro_Start();                   // Определяем подключённые модули.
}                                             //
                                              //
void loop(){                                  //
    bool i = Metro[0].read( 0, EXT_DIGITAL ); // Читаем логический уровень с 0 вывода в переменную «i».
    Metro[0].set( 1, i, EXT_DIGITAL );        // Устанавливаем на 1 выводе считанный логический уровень из переменной «i».
}                                             //

Данный пример устанавливает на 1 выводе логический уровень равный логическому уровню поступившему на вывод 0.

Если к 1 выводу подключить светодиод, то он будет светиться пока 0 вывод соединён с красной колодкой и будет выключен пока 0 вывод соединён с чёрной колодкой.

Чтение и установка аналоговых уровней:

#include <Wire.h>                             // Подключаем библиотеку Wire.
#include <iarduino_Metro.h>                   // Подключаем библиотеку iarduino_Metro.
                                              //
void setup(){                                 //
    iarduino_Metro_Start();                   // Определяем подключённые модули.
}                                             //
                                              //
void loop(){                                  //
    int i = Metro[0].read( 2, EXT_ANALOG );   // Читаем аналоговый уровень с 2 вывода в переменную «i».
    Metro[0].set( 3, i, EXT_ANALOG );         // Устанавливаем на 3 выводе ШИМ соответствующий считанному аналоговому уровню из переменной «i».
}                                             //

Данный пример устанавливает на 3 выводе сигнал ШИМ, уровень которого прямо пропорционален напряжению подведённому к выводу 2. Удобство данного примера заключается в том, что диапазон считанных аналоговых уровней (0-4095) совпадает с диапазоном устанавливаемых значений ШИМ (0-4095).

Если к 3 выводу подключить светодиод, а к 2 выводу потенциометр, то яркость свечения светодиода будет зависеть от угла поворота потенциометра.

Управление сервоприводами:

#include <Wire.h>                             // Подключаем библиотеку Wire.
#include <iarduino_Metro.h>                   // Подключаем библиотеку iarduino_Metro.
                                              //
void setup(){                                 //
    iarduino_Metro_Start();                   // Определяем подключённые модули.
}                                             //
                                              //
void loop(){                                  //
    int i = Metro[0].read( 0, EXT_ANALOG );   // Читаем аналоговый уровень с 0 вывода в переменную «i».
    i = map( i, 0 ,4095, 0, 180 );            // Преобразуем значение «i» от диапазона 0...4095 к диапазону 0...180.
    Metro[0].set( 1, i, EXT_SERVO );          // Устанавливаем сервопривод 1 вывода в угол из переменной «i».
}                                             //

Данный пример устанавливает сервопривод подключённый к 1 выводу в угол, значение которого прямо пропорционально напряжению подведённому к выводу 0.

Если к 1 выводу подключить сервопривод, а к 0 выводу потенциометр, то угол поворота сервопривода будет зависеть от угла поворота потенциометра.

Описание функций библиотеки:

В данном разделе описаны функции библиотеки iarduino_Metro для работы с расширителем выводов, при работе с другими модулями те же функции могут иметь другое назначение.

Подключение библиотеки:

#include <Wire.h>           // Подключаем библиотеку Wire. Для работы с Arduino, Piranha или Metro Leonardo, библиотеку Wire можно не подключать.
#include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro.

После подключения библиотеки iarduino_Metro создавать объекты не требуется, вместо этого необходимо однократно вызвать функцию iarduino_Metro_Start(); в коде setup. Эта функция обнаружит все модули Metro, назначит им адреса на шине I2C и создаст массив объектов Metro, количество элементов которого будет совпадать с количеством найденных модулей Metro.

Определение подключённых модулей Metro:

iarduino_Metro_Start();     // В качестве аргумента функции можно указать вывод Arduino к которому подключен вход ADR модуля Metro (по умолчанию используется вывод D12).

Определение подключённых модулей Metro с возвращением их количества:

i = iarduino_Metro_Start(); // Определить все модули и записать их количество в переменную i.

После определения подключенных модулей станет доступен массив Metro, каждый элемент которого является объектом подключенного модуля Metro и предназначен для управления им.

    Например, если к управляющей плате подключено 3 любых модуля Metro, то массив Metro будет содержать 3 элемента:
  • Metro[0] - объект для управления первым модулем (ближайшим к управляющей плате);
  • Metro[1] - объект для управления вторым модулем (следующим после первого);
  • Metro[2] - объект для управления третьим модулем (дальним от управляющей платы).

Сторонние модули ша шине I2C: На шине I2C могут присутствовать сторонние модули* (не принадлежащие линейке Metro) со своими библиотеками. Это не повлияет на корректность обнаружения модулей Metro, не приведёт к присвоению неуникального адреса модулю и не нарушит очерёдность следования элементов массива Metro.
* Кроме сторонних модулей с адресом 0x09.

Функция read();

  • Назначение: Чтение аналоговых или логических уровней с выводов модуля.
  • Синтаксис: Metro[ индекс ].read( ВЫВОД [, ТИП ] );
  • Параметры:
    • ВЫВОД - Целое число от 0 до 3 соответствующее номеру вывода, уровень которого требуется прочитать.
      • Для чтения логических уровней со всех выводов, нужно указать EXT_ALL.
    • ТИП читаемого уровня, может принимать одно из четырёх значений, или отсутствовать:
      • EXT_ANALOG - считать аналоговый уровень.
      • EXT_DIGITAL - считать логический уровень (по умолчанию).
      • EXT_DIGITAL_UP - считать логический уровень, подтянув вывод до уровня логической «1» через внутренний резистор модуля.
      • EXT_DIGITAL_DN - считать логический уровень, прижав вывод до уровня логического «0» через внутренний резистор модуля.
  • Возвращаемые значения: Зависят от типа читаемого уровня.
    • Если указано считать аналоговый уровень, то функция вернёт значение от 0 до 4095.
    • Если указано считать логический уровень, то функция вернёт значение HIGH или LOW.
    • Если указано считать логические уровни со всех выводов, то функция вернёт один байт, каждый бит которого хранит логический уровень вывода, номер которого совпадает с номером бита в байте.
  • Примечание:
    • Если вызвать функцию без указания типа читаемого уровня, то функция вернёт логический уровень.
    • Если требуется считать состояние кнопки, то целесообразно подтягивать или прижимать вывод внутренним резистором модуля, в зависимости от схемы включения кнопки.
  • Пример:
Serial.print( "Аналоговый уровень на 2 выводе равен " );
Serial.println( Metro[0].read( 2 , EXT_ANALOG )       );
Serial.print( "Логический уровень на 3 выводе равен " );
Serial.println( Metro[0].read( 3 , EXT_DIGITAL )      );
  • Пример:
byte i = Metro[0].read(EXT_ALL, EXT_DIGITAL);
Serial.print( "Логические уровни на выводах 0-3 равны " );
Serial.print( bool( i & bit(0) ) );
Serial.print( bool( i & bit(1) ) );
Serial.print( bool( i & bit(2) ) );
Serial.print( bool( i & bit(3) ) );
Serial.println( "." );

Функция set();

  • Назначение: Установка логических уровней, сигналов ШИМ, или управление сервоприводами.
  • Синтаксис: Metro[ индекс ].set( ВЫВОД , УРОВЕНЬ [, ТИП] );
  • Параметры:
    • ВЫВОД - Целое число от 0 до 3 соответствующее номеру вывода, на котором требуется установить уровень, или угол сервопривода.
      • Для установки уровня (или угла) на всех выводах, нужно указать EXT_ALL.
    • УРОВЕНЬ - Целое число от 0 до 4095 для аналогового уровня (ШИМ), HIGH или LOW для логического уровня, или угол от 0 до 180° для сервопривода.
    • ТИП устанавливаемого уровня, может принимать одно из трёх значений, или отсутствовать:
      • EXT_ANALOG - установить аналоговый уровень (ШИМ).
      • EXT_DIGITAL - установить логический уровень (по умолчанию).
      • EXT_SERVO - установить сервопривод в указанный угол.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Если вызвать функцию без указания типа устанавливаемого уровня, то будет установлен логический уровень.
    • Установка угла сервопривода (на любом из выводов) приведёт к тому, что частота ШИМ на всех выводах упадёт до 50 Гц (на этой частоте работают большинство сервоприводов).
  • Пример:
Metro[0].set( 0 , 2047 , EXT_ANALOG  ); // Установить на 0 выводе сигнал ШИМ с 50% заполнением.
Metro[0].set( 1 , HIGH , EXT_DIGITAL ); // Установить на 1 выводе высокий логический уровень.
Metro[0].set( 2 , 90   , EXT_SERVO   ); // Повернуть сервопривод 2 вывода на угол 90°. При этом частота ШИМ установленная на 0 выводе упадёт до 50 Гц, а коэффициент заполнения (2047=50%) останется прежним.
  • Пример:
Metro[0].set( EXT_ALL , 205 , EXT_ANALOG  ); // Установить на всех выводах сигнал ШИМ с 5% заполнением.
Metro[0].set( EXT_ALL , LOW , EXT_DIGITAL ); // Установить на всех выводах низкий логический уровень.
Metro[0].set( EXT_ALL , 180 , EXT_SERVO   ); // Повернуть все сервоприводы на угол 180°. При этом частота ШИМ упадёт до 50 Гц.

Функция frequency();

  • Назначение: Функция устанавливает частоту ШИМ для выводов модуля.
  • Синтаксис: Metro[ индекс ].frequency( ЧАСТОТА );
  • Параметры:
    • ЧАСТОТА - Задаётся целым числом Гц от 1 до 12000.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Частота ШИМ не влияет на коэффициент заполнения ШИМ указываемый функцией set().
    • По умолчанию используются ШИМ с частотой 490 Гц.
    • После установки угла сервопривода функцией set( вывод , угол , EXT_SERVO ), частота ШИМ для любого вывода снизится до 50 Гц.
  • Пример:
Metro[0].set( 0 , 2047 , EXT_ANALOG  ); // Установить на 0 выводе сигнал ШИМ с 50% заполнением.
Metro[0].frequency( 1000 );             // Установить частоту ШИМ в 1 кГц.
Metro[0].set( 1 , 3071 , EXT_ANALOG  ); // Установить на 1 выводе сигнал ШИМ с 75% заполнением.
// Теперь на 0 и 1 выводе установлен сигнал ШИМ с частотой 1 кГц, но на 0 выводе ШИМ с 50% заполнением, а на 1 выводе с 75%.

Переменная address:

  • Тип: uint8_t.
  • Данные: Адрес модуля на шине I2C.
  • Примечание: Адрес формируется и присваивается во время определения модулей функцией iarduino_Metro_Start(); Не меняйте адрес, так как он используется библиотекой.
  • Пример чтения адреса модуля:
Serial.print  ( "Адрес модуля на шине I2C = " );
Serial.println( Metro[0].address              );

Переменная model:

  • Тип: uint8_t.
  • Данные: Идентификатор типа модуля.
  • Примечание: Тип модуля считывается во время определения модулей функцией iarduino_Metro_Start(); Не меняйте тип модуля, так как он используется библиотекой.
  • Пример определения типа модуля:
switch( Metro[0].model ){
    case MOD_KEY: Serial.println( "кнопка"                         ); break;
    case MOD_RGB: Serial.println( "светодиод"                      ); break;
    case MOD_RES: Serial.println( "потенциометр"                   ); break;
    case MOD_BUZ: Serial.println( "звукоизлучатель"                ); break;
    case MOD_DHT: Serial.println( "датчик влажности и температуры" ); break;
    case MOD_DSL: Serial.println( "датчик освещённости"            ); break;
    case MOD_EXT: Serial.println( "расширитель выводов"            ); break;
    case MOD_8X8: Serial.println( "светодиодная матрица 8х8"       ); break;
    default:      Serial.println( "неизвестный модуль"             ); break;
}

Переменная version:

  • Тип: uint8_t.
  • Данные: Версия прошивки модуля.
  • Примечание: Версия прошивки считывается во время определения модулей функцией iarduino_Metro_Start(); Изменение значения переменной не изменит версию модуля и не повлияет на работу модуля, и библиотеки.
  • Пример чтения версии прошивки модуля:
Serial.print  ( "Версия прошивки модуля = " );
Serial.println( Metro[0].version            );

Переменная size:

  • Тип: uint8_t.
  • Данные: Объем памяти ОЗУ в байтах, используемый библиотекой для данного модуля.
  • Примечание: Библиотека создаёт массив объектов Metro с помощью функции iarduino_Metro_Start(); в коде setup (при старте скетча), значит и память ОЗУ для работы с модулями выделяется там же, а не во время компиляции скетча. Зная объем выделенной памяти можно определить объем свободной и рассчитать, какое количество модулей Metro ещё можно подключить. Изменение значения переменной не изменит объём выделенной памяти и не повлияет на работу модуля, и библиотеки.
  • Пример чтения объема памяти ОЗУ выделенного для работы с модулем:
Serial.print  ( "Для работы данного модуля выделено " );
Serial.print  ( Metro[0].size                         );
Serial.println( " байт памяти ОЗУ."                   );

Применение:

Модуль Metro - Расширитель выводов позволяет расширить функционал линейки Metro, так как с помощью данного модуля появляется возможность подключения элементов, модулей и устройств не входящих в линейку Metro.

Ссылки:

Обсуждение