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

Джойстик, FLASH-I2C, подключаем к Raspberry

Общие сведения:

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

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

Модуль можно использовать для управления роботами, движущимися механизмами, станками с ЧПУ, для создания игр и многих других проектов.

Видео:

Редактируется ...

Спецификация:

  • Напряжение питания: 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" выполнены в одном формате

Подключение:

**

По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09.

— Перед подключением 1 модуля к шине I2C настоятельно рекомендуется изменить адрес модуля.

— При подключении 2 и более FLASH-I2C модулей к шине необходимо в обязательном порядке предварительно изменить адрес каждого модуля, после чего уже подключать их к шине.

Более подробно о том, как это сделать, а так же о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.

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

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

Способ - 1: Используя провода и Raspberry Pi

Используя провода «Мама — Мама», подключаем  напрямую к Raspberry Pi

В этом случае необходимо питать логическую часть модуля от 3,3 В Raspberry

Способ - 2: Используя Trema+Expander Hat

Используя 4-х проводной шлейф, подключаем к Trema+Expander Hat.

Питание:

Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND.

Подробнее о модуле:

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

Модуль позволяет:

  • Менять свой адрес на шине I2C.
  • Получать текущее положение джойстика по осям X и Y.
  • Получить необработанные значения АЦП (12-бит) считанные с потенциометров джойстика.
  • Откалибровать джойстик.
  • Задать чувствительность джойстика.
  • Задать величину мёртвой зоны у центрального положения.
  • Для модуля с кнопкой, можно определить события и состояния кнопки.

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

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Смена адреса модуля на шине I2C:

#!/usr/bin/python3

import sys

# Подключаем библиотеку для работы с джойстиком
from pyiArduinoI2Cjoystick import *

# Объявляем объект module для работы с функциями и методами библиотеки pyiArduinoI2Cjoystick.
# Если при объявлении объекта указать адрес, например, module(0x0B),
# то пример будет работать с тем модулем, адрес которого был указан.
module = pyiArduinoI2Cjoystick(None, NO_BEGIN)

# Если сценарию не были переданы аргументы
if len(sys.argv) < 2:
    # Назначаем модулю адрес (0x07 < адрес < 0x7F).
    newAddress = 0x09

# Иначе
else:
    # Новый адрес - первый аргумент
    newAddress = int(sys.argv[1])

# Если датчик найден
if module.begin():
    print("Найден модуль %#.2x" % module.getAddress())

    # Если адрес удалось изменить
    if module.changeAddress(newAddress):
            print("Адрес изменён на %#.2x" % module.getAddress())

    else:
            print("Адрес не изменён!")

else:
    print("Датчик не найден!")

Для работы данного примера, на шине I2C должен быть только один джойстик.

Данный сценарий демонстрирует не только возможность смены адреса на указанный в переменной newAddress, но и обнаружение, и вывод текущего адреса модуля на шине I2C. Если скрипту был передан аргумент, то адрес будет изменён на число в аргументе, например: ./newAddress.py 10.

Получение координат джойстика:

#!/usr/bin/python3

from time import sleep
from curses import wrapper

# Подключаем библиотеку для работы с джойстиком I2C-flash.
from pyiArduinoI2Cjoystick import *

# Объявляем объект для работы с библиотекой, указывая адрес модуля на шине.
j = pyiArduinoI2Cjoystick(0x09)

# Если объявить объект без указания адреса, то адрес будет найден автоматически.
#j = pyiArduinoI2Cjoystick()


def main(stdscr):

    stdscr.clear()

    print("Текущие координаты: (нажмите <ctrl+c> для выхода)", end="\r\n")

    # Получаем и выводим координаты по отдельности: #

    print("X=", end='')

    # Выводим координату по оси X, значение от -100 до 100.
    print(j.x, end='')

    print(", Y=", end='')

    # Выводим координату по оси Y, значение от -100 до 100.
    print(j.y, end='')

    # Получаем сразу обе координаты:
    x, y = j.getPosition()

    print(", X:Y=", end='')

    # Выводим координату по оси X, значение от -100 до 100.
    print(x, end='')

    print(":", end='')

    # Выводим координату по оси X, значение от -100 до 100.
    print(y, end="\r\n")

    sleep(.1)

    stdscr.refresh()

while True:

    wrapper(main)

После запуска данного примера, в мониторе последовательного порта будут появляться строки с текущими координатами джойстика.

Координаты можно получать как по отдельности: getPosition_X(), getPosition_Y(), так и одним запросом используя функцию getPosition().

Получение направления джойстика в градусах:

#!/usr/bin/python3

from time import sleep
from math import atan2, pi

# Подключаем библиотеку для работы с джойстиком I2C-flash.
from pyiArduinoI2Cjoystick import *

# Объявляем объект joy для работы с библиотекой, указывая адрес модуля на шине.
j = pyiArduinoI2Cjoystick(0x09)


print("Выводим положение джойстика в полярной системе координат.")
print("Для выхода нажмите <ctrl+c>")

while True:

    # Получаем текущие координаты
    x, y = j.x, j.y

    # Вычисляем радианы
    rad = atan2(y,x)

    # Вычисляем градусы
    deg = rad * (180 / pi)

    if deg < 0:
        deg = deg + 360

    # Выводим градусы
    print(round(deg))

    sleep(.1)

После загрузки данного примера, в мониторе последовательного порта будут появляться строки с указанием угла поворота джойстика, но только если он отклонён от центра.

Изменение направления координат по осям X и Y:

#!/usr/bin/python3

from time import sleep
from curses import wrapper
# Подключаем библиотеку для работы с джойстиком I2C-flash.
from pyiArduinoI2Cjoystick import *

# Объявляем объект joy для работы с библиотекой, указывая адрес модуля на шине.
j = pyiArduinoI2Cjoystick(0x09)

# Если объявить объект без указания адреса, то адрес будет найден автоматически.
#j = pyiArduinoI2Cjoystick()

a, b, c = 0, 0, 0


#  Изменение направления оси X:

# Читаем установленные  калибровочные значения для оси X в переменные a,b,c.
a, b, c = j.getCalibration_X()

# Сохраняем прочитанные калибровочные значения для оси X,
# но указываем аргументы в обратном порядке: c, b, a.
j.setCalibration_X(c, b, a)


#  Изменение направления оси Y:                  #

# Читаем установленные  калибровочные значения для оси Y в переменные a,b,c.
a, b, c = j.getCalibration_Y()

# Сохраняем прочитанные калибровочные значения для оси Y,
# но указываем аргументы в обратном порядке: c, b, a.
j.setCalibration_Y(c, b, a)

def main(stdscr):

    stdscr.clear()

    print("Текущие координаты: (нажмите <ctrl+c> для выхода)", end="\r\n")

    # Получаем координаты
    x, y = j.getPosition()

    # Выводим  координаты джойстика.
    print("X:Y="+str(x)+":"+str(y))

    print("\r")

    sleep(.1)

    stdscr.refresh()

while True:
    wrapper(main)

После загрузки данного примера, в мониторе последовательного порта будут появляться строки с текущими координатами джойстика. Но с каждым новым запуском сценария направление координат будет меняться (слева отрицательные значения, справа положительные и наоборот).

Обратите внимание на то, что направление координат по осям сохраняется в энергонезависимой памяти модуля, значит если Вам нужно сменить направление осей, запустите этот сценарий однократно.

Описание функций библиотеки:

В данном разделе описаны функции библиотеки pyiArduinoI2Cjoystick для работы с Trema модулем - Джойстик, I2C-flash.

Подключение модуля:

from pyiArduinoI2Cexpander import *

Создание объекта:

obj = pyiArduinoI2Cexpander(АДРЕС)

Функция begin()

  • Назначение: инициализация расширителя выводов
  • Синтаксис: obj.begin()
  • Параметры: нет
  • Возвращаемые значения: флаг инициализации
  • Примечание: функция не обязательная, выполняется автоматически при создании объекта. Можно использовать для проверки наличия устройства на шине.
  • Пример:
if obj.begin():
    print("устройство найдено и инициализировано")
else:
    print("устройство не найдено, проверьте включена ли шина I2C")

Функция changeAddress()

  • Назначение: смена адреса устройства
  • Синтаксис: obj.changeAddress(newAddr)
  • Параметры: newAddr - новый адрес для устройства
  • Возвращаемые значения: флаг выполнения. 1 - успешно, 0 - неуспешно.
  • Примечание: нет
  • Пример:
obj.changeAddress(0x0A)

Функция reset()

  • Назначение: перезагрузка устройства
  • Синтаксис: obj.reset()
  • Параметры: нет
  • Возвращаемые значения: флаг выполнения
  • Примечание: нет
  • Пример:
obj.reset()

Функция getAddress()

  • Назначение: узнать текущий адрес устройства на шине I2C
  • Синтаксис: obj.getAddress()
  • Параметры: нет
  • Возвращаемые значения: текущий адрес модуля на шине I2C
  • Примечание: нет
  • Пример:
addr = obj.getAddress()

Функция getVersion()

  • Назначение: узнать текущую версию прошивки модуля
  • Синтаксис: obj.getVersion()
  • Параметры: нет
  • Возвращаемые значения: текущая версия прошивки модуля
  • Примечание: нет
  • Пример:
ver = obj.getVersion()

Функция getPosition_X()

  • Назначение: Запрос текущей координаты джойстика по оси X.
  • Синтаксис: getPosition_X()
  • Параметры: Нет.
  • Возвращаемое значение: координата от -100 (лево) до +100 (право), значение 0 (центр).
  • Примечание: так же значение можно получить через атрибут объекта "x": coord_x = obj.x.
  • Пример:
print( "Координата по оси X = ", end='' )
print( obj.getPosition_X() )

Функция getPosition_Y()

  • Назначение: Запрос текущей координаты джойстика по оси Y.
  • Синтаксис: getPosition_Y()
  • Параметры: Нет.
  • Возвращаемое значение: координата от -100 (низ) до +100 (верх), значение 0 (центр).
  • Примечание: так же значение можно получить через атрибут объекта "y": coord_y = obj.y.
  • Пример:
print( "Координата по оси Y = ", end='' )
print( obj.getPosition_Y() )

Функция getPosition()

  • Назначение: Запрос текущих координат джойстика по осям X и Y.
  • Синтаксис: x, y = getPosition()
  • Параметры: нет
  • Возвращаемое значение: координаты x, y
  • Примечание:
    • Данная функция позволяет получить те же координаты, что и функции getPosition_X() и getPosition_Y(), но получение двух координат одним запросом выполняется быстрее.
  • Пример:
x, y = obj.getPosition()
print(x, y)

Функция getADC_X()

  • Назначение: Запрос сырого значения АЦП снятого с потенциометра по оси X.

  • Синтаксис: getADC_X()

  • Параметры: Нет.

  • Возвращаемое значение: значение АЦП (12 бит) от 0 до 4095.

  • Примечание:

    • Показания АЦП снятые с потенциометра по оси X, можно использовать как альтернативный метод получения координаты джойстика, а так же для калибровки джойстика, указывая значения АЦП в качестве параметров функции setCalibration_X().
    • Так же значение можно получить через атрибут объекта "ax": adc_x = obj.ax.
  • Пример:

print( "Текущему положению джойстика по оси X соответствует значение АЦП = ", end='' )
print( obj.getADC_X() )

Функция getADC_Y()

  • Назначение: Запрос сырого значения АЦП снятого с потенциометра по оси Y.
  • Синтаксис: getADC_Y()
  • Параметры: Нет.
  • Возвращаемое значение: значение АЦП (12 бит) от 0 до 4095.
  • Примечание:
    • Показания АЦП снятые с потенциометра по оси Y, можно использовать как альтернативный метод получения координаты джойстика, а так же для калибровки джойстика, указывая значения АЦП в качестве параметров функции setCalibration_Y().
    • Так же значение можно получить через атрибут объекта "ay": adc_y = obj.ay.
  • Пример:
print( "Текущему положению джойстика по оси Y соответствует значение АЦП = ", end='' )
print( obj.getADC_Y() )

Функция getADC()

  • Назначение: Запрос сырых значений АЦП снятых с потенциометров по осям X и Y.
  • Синтаксис: x, y = getADC()
  • Параметры: нет
  • Возвращаемое значение: значение
  • Примечание:
  • Данная функция позволяет получить те же значения, что и функции getADC_X() и getADC_Y(), но получение двух значений одним запросом выполняется быстрее.
  • Пример:
x, y = obj.getADC()
print(x, y)

Функция getButton(), только для версии джойстика с кнопкой

  • Назначение: Запрос времени удержания, состояния, или события кнопки джойстика.
  • Синтаксис: getButton( ЗАПРОС );
  • Параметр: один из перечисленных вариантов...
    • KEY_PUSHED - вернуть событие кнопки - «нажимается».
    • KEY_RELEASED - вернуть событие кнопки - «отпускается».
    • KEY_CHANGED - вернуть событие кнопки - «состояние изменилось».
    • KEY_PRESSED - вернуть состояние кнопки - «нажата».
    • KEY_TRIGGER - вернуть состояние кнопки - «переключатель».
    • KEY_HOLD_05 - вернуть состояние кнопки - «удерживается» дольше 0,5 сек.
    • KEY_HOLD_10 - вернуть состояние кнопки - «удерживается» дольше 1,0 сек.
    • KEY_HOLD_20 - вернуть состояние кнопки - «удерживается» дольше 2,0 сек.
    • KEY_TIME_PRESSED - вернуть время удержания кнопки в миллисекундах.
  • Возвращаемое значение: значение зависит от параметра функции:
    • ФЛАГ наличия запрашиваемого состояния или события (True или False).
    • ВРЕМЯ удержания кнопки в миллисекундах (от 0 до 25500).
  • Примечание:
    • Функция доступна только для джойстика с кнопкой.
    • Если функция вызвана с параметром KEY_TIME_PRESSED, то она вернёт время удержания кнопки, или 0 (если кнопка отпущена). При указании любого другого параметра, функция вернёт флаг соответствующий запрашиваемому состоянию или событию.
    • Если запрошено событие кнопки (нажимается, отпускается, состояние изменилось), то функция вернёт true только один раз после совершения запрашиваемого события.
    • Если запрошено состояние кнопки (нажата, переключатель, удерживается), то функция будет возвращать true всё время, пока установлено запрашиваемое состояние.
  • Пример:
i = obj.getButton(KEY_CHANGED)       # Переменная i будет установлена в True, если кнопка нажимается или отпускается.
j = obj.getButton(KEY_TIME_PRESSED)  # Переменная j содержит время удержания кнопки в миллисекундах.

Функция setCalibration_X()

  • Назначение: Калибровка координат по оси X.
  • Синтаксис: setCalibration_X( ЛЕВО , ЦЕНТР , ПРАВО )
  • Параметры:
    • ЛЕВО - значение АЦП соответствующее крайнему левому положению джойстика.
    • ЦЕНТР - значение АЦП соответствующее центральному положению джойстика.
    • ПРАВО - значение АЦП соответствующее крайнему правому положению джойстика.
  • Возвращаемое значение: bool - результат сохранения калибровочных значений (true или false).
  • Примечание:
  • Значения АЦП для оси X можно получить функцией getADC_X() или getADC(), предварительно установив джойстик в требуемое положение.
  • Калибровочные значения, указанные функцией setCalibration_X() сохраняются в энергонезависимой памяти модуля, а значит будут действовать и после отключения питания.
  • Калибровка координат по оси X влияет только на значения которые, после калибровки, будут возвращать функции getPosition_X() и getPosition().
  • После калибровки, координаты положения джойстика будут рассчитываться модулем следующим образом:
    • Если джойстик находится левее центра, то координата джойстика getPosition_X() будет равна значению АЦП getADC_X() преобразованному от диапазона ЛЕВО...ЦЕНТР к диапазону -100...0.
    • Если джойстик находится в центре (в положении где значение АЦП getADC_X() равно значению ЦЕНТР ), то координата джойстика getPosition_X() будет равна 0.
    • Если джойстик находится правее центра, то координата джойстика getPosition_X() будет равна значению АЦП getADC_X() преобразованному от диапазона ЦЕНТР...ПРАВО к диапазону 0...100.
  • Если требуется повернуть направление координат по оси X (так что бы крайнему левому положению соответствовала координата 100, а крайнему правому, координата -100), то функцию необходимо вызвать с параметрами указанными в обратном порядке setCalibration_X( ПРАВО , ЦЕНТР , ЛЕВО ).
  • Пример:
obj.setCalibration_X( 0 , 2047 , 4095 )

Функция setCalibration_Y();

  • Назначение: Калибровка координат по оси Y.
  • Синтаксис: setCalibration_Y( НИЗ , ЦЕНТР , ВЕРХ );
  • Параметры:
    • int НИЗ - значение АЦП соответствующее крайнему нижнему положению джойстика.
    • int ЦЕНТР - значение АЦП соответствующее центральному положению джойстика.
    • int ВЕРХ - значение АЦП соответствующее крайнему верхнему положению джойстика.
  • Возвращаемое значение: bool - результат сохранения калибровочных значений (true или false).
  • Примечание:
  • Значения АЦП для оси Y можно получить функцией getADC_Y() или getADC(), предварительно установив джойстик в требуемое положение.
  • Калибровочные значения, указанные функцией setCalibration_Y() сохраняются в энергонезависимой памяти модуля, а значит будут действовать и после отключения питания.
  • Калибровка координат по оси Y влияет только на значения которые, после калибровки, будут возвращать функции getPosition_Y() и getPosition().
  • После калибровки, координаты положения джойстика будут рассчитываться модулем следующим образом:
    • Если джойстик находится ниже центра, то координата джойстика getPosition_Y() будет равна значению АЦП getADC_Y() преобразованному от диапазона НИЗ...ЦЕНТР к диапазону -100...0.
    • Если джойстик находится в центре (в положении где значение АЦП getADC_Y() равно значению ЦЕНТР ), то координата джойстика getPosition_Y() будет равна 0.
    • Если джойстик находится выше центра, то координата джойстика getPosition_Y() будет равна значению АЦП getADC_Y() преобразованному от диапазона ЦЕНТР...ВЕРХ к диапазону 0...100.
  • Если требуется повернуть направление координат по оси Y (так что бы крайнему нижнему положению соответствовала координата 100, а крайнему верхнему, координата -100), то функцию необходимо вызвать с параметрами указанными в обратном порядке setCalibration_Y( ВЕРХ , ЦЕНТР , НИЗ ).
  • Пример:
obj.setCalibration_Y( 0 , 2047 , 4095 )

Функция getCalibration_X()

  • Назначение: Запрос калибровочных значений используемых модулем для расчёта координат оси X.
  • Синтаксис: ЛЕВО, ЦЕНТР, ПРАВО = getCalibration_X()
  • Параметры: нет
  • Возвращаемое значение: три значения калибровки джойстика оси X
  • Примечание:
    • Функция getCalibration_X() читает калибровочные значения установленные функцией setCalibration_X().
  • Пример:
a, b, c = obj.getCalibration_X()  # Читаем установленные калибровочные значения для оси X.
obj.setCalibration_X(c, b, a)     # Устанавливаем прочитанные значения, но в обратном порядке.

Результатом приведённого примера будет смена направления координат по оси X. Если крайнему левому положению соответствовала координата -100, а крайнему правому +100, то теперь крайнему левому положению будет соответствовать координата +100, а крайнему правому -100. Центральное положение оставлено без изменений.

Функция getCalibration_Y()

  • Назначение: Запрос калибровочных значений используемых модулем для расчёта координат оси Y.
  • Синтаксис: НИЗ , ЦЕНТР , ВЕРХ = getCalibration_Y()
  • Параметры:
  • Возвращаемое значение: три значения калибровки джойстика оси Y
  • Примечание:
    • Функция getCalibration_Y() читает калибровочные значения установленные функцией setCalibration_Y().
  • Пример:
a, b, c = obj.getCalibration_Y()  # Читаем установленные калибровочные значения для оси Y.
obj.setCalibration_Y(c, b, a)     # Устанавливаем прочитанные значения, но в обратном порядке.

Результатом приведённого примера будет смена направления координат по оси Y. Если крайнему нижнему положению соответствовала координата -100, а крайнему верхнему +100, то теперь крайнему нижнему положению будет соответствовать координата +100, а крайнему верхнему -100. Центральное положение оставлено без изменений.

Функция setDeadZone()

  • Назначение: Установка мертвой зоны центрального положения джойстика.
  • Синтаксис: setDeadZone( ЗОНА );
  • Параметр: ЗОНА - значение от 0.0% до 25.5%, с шагом 0,1.
  • Возвращаемое значение: результат применения новой зоны (True или False).
  • Примечание:
    • Устанавливаемое значение определяет размер мёртвой зоны у центрального положения джойстика. Этот показатель определяет, на сколько % требуется отклонить джойстик от центрального положения (по любой оси), что бы его координаты начали меняться. Пока джойстик находится в мёртвой зоне, его координаты будут равны 0:0.
    • Мёртвая зона, это зона не чувствительности к отклонению джойстика. Она позволяет избежать "дрожание" (jitter) координат джойстика в центральном положении.
    • Мёртвую зону можно использовать в проектах, где управление устройствами должно начинаться после значительного сдвига джойстика от центра.
    • Размер мёртвой зоны сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
  • Пример:
obj.setDeadZone(23.4)  # Установить мёртвую зону в 23,4% от полного хода джойстика из центра к любому краю.

Функция setAveraging()

  • Назначение: Установка коэффициента усреднения показаний.
  • Синтаксис: setAveraging( КОЭФФИЦИЕНТ )
  • Параметр: КОЭФФИЦИЕНТ - значение от 0 до 255, определяющее сглаживание показаний АЦП и координат по осям X и Y.
  • Возвращаемое значение: bool - результат применения нового усреднения (true или false).
  • Примечание:
    • Чем выше сглаживание, тем плавнее будут меняться показания АЦП, а значит плавнее будут меняться координаты положения джойстика, даже если джойстик отклоняется резко.
    • Значение 0 означает что сглаживание показаний отключено. Значение по умолчанию 2.
    • Сглаживание показаний может понадобиться в проектах, где требуется плавное управление.
    • Коэффициент усреднения показаний сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
  • Пример:
obj.setAveraging(150)  # Увеличить сглаживание до 150, это приведёт к большой инерционности получаемых координат.

Ссылки:




Обсуждение

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