Бампер с 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), хранящийся в энергонезависимой памяти, можно менять программно.
Модуль можно использовать в любых проектах где требуется организовать движение мобильных устройств без участия оператора.
Описание:
Модуль построен на базе микроконтроллера STM32G030F4 (ранние модели были построены на базе микроконтроллера STM32F030F4, но они полностью совместимы с новыми моделями), снабжен собственным стабилизатором напряжения, имеет на борту 9 датчиков отражения (линий) и кнопку калибровки. Светодиодная индикация модуля позволяет определять наличие линий под датчиками - светодиод расположенный перед датчиком светится если под датчиком есть линия. Так же на модуле установлены светодиоды сигналов поворота. У версии модуля с поддержкой определения цвета, имеются три датчика цвета расположенные по центру и по бокам бампера, каждый датчик состоит из RGB светодиода и фототранзистора.
Чтение аналоговых и цифровых сигналов с датчиков линий, аналоговых и цифровых сигналов с датчиков цвета, а так же управление поворотниками осуществляется через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.
С помощью регистров модуля можно:
- Изменить адрес данного модуля, временно (пока есть питание) или постоянно.
- Считывать аналоговые сигналы с датчиков линий.
- Считывать цифровые сигналы с датчиков линий (есть линия под датчиком или нет).
- Откалибровать модуль под контраст линий и фона трассы.
- Задать скорость опроса модулем датчиков линий.
- Узнать максимальную скорость при которой бампер обнаружит перекрёсток трассы.
- Узнать тип трассы для которой откалиброван модуль (трасса со светлой или тёмной линией).
- Изменить тип трассы (использовать цвет фона как линию, а цвет линии как фона).
- Задать скорость мигания поворотников.
- Управлять поворотниками самостоятельно, или указать им работать в автоматическом режиме.
Для модулей с поддержкой определения цвета, доступны дополнительные возможности:
- Считывать аналоговые сигналы с датчиков цвета.
- Считывать цифровые сигналы с датчиков цвета (0-чер,1-бел,2-кра,3-жел,4-зел,5-син).
- Откалибровать датчики цвета по белому фону.
- Задать скорость опроса модулем датчиков цвета.
Калибровка датчиков линий:
Калибровка позволяет модулю отличать линии трассы от фона. Калибровка состоит из двух этапов: чтение количества отражённого света от поверхности линии и чтение количества отражённого света от поверхности фона трассы. Результаты калибровки сохраняются в энергонезависимую память модуля, а значит модуль будет отличать линии от фона и после отключения питания.
Установите модуль так, что бы все его датчики находились над линией трассы и нажмите на кнопку «калибровка», или запишите значение 0x1B в регистр 0x13 «REG_CALIBRATION». О начале калибровки сигнализирует включение левого поворотника и поочерёдное включение светодиодов расположенных перед датчиками линий, далее светодиоды отключатся, после чего все светодиоды начнут мигать в шахматном порядке, информируя о необходимости перехода к чтению фона трассы для завершения калибровки.
Установите модуль так, что бы все его датчики находились над фоном трассы и нажмите на кнопку «калибровка», или запишите значение 0x09 в регистр 0x13 «REG_CALIBRATION». О начале калибровки сигнализирует включение правого поворотника и поочерёдное включение светодиодов расположенных перед датчиками линий, далее светодиоды отключатся, после чего все светодиоды расположенные перед датчиками одновременно включатся на пол секунды или быстро мигнут три раза, информируя о результате калибровки.
Успех калибровки определяется модулем по контрасту между фоном и линией, при малой контрастности калибровка будет считаться неудачной, а её результаты не сохранятся в регистрах модуля. Если калибровка закончилась провалом, то все светодиоды расположенные перед датчиками линий быстро мигнут три раза. Если калибровка закончилась успехом, то все светодиоды расположенные перед датчиками линий одновременно включатся на пол секунды. Так же о результате калибровки можно судить по флагу «FLG_CALIBRATION» регистра 0x13 «REG_CALIBRATION».
В результате калибровки модуль не только сможет отличать линии от фона, но и определит тип трассы (трасса с тёмной линией на светлом фоне, или со светлой линией на тёмном фоне), о чём информирует флаг «FLG_LINE_BLACK» регистра 0x11 «REG_FLG_LINE_H». Если на трассе есть участки, где цвет линии меняется с цветом фона, достаточно изменить значение указанного флага.
Калибровка датчиков цвета:
Только для модулей с поддержкой определения цвета.
Калибровка позволяет модулю настроить коэффициенты коррекции яркости каналов RGB для каждого датчика цвета. Результаты калибровки сохраняются в энергонезависимую память модуля, а значит модуль будет корректно определять цвета и после отключения питания.
При калибровке кнопкой нужно выполнить те же действия, что и при калибровке датчиков линий, но бампер должен постоянно находиться над белым фоном (например над белым листом бумаги). Разместите модуль над белым фоном и нажмите на кнопку «калибровка». Включится левый поворотник, а светодиоды расположенные перед датчиками линий начнут поочерёдно включаться, после чего все светодиоды начнут мигать в шахматном порядке. Не меняя положение модуля, повторно нажмите на кнопку «калибровка». Включится правый поворотник, а светодиоды расположенные перед датчиками линий начнут поочерёдно включаться, после чего все светодиоды отключатся и мигнут три раза информируя о том, что калибровка датчиков линий не выполнена и не сохранена. Далее на пол секунды включатся RGB светодиоды красным или зелёным цветом информируя о результате калибровки датчиков цвета.
Вместо нажатий на кнопку «калибровка» можно записать значение 0x15 в регистр 0x13 «REG_CALIBRATION». В этом случае калибровка начнётся сразу со второго этапа: Включится правый поворотник, а светодиоды расположенные перед датчиками линий начнут поочерёдно включаться, после чего все светодиоды отключатся и мигнут три раза информируя о том, что калибровка датчиков линий не выполнена и не сохранена. Далее на пол секунды включатся RGB светодиоды красным или зелёным цветом информируя о результате калибровки датчиков цвета.
Если цвет фона сильно отличается от белого, то калибровка будет считаться неудачной, а её результаты не сохранятся в регистрах модуля. Если калибровка закончилась провалом, то RGB светодиоды включатся красным цветом. Если калибровка закончилась успехом, то RGB светодиоды включатся зелёным цветом. Так же о результате калибровки можно судить по флагу «FLG_CALIBRATION» регистров 0x41-0x46 «REG_CORRECTION».
Выводы модуля:
Модуль подключается по шине 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 мс.
Регистры:
Карта регистров модуля:
Регистры с адресами 0x02, 0x03, 0x08 - 0x0F зарезервированы, их биты сброшены. Попытка записи данных в эти регистры будет проигнорирована модулем.
Регистры с адресами 0x3A - 0x46 доступны только для модулей с поддержкой определения цвета.
Регистр 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» - Граница АЦП фона и линии:
Регистры 0x16-0x17 «REG_THRESHOLD_2» - Граница АЦП фона и линии:
Регистры 0x18-0x19 «REG_THRESHOLD_3» - Граница АЦП фона и линии:
Регистры 0x1A-0x1B «REG_THRESHOLD_4» - Граница АЦП фона и линии:
Регистры 0x1C-0x1D «REG_THRESHOLD_5» - Граница АЦП фона и линии:
Регистры 0x1E-0x1F «REG_THRESHOLD_6» - Граница АЦП фона и линии:
Регистры 0x20-0x21 «REG_THRESHOLD_7» - Граница АЦП фона и линии:
Регистры 0x22-0x23 «REG_THRESHOLD_8» - Граница АЦП фона и линии:
Регистры 0x24-0x25 «REG_THRESHOLD_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 мс.
Используя показания регистров аналоговых значений, Вы можете самостоятельно определять наличие линии под датчиками, и даже определять оттенки используемых линий.
Регистр 0x38 «REG_SET_SPEED» - указывает скорость работы датчиков:
Регистр для чтения и записи.
- SET_SPEED_RGB[3-2] - Биты определяют скорость опроса модулем датчиков цвета:
«00» - Не читать цвета (в этом режиме быстро читаются линии).
«01» - Медленно читать цвета.
«10» - Читать цвета со средней скоростью (режим не поддерживается).
«11» - Быстро читать цвета (в этом режиме линии читаются медленно). - SET_SPEED_LINE[1-0] - Биты определяют скорость опроса модулем датчиков линий:
«00» - Не читать линии (режим не поддерживается).
«01» - Медленно читать линии (в этом режиме бампер может находится высоко над трассой).
«10» - Средняя скорость чтения линий.
«11» - Быстро читать линии (в этом режиме бампер должен находиться низко, не выше 5 мм). - ПРИМЕЧАНИЕ: Биты «SET_SPEED_RGB[3-2]» используются только для бампера с поддержкой определения цвета.
Регистр 0x39 «REG_MAX_SPEED» - содержит максимальную скорость:
Регистр только для чтения.
- REG_MAX_SPEED - Целое число от 0 до 255 являющееся максимальной скоростью движения бампера по линии в мм/с. Значение показывает при какой максимальной скорости бампер сможет определить наличие перпендикулярного перекрёстка. Скорость прочитанную из регистра нужно умножить на толщину линии трассы в мм.
- Пример: Значение регистра = 100 мм/с, ширина линии = 1 см = 10 мм, значит бампер может ехать с максимальной скоростью: 100 мм/с * 10 мм = 1000 мм/с = 1 м/с = 3,6 км/ч.
Регистры чтения цвета:
Ниже описаны регистры для бамперов с поддержкой определения цвета.
Регистр 0x3A «REG_COLOR» - содержит цвета от 3 датчиков:
Регистр только для чтения.
- REG_COLOR - Один байт состоящий из 3 чисел соответствующих цветам с 3 датчиков.
- REG_COLOR = 36L + 6C + 1R
где L, C, R - это числа от 0 до 5 для левого (L), центрального (C) и правого (R) датчика.
Каждое число соответствует цвету: 0-чёр, 1-бел, 2-кра, 3-жёл, 4-зел, 5-син. - Получить числа L, C и R из значения регистра можно по следующему алгоритму:
L = REG_COLOR / 36 % 6;
C = REG_COLOR / 6 % 6;
R = REG_COLOR % 6; - Пример: Если L=1, C=3, L=5, значит левый датчик определил белый цвет, средний датчик определил жёлтый цвет, а правый датчик определил синий цвет.
Регистры 0x3B-0x3C «REG_LRGB_1» - аналоговые значения цвета:
Регистры 0x3D-0x3E «REG_LRGB_2» - аналоговые значения цвета:
Регистры 0x3F-0x40 «REG_LRGB_3» - аналоговые значения цвета:
Цифра в названии регистра определяет датчик цвета: 1-левый, 2-средний, 3-правый.
Регистры только для чтения.
- REG_LRGB_X - Содержит двухбайтное значение состоящее из 4 чисел: L,R,G,B.
- REG_LRGB_X = (LLLL RRRR GGGG BBBB)2, где:
LLLL - это 4х-битное число от 0 до 15 соответствующее общей яркости цвета.
RRRR - это 4х-битное число от 0 до 15 соответствующее яркости красного цвета.
GGGG - это 4х-битное число от 0 до 15 соответствующее яркости зелёного цвета.
BBBB - это 4х-битное число от 0 до 15 соответствующее яркости синего цвета. - Получить числа L, R, G, B из значения регистра можно по следующему алгоритму:
L = (REG_LRGB_X>>12) & 0x000F;
R = (REG_LRGB_X>>8) & 0x000F;
G = (REG_LRGB_X>>4) & 0x000F;
B = (REG_LRGB_X>>0) & 0x000F; - Примеры:
Если L=3, R=6, G=15, B=5, значит под датчиком тёмно зелёный цвет
Если L=13, R=6, G=5, B=15, значит под датчиком светло синий цвет.
Регистры 0x41-0x42 «REG_CORRECTION_1» - коэффициенты коррекции:
Регистры 0x43-0x44 «REG_CORRECTION_2» - коэффициенты коррекции:
Регистры 0x45-0x46 «REG_CORRECTION_3» - коэффициенты коррекции:
Цифра в названии регистра определяет датчик цвета: 1-левый, 2-средний, 3-правый.
Регистры для чтения и записи.
- FLG_CALIBRATION - старший бит двухбайтного регистра является флагом успешного завершения калибровки датчика цвета.
Флаг автоматически сбрасывается при записи любого значения в данный регистр, и автоматически меняется по завершении калибровки цвета информируя о её результате. - REG_CORRECTION_X[14-0] - Содержит 15ти-битное значение состоящее из 3 чисел: R,G,B.
- REG_CORRECTION_X[14-0] = (RRRRR GGGGG BBBBB)2, где:
RRRRR - это 5ти-битное число от -15 до +15 для коррекции яркости красного.
GGGGG - это 5ти-битное число от -15 до +15 для коррекции яркости зелёного.
BBBBB - это 5ти-битное число от -15 до +15 для коррекции яркости синего. - Получить коэффициенты коррекции можно по следующему алгоритму:
KR = ( (REG_CORRECTION_X>>10) & 0x001F) - 15;
KG = ( (REG_CORRECTION_X>>5) & 0x001F) - 15;
KB = ( (REG_CORRECTION_X>>0) & 0x001F) - 15; - Каждая единица коэффициента коррекции яркости цвета меняет аналоговое значение соответствующего цвета в регистрах «REG_LRGB» на 3%.
Пример: Если KR=0, KG=10, KB=-10, то R+0%, G+30%, B-30%. - Значение «REG_CORRECTION_X» рассчитывается автоматически, по результату калибровки цвета, но может быть и записано по шине I2C.
Регистры 100+:
У младших версий модулей линейки «FLASH-I2C» нет блока регистров «100+», так же этого блока нет у модулей линейки «Metro», о его наличии свидетельствует установленный флаг «RAND_ADR» в регистре 0x00 «FLAGS_0».
Блок регистров «100+» с адресами от 0x64 (100)10 до 0x75 (117)10 не участвует в работе модуля, он предназначен только для обнаружения модулей с одинаковыми адресами и назначения этим модулям разных адресов, не отключая их от шины I2C.
Карта регистров 100+:
Регистры 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 пуст, так как поворотники работают в автоматическом режиме.
Габариты:
Ссылки:
- Бампер с 9 датчиками линий с шагом 14мм, FLASH-I2C.
- Бампер с 9 датчиками линий с шагом 7мм, FLASH-I2C.
- Wiki - Бампер с 9 датчиками линий, I2C-Flash.
- Wiki - Бампер с 9 датчиками линий, I2C-Flash, подключаем к Raspberry
- Библиотека iarduino_I2C_Bumper.
- Расширенные возможности библиотек iarduino для шины I2C.
- Wiki - Установка библиотек в Arduino IDE.
Обсуждение