FlatGyroJoy

Razor AHRS 5DOF      Opentrack      Джойстик      Donate 

FlatGyroJoy - гироджойстик и гироштурвал


Всем привет!

Если вы видели мои видео о 5DOF трекере, то, наверное, обратили внимание, что при наклонах нижнего модуля Neck, в нижней части окна Калибратора по координатной сетке очень точно движется зелёный шарик.

Движение шарика очень похоже на тест джойстика в джойтестере, не так ли ?!

А не построить ли нам на этом датчике гироскопический джойстик или штурвал ?!

Легко:

Видим, что распространённый и очень дешёвый модуль GY521 можно с успехом использовать  в качестве двухосевого датчика джойстика.

В инерциальном измерительном модуле GY521 установлен чип MPU6050, который программно совместим с чипом MPU6500. Поэтому можно использовать модули с чипом MPU6500 без изменения скетча. Обычно в MPU6500 ещё встроен магнитометр AK8963, поэтому такие модули дороже, чем GY521. Нам магнитометр для джойстика не нужен, поэтому специально покупать такие модули незачем, лучше взять дешёвый GY521. Но если модули с MPU6500 уже есть и лежат дома в коробке без дела, почему бы их не использовать?!

Я испытал работу джойстика с модулями GY521, GY9250 и GY91:

Возможны разные варианты конструкции гироджойстика.

Гироштурвал

( макет )

Инерциальный измерительный модуль ( IMU ) уменьшает требования к механике джойстика, в частности, к точности и люфтам механики. Достаточно жёстко ( жёстко - это важно, то есть без люфтов! ) закрепить IMU в ручке джойстика и он будет отслеживать отклонения от центра только самой ручки. Люфты в механике уже не страшны. Это видно на примере макета гироштурвала.

Гироджойстик

( макет )

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

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

Под верхней крышкой находится плоская круглая панель с приклеенным модулем GY521.

Основание джойстика заполнено мелкой свинцовой дробью, для смещения центра тяжести вниз, и залито клеем ПВА, чтобы предотвратить смещение дробинок при отклонении РУС от центра.

Такая конструкция типа "кукла-неваляшка" обеспечивает чёткий возврат в центр при полном отсутствии механики.

Но есть и небольшие недостатки такой конструкции.

Усилие отклонения в макете с диаметром основания 75 мм всё же маловато. При увеличении диаметра и массы основания можно получить большее усилие. Так как масса увеличивается пропорционально кубу размера, при увеличении размеров джойстика в два раза - до 150 мм, масса джойстика и усилие отклонения должны увеличиться в 8 раз!

При отпускании РУС происходят довольно продолжительные колебания вокруг центрального положения из-за малого трения между основанием и столом. Длительность этих колебаний можно сократить почти до нуля, если катать джойстик по мышиному силиконовому коврику. Коврик хорошо демпфирует колебания.

Геймпад

Ну и самый простой способ сделать макет гироджойстика - это выполнить его в виде геймпада.

Достаточно из куска фанеры выпилить контур, похожий на геймпад, и закрепить на нём Arduino Pro Micro, модуль GY521, несколько кнопок и потенциометры по желанию.

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

Скетч FlatGyroJoy

Для применения IMU в джойстике разработан скетч FlatGyroJoy ( на основе скетча RingButtonBox ), который позволяет создать джойстик, штурвал или геймпад со следующими параметрами:

Также поддерживаются дополнительные кнопки для управления джойстиком, которые не видны в драйвере джойстика, это:

В тестировании скетча FlatGyroJoy принял активное участие камрад @bunik , за это ему огромное Спасибо!

Схема соединений

В джойстике может применяться Arduino Pro Micro или Arduino Leonardo, с микроконтроллером ATMega32U4 на 16MHz и 5V.

В показанных макетах модуль GY521 и четыре кнопки подключенны к Arduino Pro Micro по следующей схеме: 

Схема гироджойстика с двумя осями X и Y, с тремя кнопками и с одной дополнительной кнопкой "Center".


Скетч FlatGyroJoy обладает большой гибкостью в настройках, поэтому есть почти полная свобода при составлении схемы подключений.

Контакты SDA и SCL модуля GY521 могут быть подключены к любым из 18 входных контактов Arduino Pro Micro, так как в скетче используется софтовый I2C. Если контакты SDA и SCL подключены к контактам 2 и 3 Arduino, то можно использовать и встроенный в Arduino аппаратный I2C, но никаких преимуществ аппаратный I2C не даёт, а размер прошивки получается даже больше.

Кнопки, хатки и энкодеры могут быть подключены к любым из оставшихся свободными 16 входных контактов Arduino. Можно использовать прямое подключение кнопок и одновременно матрицы кнопок - кольцевую и прямоугольную. Всё точно так же, как в скетче RingButtonBox

Дополнительные аналоговые оси на потенциометрах или датчиках Холла могут быть подключены только к свободным входам АЦП Arduino, поэтому составление своей схемы соединений нужно начать с аналоговых осей. Аналоговые входы АЦП это контакты A3, A2, A1, A0, 10, 9, 8, 6 и 4.

Также нужно не забыть припаять перемычку J1 рядом с контактом TXO. С перемычкой Arduino Pro Micro работает стабильнее при питании от USB.

Настройки скетча FlatGyroJoy

Скетч FlatGyroGoy создан на основе скетча RingButtonBox . Большинство настроек осталось прежними. Поэтому я расскажу о новых настройках, связанных с поддержкой модуля GY521 и введением дополнительных служебных кнопок.

Настройки модуля GY521

#define PointerSize       2

PointerSize может принимать значения:


#define AD0               0

AD0 задаёт - подключен или нет резистор 3kOm между контактами AD0 и VCC модуля GY521. Обычное значение 0.


#define sdaPin          SDA

#define sclPin          SCL

Если в скетче заданы пины sdaPin и sclPin, то используется софтовый I2C, даже если их значения равны SDA и SCL. Если закомментировать или удалить эти строки, то будет использоваться аппаратный I2C, но тогда для подключения GY521 должны использоваться контакты 2 и 3 (то есть SDA и SCL) Arduino Pro Micro. При софтовом I2C можно использовать для подключения GY521 любую пару свободных входных контактов Arduino Pro Micro, размер прошивки получится даже меньше.


#define Orientation       XB_YR

- ориентация модуля GY521 в центральном положении.

На модуле нарисованы стрелки X и Y. Значение XB_YR означает, что в центральном положении джойстика стрелка X приблизительно указывает назад (Back), а стрелка Y приблизительно указывает направо (Right). Всего доступны 24 варианта значения Orientation:








#define KP                5.0

//#define KI              0.005

KP и KI - пропорциональный и интегральный коэффициенты PI регулятора. Коэффициенты KP и KI задают насколько быстро накапливающиеся ошибки гироскопа рассеиваются акселерометром. Настройка коэффициентов PI регулятора это дело вкуса и личных предпочтений. Об этом я немного расскажу ниже.


#define gyroalpha         0.5 // 0.10..1.00

- коэффициент экспоненциального фильтра гироосей модуля GY521. Помогает уменьшить дрожание выхода джойстика при большом коэффициенте KP.

Чем меньше коэффициент gyroalpha, тем более сглаженным будут изменения значений осей и меньше дрожание.

Чем больше коэффициент gyroalpha, тем быстрее будет реакция на поворот, но и шум будет заметнее.


//#define maxgyro         300     // ограничитель максимальной скорости поворота, град/сек.

//#define deltaPmax         2

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

maxgyro задаёт максимальную скорость поворота ( град / сек ), при превышении этого порога данные гироскопа отбрасываются, как недостоверные из-за удара.

deltaPmax задаёт максимальный коэффициент _delta_p. Это ограничивает скорость подстройки акселерометра, с той же целью.

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


#define CalibrateTimes 200     // количество калибровочных измерений при включении

#define CenteringTimes 300     // количество циклов центровки при включении

- эти настройки влияют на процесс включения джойстика. При включении джойстик должен быть неподвижным и должен находиться в центральном положении. Во время калибровки и центровки в течение 5 секунд моргает светодиод. Когда светодиод погаснет, джойстик выйдет в рабочий режим.

CalibrateTimes 200 - задаёт количество калибровочных измерений при включении. При этом 200 раз в течение 2 секунд будут измерены значения гироскопа и вычислено среднее значение смещения гироскопа с погрешностью 1 / 200 = 0,5%.

CenteringTimes 300 - задаёт количество циклов центровки при включении. При этом 300 раз в течение 3 секунд будет определено положение джойстика, соответственно, будут постепенно приближаться к рабочему значению переменные PI регулятора, и последнее измеренное положение будет считается центральным положением джойстика.


Настройки кнопок

Кнопки джойстика настраиваются точно так же, как в RingButtonBox 

Для моего варианта схемы я задал список контактов в любом порядке, к которым напрямую подключены кнопки ( 3 кнопки джойстика и кнопка Center ):

#define DirectKeysPins   16,14,9,10 

Затем проверил сканкоды кнопок в Мониторе порта командой #scan и записал сканкоды кнопок джойстика по порядку в список:

#define RemapButtons     0,  1,  2

Задал количество кнопок джойстика:

#define BUTTONcount      3


Дополнительные кнопки

В скетч FlatGyroJoy добавлены дополнительные служебные кнопки, которые не видны в драйвере джойстика:

#define KeyCenter        3

- кнопка центровки. Необходима, если джойстик не имеет чёткого возврата в центр, например в случае геймпада. Также эта кнопка сбрасывает триммер в центр. 3 - это сканкод кнопки центровки.

#define KeyTrimmer       nc

- кнопка триммирования. Работает точно так же, как в тензоджойстике :

Я не уверен, нужна ли эта кнопка в гироджойстике.


#define KeyActivated    nc

- Кнопка активации джойстика. При удерживаемой кнопке джойстик передаёт данные в комп. При отпущенной данные в комп не идут. Кнопка может быть полезна, если нужно отлучиться от компа во время полёта. Логично выполнить эту кнопку в виде выключателя, чтобы постоянно не удерживать. Конечно, далеко не всем нужна эта кнопка.


#define KeyCalibrate    nc

- кнопка калибровки. Может быть полезна для перекалибровки джойстика без переподключения к USB. Если модуль GY521 при включении джойстика не был неподвижен, или температура модуля GY521 сильно изменилась, то может потребоваться эта кнопка. При нажатии кнопки калибровки модуль GY521 должен быть неподвижен и желательно, чтобы он находился в центральном положении. В течение 5 секунд гироскоп откалибруется и будет сделана центровка джойстика, всё это время на Ардуино моргает светодиод.

Не думаю, что эта кнопка особо нужна.


Отключить ненужные служебные кнопки можно, задав вместо сканкода значение nc (not connected) или удалить ( закомментировать ) эту строку.


Настройки PI регулятора

В скетче FlatGyroJoy есть интересные коэффициенты:

#define KP                5

//#define KI              0.005

Это коэффициенты PI регулятора.

PI регулятор - это частный случай PID регулятора, с нулевой дифференциальной составляющей. О работе и настройке PID регулятора неплохо рассказано здесь: ПИД-регуляторы – для чайников-практиков

KP - пропорциональный коэффициент PI регулятора. Чем больше KP, тем быстрее акселерометр рассеивает ошибки гироскопа. Но и выход становится более шумным. При слишком большом KP возможно самовозбуждение.

Действие коэффициента KP похоже на пружину, закрывающую дверь. Если в дверь дует слишком сильный сильный ветер ( смещение гироскопа ), то дверь может остаться приоткрытой ( не будет полного возврата в центр ).

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

С одним коэффициентом KP, без коэффициента KI, переходный процесс становится экспоненциальным. Это наиболее естественный отклик.

В целом, выбор величин коэффициентов KP и KI - это всегда компромисс между точностью, длительностью переходного процесса и шумностью выхода. Во многом, это дело вкуса.

Команды Монитора порта

При включенном в скетче SerialDebug 1, в "Мониторе порта" на скорости 115200 можно вводить команды для проверки джойстика. 

Используются те же команды, что и для RingButtonBox .

Но появились и новые команды.

#init [Отправить] ( можно #i ).

- заново инициализирует шину I2C и модуль GY521. Команда позволяет определить, верно ли подключен ( припаян ) модуль GY521. При удачной инициализации получим ответ:

Sensor init with AD0=0: OK

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


#raw [Отправить] ( можно #r ).

- включает вывод сырых значений акселерометра и гироскопа:

#Raw: A: 0.01 0.01 1.03 | G: -1 0 0

  Команда позволяет определить исправность акселерометра и гироскопа в чипе MPU6050 модуля GY521.

При поворотах модуля GY521 все шесть колонок чисел должны изменяться.

Остановить поток можно командой #0 или #n.


#a0 [Отправить]

- отключает использование акселерометра. Без акселерометра джойстик не знает где верх и где низ. Включить акселерометр можно командой #a1. Команда используется совместно с DXJoyTester или Joy.cpl. Только для проверки работы модуля GY521.


#g0 [Отправить]

- отключает использование гироскопа. Без гироскопа джойстик может работать, но становится очень инерционным, как будто находится в воде или масле. Включить гироскоп можно командой #g1. Команда используется совместно с DXJoyTester или Joy.cpl. Только для проверки работы модуля GY521. Отключение гироскопа может помочь при настройке коэффициентов KP и KI.


Остальные команды достались в наследство от RingButtonBox:

#scan [Отправить] ( можно #s ).

- запускает вывод сканкодов физических кнопок, То есть выводятся сканкоды нажатых кнопок джойстика, дополнительных кнопок, хаток и контактов энкодеров:

#Scan: 0 1 3  - одновременно нажаты кнопки джойстика 1, 2 и служебная кнопка Center

Остановить поток можно командой #0 или #n.


#axes [Отправить] ( можно #a ).

- запускает вывод сырых значений осей с модуля GY521, АЦП и энкодеров. Первые две колонки чисел это оси X и Y в градусах, остальные колонки, если есть, это значения осей на АЦП и энкодерах:

#Axes: 0.79 -0.47

- в моём случае есть только две оси X и Y в градусах. 

Остановить поток можно командой #0 или #n.


#none [Отправить] ( можно #n или #0 ).

- останавливает поток данных через COM-порт. На работу самого джойстика эта команда не влияет. Команда используется для прерывания действия команд #raw, #scan, #axes.

Ответ:

#0: - output stopped

Джойстик при этом продолжает работать.


Этого небольшого набора из семи команд вполне достаточно для проверки и настройки джойстика.

После настройки и окончательной проверки работы джойстика нужно отключить в скетче отладку по COM-порту:

#define serialdebug     0

Это уменьшает вероятность сбоев в работе джойстика при обращениях посторонних программ к COM-порту и заметно сокращает размер прошивки.

Заключение

Модуль GY521 можно с успехом использовать  в качестве двух осевого датчика джойстика.

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