КОРЗИНА
магазина
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: 3,3 В (толерантны к 5 В).
    • Рабочая температура: от -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 памяти, а значит после отключения питания, установится прежний адрес модуля.

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

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

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

      Регистры:

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

      адрес76 5 4 3 2 10
      0x00 FLG_RESET FLG_SELF_TEST - - - - - -
      0x01 SET_RESET SET_SELF_TEST - - - - SAVE_ADR_EN -
      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 REG_CALIBRATION[6-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-успех). Не поддерживается данным модулем.

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

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

      • SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
      • SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 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.

      Регистр 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» для чтения и записи (хранится в 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» - Калибровка завершается (выполняется чтение АЦП для фона).
      • REG_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 мс.
        Используя показания регистров аналоговых значений, Вы можете самостоятельно определять наличие линии под датчиками, и даже определять оттенки используемых линий.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        Примечание:

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

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

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

        • В начале скетча определены константы содержащие следующие значения:
          • Адрес модуля «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 пуст, так как поворотники работают в автоматическом режиме.

        Габариты:

        Ссылки:




          Обсуждение

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