LED Матрица 8x8, i2c (Metro-модуль) - Datasheet

Модуль Metro - LED матрица 8x8.

Техническое описание: Данная страница содержит подробное техническое описание модуля Metro - LED матрица 8x8 и раскрывает работу с модулем через его регистры.

Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_Metro можно на странице Wiki - LED матрица 8x8 (Metro-модуль).

Аналоги: Аналогом модуля Metro LED Матрица 8x8 является Trema модуль LED матрица 8x8 который построен на том же чипе, имеет те же регистры и принцип работы, но выполнен в другом формфакторе, использует только выводы шины I2C и работает с другой библиотекой.

Назначение:

Модуль Metro - LED матрица 8x8 - является цифровой монохромной светодиодной матрицей с подключением по шине I2С.

К одной шине I2C можно подключить более 100 модулей.

Модуль можно использовать в любых проектах где требуется вывод данных на монохромный дисплей размерами 8x8 пикселей. В качестве данных для вывода могут использоваться изображения, символы или бегущая строка.

Описание:

Модуль построен на базе микроконтроллера STM32F030K6 и снабжен собственный стабилизатором напряжения. Модуль отрисовывает изображение последовательно включая по одному светодиоду матрицы с частотой 100 кадров/сек. При такой частоте глаз не замечает мерцаний светодиодов и видит всё изображение матрицы целиком. Для вывода символов в памяти модуля имеется таблица изображений символов в кодировке CP866 (поддерживает Кириллицу). Изображение любого символа таблицы можно заменить на собственное. Так же модуль имеет буфер в 512 символов для хранения текста бегущей строки. Управление дисплеем и запись данных для вывода осуществляется через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.

С помощью регистров модуля можно:

  • Изменить адрес данного модуля, обнаружить наличие следующего модуля и изменить адрес следующего модуля.
  • Изменить частоту отрисовки матрицы от 10 до 255 кадров/сек.
  • Установить яркость матрицы от 0 (0%) до 255 (100%).
  • Установить поворот изображений матрицы на 0°, 90°, 180° и 270°.
  • Записать/прочитать изображение матрицы в виде массива (8 регистров по 8 бит).
  • Залить/стереть изображение матрицы.
  • Вывести символ по его коду в кодировке CP866 (в т.ч. Кириллический).
  • Изменить изображение любого символа в памяти модуля.
  • Стереть/записать текст для бегущей строки (до 512 символов).
  • Запустить автопрокрутку бегущей строки с указанием скорости, режима и направления сдвига.
  • Выполнять одиночные сдвиги бегущей строки на один шаг или на указанную позицию.
  • Включить функцию анимации появления/исчезания изображений матрицы.

Выводы модуля:

У модуля имеются две колодки выводов: IN - штыревой разъем (вход модуля) и OUT гнездовой разъем (выход для подключения входа следующего модуля Metro). На каждой колодке имеется по пять выводов:

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • 5V - вход питания.
  • GND - общий вывод питания.
  • ADR (на колодке IN) - вход установки адреса данного модуля.
  • ADR (на колодке OUT) - вывод (вход/выход) обнаружения следующего модуля и установки его адреса.

Выводы SCL, SDA, 5V и GND внутрисхемно соединены с одноимёнными выводами колодок IN и OUT, и предназначены для передачи данных по шине I2C. Выводы SCL и SDA внутрисхемно НЕ подтянуты в модуле до уровня логической 1.

Вход ADR на колодке IN используется для сброса/записи адреса модуля на шине I2C. Данный вход внутрисхемно прижат к GND через резистор номиналом в 1 кОм. Если на вход ADR подать уровень логической 1, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти модуля, а значит после отключения питания, установится прежний адрес. Если при наличии логической 1 на входе ADR, записать адрес в регистр «ADDRESS» с установленным битом «IF_PIN_ADDRESS» то данный адрес станет новым адресом модуля на шине I2C и сохранится во FLASH памяти модуля, а значит сохранится и после отключения питания.

Вывод ADR на колодке OUT является двунаправленным выводом и используется для обнаружения наличия следующего модуля Metro, а также сброса/записи адреса следующего модуля. Данный вывод внутрисхемно подтянут до уровня 3,3 В через резистор в 100 кОм, что позволяет определить наличие следующего модуля Metro. Если вывод сконфигурирован как вход и на нём уровень логической 1 (3,3 В) - значит следующих модулей нет, а если на нём уровень логического 0 (GND) - значит следующий модуль есть. Если вывод сконфигурирован как выход, то установив на нём уровень логической 1 можно сбросить/записать адрес следующего модуля.

Конфигурация, чтение и установка уровней выводов ADR осуществляется через регистры модуля.

Характеристики:

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 35 мА.
  • Тип матрицы: монохромная.
  • Разрешение матрицы: 8x8.
  • Количество светодиодов: 64.
  • Цвет свечения: красный.
  • Развёртка: задаётся от 10 до 255 кадров/сек (по умолчанию 100).
  • Шаг регулировки яркости: 1/255.
  • Буфер для хранения бегущей строки: до 512 символов.
  • Скорость бегущей строки: задаётся от 0,06 до 15 секунд на символ.
  • Таблица символов: CP866 (поддерживает Кириллицу).
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
  • Рабочая температура: от -40 до +65 °C.
  • Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
  • Вес: 7 г.

Установка адреса:

Сброс адреса (без сохранения):

Если физически подать уровень логической 1 на вход модуля ADR, то адрес модуля сбросится в значение по умолчанию 0x09, но этот адрес не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.

Установка адреса (без сохранения):

Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 0, то указанный адрес станет адресом модуля на шине I2C, но он не сохранится во FLASH памяти, а значит после отключения питания, установится прежний адрес модуля.

Установка адреса (с сохранением):

Для установки адреса с его сохранением в FLASH память модуля необходимо выполнить два действия:

  • Установить уровень логической 1 на входе ADR колодки IN (при этом адрес модуля сбросится в значение по умолчанию 0x09), или установить в 1 бит «SET_PIN_ADDRES» в регистре 0x01 «BITS_0» (при этом адрес модуля останется прежним).
  • Записать в регистр 0x06 «ADDRESS» значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 1. ВАЖНО: запись адреса занимает не менее 30 мс.

Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «IF_PIN_ADDRESS» равным 1, при сброшенном бите «SET_PIN_ADDRES» и наличии уровня логического 0 на входе ADR, то указанный адрес проигнорируется и у модуля останется прежний адрес.

Обнаружение следующего модуля:

Модули Metro подключаются друг к другу (вход к выходу) как вагоны метро.

Вход ADR колодки IN внутрисхемно прижат к GND через резистор 1 кОм, значит если данный вход ни к чему не подключён, то на нем присутствует уровень логического 0.

Вывод ADR колодки OUT внутрисхемно подтянут к 3,3 В через резистор 100 кОм, значит если данный вывод сконфигурирован как вход и ни к чему не подключен, то на нем присутствует уровень логической 1.

Следовательно, если вывод ADR колодки OUT сконфигурирован как вход и на нём присутствует уровень логической 1, значит колодка OUT свободна, а если присутствует уровень логического 0, значит к колодке OUT подключена колодка IN следующего модуля.

За конфигурацию вывода ADR колодки OUT отвечает бит «SET_PIN_OUTPUT» регистра 0x01 «BITS_0», а считать логический уровень с этого входа можно через флаг «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».

Значит для обнаружения модуля нужно сбросить бит «SET_PIN_OUTPUT» в регистре 0x01 «BITS_0» и считать бит «GET_PIN_OUTPUT» из регистра 0x00 «FLAGS_0». Если считана 1 значит колодка OUT свободна (следующих модулей нет), а если считан 0, значит к колодке OUT подключен следующий модуль.

Регистры:

Карта регистров модуля:

адрес76 5 4 3 2 10
0x00 FLG_RESET FLG_SELF_TEST - - - - GET_PIN_ADDRES GET_PIN_OUTPUT
0x01 SET_RESET SET_SELF_TEST - - - - SET_PIN_ADDRES SET_PIN_OUTPUT
0x02
0x03
RESERVED
0x04 MODEL[7-0]
0x05 VERSION[7-0]
0x06 ADDRESS[6-0] IF_PIN_ADDRES
0x07 CHIP_ID[7-0]
0x08 FREQUENCY[7-0]
0x09 BRIGHTNESS[7-0]
0x0A
---
0x0F
RESERVED
0x10 TURN[1-0] FILL_SCR CLEAR_SCR CLEAR_STR STEP_MOD STEP_ROUTE ENABLE
0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
ROW_1[7-0]
ROW_2[7-0]
ROW_3[7-0]
ROW_4[7-0]
ROW_5[7-0]
ROW_6[7-0]
ROW_7[7-0]
ROW_8[7-0]
0x19 SAVE_AS[7-0]
0x1A SYMBOL_INPUT[7-0]
0x1B TEXT_INPUT[7-0]
0x1C
STEP_LEN[7-0]
0x1D STEP_ONE STEP_LEN[14-8]
0x1E TIME_STEP[7-0]
0x1F TIME_PAUSE[7-0]
0x20 TIME_START[7-0]
0x21 TIME_STOP[7-0]
0x22 FUNCTIONS[7-0]

Регистры с адресами 0x02, 0x03, 0x0A - 0x0F зарезервированы, их биты сброшены в 0. Попытка записи данных в эти регистры будет проигнорирована модулем.

Регистр 0x00 «FLAGS_0» - содержит флаги чтения состояния модуля:

Регистр только для чтения.

  • FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
  • FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
  • GET_PIN_ADDRES - Бит повторяет логический уровень считанный со входа ADR колодки IN модуля.
  • GET_PIN_OUTPUT - Бит повторяет логический уровень считанный с вывода ADR колодки OUT модуля.

Регистр 0x01 «BITS_0» - содержит биты установки состояния модуля:

Регистр для записи и чтения.

  • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
  • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
  • SET_PIN_ADDRES - Бит является альтернативой входа ADR колодки IN. Установка бита в 1 расценивается как наличие логической 1 на входе ADR колодки IN, но не устанавливает этот уровень физически на входе, что позволяет установить и сохранить адрес модуля во FLASH память не используя вход ADR. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. Установка бита в 1 не сбрасывает адрес модуля в значение по умолчанию (0x09), как это делает физическая «1» на входе ADR колодки IN.
  • SET_PIN_OUTPUT - Бит конфигурации вывода ADR колодки OUT. Установка бита в 1 сконфигурирует вывод ADR колодки OUT модуля в режим выхода и установит на нём уровень логической 1. Сброс бита в 0 сконфигурирует вывод ADR колодки OUT в режим входа, логический уровень которого можно считать через бит «GET_PIN_OUTPUT» регистра 0x00 «FLAGS_0».

Регистр 0x04 «MODEL» - содержит идентификатор типа модуля:

Регистр только для чтения.

Регистр 0x05 «VERSION» - содержит версию прошивки модуля:

Регистр только для чтения.

  • VERSION[7-0] - Версия прошивки (от 0x01 до 0xFF).

Регистр 0x06 «ADDRESS» - отвечает за чтение/установку адреса модуля на шине I2C:

Регистр для чтения и записи.

  • ADDRESS[6-0] - 7 бит адреса модуля на шине I2C. При чтении возвращается текущий адрес модуля, при записи устанавливается указанный адрес модулю.
  • IF_PIN_ADDRES - Флаг проверки состояния входа ADR колодки IN для записи адреса в FLASH память модуля.
    При чтении регистра, флаг указывает на то, что адрес ADDRESS[6-0] считан из Flash памяти.
    При записи в регистр:
    Если флаг сброшен, то адрес в битах ADDRESS[6-0] будет установлен временно (до отключения питания, или сброса/записи нового адреса). Если флаг «IF_PIN_ADDRES» установлен, то адрес в битах ADDRESS[6-0] будет сохранён в FLASH память модуля (останется и после отключения питания), но только если на входе ADR колодки IN, или в бите «SET_PIN_ADDRES» регистра 0x01 «BITS_0» установлена логическая 1. Если флаг «IF_PIN_ADDRES» установлен, бит «SET_PIN_ADDRES» сброшен и на входе ADR колодки IN установлен уровень логического 0, то адрес в битах ADDRESS[6-0] не будет установлен ни временно, ни постоянно.

Регистр 0x07 «CHIP_ID» - содержит идентификатор общий для всей линейки Metro:

Регистр только для чтения.

У всех модулей линейки метро в регистре «CHIP_ID» содержится значение 0xC3. Если требуется отличить модули Metro на шине I2C от сторонних модулей, то достаточно прочитать значение регистров 0x06 «ADDRESS» и 0x07 «CHIP_ID» всех модулей на шине I2C. Если 7 старших битов регистра 0x06 «ADDRESS» хранят адрес совпадающий с адресом модуля, а в регистре 0x07 «CHIP_ID» хранится значение 0xC3, то можно с большой долей вероятности утверждать, что данный модуль является модулем Metro.

Регистр 0x08 «FREQUENCY» - содержит частоту развертки матрицы:

Регистр только для записи.

  • FREQUENCY[7-0] - Частота развертки матрицы в диапазоне от 10 до 255 кадров/сек. Значение по умолчанию 100 кадров в секунду.

Регистр 0x09 «BRIGHTNESS» - содержит яркость матрицы:

Регистр только для записи.

  • BRIGHTNESS[7-0] - Яркость всех светодиодов матрицы в диапазоне от 0 (0%) до 255 (100%). Значение по умолчанию 192 (75%).

Регистр 0x10 «REG_DATA» - содержит флаги управления матрицей и бегущей строкой:

Регистр для чтения и записи.

  • TURN[1-0] - Биты поворота изображения. Доступные значения от 0 (0b00) до 3 (0b11) поворачивают изображение матрицы по часовой стрелке на TURN[1-0] * 90°.
  • FILL_SCR - Флаг заливки дисплея. Установка флага приведёт к установке всех битов регистров «ROW_1»...«ROW_8» и как следствие включению всех светодиодов матрицы. Флаг сбрасывается самостоятельно после выполнения заливки.
  • CLEAR_SCR - Флаг очистки дисплея. Установка флага приведёт к сбросу всех битов регистров «ROW_1»...«ROW_8» и как следствие выключению всех светодиодов матрицы. Флаг сбрасывается самостоятельно после выполнения очистки.
  • CLEAR_STR - Флаг очистки бегущей строки. Установка флага приведёт к очистке буфера хранения текста бегущей строки. Флаг сбрасывается самостоятельно после выполнения очистки.
  • STEP_MOD - Флаг режима посимвольного сдвига бегущей строки. Установка флага приведёт к тому, что текст бегущей строки будет сдвигаться не попиксельно (влево или вправо), а отображаться посимвольно (буква за буквой). Сброс флага установит нормальный (попиксельный) режим сдвига бегущей строки.
  • STEP_ROUTE - Флаг обратного направления сдвига бегущей строки. Установка флага приведёт к тому, что бегущая строка будет сдвигаться слева на право (обратно чтению). Сброс флага установит нормальное направление сдвига бегущей строки (справа на лево).
  • ENABLE - Флаг разрешения работы светодиодов. Сброс флага выключает все светодиоды, но не очищает регистры «ROW_1»...«ROW_8», не останавливает выполнение функций и не останавливает бегущую строку.

Регистры 0x11-0x18 «ROW_1»-«ROW_8» - содержат изображение матрицы:

Регистр для чтения и записи.

  • ROW_1[7-0] - Состояние пикселей первой строки матрицы (верхней). Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
  • ROW_2[7-0] ... ROW_7[7-0] - Состояние пикселей 2...7 строк матрицы. Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
  • ROW_8[7-0] - Состояние пикселей восьмой строки матрицы (нижней). Каждый бит регистра соответствует состоянию светодиода матрицы (старший слева, младший справа).
  • Изображение матрицы можно как записывать, так и читать.

Регистр 0x19 «SAVE_AS» - позволяет заменить изображение символа в таблице символов:

Регистр для чтения и записи.

  • SAVE_AS[7-0] - Запись в регистр любого значения (кода символа от 1 до 255) приведёт к перезаписи изображения данного символа на текущее изображение с матрицы. Регистр самостоятельно сбрасывается в 0 по окончании сохранения данных матрицы в таблицу изображений символов. Внесённые изменения хранятся до отключения питания.
    Например, если вывести в матрицу любое изображение через регистры 0x11-0x18 «ROW_1»-«ROW_8», а потом записать число 74 (код символа «J») в регистр 0x19 «SAVE_AS», то в дальнейшем символ «J» (при выводе бегущей строки, или символа) будет выглядеть как изображение которое было выведено в матрицу.
    Если вместо кода символа в регистр 0x19 «SAVE_AS» записать 0, то значения регистров «ROW_1», «ROW_2» и «ROW_3» (три верхние строки изображения) будут расценены как ширина символов («ROW_1»), межсимвольный интервал («ROW_2») и отступ символа от левого края дисплея («ROW_3»).

Регистр 0x1A «SYMBOL_INPUT» - позволяет вывести символ в матрицу по его коду:

Регистр для чтения и записи.

  • SYMBOL_INPUT[7-0] - Запись в регистр любого значения (кода символа от 1 до 255) приведёт к выводу изображения этого символа (из таблицы изображений символов) в матрицу. Регистр самостоятельно сбрасывается в 0 по окончании вывода символа.
    Если вместо кода символа в регистр 0x1A «SYMBOL_INPUT» записать 0, то изменятся только три верхние строки экрана в которых побитово отразятся числа: в первой строке - ширина символов, во второй строке - межсимвольный интервал и в третьей - отступ символа от левого края дисплея. Те же числа будут доступны в регистрах «ROW_1», «ROW_2» и «ROW_3».

Регистр 0x1B «TEXT_INPUT» - позволяет дописать текст бегущей строки:

Регистр для чтения и записи.

  • TEXT_INPUT[7-0] - Текст бегущей строки формируется посимвольно, путём последовательного ввода кодов символов в данный регистр. Регистр самостоятельно сбрасывается в 0 по окончании добавления символа к тексту бегущей строки. Если требуется создать новую строку, а не дополнить имеющуюся, то перед вводом символов необходимо очистить буфер хранения текста бегущей строки путём установки флага «CLEAR_STR» регистра 0x10 «REG_DATA».

Регистры 0x1C-0x1D «STEP_LEN» - устанавливают бегущую строку в указанную позицию:

Регистры для чтения и записи.

  • STEP_LEN[7-0] - Младший байт позиции строки (доступен в регистре 0x1C).
  • STEP_LEN[14-8] - Старший байт позиции строки (доступен в регистре 0x1D).
    Запись любого значения приводит к установке бегущей строки в указанную позицию. Регистры самостоятельно сбрасываются в 0 по окончании установки. Строка устанавливается в указанную позицию от левого или правого края текста (зависит от флага «STEP_ROUTE» в регистре 0x10 «REG_DATA») позиция указывается в пикселях или символах (зависит от флага «STEP_MOD» в регистре 0x10 «REG_DATA»).
  • STEP_ONE - Флаг сдвига бегущей строки на один шаг (доступен в регистре 0x1D). Установка флага приводит к сдвигу бегущей строки на один шаг (как STEP_LEN[14-0]++). Если флаг установлен, то значение «STEP_LEN» игнорируется. Флаг самостоятельно сбрасывается вместе с регистром «STEP_LEN» после сдвига строки.

    Регистр 0x1E «TIME_STEP» - устанавливает автопрокрутку бегущей строки:

    Регистр для чтения и записи.

    • TIME_STEP[7-0] - Время затрачиваемое на один шаг автопрокрутки бегущей строки в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). Запись не нулевого значения включает автопрокрутку, которая работает как STEP_LEN[14-0]++ каждые TIME_STEP[7-0] сотых долей секунд. Запись 0 - отключает автопрокрутку. Если регистр «TIME_PAUSE» сброшен, то значение регистра «TIME_STEP» самостоятельно сбрасывается после завершения прокрутки всей строки.
      Примечание: при автопрокрутке, к шагу нулевой позиции и шагу последней позиции бегущей строки добавляется время простоя из регистров 0x20 «TIME_START» и 0x21 «TIME_STOP».

    Регистр 0x1F «TIME_PAUSE» - содержит время паузы до повторной автопрокрутки всей строки:

    Регистр для чтения и записи.

    • TIME_PAUSE[7-0] - Время паузы до повторной автопрокрутки всей бегущей строки в десятых долях секунд от 0 (0,0 сек) до 255 (25.5 сек). Если в регистре записано не нулевое значение, то по окончании автопрокрутки регистр «TIME_STEP» не сбрасывается, а выжидается указанная пауза и автопрокрутка возобновляется с 0 позиции. Запись 0 приводит к тому, что по окончании автопрокрутки всей бегущей строки регистр «TIME_STEP» сбрасывается, пауза не выжидается и повторная автопрокрутка не производится.

    Регистр 0x20 «TIME_START» - содержит время простоя автопрокрутки на первом символе текста:

    Регистр для чтения и записи.

    • TIME_START[7-0] - Время простоя автопрокрутки на первом символе текста в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). По умолчанию 100 (1,00 сек).

    Регистр 0x21 «TIME_STOP» - содержит время простоя автопрокрутки на последнем символе:

    Регистр для чтения и записи.

    • TIME_STOP[7-0] - Время простоя автопрокрутки на последнем символе текста в сотых долях секунд от 0 (0,00 сек) до 255 (2,55 сек). По умолчанию 100 (1,00 сек).

    Регистр 0x22 «FUNCTIONS» - содержит номер функции анимации:

    Регистр для чтения и записи.

    • FUNCTIONS[7-0] - Появление и исчезание изображений, символов и бегущей строки можно анимировать записав в данный регистр номер функции анимации. Запись 0 приводит к завершению выполнения любой функции анимации. Все функции (кроме 0x01 и 0x02) самостоятельно сбрасывают регистр «FUNCTIONS» в 0 после завершения своей анимации.
      • 0x01 - Предварительная очистка дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет чист. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
        Примечание: данную функцию удобно использовать перед функциями появления изображений из пустого фона.
      • 0x02 - Предварительная закраска дисплея. Данные находящиеся в регистрах 0x11-0x18 «ROW_1»-«ROW_8» не будут отображаться в матрице пока действует эта функция. В данном режиме можно загружать новые изображения, менять запускать и останавливать строку прокрутки, всё это будет работать, но дисплей будет полностью закрашен. Функция действует бессрочно, пока в регистр «FUNCTIONS» не будет записано другое значение.
        Примечание: данную функцию удобно использовать перед функциями появления изображений из закрашенного фона.
      • 0x03 - Появление изображения рябью из пустого фона. Все светодиоды потухают, после чего на дисплее попиксельно (хаотично) проявляется изображение (или бегущая строка) которые были установлены до выполнения этой функции.
      • 0x04 - Исчезновение изображения рябью в пустой фон. Изображение дисплея (или бегущая строка) попиксельно (хаотично) исчезает пока не останется пустой фон.
        Примечание: после выполнения данной функции все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» будут сброшены (выключены все светодиоды), а в регистр 0x1E «TIME_STEP» будет записан 0 (если была включена автопрокрутка, то она будет остановлена).
      • 0x05 - Появление изображения рябью из закрашенного фона. Все светодиоды включаются, после чего на дисплее попиксельно (хаотично) проявляется изображение (или бегущая строка) которые были установлены до выполнения этой функции.
      • 0x06 - Исчезновение изображения рябью в закрашенный фон. Изображение дисплея (или бегущая строка) попиксельно (хаотично) закрашивается пока не закрасится весь дисплей.
        Примечание: после выполнения данной функции все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» будут установлены (включены все светодиоды), а в регистр 0x1E «TIME_STEP» будет записан 0 (если была включена автопрокрутка, то она будет остановлена).
      • 0x07-0x0A - Появление/Исчезновение сверху-вниз:
        Действия данных функций аналогичны функциям 0x03-0x06, но исчезновение/появление изображения (или бегущей строки) происходит не рябью, а сверху-вниз.
        • 0x07 - Появление изображения сверху-вниз из пустого фона.
        • 0x08 - Исчезновение изображения сверху-вниз в пустой фон.
        • 0x09 - Появление изображения сверху-вниз из закрашенного фона.
        • 0x0A - Исчезновение изображения сверху-вниз в закрашенный фон.
      • 0x0B-0x0E - Появление/Исчезновение снизу-вверх:
        Действия данных функций аналогичны функциям 0x03-0x06, но исчезновение/появление изображения (или бегущей строки) происходит не рябью, а снизу-вверх.
        • 0x0B - Появление изображения снизу-вверх из пустого фона.
        • 0x0C - Исчезновение изображения снизу-вверх в пустой фон.
        • 0x0D - Появление изображения снизу-вверх из закрашенного фона.
        • 0x0E - Исчезновение изображения снизу-вверх в закрашенный фон

    Примеры значений регистров:

    • Для работы светодиодов матрицы, флаг «ENABLE» регистра 0x10 «REG_DATA» должен быть установлен в 1.
    • Изображение матрицы повторяет значения битов в регистрах 0x11-0x18 «ROW_1»-«ROW_8», где каждый бит каждого регистра отвечает за включение одного из светодиодов матрицы.
    • Можно установить или сбросить сразу все биты регистров 0x11-0x18 «ROW_1»-«ROW_8» установкой флагов «FILL_SCR» или «CLEAR_SCR» в регистре 0x10 «REG_DATA», тем самым залить или очистить всю матрицу.
    • Изображение можно повернуть на 0°, 90°, 180° или 270° записав соответствующее значение в биты «TURN[1-0]» регистра 0x10 «REG_DATA».
    • Яркость свечения всех светодиодов зависит от значения в регистре 0x09 «BRIGHTNESS».
    • В матрицу можно вывести изображение любого символа введя его код в регистр 0x1A «SYMBOL_INPUT». Изображение символов хранится в таблице изображений символов.
    • Таблицу изображений символов можно редактировать. Для этого нужно ввести изображение в регистры 0x11-0x18 «ROW_1»-«ROW_8» и записать в регистр 0x19 «SAVE_AS» код символа изображение которого требуется заменить на хранящееся в регистрах 0x11-0x18 «ROW_1»-«ROW_8».
    • Матрица может отображать бегущую строку, текст которой записывается посимвольно через регистр 0x1B «TEXT_INPUT». Если требуется записать новый текст, а не дописать имеющийся, то перед вводом кодов символов в регистр 0x1B «TEXT_INPUT» необходимо очистить текст бегущей строки установив флаг «CLEAR_STR» в регистре 0x10 «REG_DATA» и дождаться его самостоятельного сброса.
    • Режим и направление сдвига бегущей строки устанавливается битами «STEP_MOD» и «STEP_ROUTE» регистра 0x10 «REG_DATA».
    • Бегущую строку можно установить в указанную позицию, задав её значение в регистрах 0x1C-0x1D «STEP_LEN», или сдвинуть на один шаг установив бит «STEP_ONE» в регистре 0x1D «STEP_LEN».
    • Для бегущей строки можно включить режим автопрокрутки задав время регистров 0x1E - 0x21 («TIME_STEP», «TIME_PAUSE», «TIME_START» и «TIME_STOP»).
    • Бегущую строку можно вывести на нескольких дисплеях. Для этого в каждый дисплей нужно ввести один и тот же текст бегущей строки. Текст должен начинаться с нескольких символов пробелов. Далее установить позицию строки для каждого дисплея с разницей в 8 пикселей: для крайнего левого дисплея в 0, следующего в 8, следующего в 16, следующего в 24 и т.д. После чего выполнять управляемую прокрутку строки. Для этого нужно сдвинуть строку всех дисплеев на один шаг (установив бит «STEP_ONE» у всех дисплеев), выждать некоторое время и повторить сдвиг строки на всех дисплеях, и т.д. пока вся строка не пройдёт по всем дисплеям. После чего повторить весь процесс с задания изначальной позиции.
    • Появление и исчезновение изображений символов или бегущей строки можно анимировать указав номер функции анимации в регистре 0x22 «FUNCTIONS». Обратите внимание на то, что функции анимации исчезновения изображений меняют значение регистров 0x11-0x18 «ROW_1»-«ROW_8» и останавливают автопрокрутку бегущей строки.

    Доступ к данным регистров:

    Каждый регистр модуля хранит 1 байт данных. Так как модуль использует интерфейс передачи данных I2C, то и доступ к данным охарактеризован им.

    Обмен данными по шине I2C происходит по одному биту за один такт, после каждых переданных 8 бит (1 байта) принимающее устройство отвечает передающему одним битом: «ACK» в случае успешного приёма, или «NACK» в случае ошибки. Пакет приёма/передачи данных начинается сигналом «START» и завершается сигналом «STOP». Первый байт пакета всегда состоит из 7 бит адреса устройства и одного (младшего) бита R/W.

    Сигналы интерфейса передачи данных I2C:

      Для удобства восприятия сигналов они выполнены в следующих цветах:
    • Зелёный - сигналы формируемые мастером.
    • Красный - данные отправляемые мастером.
    • Синий - данные отправляемые модулем Metro.
    • Фиолетовый - данные отправляемые мастером или модулем Metro.
    • «START» - отправляется мастером в начале пакета приема/передачи данных. Сигнал представляет переход уровня линии «SDA» из «1» в «0» при наличии «1» на линии «SCL».
    • «STOP» - отправляется мастером в конце пакета приёма/передачи данных. Сигнал представляет переход уровня линии «SDA» из «0» в «1» при наличии «1» на линии «SCL».
    • БИТ - значение бита считывается с линии «SDA» по фронту импульса на линии «SCL».
    • «ACK» - бит равный 0, отправляется после успешного приёма байта данных.
    • «NACK» - бит равный 1, отправляется после байта данных в случае ошибки.
    • ПЕРВЫЙ БАЙТ - отправляется мастером, состоит из 7 бит адреса и бита «RW».
    • «R/W» - младший бит первого байта данных указывает направление передачи данных пакета, 1 - прием (от модуля к мастеру), 0 - передача (от мастера в модуль).
    • «RESTART» - повторный старт, отправляется мастером внутри пакета. Сигнал представляет из себя «START» отправленный не на свободной шине, а внутри пакета.

    ВАЖНО: Все изменения на линии «SDA» должны происходить только при наличии «0» на линии «SCL» за исключением сигналов «START», «STOP» и «RESTART».

      Запись данных в регистры:

      • Отправляем сигнал «START».
      • Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
        Получаем ответ от модуля в виде одного бита «ACK».
      • Отправляем второй байт: адрес регистра в который будет произведена запись.
        Получаем ответ от модуля в виде одного бита «ACK».
      • Отправляем третий байт: данные для записи в регистр.
        Получаем ответ от модуля в виде одного бита «ACK».
      • Далее можно отправить четвёртый байт данных для записи в следующий по порядку регистр и т.д.
      • Отправляем сигнал «STOP».

      Пример записи в один регистр:

      Запись значения 0x2A в регистр 0x06 модуля с адресом 0x09:

                                       // Запись в регистр методами библиотеки Wire.h
      Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
      Wire.write(0x06);                // Записываем в буфер байт адреса регистра.
      Wire.write(0x26);                // Записываем в буфер байт который будет записан в регистр.
      Wire.endTransmission();          // Выполняем передачу адреса и байтов из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
      

      Пример записи в несколько регистров подряд:

      Запись в модуль с адресом 0x09 нескольких значений начиная с регистра 0x12:
      В регистр 0x12 запишется значение 0x0F, в следующий по порядку регистр (0x13) запишется значение 0x30 и в следующий по порядку регистр (0x14) запишется значение 0xB1.

                                       // Запись в регистры методами библиотеки Wire.h
      byte data[3] = {0x0F,0x30,0xB1}; // Определяем массив с данными для передачи.
      Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
      Wire.write(0x12);                // Записываем в буфер байт адреса первого регистра.
      Wire.write(data, 3);             // Записываем в буфер 3 байта из массива data.
      Wire.endTransmission();          // Выполняем передачу адреса и байт из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.

      Чтение данных из регистров:

      • При чтении пакет делится на 2 части: запись № регистра и чтение его данных.
      • Отправляем сигнал «START».
      • Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
        Получаем ответ от модуля в виде одного бита «ACK».
      • Отправляем второй байт: адрес регистра из которого нужно прочитать данные.
        Получаем ответ от модуля в виде одного бита «ACK».
      • Отправляем сигнал «RESTART».
      • Отправляем первый байт после «RESTART»: 7 бит адреса и бит «R/W» равный 1 (чтение).
        Получаем ответ от модуля в виде одного бита «ACK».
      • Получаем байт данных из регистра модуля.
        Отвечаем битом «ACK» если хотим прочитать следующий регистр, иначе отвечаем «NACK».
      • Отправляем сигнал «STOP».

      Пример чтения одного регистра:

      Чтение из модуля с адресом 0x09 байта данных регистра 0x05:
      (в примере модуль вернул значение 0x01).

                                       // Чтение регистра методами библиотеки Wire.h
      byte data;                       // Объявляем переменную для чтения байта данных.
      Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
      Wire.write(0x05);                // Записываем в буфер байт адреса регистра.
      Wire.endTransmission(false);     // Выполняем передачу без установки состояния STOP.
      Wire.requestFrom(0x09, 1);       // Читаем 1 байт из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
      data=wire.read();                // Сохраняем прочитанный байт в переменную data.

      Пример чтения нескольких регистров подряд:

      Чтение из модуля с адресом 0x09 нескольких регистров начиная с регистра 0x05:
      (в примере модуль вернул значения: 0x01 из рег. 0x05, 0x13 из рег. 0x06, 0xC3 из рег. 0x07).

                                       // Чтение регистров методами библиотеки Wire.h
      byte data[3];                    // Объявляем массив для чтения данных.
      Wire.beginTransmission(0x09);    // Инициируем передачу данных в устройство с адресом 0x09.
      Wire.write(0x05);                // Записываем в буфер байт адреса регистра.
      Wire.endTransmission(false);     // Выполняем передачу без установки состояния STOP.
      Wire.requestFrom(0x09, 3);       // Читаем 3 байта из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
      int i=0;                         // Определяем счётчик номера прочитанного байта.
      while( Wire.available() ){       // Выполняем цикл while пока есть что читать из буфера.
        if(i<3){                       // Лучше делать такую проверку, чтоб не записать данные за пределы массива data!
          data[i] = wire.read(); i++;  // Читаем очередной байт из буфера в массив data.
        }                              //
      }                                //

      Примечание:

      • Если на линии I2C только один мастер, то сигнал «RESTART» можно заменить на сигналы «STOP» и «START».
      • Рекомендуется не выполнять чтение или запись данных чаще 200 раз в секунду.
        Обратите внимание на сигналы «RESTART» и «STOP» в пакетах чтения данных:
      • Между фронтом и спадом сигнала «RESTART» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 1.
      • Между сигналом «NACK» и сигналом «STOP» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 0.
      • Эти биты не сохраняются в модулях и не расцениваются как ошибки.

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

      Пример вывода изображения на дисплей:

      Следующий скетч демонстрирует пример вывода изображения стрелки и её вращения. В начале скетча был определён массив IMAGE с изображением стрелки направленной вверх. В коде setup данный массив был записан в регистры «REG_ROW_1» - «REG_ROW_8». А в коде loop с промежутками в 200 миллисекунд отправляется байт данных в регистр «REG_DATA» у которого постоянно увеличивается значение битов «TURN» отвечающих за поворот изображения.

      #include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
      const int ADDRESS    =  0x09;                    // Определяем адрес модуля Metro - датчик температуры и влажности.
      const int REG_DATA   =  0x10;                    // Определяем адрес регистра REG_DATA.
      const int REG_ROW_1  =  0x11;                    // Определяем адрес регистра ROW_1.
      byte      IMAGE[8]   = {0b00000000,              // Определяем массив из 8 байт.
                              0b00011000,              // где каждый байт массива это строка изображения,
                              0b00111100,              // а каждый бит байта управляет одним светодиодом.
                              0b01111110,              // 
                              0b00011000,              // Если бит установлен то светодиод включён.
                              0b00011000,              // 
                              0b00011000,              // В данном примере массив содержит изображение стрелки направленной вверх.
                              0b00000000};             //
      void setup(){                                    //
          Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
          Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
          delay(500);                                  //
          Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
          Wire.write(REG_ROW_1);                       // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра ROW_1.
          Wire.write(IMAGE, 8 );                       // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это 8 байт массива IMAGE.
          Wire.endTransmission();                      // Выполняем инициированную ранее передачу данных.
      }                                                //
                                                       //
      void loop(){                                     // В коде loop выполняем поворот изображения меняя значения битов TURN регистра REG_DATA.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b00000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b00000001. TURN=0, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b01000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b01000001. TURN=1, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b10000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b10000001. TURN=2, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
          Wire.beginTransmission(ADDRESS); Wire.write(REG_DATA); Wire.write(0b11000001); Wire.endTransmission(); delay(200); // Записываем в регистр REG_DATA значение 0b11000001. TURN=3, FILL_SCR=0, CLEAR_SCR=0, CLEAR_STR=0, STEP_MOD=0, STEP_ROUTE=0, ENABLE=1.
      }

      Габариты:

      Ссылки:

      Обсуждение