FlatGyroJoy
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 ), который позволяет создать джойстик, штурвал или геймпад со следующими параметрами:
максимальное отклонение осей крена и тангажа ( X и Y ) от центра до + / - 90 градусов.
2..8 осей, из них оси X и Y на модуле GY521, остальные оси - на потенциометрах и / или энкодерах.
0..4 хатки - на 8, 4, или 2 положения.
0..128 кнопок.
автоматическая калибровка гироскопа и центровка осей крена и тангажа при включении джойстика.
частота обновления данных 100Гц.
Также поддерживаются дополнительные кнопки для управления джойстиком, которые не видны в драйвере джойстика, это:
Center - центровка осей крена и тангажа и сброс триммера в центр.
Trimmer - триммер осей крена и тангажа. Работает также как в тензоджойстике ( раздел "Кнопки" )
Calibrate - калибровка гироскопа модуля GY521. Эта не очень нужная кнопка, просто на всякий случай.
Activated - кнопка активации джойстика. Если эта кнопка задана, джойстик будет передавать данные в комп, только если кнопка Activated нажата и удерживается. Кнопка может быть полезна для штурвалов без центровки или для геймпадов, если нужно отойти от компа во время полёта.
В тестировании скетча 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 может принимать значения:
0 - оси модуля GY521 не используются. Оси X и Y могут использоваться как аналоговые или на энкодерах. В этом случае FlatGyroGoy работает точно также, как RingButtonBox, без гироосей.
1 - используется только ось X модуля GY521. Ось Y может использоваться как аналоговая или на энкодере. В этом случае можно создать гиропедали или гироруль.
2 - используются обе оси X и Y модуля GY521. Этот вариант для создания джойстика, штурвала или геймпада.
#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:
XF_YU - X forward, Y up
XF_YR - X forward, Y right ( NED orientation )
XF_YD - X forward, Y down
XF_YL - X forward, Y left
XR_YU - X right, Y up
XR_YF - X right, Y right
XR_YD - X right, Y down
XR_YB - X right, Y left
XB_YU - X back, Y up
XB_YR - X back, Y right
XB_YD - X back, Y down
XB_YL - X back, Y left
XL_YU - X left, Y up
XL_YF - X left, Y right
XL_YD - X left, Y down
XL_YB - X left, Y left
XU_YF - X up, Y forward
XU_YR - X up, Y right
XU_YB - X up, Y back
XU_YL - X up, Y left
XD_YF - X down, Y forward
XD_YR - X down, Y right
XD_YB - X down, Y back
XD_YL - X down, Y left
#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
- кнопка триммирования. Работает точно так же, как в тензоджойстике :
Кнопка "Trimmer" позволяет установить новое центральное положение РУС, если самолёт выпустил закрылки или самолёт получил повреждения и не может лететь прямо. Порядок действий такой:
Выровнять самолёт по крену и тангажу при помощи РУС.
Нажать и удерживать кнопку "Trimmer". На Ардуино при этом загорится светодиод, а самолёт перестанет реагировать на отклонения РУС, то есть будет лететь в выровненном положении.
Теперь отпустить РУС, чтобы он вернулся в центральное положение.
Наконец, отпустить кнопку "Trimmer". Светодиод на Ардуино погаснет, а РУС снова получит управление самолётом.
Я не уверен, нужна ли эта кнопка в гироджойстике.
#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 позволяет снизить требования к точности механики джойстика или совсем отказаться от использования механики в джойстике.
Ссылки
Скачать скетч: FlatGyroJoy.rar
Настройки скетча для кольцевой матрицы
Обсудить: FlatGyroJoy - гироджойстик и гироштурвал
Удачи!
#joystick #yoke #inertial #gyroscope #diy