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

Бампер с 9 датчиками линий, FLASH-I2C - Datasheet

Бампер с 9 датчиками линий I2C-flash.

Техническое описание: Данная страница содержит подробное техническое описание модуля Бампер с 9 датчиками линий с шагом 14мм, FLASH-I2C и модуля Бампер с 9 датчиками линий с шагом 7мм, FLASH-I2C, и раскрывает работу с модулем через его регистры.

Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_I2C_Bumper можно на странице Wiki - Бампер с 9 датчиками линий, I2C-Flash.

Назначение:

Модуль Бампер с 9 датчиками линий с шагом 14мм или шагом 7мм, I2C-flash - предназначен для установки на подвижные механизмы (машины, тракторы, танки, роботы) для их движения по линии без участия оператора. Модуль снабжен световой индикацией наличия линии и поворотниками.

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

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

Описание:

Модуль построен на базе микроконтроллера STM32F030F4, снабжен собственным стабилизатором напряжения, имеет на борту 9 датчиков отражения (линий) и кнопку калибровки. Светодиодная индикация модуля позволяет определять наличие линий под датчиками - светодиод расположенный перед датчиком светится если под датчиком есть линия. Так же на модуле установлены светодиоды сигналов поворота.

    Чтение аналоговых и цифровых сигналов с датчиков линий, а так же управление поворотниками осуществляется через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.

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

    • Изменить адрес данного модуля, временно (пока есть питание) или постоянно.
    • Считывать аналоговые сигналы с датчиков линий.
    • Считывать цифровые сигналы с датчиков линий (есть линия под датчиком или нет).
    • Откалибровать модуль для работы с определёнными цветами линий и фона.
    • Узнать тип трассы для которой откалиброван модуль (трасса со светлой или тёмной линией).
    • Изменить тип трассы (использовать цвет фона как линию, а цвет линии как фона).
    • Задать скорость мигания поворотников.
    • Управлять поворотниками самостоятельно, или указать им работать в автоматическом режиме.

    Калибровка:

    Калибровка позволяет модулю отличать линии трассы от фона. Калибровка состоит из двух этапов: чтение количества отражённого света от поверхности линии и чтение количества отражённого света от поверхности фона трассы. Результаты калибровки сохраняются в энергонезависимую память модуля, а значит модуль будет отличать линии от фона и после отключения питания.

    Установите модуль так, что бы все его датчики находились над линией трассы и нажмите на кнопку «калибровка», или запишите значение 0x1B в регистр 0x13 «REG_CALIBRATION». О начале калибровки сигнализирует включение левого поворотника и поочерёдное включение светодиодов расположенных перед датчиками линий, далее светодиоды отключатся, после чего все светодиоды начнут мигать в шахматном порядке, информируя о необходимости перехода к чтению фона трассы для завершения калибровки.

    Установите модуль так, что бы все его датчики находились над фоном трассы и нажмите на кнопку «калибровка», или запишите значение 0x09 в регистр 0x13 «REG_CALIBRATION». О начале калибровки сигнализирует включение правого поворотника и поочерёдное включение светодиодов расположенных перед датчиками линий, далее светодиоды отключатся, после чего все светодиоды расположенные перед датчиками одновременно включатся на пол секунды или быстро мигнут три раза, информируя о результате калибровки.

    Успех калибровки определяется модулем по контрасту между фоном и линией, при малой контрастности калибровка будет считаться неудачной, а её результаты не сохранятся в регистрах модуля. Если калибровка закончилась провалом, то все светодиоды расположенные перед датчиками линий быстро мигнут три раза. Если калибровка закончилась успехом, то все светодиоды расположенные перед датчиками линий одновременно включатся на пол секунды. Так же о результате калибровки можно судить по флагу «FLG_CALIBRATION» регистра 0x13 «REG_CALIBRATION».

    В результате калибровки модуль не только сможет отличать линии от фона, но и определит тип трассы (трасса с тёмной линией на светлом фоне, или со светлой линией на тёмном фоне), о чём информирует флаг «FLG_LINE_BLACK» регистра 0x11 «REG_FLG_LINE_H». Если на трассе есть участки, где цвет линии меняется с цветом фона, достаточно изменить значение указанного флага.

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

    Модуль подключается по шине I2C, все выводы которой (GND, Vcc, SDA, SCL) размещены на двух одинаковых колодках.

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

    Для подключения модуля можно использовать любую из двух колодок (верхнюю или нижнюю), а оставшуюся колодку можно применить для подключения второго бампера или иного модуля к шине I2C.

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

    • Напряжение питания: 3,3 В или 5 В (постоянного тока).
    • Потребляемый ток: до 20 мА (все светодиоды включены).
    • Расстояние от трассы до датчиков: от 2 до 50 мм.
    • Максимальная скорость движения бампера (м/с): ширина линии (мм) / 3.
    • Интерфейс: I2C.
    • Скорость шины I2C: 100 кбит/с.
    • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
    • Уровень логической 1 на линиях шины I2C: Vcc.
    • Рабочая температура: от -20 до +70 °С.
    • Габариты модуля с шагом 14мм: 119 x 25 мм (без креплений), 119 x 35 мм (с креплениями).
    • Габариты модуля с шагом 7мм: 59 x 25 мм (без креплений), 59 x 35 мм (с креплениями).
    • Вес: 10 г.

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

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

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

      Если в регистр 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 мс.

      Регистры:

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

      адрес76 5 4 3 2 10
      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
      0x10 LINE_8 LINE_7 LINE_6 LINE_5 LINE_4 LINE_3 LINE_2 LINE_1
      0x11 FLG_LINE_BLACK RESERVED LINE_9
      0x12 SET_HEAD_ON SET_TURN_AUTO_STOP[6-5] SET_TURN_PERIOD[4-3] SET_TURN_MODE[2-0]
      0x13 FLG_CALIBRATION STAGE_CALIBRATION[6-5] SET_CALIBRATION[4-0]
      0x14 REG_THRESHOLD_1[7-0]
      0x15 - - - - REG_THRESHOLD_1[11-8]
      0x16 REG_THRESHOLD_2[7-0]
      0x17 - - - - REG_THRESHOLD_2[11-8]
      0x18 REG_THRESHOLD_3[7-0]
      0x19 - - - - REG_THRESHOLD_3[11-8]
      0x1A REG_THRESHOLD_4[7-0]
      0x1B - - - - REG_THRESHOLD_4[11-8]
      0x1C REG_THRESHOLD_5[7-0]
      0x1D - - - - REG_THRESHOLD_5[11-8]
      0x1E REG_THRESHOLD_6[7-0]
      0x1F - - - - REG_THRESHOLD_6[11-8]
      0x20 REG_THRESHOLD_7[7-0]
      0x21 - - - - REG_THRESHOLD_7[11-8]
      0x22 REG_THRESHOLD_8[7-0]
      0x23 - - - - REG_THRESHOLD_8[11-8]
      0x24 REG_THRESHOLD_9[7-0]
      0x25 - - - - REG_THRESHOLD_9[11-8]
      0x26 REG_ANALOG_1[7-0]
      0x27 - - - - REG_ANALOG_1[11-8]
      0x28 REG_ANALOG_2[7-0]
      0x29 - - - - REG_ANALOG_2[11-8]
      0x2A REG_ANALOG_3[7-0]
      0x2B - - - - REG_ANALOG_3[11-8]
      0x2C REG_ANALOG_4[7-0]
      0x2D - - - - REG_ANALOG_4[11-8]
      0x2E REG_ANALOG_5[7-0]
      0x2F - - - - REG_ANALOG_5[11-8]
      0x30 REG_ANALOG_6[7-0]
      0x31 - - - - REG_ANALOG_6[11-8]
      0x32 REG_ANALOG_7[7-0]
      0x33 - - - - REG_ANALOG_7[11-8]
      0x34 REG_ANALOG_8[7-0]
      0x35 - - - - REG_ANALOG_8[11-8]
      0x36 REG_ANALOG_9[7-0]
      0x37 - - - - REG_ANALOG_9[11-8]

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

      Регистр 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] - Для модуля Бампер с 9 датчиками линий, I2C-flash - идентификатор равен 0x10.
      • Если установлен флаг «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. При чтении возвращается текущий адрес модуля, при записи устанавливается указанный адрес модулю.
      • 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 «REG_FLG_LINE_L» - содержит флаги наличия линий:

      Регистр 0x11 «REG_FLG_LINE_H» - содержит флаги наличия линий:

      Регистры только для чтения (кроме флага «FLG_LINE_BLACK»).

      Флаг «FLG_LINE_BLACK» для чтения и записи (хранится в Flash памяти модуля).

      • FLG_LINE_BLACK - Флаг указывает тип используемой линии:
        «1» - тёмная линия на светлом фоне.
        «0» - светлая линия на тёмном фоне.
        Значение флага автоматически определяется модулем при калибровке.
        Изменение значения флага «FLG_LINE_BLACK» приведёт к тому, что биты «FLG_LINE_1...9» данного регистра, будут определять фон как линию, а линию как фон.
      • FLG_LINE_1...9 - Флаги указывают, что под соответствующим датчиком зафиксирована линия.

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

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

      • SET_HEAD_ON - Установка бита в «1» приводит к включению передних фар модуля (не поддерживается данным модулем).
      • SET_TURN_AUTO_STOP[6-5] - Биты определяют условие отключения поворотников в автоматическом режиме работы:
        «00» - Поворотник отключается как только линия окажется под любым датчиком модуля, кроме датчиков указанных в условии включения поворотника.
        «01» - Поворотник отключается как только линия окажется под центральным датчиком модуля.
        «10» - Поворотник отключается как при условии «00», но не сразу, а спустя два мигания.
        «11» - Поворотник отключается как при условии «01», но не сразу, а спустя два мигания
      • SET_TURN_PERIOD[4-3] - Биты определяют период миганий поворотников:
        «00» - Период мигания поворотников равен 100мс (10Гц) 50мс вкл / 50мс выкл.
        «01» - Период мигания поворотников равен 200мс (5Гц) 100мс вкл / 100мс выкл.
        «10» - Период мигания поворотников равен 400мс (2,5Гц) 200мс вкл / 200мс выкл.
        «11» - Период мигания поворотников равен 800мс (1,25Гц) 400мс вкл / 400мс выкл.
      • SET_TURN_MODE[2-0] - Биты определяют режим работы поворотников:
        «000» - Поворотники отключены.
        «001» - Включён левый поворотник (ручной режим).
        «010» - Включён правый поворотник (ручной режим).
        «011» - Включены оба поворотника (аварийка).
        «100» - Поворотники работают в режиме полицейской машины.
        «101» - Поворотники работают в автоматическом режиме (поворотник включается при наличии линии под любым из двух самых крайних датчиков со стороны поворотника).
        «110» - Поворотники работают в автоматическом режиме (поворотник включается при наличии линии под любым из трёх самых крайних датчиков со стороны поворотника).
        «111» - Поворотники работают в автоматическом режиме (поворотник включается при наличии линии под любым из четырёх датчиков со стороны поворотника).

      Регистр 0x13 «REG_CALIBRATION» - регистр калибровки модуля:

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

      • FLG_CALIBRATION - Флаг указывает на успешное завершение калибровки.
        Флаг автоматически сбрасывается при записи любого значения в данный регистр, или при нажатии на кнопку «калибровка» и устанавливается после успешного завершения калибровки.
      • STAGE_CALIBRATION[6-5] - Флаги указывают на текущую стадию калибровки.
        Флаги устанавливаются автоматически, запись любых значений игнорируется модулем.
        «00» - Калибровка не выполняется.
        «01» - Калибровка запущена (выполняется чтение АЦП для линии).
        «10» - Ожидается завершение калибровки (нажатие кнопки или получение кода).
        «11» - Калибровка завершается (выполняется чтение АЦП для фона).
      • SET_CALIBRATION[4-0] - Биты получения кода запуска и завершения калибровки.
        «0x1B» - Запуск калибровки.
        «0x09» - Завершение калибровки.
        «0x12» - Завершение калибровки.
        Запись других значений приведёт к отмене калибровки без сохранения результата.
        Биты сбрасываются автоматически, с началом выполнения новой стадии калибровки.
        При запуске калибровки, модуль выполнит чтение АЦП датчиков для линии трассы.
        При завершении калибровки, модуль выполнит чтение АЦП датчиков для фона трассы, рассчитает границы значений АЦП между фоном и линией, определит тип трассы, и сохранит рассчитанные значения в свои регистры.
        При завершении калибровки кодом «0x09» (как при нажатии на кнопку «калибровка») границы значений АЦП будут рассчитаны для каждого датчика в отдельности, а при завершении калибровки кодом «0x12» границы АЦП будут рассчитаны как среднее арифметическое значение, общее для всех датчиков модуля.
      • Результаты калибровки:
        При успешном выполнении калибровки устанавливается флаг «FLG_CALIBRATION» данного регистра, рассчитанные границы значений АЦП между фоном и линией записываются в регистры 0x26-0x37 «REG_THRESHOLD_X»., а в регистре 0x11 «REG_FLG_LINE_H» устанавливается или сбрасывается флаг «FLG_LINE_BLACK» определяющий тип линии
        («1» - тёмная линия на светлом фоне / «0» - светлая линия на тёмном фоне).
      • ВАЖНО: Калибровка модуля состоит из двух этапов (запуск/завершение) и занимает несколько секунд.

      Регистры 0x14-0x15 «REG_THRESHOLD_1» - Граница АЦП фона и линии 1 датчика:

      Регистры 0x16-0x17 «REG_THRESHOLD_2» - Граница АЦП фона и линии 2 датчика:

      Регистры 0x18-0x19 «REG_THRESHOLD_3» - Граница АЦП фона и линии 3 датчика:

      Регистры 0x1A-0x1B «REG_THRESHOLD_4» - Граница АЦП фона и линии 4 датчика:

      Регистры 0x1C-0x1D «REG_THRESHOLD_5» - Граница АЦП фона и линии 5 датчика:

      Регистры 0x1E-0x1F «REG_THRESHOLD_6» - Граница АЦП фона и линии 6 датчика:

      Регистры 0x20-0x21 «REG_THRESHOLD_7» - Граница АЦП фона и линии 7 датчика:

      Регистры 0x22-0x23 «REG_THRESHOLD_8» - Граница АЦП фона и линии 8 датчика:

      Регистры 0x24-0x25 «REG_THRESHOLD_9» - Граница АЦП фона и линии 9 датчика:

      Регистры для чтения и записи (значение хранится в энергонезависимой памяти модуля).

      • REG_THRESHOLD_X[11-0] - Целое число от 0 до 4095 являющееся средним значением (границей) между показаниями АЦП датчика для фона и для линии трассы.
        Модуль определяет наличие линий под датчиками, сравнивая значение данного регистра с показаниями АЦП снятыми со своих датчиков, сохраняя результат сравнения в флаги «FLG_LINE_1...9» регистров 0x10-0x11 «REG_FLG_LINE».
        Значение «REG_THRESHOLD_X» рассчитывается автоматически, по результату калибровки, но может быть и записано по шине I2C.
      • ВАЖНО: После записи значения в данный регистр требуется выждать не менее 30 мс, так как данные сохраняются в энергонезависимую память модуля.

      Регистры 0x26-0x27 «REG_ANALOG_1» - содержит АЦП 1 датчика:

      Регистры 0x28-0x29 «REG_ANALOG_2» - содержит АЦП 2 датчика:

      Регистры 0x2A-0x2B «REG_ANALOG_3» - содержит АЦП 3 датчика:

      Регистры 0x2C-0x2D «REG_ANALOG_4» - содержит АЦП 4 датчика:

      Регистры 0x2E-0x2F «REG_ANALOG_5» - содержит АЦП 5 датчика:

      Регистры 0x30-0x31 «REG_ANALOG_6» - содержит АЦП 6 датчика:

      Регистры 0x32-0x33 «REG_ANALOG_7» - содержит АЦП 7 датчика:

      Регистры 0x34-0x35 «REG_ANALOG_8» - содержит АЦП 8 датчика:

      Регистры 0x36-0x37 «REG_ANALOG_9» - содержит АЦП 9 датчика:

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

      • REG_ANALOG_X - Целое число от 0 до 4095 являющееся значением АЦП снятого с соответствующего датчика линии модуля. Чем светлее объект находящийся под датчиком, тем больше его отражающая способность и как следствие, выше показание АЦП.
        Значения данных регистров обновляются не реже 3 мс.
        Используя показания регистров аналоговых значений, Вы можете самостоятельно определять наличие линии под датчиками, и даже определять оттенки используемых линий.

      Регистры 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. В противном случае потребуется отключить питание при уже подключённом модуле.

        Пример установки автоматического режима работы поворотников:

        • В начале скетча определены константы содержащие следующие значения:
          • Адрес модуля «ADDRESS».
          • Адрес регистра «REG_BIT_LAMP».
          • Все возможные значения битов регистра «REG_BIT_LAMP».
        • В коде setup() выполняются следующие действия:
          • Инициируется работа с шиной I2C.
          • Выжидается время в 500 мс.
          • Определяется переменная «i», значение которой собирается из определённых ранее констант:
            • Состояние бита «SET_HEAD_ON».
            • Одно из значений «SET_TURN_AUTO_STOP_X».
            • Одно из значений «SET_TURN_PERIOD_X».
            • Одно из значений «SET_TURN_MODE_X».
          • Выполняется запись значения переменной «i» в регистр «REG_BIT_LAMP» модуля.
        • Код цикла loop() отсутствует, так как поворотники работают в автоматическом режиме.
        #include <Wire.h>                                   // Подключаем библиотеку Wire для работы с шиной I2C.
        const int ADDRESS              = 0x09;              // Определяем адрес модуля на шине I2C.
        const int REG_BIT_LAMP         = 0x12;              // Определяем адрес регистра REG_BIT_LAMP для управления поворотниками.
        //        Биты [6-5] - Автоотключение поворотников: //
        const int SET_TURN_AUTO_STOP_0 = B00000000;         // 0 - Поворотник отключается как только линия окажется под любым датчиком кроме указанных в условии «TURN_MODE_AUTO_X».
        const int SET_TURN_AUTO_STOP_1 = B00100000;         // 1 - Поворотник отключается как только линия окажется под центральным датчиком.
        const int SET_TURN_AUTO_STOP_2 = B01000000;         // 2 - Как условие № 0, но продолжительнее на два мигания.
        const int SET_TURN_AUTO_STOP_3 = B01100000;         // 3 - Как условие № 1, но продолжительнее на два мигания.
        //        Биты [4-3] - Частота миганий поворотников://
        const int SET_TURN_PERIOD_100  = B00000000;         // 0 - Период 100мс =>  50мс вкл /  50мс выкл.
        const int SET_TURN_PERIOD_200  = B00001000;         // 1 - Период 200мс => 100мс вкл / 100мс выкл.
        const int SET_TURN_PERIOD_400  = B00010000;         // 2 - Период 400мс => 200мс вкл / 200мс выкл.
        const int SET_TURN_PERIOD_800  = B00011000;         // 3 - Период 800мс => 400мс вкл / 400мс выкл.
        //        Биты [2-0] - Режим работы поворотников:   //
        const int SET_TURN_MODE_OFF    = B00000000;         // 0 - Отключены.
        const int SET_TURN_MODE_LEFT   = B00000001;         // 1 - Включён левый  поворотник.
        const int SET_TURN_MODE_RIGHT  = B00000010;         // 2 - Включён правый поворотник.
        const int SET_TURN_MODE_ALARM  = B00000011;         // 3 - Включены оба поворотника (аварийка).
        const int SET_TURN_MODE_POLICE = B00000100;         // 4 - Режим полицейской машины.
        const int SET_TURN_MODE_AUTO_1 = B00000101;         // 5 - Поворотник включается автоматически, при наличии линии под любым из двух самых крайних датчиков со стороны поворотника.
        const int SET_TURN_MODE_AUTO_2 = B00000110;         // 6 - Поворотник включается автоматически, при наличии линии под любым из трёх самых крайних датчиков со стороны поворотника.
        const int SET_TURN_MODE_AUTO_3 = B00000111;         // 7 - Поворотник включается автоматически, при наличии линии под любым из четырёх датчиков со стороны поворотника.
                                                            //
        void setup(){                                       //
            Wire.setClock(100000L);                         // Устанавливаем скорость передачи данных по шине I2C.
            Wire.begin();                                   // Инициируем работу c шиной I2C в качестве мастера.
            delay(500);                                     //
        //  Готовим значение к отправке в модуль:           //
            uint8_t i = 0;                                  //
            i |=  SET_TURN_AUTO_STOP_3;                     // Поворотник должен отключаться через 2 мигания после того как линия окажется под центральным датчиком.
            i |=  SET_TURN_PERIOD_800;                      // Поворотник должен мигать с частотой 1,25 Гц (период 800мс) => 400мс вкл / 400мс выкл.
            i |=  SET_TURN_MODE_AUTO_1;                     // Поворотник должен включаться при наличии линии под одним, самым крайним, датчиком со стороны поворотника.
        //  Отправляем подготовленное значение:             //
            Wire.beginTransmission(ADDRESS);                // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
            Wire.write(REG_BIT_LAMP);                       // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра REG_BIT_LAMP.
            Wire.write(i);                                  // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это число из переменной i.
            Wire.endTransmission();                         // Выполняем инициированную ранее передачу данных.
        }                                                   //
                                                            //
        void loop(){}                                       // Код loop пуст, так как поворотники работают в автоматическом режиме.

        Габариты:

        Ссылки:




          Обсуждение

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