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

Джойстик, i2c-flash - Datasheet

Трема модуль - Джойстик, I2C-flash.

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

Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_I2C_Joystick можно на странице Wiki - Джойстик, I2C-flash (Trema-модуль).

Назначение:

Trema модуль - Джойстик, I2C-flash - является устройством ввода данных с подключением по шине I2С.

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

Описание:

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

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

  • Изменить адрес данного модуля на шине I2C. При изменении адреса, можно указать, что новый адрес должен сохраниться в flash память модуля, а значит адрес сохранится и после отключения питания.
  • Узнать текущее положение джойстика по осям X и Y. Центральному положению джойстика соответствует координата 0:0. Отклонение джойстика приведёт к изменению координаты от 0:0 до ±100:±100 (значения зависят от степени отклонения, а знаки от направлений).
  • Получить необработанные значения АЦП (12-бит) считанные с потенциометров джойстика, как для оси X, так и для оси Y.
  • Откалибровать джойстик. Ввести значения АЦП соответствующие центральному и крайним положениям джойстика по каждой оси.
  • Задать чувствительность джойстика. В некоторых случаях требуется плавное управление чем либо, для таких проектов можно задать инерционность показаний, чем выше это значение, тем плавнее будут меняться координаты, даже если джойстик отклоняется резко.
  • Задать величину мёртвой зоны у центрального положения в %. Этот показатель определяет, на сколько % требуется отклонить джойстик от центрального положения, что бы его координаты изменились с позиции 0:0.
  • Для модуля с кнопкой, можно определить: события кнопки джойстика - нажимается / отпускается, состояния кнопки джойстика - нажата / отпущена, факт смены состояния кнопки и удержания кнопки дольше 0.5, 1 и 2 секунд, прочитать бит-триггер который меняет свое состояние с каждым новым нажатием на кнопку джойстика. Узнать время прошедшее с момента установки текущего состояния кнопки нажата / отпущена.

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

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

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

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

  • Напряжение питания: 3,3 В или 5 В (постоянного тока).
  • Потребляемый ток: до 15 мА.
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Разрешение АЦП: 12 бит.
  • Диапазон положений джойстика по осям X и Y: -100 ... 0 ... +100.
  • Рабочая температура: от -20 до +70 °С.
  • Габариты: 30 х 30 мм.
  • Вес: 6 г.

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

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

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

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

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

Регистры:

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

адрес76543210
0x00 FLG_RESET FLG_SELF_TEST - - - FLG_I2C_UP - -
0x01 SET_RESET SET_SELF_TEST - - - SET_I2C_UP 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 AVERAGING[7-0]
0x09 DEAD_ZONE[7-0]
0x0A
---
0x0F
RESERVED
0x10 PUSHED RELEASED PRESSED TRIGGER HOLD_05 HOLD_10 HOLD_20 CHANGED
0x11 KEY_TIME[7-0]
0x12 AXIS_X[7-0]
0x13 AXIS_Y[7-0]
адрес76543210
0x14 ADC_X[7-0]
0x15 - - - - ADC_X[11-8]
0x16 ADC_Y[7-0]
0x17 - - - - ADC_Y[11-8]
0x18 RIGHT_X[7-0]
0x19 - - - - RIGHT_X[11-8]
0x1A CENTER_X[7-0]
0x1B - - - - CENTER_X[11-8]
0x1C LEFT_X[7-0]
0x1D - - - - LEFT_X[11-8]
0x1E UP_Y[7-0]
0x1F - - - - UP_Y[11-8]
0x20 CENTER_Y[7-0]
0x21 - - - - CENTER_Y[11-8]
0x22 DOWN_Y[7-0]
0x23 - - - - DOWN_Y[11-8]

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

Регистры с адресами 0x14-0x23 необходимы для калибровки джойстика.

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

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

  • FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
  • FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
  • 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_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] - Для Trema энкодера, потенциометра, I2C-flash - идентификатор равен 0x09.

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

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

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

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

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

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

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

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

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

Регистр 0x08 «AVERAGING» - задаёт чувствительность джойстика:

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

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

  • AVERAGING[7-0] - Значение от 0 до 255 определяющее сглаживание показаний АЦП считанных с осей X и Y. Значение регистра по умолчанию 0x02.
    Чем выше сглаживание, тем плавнее будут меняться показания АЦП, а значит плавнее будут меняться координаты положения джойстика, даже если джойстик отклоняется резко. Значение 0 означает что сглаживание показаний АЦП отключено.
    Функция сглаживания показаний может понадобиться в проектах, где требуется плавное управление.

Регистр 0x09 «DEAD_ZONE» - содержит размер мёртвой зоны:

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

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

  • DEAD_ZONE[7-0] - Значение определяющее размер мёртвой зоны у центрального положения в десятых долях процентов от 0 (0%) до 255 (25,5%). Этот показатель определяет, на сколько % требуется отклонить джойстик от центрального положения (по любой оси), что бы его координаты начали меняться. Пока джойстик находится в мёртвой зоне, его координаты будут равны 0:0.
    Другими словами, мертвая зона, это зона не чувствительности к отклонению джойстика. Она позволяет избежать "дрожание" (jitter) координат джойстика в центральном положении.
    Так же эту зону можно использовать в проектах, где управление устройствами должно начинаться после значительного сдвига джойстика от центра.

Регистр 0x10 «REG_KEY» - содержит флаги состояний и событий кнопки:

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

  • PUSHED - Флаг нажатия на кнопку. Устанавливается в момент нажатия на кнопку и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра.
  • RELEASED - Флаг отпускания кнопки. Устанавливается в момент отпускания кнопки и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтении данного регистра.
  • PRESSED - Флаг состояния кнопки. Установлен пока кнопка нажата и сброшен если она отпущена.
  • TRIGGER - Флаг триггер. Меняет своё состояние с каждым новым нажатием на кнопку (нажали - установился, нажали - сбросился, нажали - установился, ...).
  • HOLD_05 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше 0,5 сек. и сбрасывается при отпускании кнопки.
  • HOLD_10 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше 1 сек. и сбрасывается при отпускании кнопки.
  • HOLD_20 - Флаг удержания кнопки. Устанавливается если кнопка удерживается дольше 2 сек. и сбрасывается при отпускании кнопки.
  • CHANGED - Флаг смены состояния кнопки. Устанавливается в момент нажатия или отпускания кнопки и остаётся установленным пока не будет прочитан. Флаг сбрасывается самостоятельно после чтения данного регистра. ( CHANGED = PUSHED | RELEASED ).

Регистр 0x11 «KEY_TIME» - содержит время удержания/простоя кнопки:

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

  • KEY_TIME[7-0] - Время удержания или простоя кнопки в десятых долях секунд от 0 (0 сек.) до 255 (25,5 сек.). Если флаг «PRESSED» регистра 0x10 «REG_KEY» установлен, значит значение KEY_TIME[7-0] хранит время удержания, иначе, время простоя. Если кнопка удерживается/простаивает дольше 25,5 секунд, то значение KEY_TIME[7-0] останавливается на 255.

Регистр 0x12 «AXIS_X» - содержит координаты джойстика по оси X:

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

  • AXIS_X[7-0] - Значение от -100 до +100 хранится в дополнительном коде (код дополнения до двух).
    Если джойстик находится в центре, то его координата по оси X равна 0.
    При отклонении джойстика влево, его координата будет увеличиваться в отрицательную сторону, а при отклонении вправо, в положительную. Крайнему левому положению соответствует координата -100, а крайнему правому положению +100.
    Если координаты не соответствуют реальному положению джойстика (в центре не 0, а в крайних положениях не ±100), то джойстик необходимо откалибровать, записав новые значения в регистры 0x18-0x19 «RIGHT_X», 0x1A-0x1B «CENTER_X», и 0x1C-0x1D «LEFT_X».

Регистр 0x13 «AXIS_Y» - содержит координаты джойстика по оси Y:

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

  • AXIS_Y[7-0] - Значение от -100 до +100 хранится в дополнительном коде (код дополнения до двух).
    Если джойстик находится в центре, то его координата по оси Y равна 0.
    При отклонении джойстика вниз, его координата будет увеличиваться в отрицательную сторону, а при отклонении вверх, в положительную. Крайнему нижнему положению соответствует координата -100, а крайнему верхнему положению +100.
    Если координаты не соответствуют реальному положению джойстика (в центре не 0, а в крайних положениях не ±100), то джойстик необходимо откалибровать, записав новые значения в регистры 0x1E-0x1F «UP_Y», 0x20-0x21 «CENTER_Y», и 0x22-0x23 «DOWN_Y».

Регистры 0x14-15 «ADC_X» - содержат значение АЦП по оси X:

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

  • ADC_X[11-0] - Значение АЦП (от 0 до 4095) снятое с потенциометра фиксирующего отклонение джойстика по оси X. Показания АЦП можно использовать как альтернативный метод получения координат джойстика, а так же для калибровки джойстика.
  • Калибровка джойстика по оси X позволяет привести показания регистра 0x12 «AXIS_X» в соответствие с действительным отклонением джойстика по оси X.
    Для калибровки джойстика по оси X выполните следующие действия:
    • Отклоните джойстик в крайнее левое положение, сохраните значение АЦП считанное из регистров 0x14-15 «ADC_X» в регистры 0x1C-0x1D «LEFT_X».
    • Отпустите джойстик (он сам установится в центральное положение), сохраните значение АЦП считанное из регистров 0x14-15 «ADC_X» в регистры 0x1A-0x1B «CENTER_X».
    • Отклоните джойстик в крайнее правое положение, сохраните значение АЦП считанное из регистров 0x14-15 «ADC_X» в регистры 0x18-0x19 «RIGHT_X».

Регистры 0x16-0x17 «ADC_Y» - содержат значение АЦП по оси Y:

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

    • ADC_Y[11-0] - Значение АЦП (от 0 до 4095) снятое с потенциометра фиксирующего отклонение джойстика по оси Y. Показания АЦП можно использовать как альтернативный метод получения координат джойстика, а так же для калибровки джойстика.
    • Калибровка джойстика по оси Y позволяет привести показания регистра 0x13 «AXIS_Y в соответствие с действительным отклонением джойстика по оси Y.
      Для калибровки джойстика по оси Y выполните следующие действия:
      • Отклоните джойстик в крайнее нижнее положение, сохраните значение АЦП считанное из регистров 0x16-17 «ADC_Y» в регистры 0x22-0x23 «DOWN_Y».
      • Отпустите джойстик (он сам установится в центральное положение), сохраните значение АЦП считанное из регистров 0x16-17 «ADC_Y» в регистры 0x20-0x21 «CENTER_Y».
      • Отклоните джойстик в крайнее верхнее положение, сохраните значение АЦП считанное из регистров 0x16-17 «ADC_Y» в регистры 0x1E-0x1F «UP_Y».

    Регистры 0x18-0x19 «RIGHT_X» - калибровочные регистры для оси X:

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

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

    • RIGHT_X[11-0] - Значение АЦП (от 0 до 4095) соответствующее крайнему правому положению джойстика. Данное значение влияет на точность определения координат джойстика по оси X, при его нахождении правее центра.
      Если джойстик находится справа от центра, то его координаты по оси X (0x12 «AXIS_X») равны значению АЦП (0x14-15 «ADC_X»), преобразованному от диапазона, границы которого заданы регистрами 0x1A-0x1B...0x18-0x19 к диапазону 0...100.
    • Истинное значение RIGHT_X[11-0]
      Истинное значение RIGHT_X[11-0] можно считать из регистров 0x14-15 «ADC_X» в тот момент когда джойстик находится в крайнем правом положении.
      Для смены направления оси X, достаточно поменять местами значения регистров 0x18-0x19 «RIGHT_X» и 0x1C-0x1D «LEFT_X».

    Регистры 0x1A-0x1B «CENTER_X» - калибровочные регистры для оси X:

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

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

    • CENTER_X[11-0] - Значение АЦП (от 0 до 4095) соответствующее центральному положению джойстика по оси X. Точность данного значения гарантирует то, что при нахождении джойстика в центральном положении, в регистре координат 0x12 «AXIS_X» будет значение 0.
    • Истинное значение CENTER_X[11-0]
      Истинное значение CENTER_X[11-0] можно считать из регистров 0x14-15 «ADC_X» в тот момент когда джойстик находится в центральном положении.

    Регистры 0x1C-0x1D «LEFT_X» - калибровочные регистры для оси X:

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

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

    • LEFT_X[11-0] - Значение АЦП (от 0 до 4095) соответствующее крайнему левому положению джойстика. Данное значение влияет на точность определения координат джойстика по оси X, при его нахождении левее центра.
      Если джойстик находится слева от центра, то его координаты по оси X (0x12 «AXIS_X») равны значению АЦП (0x14-15 «ADC_X»), преобразованному от диапазона, границы которого заданы регистрами 0x1A-0x1B...0x1C-0x1B к диапазону 0...-100.
    • Истинное значение LEFT_X[11-0]
      Истинное значение LEFT_X[11-0] можно считать из регистров 0x14-15 «ADC_X» в тот момент когда джойстик находится в крайнем левом положении.
      Для смены направления оси X, достаточно поменять местами значения регистров 0x18-0x19 «RIGHT_X» и 0x1C-0x1D «LEFT_X».

    Регистры 0x1E-0x1F «UP_Y» - калибровочные регистры для оси Y:

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

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

    • UP_Y[11-0] - Значение АЦП (от 0 до 4095) соответствующее крайнему верхнему положению джойстика. Данное значение влияет на точность определения координат джойстика по оси Y, при его нахождении выше центра.
      Если джойстик находится выше центра, то его координаты по оси Y (0x13 «AXIS_Y») равны значению АЦП (0x16-17 «ADC_Y»), преобразованному от диапазона, границы которого заданы регистрами 0x20-0x21...0x1E-0x1F к диапазону 0...100.
    • Истинное значение UP_Y[11-0]
      Истинное значение UP_Y[11-0] можно считать из регистров 0x16-17 «ADC_Y» в тот момент когда джойстик находится в крайнем верхнем положении.
      Для смены направления оси Y, достаточно поменять местами значения регистров 0x1E-0x1F «UP_Y» и 0x22-0x23 «DOWN_Y».

    Регистры 0x20-0x21 «CENTER_Y» - калибровочные регистры для оси Y:

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

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

    • CENTER_Y[11-0] - Значение АЦП (от 0 до 4095) соответствующее центральному положению джойстика по оси Y. Точность данного значения гарантирует то, что при нахождении джойстика в центральном положении, в регистре координат 0x13 «AXIS_Y» будет значение 0.
    • Истинное значение CENTER_Y[11-0]
      Истинное значение CENTER_Y[11-0] можно считать из регистров 0x16-17 «ADC_Y» в тот момент когда джойстик находится в центральном положении.

    Регистры 0x22-0x23 «DOWN_Y» - калибровочные регистры для оси Y:

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

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

    • DOWN_Y[11-0] - Значение АЦП (от 0 до 4095) соответствующее крайнему нижнему положению джойстика. Данное значение влияет на точность определения координат джойстика по оси Y, при его нахождении ниже центра.
      Если джойстик находится ниже центра, то его координаты по оси Y (0x13 «AXIS_Y») равны значению АЦП (0x16-17 «ADC_Y»), преобразованному от диапазона, границы которого заданы регистрами 0x20-0x21...0x22-0x23 к диапазону 0...-100.
    • Истинное значение DOWN_Y[11-0]
      Истинное значение DOWN_Y[11-0] можно считать из регистров 0x16-17 «ADC_Y» в тот момент когда джойстик находится в крайнем нижнем положении.
      Для смены направления оси Y, достаточно поменять местами значения регистров 0x1E-0x1F «UP_Y» и 0x22-0x23 «DOWN_Y».

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

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

      Пример чтения координат джойстика:

      Следующий скетч демонстрирует пример вывода состояния кнопки (нажата/отпущена) в монитор последовательного порта.

      #include <Wire.h>                                // Подключаем библиотеку Wire для работы с шиной I2C.
      const int ADDRESS     = 0x09;                    // Определяем адрес модуля Metro - кнопка.
      const int REG_AXIS_X  = 0x12;                    // Определяем адрес регистра AXIS_X.
      const int REG_AXIS_Y  = 0x13;                    // Определяем адрес регистра AXIS_Y.
         int8_t x, y;                                  // Объявляем переменные для получения координат джойстика.
                                                       //
      void setup(){                                    //
          Serial.begin(9600);                          // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек.
          while(!Serial){;}                            // Ждём готовность к работе аппаратной шины UART.
          Wire.setClock(100000L);                      // Устанавливаем скорость передачи данных по шине I2C.
          Wire.begin();                                // Инициируем работу c шиной I2C в качестве мастера.
      }                                                //
                                                       //
      void loop(){                                     //
          Wire.beginTransmission(ADDRESS);             // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся.
          Wire.write(REG_AXIS_X);                      // Функция write() помещает значение своего аргумента в буфер для передачи.
          Wire.endTransmission(false);                 // Выполняем инициированную ранее передачу данных (параметр false указывает что состояние STOP устанавливать не требуется).
          Wire.requestFrom(ADDRESS, 2);                // Читаем из модуля с адресом ADDRESS, 2 байта данных в буфер библиотеки Wire. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART.
          if   ( Wire.available() ){ x=Wire.read(); }  // Если в буфере библиотеки Wire есть данные, то читаем 1 байт в переменную x.
          if   ( Wire.available() ){ y=Wire.read(); }  // Если в буфере библиотеки Wire есть данные, то читаем 1 байт в переменную y.
          while( Wire.available() ){   Wire.read(); }  // Если в буфере библиотеки Wire есть еще данные, то читаем их в никуда (чистим буфер).
          Serial.println((String)"X:Y="+x+":"+y);      //
          delay(500);                                  //
      }                                                //

      Габариты:

      Все модули линейки "Trema" выполнены в одном формате:

      Ссылки:




      Обсуждение

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