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

Основание дорожных знаков и светофора, FLASH-I2C - Datasheet

Модуль - Основание дорожных знаков, FLASH-I2C.

Техническое описание: Данная страница содержит подробное техническое описание Модуля - Основание дорожных знаков и светофора, FLASH-I2C, и раскрывает работу с модулем через его регистры. Модуль входит в состав светофора и дорожных знаков.

Ознакомиться с пользовательскими описаниями модулей и примерами работы с библиотекой iarduino_I2C_Track можно на страницах Wiki - Светофор и шлагбаум и Wiki - Дорожный знак.

Назначение:

Модуль - Основание дорожных знаков и светофора, FLASH-I2C - является основанием для установки светофора, шлагбаума или дорожных знаков. Модуль позволяет управлять шлагбаумом, подсветкой знаков и цветами светофора, а так же передавать информацию о знаке или состоянии светофора и шлагбаума по ИК-каналу. Модуль способен работать как под управлением по шине I2С, так и автономно, при подключении батарейного отсека. Принимать передаваемые модулем данные можно при помощи модуля ИК-приемник/передатчик, FLASH-I2C.

К одной шине I2C можно подключить более 100 модулей. Адрес модуля на шине I2C (по умолчанию 0x09) назначается программно и хранится в его энергонезависимой памяти.

Описание:

Модуль построен на базе, микроконтроллера STM32F030F4, снабжён ИК-светодиодом, светодиодом информирующем о передаче данных, регулятором дальности ИК-связи, транзисторными сборками Дарлингтона, для управления подсветкой знаков или светодиодами светофора, и снабжён собственным стабилизатором напряжения, имеет колодки для подключения сервопривода шлагбаума, дорожных знаков или светофора, и колодку шины I2C. Модуль способен передавать данные по ИК-каналу в соответствии с протоколами: NEC, SAMSUNG, SHARP, SIRC12, SIRC15, RC5, RC5X, RC6 и IARDUINO. Все перечисленные протоколы используют пакетную передачу данных, данные в пакете представлены в виде адреса ИК-устройства (не путать с адресом устройства на шине I2C) и команды для него. Принимать данные отправленные по ИК-каналу можно при помощи модуля ИК-приемник/передатчик, FLASH-I2C, который поддерживает все перечисленные выше ИК протоколы.

Запись данных в модуль, для передачи по ИК-каналу, осуществляется через его регистры. Доступ к регистрам модуля осуществляется по шине I2C.

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

  • Изменить адрес данного модуля на шине I2C. При изменении адреса, можно указать, что новый адрес должен сохраниться в flash память модуля, а значит адрес сохранится и после отключения питания.
  • Включить / отключить внутреннюю подтяжку линий шины I2C (по умолчанию включена). Состояние подтяжки линий шины I2C автоматически сохраняется в flash память модуля, а значит состояние линий сохранится после отключения и включения питания.
  • Узнать версию прошивки модуля.
  • Указать данные для передачи по ИК-каналу (адрес устройства и команду).
  • Задать автоматическую отправку данных по ИК-каналу с заданным интервалом.
  • При автоматической отправке данных, можно задать режим хаотичной смены интервалов между пакетами (в диапазоне ±50% от заданного), что позволит передавать данные по ИК-каналу от нескольких модулей, в одном направлении, одновременно.
  • Выбрать один из 9 доступных протоколов для передачи данных по ИК-каналу.
  • Включить/отключить ИК-передатчик.
  • Включить/отключить светодиод информирующий о передаче данных по ИК-каналу.
  • Указать модулю работать в автономном режиме, с загрузкой настроек из Flash памяти.
  • Сохранить текущие настройки в Flash память, для дальнейшей автономной работы.
  • Установить логический уровень на выбранном выводе двухрядной колодки.
  • Установить меандр на выбранном выводе двухрядной колодки (частота 1Гц).
  • Указать модулю работать автономно в режиме светофора.
  • Задать автоматическую передачу состояния светофора по ИК-каналу.
  • Указать время свечения зелёного, желтого и красного цвета светофора.
  • Переключать цвета светофора в ручном или полуавтоматическом режиме.
  • Задать скорость поднятия и опускания шлагбаума.
  • Управлять шлагбаумом используя ШИМ (в мкс) или логику (открыть/закрыть).
  • Определить крайние положения шлагбаума задав длительности импульсов ШИМ в мкс.

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

На плате модуля расположено 3 разъёма:

Сверху платы расположен двухрядный разъём состоящий из 8 выходов для подключения дорожных знаков или светофора. C назначением каждого выхода можно ознакомиться в описании битов регистра 0x1A «DIGITAL».

  • 0 - выход схемы с открытым стоком через токоограничительный резистор.
  • 1 - выход схемы с открытым стоком через токоограничительный резистор.
  • 2 - выход схемы с открытым стоком.
  • 3 - выход схемы с открытым стоком через токоограничительный резистор.
  • 4 - Vcc. Соединён с одноимёнными выводами всех колодок на плате.
  • 5 - выход схемы с открытым стоком через токоограничительный резистор.
  • 6 - выход двухтактной схемы с возможностью установки ШИМ 50 Гц.
  • 7 - выход схемы с открытым стоком через токоограничительный резистор.

Слева расположен разъём СЕРВО состоящий из 3 выводов для подключения сервопривода шлагбаума.

  • S (Signal) - выход ШИМ сигнала для управления углом поворота сервопривода.
  • V (Vcc) - выход питания сервопривода.
  • G (GND) - общий вывод питания.

Внизу расположен разъем I2C состоящий из 4 выводов для подключения к шине I2C:

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • Vcc - вход питания от 3,3 до 5 В.
  • GND - общий вывод питания.

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

  • Напряжение питания: 3,3 В или 5 В, поддерживаются оба напряжения.
  • Ток потребляемый модулем: до 50 мА.
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: Vcc.
  • Рабочая температура: от -20 до +70 °С.
  • Габариты: 24 х 66 мм (без крестовины).
  • Габариты: 71 х 71 x 66 мм (с крестовиной).
  • Вес: 15 г.

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

Модуль - Основание дорожных знаков, FLASH-I2C относится к серии «Flash» модулей. Все модули данной серии позволяют назначать себе адрес для шины I2C, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания). По умолчанию все модули серии «Flash» поставляются с адресом 0x09.

Допускается указывать адреса в диапазоне: 7 < адрес < 127.

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

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

Установка адреса может быть заблокирована, если в регистре 0x01 «BITS_0» установлен бит «BLOCK_ADR». Этот бит по умолчанию сброшен, но он самостоятельно устанавливается при попытке записи данных в регистры предназначенные только для чтения. Бит «BLOCK_ADR» используется в модулях версии 5 и выше. Версия модуля хранится в регистре 0x05 «VERSION».

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

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

  • Установить бит «SAVE_ADR_EN» в регистре 0x01 «BITS_0» (при этом адрес модуля останется прежним).
  • Записать в регистр 0x06 «ADDRESS» значение из 7 бит адреса и младшим битом «SAVE_FLASH» равным 1.

Если не выполнить первое действие (не установить бит «SAVE_ADR_EN»), то новый адрес будет проигнорирован и у модуля останется старый адрес. Бит «SAVE_ADR_EN» самостоятельно сбрасывается после сохранения адреса во FLASH память, а так же при обращении к любому регистру модуля (кроме записи в 0x01 «BITS_0» и 0x06 «ADDRESS»).

Установка адреса может быть заблокирована, если в регистре 0x01 «BITS_0» установлен бит «BLOCK_ADR». Этот бит по умолчанию сброшен, но он самостоятельно устанавливается при попытке записи данных в регистры предназначенные только для чтения. Бит «BLOCK_ADR» используется в модулях версии 5 и выше. Версия модуля хранится в регистре 0x05 «VERSION».

ВАЖНО: запись адреса занимает не менее 30 мс.

Регистры:

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

адрес РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ:
76543210
0x00 FLG_RESET FLG_SELF_TEST - FLG_GET_NAME RAND_ADR FLG_I2C_UP RESERVED RESERVED
0x01 SET_RESET SET_SELF_TEST - SET_GET_NAME BLOCK_ADR SET_I2C_UP SAVE_ADR_EN RESERVED
0x02
0x03
RESERVED
0x04 MODEL[7-0]
0x05 VERSION[7-0]
0x06 ADDRESS[6-0] SAVE_FLASH
0x07 CHIP_ID[7-0]
0x08
---
0x0F
RESERVED
адрес РЕГИСТРЫ УПРАВЛЕНИЯ ИК-ПЕРЕДАТЧИКОМ:
76543210
0x10 SEND_REPEAT[7-1] REPEAT
0x11 SEND_ADR[7-0]
0x12 SEND_COM[7-0]
0x13 RC6_MODE[2-0] NUM_CODING[5-0]
0x14
---
0x17
RESERVED
0x18 AVTO_LOAD SAVE_ALL TX_BUSY TX_LED TX_SHIFT RESERVED RESERVED TX_EN
адрес РЕГИСТРЫ УПРАВЛЕНИЯ ВЫВОДАМИ ДВУХРЯДНОЙ КОЛОДКИ:
76543210
0x19 BLINK-7 0 BLINK-5 0 BLINK-3 BLINK-2 BLINK-1 BLINK-0
0x1A DIGITAL-7 GATE_STATE DIGITAL-5 0 DIGITAL-3 DIGITAL-2 DIGITAL-1 DIGITAL-0
0x1B BLN_ON-7 0 BLN_ON-5 0 BLN_ON-3 BLN_ON-2 BLN_ON-1 BLN_ON-0
0x1C BLN_OFF-7 0 BLN_OFF-5 0 BLN_OFF-3 BLN_OFF-2 BLN_OFF-1 BLN_OFF-0
0x1D DIG_ON-7 GATE_CLOSE DIG_ON-5 0 DIG_ON-3 DIG_ON-2 DIG_ON-1 DIG_ON-0
0x1E DIG_OFF-7 GATE_OPEN DIG_OFF-5 0 DIG_OFF-3 DIG_OFF-2 DIG_OFF-1 DIG_OFF-0
адрес РЕГИСТРЫ РАБОТЫ МОДУЛЯ В РЕЖИМЕ СВЕТОФОРА (АВТОМАТ/ПОЛУАВТОМАТ):
76543210
0x1F TL_AUTOJOB TL_AUTOCOM TL_UP_ON TL_UP_OFF TL_LT_ON TL_LT_OFF TL_RT_ON TL_RT_OFF
0x20 TL_LT_EN TL_YEL_SEC[6-0]
0x21 TL_RT_EN TL_GRN_SEC[6-0]
0x22 TL_GT_EN TL_RED_SEC[6-0]
адрес РЕГИСТРЫ УПРАВЛЕНИЯ ШЛАГБАУМОМ:
76543210
0x23
0x24
SERVO_MCS[7-0]
SERVO_MCS[15-8]
0x25 GATE_SPEED[7-0]
0x26
0x27
GATE_OPEN[7-0]
GATE_OPEN[15-8]
0x28
0x29
GATE_CLOSE[7-0]
GATE_CLOSE[15-8]

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

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

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

  • FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
  • FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
  • FLG_GET_NAME - Если флаг установлен, значит модуль поддерживает вывод своего названия установкой бита «SET_GET_NAME» в регистре 0x01 «BITS_0».
  • RAND_ADR - Если флаг установлен, значит модуль поддерживает генерацию случайного адреса для шины I2C регистрами 0x64 «RANDOM_NUM», «RANDOM_ADR», «BUN_ADR».
  • FLG_I2C_UP - Если флаг установлен, значит модуль позволяет управлять подтяжкой линий шины I2C при помощи бита «SET_I2C_UP» регистра 0x01 «BITS_0».

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

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

  • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
  • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
  • SET_GET_NAME - Бит указывает использовать регистр 0x04 «MODEL» для посимвольного вывода названия модуля. Бит сбрасывается автоматически через 300 мс после его установки. Если флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» сброшен, значит модуль не поддерживает посимвольный вывод своего названия.
  • BLOCK_ADR - Бит блокирует смену и сохранение адреса для шины I2C. Бит устанавливается автоматически при попытке записи данных в регистры предназначенные только для чтения. Это защищает чип от ненамеренной смены адреса шумами на шине I2C, бит используется в модулях версии 5 и выше. Версия модуля хранится в регистре 0x05 «VERSION».
  • SET_I2C_UP - Бит управляет внутрисхемной подтяжкой линий шины I2C. Значение бита сохраняется в FLASH память модуля. Установка бита в «1» приведёт к подтяжке линий SDA и SCL до уровня 3,3 В. На линии I2C допускается устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния текущего бита. Если флаг «FLG_I2C_UP» регистра 0x00 «FLAGS_0» сброшен, значит управление подтяжкой не поддерживается модулем.
  • SAVE_ADR_EN - Бит разрешает записать новый адрес модуля для шины I2C в FLASH память. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. Запись адреса выполняется следующим образом: нужно установить бит «SAVE_ADR_EN», после чего записать новый адрес в регистр 0x06 «ADDRESS» с установленным битом «SAVE_FLASH».

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

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

  • MODEL[7-0] - Для модуля - Основание дорожных знаков и светофора, FLASH-I2C - идентификатор равен 0x18.
  • Если установлен флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» значит модуль поддерживает посимвольный вывод своего названия.
  • Установка бита «SET_GET_NAME» регистра 0x01 «BITS_0» включает режим посимвольного вывода названия модуля. При этом в регистре 0x04 «MODEL» появится первый символ названия модуля. В процессе чтения регистра 0x04 «MODEL» он будет возвращать очередной символ названия, вплоть до символа конца строки имеющего код 0x00. Далее цикл повторится.
  • Сброс бита «SET_GET_NAME» регистра 0x01 «BITS_0» отключает режим посимвольного вывода названия модуля. Регистр 0x04 «MODEL» вновь будет содержать идентификатор.

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

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

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

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

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

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

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

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

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

Регистр 0x10 «SEND_RPT» - содержит интервал и разрешение отправки пакетов повторов:

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

  • SEND_REPEAT[7-1] - Биты определяют интервал между отправляемыми пакетами повторов. Интервал = SEND_REPEAT[7-0]&0xFE = SEND_REPEAT[7-1]<<1 миллисекунд. Если интервал равен 0, то пакеты повторов будут отправляться с интервалом предусмотренным используемым ИК протоколом передачи данных.
  • REPEAT - Бит указывает модулю отправлять пакеты повтора после отправки любых данных, до тех пор, пока бит «REPEAT» не будет сброшен.
  • ПРИМЕЧАНИЕ: Установка любого значения в бит «TL_AUTOCOM» регистра 0x1F «TL_BIT» приведёт к автоматической установке того же значения в бит «REPEAT».

Регистр 0x11 «SEND_ADR» - принимает байт адреса ИК-устройства для передачи:

Регистр 0x12 «SEND_COM» - принимает байт команды ИК-устройству для передачи:

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

Данные передаваемые по ИК-каналу состоят из адреса ИК-устройства и команды для него. Отправка пакета с данными по ИК-каналу из регистров 0x11 и 0x12 осуществляется после записи в регистр 0x12.

Адрес в регистре 0x11 и команда в регистре 0x12 должны быть сформированы в соответствии с алгоритмом передачи номера знака или состояния светофора.

Если в регистре 0x10 «SEND_RPT» установлен бит «REPEAT», то сразу после отправки пакета с данными начнут автоматически отправляться пакеты повтора (как при удержании кнопки ИК-пульта), до тех пор пока бит «REPEAT» не будет сброшен.

Регистр 0x13 «SEND_COD» - содержит номер ИК протокола передачи данных:

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

  • NUM_CODING[5-0] - Биты хранят число определяющее используемый ИК протокол передачи данных:
    • 1 - NEC (передаёт байт адреса и байт команды, с проверкой на ошибки).
    • 2 - SAMSUNG (передаёт байт адреса и байт команды, с проверкой на ошибки).
    • 3 - SHARP (передаёт 5 младших бит адреса и байт команды, с проверкой на ошибки).
    • 4 - SIRC12 (передаёт 5 младших бит адреса и 7 бит команды, без проверки ошибок).
    • 5 - SIRC15 (передаёт 5 младших бит адреса и 10 бит команды, без проверки ошибок).
    • 6 - RC5 (передаёт 5 младших бит адреса и 6 бит команды, без проверки ошибок).
    • 7 - RC5X (передаёт 5 младших бит адреса и 7 бит команды, без проверки ошибок).
    • 8 - RC6 (передаёт байт адреса и байт команды, без проверки ошибок).
    • 9 - IARDUINO (передаёт байт адреса и байт команды, с проверкой на ошибки).
    • Иные значения в битах «NUM_CODING[5-0]» приведут к тому, что данные не будут отправляться по ИК-каналу.
  • RC6_MODE[2-0] - Биты хранят режим используемый протоколом RC-6 для передачи данных. Значение «RC6_MODE[2-0]» игнорируется при использовании иных ИК протоколов.
  • ПРИМЕЧАНИЕ: Предложенный ниже алгоритм передачи номера знака или состояния светофора требует наличие не менее 2 байт (16 бит) данных в одном ИК пакете и пакеты повтора должны содержать данные, следовательно, для работы с модулями из линейки «Дорожное движение» подходят только протоколы SAMSUNG, RC6 и IARDUINO.

Регистр 0x18 «BIT» - содержит биты управления ИК-каналом:

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

Значение бита «AVTO_LOAD» сохраняется и после отключения питания.

  • AVTO_LOAD - Бит указывает загружать значения регистров 0x10 - 0x22 из flash памяти при каждом включении модуля (после подачи питания).
  • SAVE_ALL - Установка бита приведёт к сохранению текущих значений регистров 0x10 - 0x22 в flash память, что даст возможность в дальнейшем, загружать эти значения обратно в регистры. Бит сбрасывается автоматически, по завершении сохранения данных.
  • TX_BUSY - Бит информирует о занятости ИК-передатчика. Бит самостоятельно устанавливается при передаче данных по ИК-каналу и сбрасывается по окончанию передачи.
  • TX_LED - Бит разрешает работу светодиода информирующего о передаче данных по ИК-каналу.
  • TX_SHIFT - Бит меняющегося интервала между пакетами повторов. Если данный бит установлен и установлен бит «REPEAT» регистра 0x10 «SEND_RPT», то интервал между отправляемыми пакетами повторов будет хаотично меняться в диапазоне ±50% от заданного битами SEND_REPEAT[7-1] регистра 0x10 «SEND_RPT». Это позволит установить несколько знаков и/или светофоров рядом в одном направлении.
  • TX_EN - Бит разрешает работу ИК-передатчика.

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

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

  • BLINK-7 - Установка бита приведёт к появлению меандра с частотой 1 Гц на 7 выходе двухрядной колодки, если установлен бит «DIGITAL-7» регистра 0x1A «DIGITAL».
  • BLINK-5 - Установка бита приведёт к появлению меандра с частотой 1 Гц на 5 выходе двухрядной колодки, если установлен бит «DIGITAL-5» регистра 0x1A «DIGITAL».
  • BLINK-3 - Установка бита приведёт к появлению меандра с частотой 1 Гц на 3 выходе двухрядной колодки, если установлен бит «DIGITAL-3» регистра 0x1A «DIGITAL».
  • BLINK-2 - Установка бита приведёт к появлению меандра с частотой 1 Гц на 2 выходе двухрядной колодки, если установлен бит «DIGITAL-2» регистра 0x1A «DIGITAL».
  • BLINK-1 - Установка бита приведёт к появлению меандра с частотой 1 Гц на 1 выходе двухрядной колодки, если установлен бит «DIGITAL-1» регистра 0x1A «DIGITAL».
  • BLINK-0 - Установка бита приведёт к появлению меандра с частотой 1 Гц на 0 выходе двухрядной колодки, если установлен бит «DIGITAL-0» регистра 0x1A «DIGITAL».
  • ПРИМЕЧАНИЕ: биты 4 и 6 данного регистра всегда сброшены в 0 и недоступны для записи, так как 4 выход двухрядной колодки является выходом питания Vcc, а 6 выход соединён с выводом «S» колодки сервопривода и предназначен для управления шлагбаумом.

Регистр 0x1A «DIGITAL» - содержит биты установки логических уровней двухрядной колодки:

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

  • DIGITAL-7 - Установка бита приведёт к установке активного логического уровня на 7 выходе двухрядной колодки (используется для подсветки знаков и правой стрелки светофора).
  • DIGITAL-5 - Установка бита приведёт к установке активного логического уровня на 5 выходе двухрядной колодки (используется для включения красного сигнала светофора).
  • DIGITAL-3 - Установка бита приведёт к установке активного логического уровня на 3 выходе двухрядной колодки (используется для включения жёлтого сигнала светофора).
  • DIGITAL-2 - Установка бита приведёт к установке активного логического уровня на 2 выходе двухрядной колодки (используется для включения звукового сигнала шлагбаума).
  • DIGITAL-1 - Установка бита приведёт к установке активного логического уровня на 1 выходе двухрядной колодки (используется для подсветки знаков и левой стрелки светофора).
  • DIGITAL-0 - Установка бита приведёт к установке активного логического уровня на 0 выходе двухрядной колодки (используется для включения зелёного сигнала светофора).
  • GATE_STATE - Установка бита приведёт к закрытию шлагбаума, а сброс к открытию. При установке бита, регистр 0x23-0x24 «SERVO_MCS» получает значение из регистра 0x28-0x29 «GATE_CLOSE», а при сбросе, из регистра 0x26-0x27 «GATE_OPEN».
  • ПРИМЕЧАНИЕ: 4 бит данного регистра всегда сброшен в 0 и недоступен для записи, так как 4 выход двухрядной колодки является выходом питания Vcc. Все выходы кроме 4 и 6 являются выходами транзисторной сборки Дарлингтона с открытым стоком. Все выходы кроме 2, 4 и 6 снабжены токоограничительными резисторами.

Регистр 0x1B «BLINK_ON» - устанавливает биты регистра «BLINK»:

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

  • BLN_ON[7-0] - Каждый установленный бит этого регистра приводит к установке соответствующего бита в регистре 0x19 «BLINK». Все биты регистра «BLINK_ON» автоматически сбрасываются в «0», что свидетельствует о применении новых значений.
    Пример: «BLINK»=(10101010)2, «BLINK_ON»=(00001111)2 => «BLINK»=(10101111)2.
  • ПРИМЕЧАНИЕ: биты 4 и 6 данного регистра всегда сброшены в 0 и недоступны для записи, так как 4 выход двухрядной колодки является выходом питания Vcc, а 6 выход соединён с выводом «S» колодки сервопривода и предназначен для управления шлагбаумом.

Регистр 0x1C «BLINK_OFF» - сбрасывает биты регистра «BLINK»:

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

  • BLN_OFF[7-0] - Каждый установленный бит этого регистра приводит к сбросу соответствующего бита в регистре 0x19 «BLINK». Все биты регистра «BLINK_OFF» автоматически сбрасываются в «0», что свидетельствует о применении новых значений.
    Пример: «BLINK»=(10101010)2, «BLINK_OFF»=(00001111)2 => «BLINK»=(10100000)2.
  • ПРИМЕЧАНИЕ: биты 4 и 6 данного регистра всегда сброшены в 0 и недоступны для записи, так как 4 выход двухрядной колодки является выходом питания Vcc, а 6 выход соединён с выводом «S» колодки сервопривода и предназначен для управления шлагбаумом.

Регистр 0x1D «DIGITAL_ON» - устанавливает биты регистра «DIGITAL»:

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

  • DIG_ON[7-0] - Каждый установленный бит этого регистра приводит к установке соответствующего бита в регистре 0x1A «DIGITAL». Все биты регистра «DIGITAL_ON» автоматически сбрасываются в «0», что свидетельствует о применении новых значений.
    Пример: «DIGITAL»=(10101010)2, «DIGITAL_ON»=(00001111)2 => «DIGITAL»=(10101111)2.
  • ПРИМЕЧАНИЕ: 4 бит данного регистра всегда сброшен в 0 и недоступен для записи.

Регистр 0x1E «DIGITAL_OFF» - сбрасывает биты регистра «DIGITAL»:

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

  • DIG_OFF[7-0] - Каждый установленный бит этого регистра приводит к сбросу соответствующего бита в регистре 0x1A «DIGITAL». Все биты регистра «DIGITAL_OFF» автоматически сбрасываются в «0», что свидетельствует о применении новых значений.
    Пример: «DIGITAL»=(10101010)2, «DIGITAL_OFF»=(00001111)2 => «DIGITAL»=(10100000)2.
  • ПРИМЕЧАНИЕ: 4 бит данного регистра всегда сброшен в 0 и недоступен для записи.

Регистр 0x1F «TL_BIT» - содержит биты управления модулем в режиме светофора:

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

  • TL_AUTOJOB - Установка бита приведёт к переходу модуля в режим автоматического переключения цветов светофора без секций поворота. Для автоматической передачи информации о состоянии светофора по ИК-каналу, нужно установить бит «TL_AUTOCOM».
  • TL_AUTOCOM - Установка бита приведёт к постоянному автоматическому изменению регистра 0x12 «SEND_COM» в соответствии с текущим состоянием светофора. Записанное значение бита автоматически сохраняется и в бит «BIT_REPEAT» регистра 0x10 «SEND_RPT», установка которого означает автоматическую отправку данных по ИК-каналу.
  • TL_UP_ON - Установка бита приведёт к полуавтоматическому переключению светофора на разрешающий сигнал.
    Бит самостоятельно сбрасывается по завершении процесса переключения.
  • TL_UP_OFF - Установка бита приведёт к полуавтоматическому переключению светофора на запрещающий сигнал.
    Бит самостоятельно сбрасывается по завершении процесса переключения.
  • TL_LT_ON - Установка бита приведёт к полуавтоматическому включению левой стрелки.
    Бит самостоятельно сбрасывается по завершении процесса переключения.
  • TL_LT_OFF - Установка бита приведёт к полуавтоматическому отключению левой стрелки.
    Бит самостоятельно сбрасывается по завершении процесса переключения.
  • TL_RT_ON - Установка бита приведёт к полуавтоматическому включению правой стрелки.
    Бит самостоятельно сбрасывается по завершении процесса переключения.
  • TL_RT_OFF - Установка бита приведёт к полуавтоматическому отключению правой стрелки.
    Бит самостоятельно сбрасывается по завершении процесса переключения.
  • ПРИМЕЧАНИЕ: Время установки разрешающего и запрещающего сигнала светофора, а так же время переключения (жёлтого и мигающего зелёного) задаётся регистрами 0x20 «TL_YEL_SEC», 0x21 «TL_GRN_SEC» и 0x22 «TL_RED_SEC». Если к модулю подключён шлагбаум, то он будет закрываться при свечении только красного цвета и открываться в противном случае.

Регистр 0x20 «TL_YEL_SEC» - время свечения жёлтого и мигающего зелёного сигнала:

Регистр 0x21 «TL_GRN_SEC» - время свечения зелёного сигнала светофора:

Регистр 0x22 «TL_RED_SEC» - время свечения красного сигнала светофора:

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

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

  • TL_LT_EN - Установка бита означает о наличии секции поворота налево.
  • TL_RT_EN - Установка бита означает о наличии секции поворота направо.
  • TL_GT_EN - Установка бита означает о наличии шлагбаума.

Остальные биты регистров хранят время свечения цветов в автоматическом режиме.

  • TL_YEL_SEC[6-0] - время свечения жёлтого и мигающего зелёного (от 1 до 127 секунд).
  • TL_GRN_SEC[6-0] - время свечения зелёного сигнала светофора (от 1 до 127 секунд).
  • TL_RED_SEC[6-0] - время свечения красного сигнала светофора (от 1 до 127 секунд).

Время свечения жёлтого используется и при полуавтоматическом переключении сигналов.

Пример: На модуль установлен светофор и светится зелёный сигнал. Устанавливаем бит «TL_UP_OFF» регистра 0x1F «TL_BIT» инициируя процесс полуавтоматического переключения светофора на запрещающий сигнал. Модуль включит мигающий зелёный на «TL_YEL_SEC[6-0]» секунд, далее включит жёлтый на то же время, после чего включит красный и сбросит установленный ранее бит «TL_UP_OFF» регистра 0x1F «TL_BIT», информируя о завершении процесса переключения.

Регистры 0x23-0x24 «SERVO_MCS» - содержат длительность импульсов ШИМ сервопривода:

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

  • SERVO_MCS[15-0] - Значение от 0 до 20'000 определяет длительность импульсов ШИМ в микросекундах. Сигнал ШИМ с частотой 50 Гц устанавливается на выводе 6 двухрядной колодки и выводе «S» колодки подключения сервопривода.
  • Значение применяется после записи старшего байта.
  • ПРИМЕЧАНИЕ: Длительность импульсов не может превышать период следования импульсов. T = 1 / f = 1 / 50 Гц = 20 мс = 20'000 мкс. Попытка записи значения выше 20'000 мкс приведёт к сохранению в регистрах значения 20'000 мкс.

Регистр 0x25 «GATE_SPEED» - содержит скорость движения шлагбаума:

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

Значение регистра сохраняется и после отключения питания.

  • GATE_SPEED[7-0] - Значение от 0 (низкая) до 255 (высокая) определяет скорость поднятия и опускания шлагбаума при работе модуля в автоматическом режиме светофора или при управлении шлагбаумом через бит «GATE_STATE» регистра 0x1A «DIGITAL».

Регистры 0x26-0x27 «GATE_OPEN» - содержат ШИМ открытого шлагбаума:

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

Значение регистров сохраняется и после отключения питания.

  • GATE_OPEN[15-0] - Значение от 1 до 19'999 определяет длительность импульсов ШИМ в микросекундах для положения сервопривода при котором шлагбаум находится в открытом состоянии.
  • Значение применяется после записи старшего байта.
  • Значение используется при работе модуля в автоматическом режиме светофора или при управлении шлагбаумом через бит «GATE_STATE» регистра 0x1A «DIGITAL».
  • ПРИМЕЧАНИЕ: Длительность импульсов не может равняться 0 мкс и не может равняться или быть выше периода в 20'000 мкс, так как это уже будет не ШИМ. Попытка записи значения выше 19'999 мкс приведёт к сохранению в регистрах значения 19'999 мкс. Попытка записи 0 приведёт к сохранению в регистрах значения 1 мкс.

Регистры 0x28-0x29 «GATE_CLOSE» - содержат ШИМ закрытого шлагбаума:

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

Значение регистров сохраняется и после отключения питания.

  • GATE_CLOSE[15-0] - Значение от 1 до 19'999 определяет длительность импульсов ШИМ в микросекундах для положения сервопривода при котором шлагбаум находится в закрытом состоянии.
  • Значение применяется после записи старшего байта.
  • Значение используется при работе модуля в автоматическом режиме светофора или при управлении шлагбаумом через бит «GATE_STATE» регистра 0x1A «DIGITAL».
  • ПРИМЕЧАНИЕ: Длительность импульсов не может равняться 0 мкс и не может равняться или быть выше периода в 20'000 мкс, так как это уже будет не ШИМ. Попытка записи значения выше 19'999 мкс приведёт к сохранению в регистрах значения 19'999 мкс. Попытка записи 0 приведёт к сохранению в регистрах значения 1 мкс.

Регистры 100+:

У младших версий модулей линейки «FLASH-I2C» нет блока регистров «100+», так же этого блока нет у модулей линейки «Metro», о его наличии свидетельствует установленный флаг «RAND_ADR» в регистре 0x00 «FLAGS_0».

Блок регистров «100+» с адресами от 0x64 (100)10 до 0x75 (117)10 не участвует в работе модуля, он предназначен только для обнаружения модулей с одинаковыми адресами и назначения этим модулям разных адресов, не отключая их от шины I2C.

Карта регистров 100+:

адрес76543210
0x64
0x66
RANDOM_NUM[7-0]
RANDOM_NUM[15-8]
0x66 RANDOM_ADR[7-0]
0x67 BUN_ADR_0F BUN_ADR_0E BUN_ADR_0D BUN_ADR_0C BUN_ADR_0B BUN_ADR_0A BUN_ADR_09 BUN_ADR_08
0x68 BUN_ADR_17 BUN_ADR_16 BUN_ADR_15 BUN_ADR_14 BUN_ADR_13 BUN_ADR_12 BUN_ADR_11 BUN_ADR_10
0x69 BUN_ADR_1F BUN_ADR_1E BUN_ADR_1D BUN_ADR_1C BUN_ADR_1B BUN_ADR_1A BUN_ADR_19 BUN_ADR_18
0x6A BUN_ADR_27 BUN_ADR_26 BUN_ADR_25 BUN_ADR_24 BUN_ADR_23 BUN_ADR_22 BUN_ADR_21 BUN_ADR_20
0x6B BUN_ADR_2F BUN_ADR_2E BUN_ADR_2D BUN_ADR_2C BUN_ADR_2B BUN_ADR_2A BUN_ADR_29 BUN_ADR_28
0x6C BUN_ADR_37 BUN_ADR_36 BUN_ADR_35 BUN_ADR_34 BUN_ADR_33 BUN_ADR_32 BUN_ADR_31 BUN_ADR_30
0x6D BUN_ADR_3F BUN_ADR_3E BUN_ADR_3D BUN_ADR_3C BUN_ADR_3B BUN_ADR_3A BUN_ADR_39 BUN_ADR_38
0x6E BUN_ADR_47 BUN_ADR_46 BUN_ADR_45 BUN_ADR_44 BUN_ADR_43 BUN_ADR_42 BUN_ADR_41 BUN_ADR_40
0x6F BUN_ADR_4F BUN_ADR_4E BUN_ADR_4D BUN_ADR_4C BUN_ADR_4B BUN_ADR_4A BUN_ADR_49 BUN_ADR_48
0x70 BUN_ADR_57 BUN_ADR_56 BUN_ADR_55 BUN_ADR_54 BUN_ADR_53 BUN_ADR_52 BUN_ADR_51 BUN_ADR_50
0x71 BUN_ADR_5F BUN_ADR_5E BUN_ADR_5D BUN_ADR_5C BUN_ADR_5B BUN_ADR_5A BUN_ADR_59 BUN_ADR_58
0x72 BUN_ADR_67 BUN_ADR_66 BUN_ADR_65 BUN_ADR_64 BUN_ADR_63 BUN_ADR_62 BUN_ADR_61 BUN_ADR_60
0x73 BUN_ADR_6F BUN_ADR_6E BUN_ADR_6D BUN_ADR_6C BUN_ADR_6B BUN_ADR_6A BUN_ADR_69 BUN_ADR_68
0x74 BUN_ADR_77 BUN_ADR_76 BUN_ADR_75 BUN_ADR_74 BUN_ADR_73 BUN_ADR_72 BUN_ADR_71 BUN_ADR_70
0x75 BUN_ADR_7F BUN_ADR_7E BUN_ADR_7D BUN_ADR_7C BUN_ADR_7B BUN_ADR_7A BUN_ADR_79 BUN_ADR_78

Регистры 0x64-0x65 «RANDOM_NUM» - содержат случайное число:

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

  • RANDOM_NUM[15-0] - Содержит двухбайтное случайное число позволяющее определить наличие нескольких устройств с одинаковым адресом.
  • Значение из регистров читается одним пакетом (младший и старший байт). После чтения старшего байта, модуль на 5мс перейдёт в режим «молчания». В этом режиме модуль будет отправлять NACK мастеру после получения номера регистра в любых запросах.
  • Если прочитать регистры 0x64-0x65 «RANDOM_NUM» дважды, с промежутком между чтениями менее 5мс, то первый раз мы получим два байта случайного числа, а второй раз модуль откажет в чтении, так как отправит NACK. Но это только в том случае, если адрес модуля уникален.
  • Если адрес принадлежит нескольким устройствам, то и отвечать на запрос чтения будут несколько устройств. При первом чтении регистров 0x64-0x65 «RANDOM_NUM», биты случайного числа у разных модулей не совпадут, в результате чего один модуль передаст оба байта случайного числа и перейдёт в режим «молчания», а другой модуль (или модули) зафиксирует потерю арбитража и не передаст старший байт, следовательно, и не перейдёт в режим «молчания». Значит при повторном чтении регистров, мы опять получим два байта случайного числа от того модуля который не перешёл в режим «молчания», что будет свидетельствовать о наличии нескольких устройств на одном адресе.

Регистр 0x66 «RANDOM_ADR» - случайный адрес:

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

  • RANDOM_ADR[7-0] - Позволяет задавать модулю случайный временный адрес, подтверждать временный адрес и получать информацию о состоянии временного адреса.
  • Запись 0x0F - Назначить модулю случайный временный адрес на 50 мс.
    В регистре 0x06 «ADDRESS» останется значение постоянного адреса.
  • Запись 0xF0 - Подтвердить назначенный временный адрес до отключения питания.
    В регистре 0x06 «ADDRESS» появится назначенный временный адрес.
  • Чтение 0x55 - Назначен временный случайный адрес на 50 мс.
  • Чтение 0xFF - Назначенный временный адрес подтверждён до отключения питания.
  • Чтение 0x00 - Временный адрес не назначался или отменён по истечении 50 мс.
  • Если на шине несколько устройств имеют одинаковый адрес, то запись значения 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. За указанное время следует найти все новые временные адреса устройств и подтвердить их отправив в регистр 0x66 «RANDOM_ADR» значение 0xF0.
  • Примечание: Случайный адрес модуль выбирает сам из диапазона от 0x08 до 0x7E включительно, кроме адресов запрещённых регистрами 0x67-0x75 «BUN_ADR».

Регистры 0x67-0x75 «BUN_ADR» - запрещают назначать адреса:

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

  • BUN_ADR_08 - Бит запрещает назначать адрес 0x08 регистром 0x66 «RANDOM_ADR».
  • BUN_ADR_09 - Бит запрещает назначать адрес 0x09 регистром 0x66 «RANDOM_ADR».
  • ...
  • BUN_ADR_7D - Бит запрещает назначать адрес 0x7D регистром 0x66 «RANDOM_ADR».
  • BUN_ADR_7E - Бит запрещает назначать адрес 0x7E регистром 0x66 «RANDOM_ADR».
  • Если бит регистров 0x67-0x75 «BUN_ADR» установлен, то модуль не назначит себе случайный временный адрес соответствующий установленному биту.
  • Если на шине есть несколько устройств с одинаковым адресом, то отправка команды 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. Но вновь назначенный адрес может совпасть с адресом другого модуля на шине I2C, особенно если их много. По этому перед назначением случайного временного адреса рекомендуется записать в регистры 0x67-0x75 «BUN_ADR» все найденные на шине I2C уникальные адреса.

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

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

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

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

    Для удобства восприятия сигналов они выполнены в следующих цветах:
  • Зелёный - сигналы формируемые мастером.
  • Красный - данные отправляемые мастером.
  • Синий - данные отправляемые модулем.
  • Фиолетовый - данные отправляемые мастером или модулем.
  • «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. В противном случае потребуется отключить питание при уже подключённом модуле.

    Алгоритм передачи номера знака или состояния светофора:

    Данные передаваемые по ИК-каналу состоят из адреса ИК-устройства и команды для него.

    Байт адреса записывается в регистр 0x11 «SEND_ADR», а байт команды в регистр 0x12 «SEND_COM». Отправка пакета с данными по ИК-каналу из регистров 0x11 и 0x12 осуществляется после записи в регистр 0x12. Если в регистре 0x10 «SEND_RPT» установлен бит «REPEAT», то сразу после отправки пакета с данными начнут автоматически отправляться пакеты повтора (как при удержании кнопки ИК-пульта), до тех пор пока бит «REPEAT» не будет сброшен.

    Передача состояния светофора:

    Для передачи состояния светофора, в качестве байта адреса используются 5 младших битов, которые информируют о типе перекрёстка и наличии у светофора секций поворота:

    БИТЫ БАЙТА АДРЕСА ДЛЯ ИК-УСТРОЙСТВА:
    76543210
    0 0 0 TRACK_L TRACK_F TRACK_R SECTION_L SECTION_R
    • Три старших бита адреса имеют значение 000, значит байт адреса для светофора сможет принимать значения в диапазоне от 0x00 до 0x1F, что позволяет отличить светофор от знака.
    • TRACK_L - Установка бита указывает, что перекрёсток светофора имеет поворот налево.
    • TRACK_F - Установка бита указывает, что перекрёсток светофора имеет прямое направление.
    • TRACK_R - Установка бита указывает, что перекрёсток светофора имеет поворот направо.
    • SECTION_L - Установка бита указывает что светофор оснащён секцией поворота налево.
    • SECTION_R - Установка бита указывает что светофор оснащён секцией поворота направо.

    ПРИМЕЧАНИЕ: Так как перекрёсток регулируемый светофором должен иметь хотя-бы одно возможное направление движения, значит ситуация при которой все биты TRACK_L/F/R сброшены - невозможна. Следовательно, светофор не может иметь адрес: 0x00 ... 0x03.

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

    БИТЫ БАЙТА КОМАНДЫ ДЛЯ ИК-УСТРОЙСТВА:
    76543210
    GATE RED YELLOW_BLINK YELLOW GREEN_BLINK GREEN GREEN_L GREEN_R
    • GATE - Установка бита указывает на закрытое состояние шлагбаума.
    • RED - Установка бита указывает на свечение красного сигнала светофора.
    • YELLOW_BLINK - Установка бита указывает на мигание жёлтого сигнала светофора.
    • YELLOW - Установка бита указывает на свечение жёлтого сигнала светофора.
    • GREEN_BLINK - Установка бита указывает на мигание зелёного сигнала светофора.
    • GREEN - Установка бита указывает на свечение зелёного сигнала светофора.
    • GREEN_L - Установка бита указывает на свечение или мигание стрелки налево.
    • GREEN_R - Установка бита указывает на свечение или мигание стрелки направо.

    Если в регистре 0x1F «TL_BIT» установить бит «TL_AUTOCOM» то модуль будет самостоятельно и постоянно формировать байт команды для регистра  0x12 «SEND_COM» в соответствии с текущим состоянием светофора.

    ПРИМЕЧАНИЕ: установка (сброс) бита «TL_AUTOCOM» приведёт к установке (сбросу) бита «BIT_REPEAT» регистра 0x10 «SEND_RPT».

    Передача номера знака:

    По состоянию на 4 апреля 2017 г. дорожные знаки ПДД пронумерованы и разделены на 8 групп. Для обозначения конкретного знака указывается номер группы, номер знака и в некоторых случаях пункт.

    Примеры обозначения дорожных знаков в ПДД:

    • 1.22 - Пешеходный переход (знак относится к 1 группе и имеет номер 22).
    • 3.24 - Ограничение максимальной скорости (знак относится к 3 группе и имеет номер 24).
    • 6.3.1 - Место для разворота (знак относится к 6 группе, имеет номер 3 и пункт 1).

    Для передачи информации о знаке по ИК-каналу используется 4 значения:

    1. Группа: может принимать значения от 1 до 7:
      • 1 - Знак относится к группе предупреждающих дорожных знаков.
      • 2 - Знак относится к группе дорожных знаков приоритета.
      • 3 - Знак относится к группе запрещающих дорожных знаков.
      • 4 - Знак относится к группе предписывающих дорожных знаков.
      • 5 - Знак относится к группе дорожных знаков особых предписаний.
      • 6 - Знак относится к группе информационных дорожных знаков.
      • 7 - Знак относится к группе дорожных знаков сервиса.
      • Если знак относится к 8 группе (таблички), то информация о нём кодируется в четвёртом передаваемом значении (см. ниже).
    2. Номер: может принимать значения от 1 до 63:
      • 1-63 - Номер знака. Знак можно определить зная его группу и номер, например, знак первой группы с номером 17 является знаком "Искусственная неровность".
    3. Пункт: может принимать значения от 0 до 15:
      • 0 - У знака нет пункта. Многие знаки обозначаются в ПДД только двумя числами (группой и номером, без пункта).
      • 1-15 - Пункт знака. Позволяет конкретизировать назначение знака, например, знак 1.20 "Сужение дороги" имеет пункт (третье число) с номером 1 (с обеих сторон), или 2 (справа), или 3 (слева).
      • Некоторые знаки имеют картинку с числовыми обозначениями, например, ограничение скорости 60 км/ч, или рекомендуемая скорость 50 км/ч, ограничение массы и т.д. В таких случаях вместо пункта знака передаётся число кратное изображённому на знаке. Пример: для передачи знака 3.24 "ограничение максимальной скорости", по ИК-каналу передаётся группа 3, номер 24 и пункт от 1 (для 10 км/ч) до 15 (для 150 км/ч).
    4. Табличка: может принимать значения от 0 до 7:
      • 0 - У знака нет таблички дополнительной информации уточняющей или ограничивающей действие знака.
      • 1 - У знака установлена табличка 8.4.1 указывающая что действие знака распространяется только на грузовые автомобили.
      • 2 - У знака установлена табличка 8.4.3 указывающая что действие знака распространяется только на легковые автомобили.
      • 3 - У знака установлена табличка 8.1.X "Расстояние до объекта" или 8.2.X "Зона действия" с указанием расстояния в 50 метров.
      • 4 - У знака установлена табличка 8.1.X "Расстояние до объекта" или 8.2.X "Зона действия" с указанием расстояния в 100 метров.
      • 5 - У знака установлена табличка 8.1.X "Расстояние до объекта" или 8.2.X "Зона действия" с указанием расстояния в 150 метров.
      • 6 - У знака установлена табличка 8.1.X "Расстояние до объекта" или 8.2.X "Зона действия" с указанием расстояния в 200 метров.
      • 7 - У знака установлена табличка 8.1.X "Расстояние до объекта" или 8.2.X "Зона действия" с указанием расстояния в 250 метров.

    Для передачи информации о знаке используются оба информационных байта ИК-пакета: байт адреса ИК-устройства и байт команды для ИК-устройства. При этом у байта адреса три старших бита не могут иметь значение 000 (так как группа знака не может быть нулевой), значит байт адреса для знаков сможет принимать значения в диапазоне от 0x20 до 0xFF, что позволяет отличить знак от светофора.

    БАЙТ АДРЕСА ИК-УСТРОЙСТВА: БАЙТ КОМАНДЫ ИК-УСТРОЙСТВА:
    7654321076543210
    ГРУППА НОМЕР ПУНКТ ТАБЛИЧКА

    Для формирования адреса ИК-устройства и команды для него, достаточно создать двухбайтное число:

    uint16_t data = (ГРУППА<<13) | (НОМЕР<<7) | (ПУНКТ<<3) | ТАБЛИЧКА ;

    Старший байт этого числа является адресом ИК-устройства, а младший - командой.

    Передача данных от автомобилей трассы или пультов ДУ:

    ИК-адрес 0x01 используется для отправки данных автомобилями трассы. Оставшиеся ИК-адреса 0x02 и 0x03 можно использовать для идентификации данных отправляемых с пультов ДУ

    Пример настройки модуля на автономную работу в режиме знака:

    Следующий скетч можно однократно запустить, после чего отключить модуль от шины I2C. Далее модуль будет работать самостоятельно, автоматически передавая номер знака 3.24 (ограничение максимальной скорости, с указанием скорости в 50 км/ч) по ИК-каналу при наличии автономного питания.

    #include <Wire.h>                         // Подключаем библиотеку Wire для работы с шиной I2C.
    const int ADDRESS      = 0x09;            // Определяем адрес модуля на шине I2C.
    const int REG_SEND_RPT = 0x10;            // Определяем номер регистра пакетов повтора.
    const int REG_BIT      = 0x18;            // Определяем номер регистра битов ИК-передатчика.
    const int REG_BLINK    = 0x19;            // Определяем номер регистра управления миганием выводов двухрядной колодки.
    const int REG_TL_BIT   = 0x1F;            // Определяем номер регистра битов светофора.
    const int X1           = 3;               // Группа знака (запрещающие дорожные знаки).
    const int X2           = 24;              // Номер знака (ограничение максимальной скорости).
    const int X3           = 5;               // Вместо пункта знака указываем число кратное изображённому на знаке: 1=10км/ч, 2=20км/ч, 3=30км/ч, ..., 15=150км/ч.
                                              //
    void setup(){                             //
         Wire.setClock(100000L);              // Устанавливаем скорость передачи данных по шине I2C.
         Wire.begin();                        // Инициируем работу c шиной I2C в качестве мастера.
         delay(1);                            //
    //   Отключаем режим автосветофора:       //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_TL_BIT );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0 );                     // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Определяем передаваемые данные:      //
         uint16_t X=(X1<<13)|(X2<<7)|(X3<<3); // data = (ГРУППА<<13) | (НОМЕР<<7) | (ПУНКТ<<3).
    //   Передаём информацию о знаке:         //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_SEND_RPT );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0|1          );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_SEND_RPT.
         Wire.write( highByte(X)  );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_SEND_ADR.
         Wire.write( lowByte(X)   );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_SEND_COM.
         Wire.write( 9            );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_SEND_COD.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Настраиваем подсветку знака:         //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_BLINK  );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BLINK.
         Wire.write( 0b10000010 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_BLINK.
         Wire.write( 0b10000010 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_DIGITAL.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Сохраняем данные и вкл передатчик:   //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_BIT    );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0b11011001 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    }                                         //
                                              //
    void loop(){                              //
    }                                         //

    Пример настройки модуля на автономную работу в режиме светофора:

    Следующий скетч можно однократно запустить, после чего отключить модуль от шины I2C. Далее модуль будет работать самостоятельно, автоматически переключать цвета светофора (без секций поворота) и передавать своё состояние по ИК-каналу при наличии автономного питания.

    #include <Wire.h>                         // Подключаем библиотеку Wire для работы с шиной I2C.
    const int ADDRESS      = 0x09;            // Определяем адрес модуля на шине I2C.
    const int REG_SEND_RPT = 0x10;            // Определяем номер регистра пакетов повтора.
    const int REG_SEND_ADR = 0x11;            // Определяем номер регистра адреса ИК-устройства.
    const int REG_SEND_COD = 0x13;            // Определяем номер регистра ИК-протокола.
    const int REG_BIT      = 0x18;            // Определяем номер регистра битов ИК-передатчика.
    const int REG_BLINK    = 0x19;            // Определяем номер регистра управления миганием выводов двухрядной колодки.
    const int REG_TL_BIT   = 0x1F;            // Определяем номер регистра битов светофора.
                                              //
    void setup(){                             //
         Wire.setClock(100000L);              // Устанавливаем скорость передачи данных по шине I2C.
         Wire.begin();                        // Инициируем работу c шиной I2C в качестве мастера.
         delay(1);                            //
    //   Определяем интервал между пакетами:  // 
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_SEND_RPT );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0|1          );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Определяем ИК протокол:              //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_SEND_COD );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 9            );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер протокола.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Определяем начальное состояние:      //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_BLINK  );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BLINK.
         Wire.write( 0b00000000 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_BLINK.
         Wire.write( 0b00000001 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра REG_DIGITAL.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Тип перекрёстка и наличие секций:    //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_SEND_ADR );          // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0b00001000 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Выбираем режим автосветофора:        //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_TL_BIT );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0b11000000 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    //   Сохраняем данные и вкл передатчик:   //
         Wire.beginTransmission(ADDRESS);     // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
         Wire.write( REG_BIT    );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра.
         Wire.write( 0b11011001 );            // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это значение для регистра.
         Wire.endTransmission();              // Выполняем инициированную ранее передачу данных.
         delay(1);                            //
    }                                         //
                                              //
    void loop(){                              //
    }                                         //

    Габариты:

    Ссылки:




    Обсуждение

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