Тензоджойстик на четырёх весовых датчиках
( Если у вас не отображаются картинки, используйте VPN клиент )
Макет этого джойстика я собрал после прочтения ветки форума: Для чего годятся джойстики на тензодатчиках?
Особенности джойстика:
Возможна работа с HX711 и c INA122. Пара HX711 считывается с синхронно. У них общий провод SCK.
Работа с разными расположениями тензобалок на основании. Нужно только, чтобы тензобалки образовывали круговой массив с шагом 90 градусов, симметричный относительно центра.
Автоматическая центровка при включении.
Добавлена возможность регулировки жёсткости РУС потенциометром "softstick-hardstick".
Добавлены кнопки "Trimmer" и "Center" (сброс триммера).
Частота обновления данных 80Гц для HX711 и 100Гц для INA122.
Поддерживаются, кроме осей РУС, ещё до шести дополнительных аналоговых осей.
Поддерживаются до 16 кнопок, не считая кнопки "Trimmer" и "Center".
Использована библиотека ArduinoJoystickLibrary
РУС
В джойстике на весовых датчиках в качестве датчиков осей X и Y использованы две пары тензобалок. В отличие от обычных джойстиков, РУС не отклоняется от центра, всегда остаётся в вертикальном положении. На выходные координаты влияет только давление руки, приложенное к РУС, чтобы отклонить его от центра.
Сигнал отклонения с каждой пары балок подаётся на пару АЦП HX711. Код с АЦП считывается в Ардуино Pro Micro:
На модулях HX711 есть перемычка, установленная в положение "10Hz". Нужно её отпаять и подсоединить в положение "80Hz". Тогда окажутся соединены контакты 15 и 16 в чипе HX711.
В Ардуино считывается последовательный код с контактов DTX и DTY. Считывание с обоих АЦП HX711 осуществляется синхронно, по общему управляющему сигналу SCK, идущему из Ардуино.
Можно вместо АЦП HX711 применить пару инструментальных ОУ INA122 или аналогичных. Усиленные сигналы с пары INA122 подаются на аналоговые входы АЦП в Ардуино Pro Micro. Но этот вариант дороже и сложнее в настойке. Не буду приводить схему включения, но её можно найти на форуме: Для чего годятся джойстики на тензодатчиках?
Тензобалки закреплены на основании так, чтобы образовался круговой массив из четырёх балок с шагом 90 градусов, симметричный относительно центра.
Угол установки датчиков относительно РУС может быть любым. Угол задаётся в скетче. Таким образом, весовые датчики могут быть установлены "крестом" или "квадратом":
#define rotation_angle 0
#define rotation_angle 0
#define rotation_angle -45
#define rotation_angle 32.7
Для макета настольного джойстика я выбрал вариант расположения тензобалок "квадратом". При таком расположении на основании занято минимум места и остаётся больше свободного места для кнопок, дополнительных осей и самой Ардуино:
#define rotation_angle 32.7
Вид снизу. Видны винты и втулки крепления к основанию.
Я использовал четыре весовых датчика на 5kG с размерами 75x12,5x12,5мм с резьбой для винтов M4.
Основание джойстика и верхняя панель для крепления тензобалок и переходника ручки я сделал из ламината толщиной 6,8 мм. Размеры 150x150 и 95x95 мм. Ламинат обладает большой жёсткостью и не прогибается, в то же время ламинат лёгок в обработке.
Очень важно просверлить отверстия для крепления тензобалок с максимальной точностью. Для этого я распечатал разметку отверстий на принтере и приклеил её клеем ПВА на заготовки. Отверстия наколол по чертежу шилом. Сверлил сначала на половину глубины сверлом 1мм, после этого стёр мокрой губкой всю бумагу с разметкой и клеем ПВА. Затем просверлил сквозные отверстия 2,8мм. Для тензобалок отверстия рассверлил сверлом 4мм. Для проводов в РУС рассверлил центральное отверстие до 8мм.
Эскиз разметки сразу для всех моих вариантов крепления балок в Spint-Layout 6.0:
К верхней панели четыре тензобалки привинчены восемью винтами M4x20 через прокладки из фольгированного стеклотекстолита толщиной 1,5мм. На разметке это жёлтые прямоугольники. Я пробовал заземлять тензобалки, подключением этих прокладок к GND, но никакого снижения шума это не дало. Поэтому можно использовать прокладки из любого твёрдого материала толщиной 1-2мм.
Ручка РУС прикреплена к верхней панели через напечатанный на 3D принтере переходник четырьмя винтами M3x15. Ручка 90х годов от старинного джойстика Kempston для ZX-Spectrum ( ZX-Spectrum: когда трава была зеленее... ). Для испытаний макета джойстика вполне сгодится.
К нижней панели тензобалки привинчены четырьмя винтами M4x20 через втулки диаметром 12мм, высотой 5мм и отверстием 4,2 мм. Втулки напечатаны на 3D принтере. Высота втулок должна быть достаточной, чтобы провода от всех четырёх балок и из ручки РУС свободно прошли под балками и были не зажаты между балкой и основанием.
Все двенадцать винтов M4 должны быть туго затянуты и с одинаковым усилием. Если один из винтов, особенно на верхней панели, будет слишком сильно или слишком слабо затянут, это может привести к искажениям отклика джойстика в соответствующем углу.
Дополнительные оси
Кроме РУС в макете джойстика подключен потенциометр аналоговой оси Z . Всего к РУС можно добавить до 6 аналоговых осей, которые будут видны в драйвере джойстика.
Также подключен потенциометр регулировки жёсткости джойстика "softstick-hardstick", которым можно регулировать усилие максимального отклонения РУС. Эта ось не видна в драйвере джойстика.
Я использовал переменные резисторы 10 kOm c линейной характеристикой:
Кнопки
Всего в макете джойстика используются четыре кнопки. Один вывод у каждой кнопки подключен к GND, а другой вывод к отдельному цифровому входу Ардуино:
Две кнопки - это кнопки самого джойстика. Всего можно подключить до 16 кнопок. Они будут видны в драйвере джойстика.
Ещё две кнопки "Trimmer" и "Center".
Кнопка "Trimmer" позволяет установить новое центральное положение РУС, если самолёт выпустил закрылки или самолёт получил повреждения и не может лететь прямо. Порядок действий такой:
Выровнять самолёт по крену и тангажу при помощи РУС.
Нажать и удерживать кнопку "Trimmer". На Ардуино при этом загорится светодиод, а самолёт перестанет реагировать на отклонения РУС, то есть будет лететь в выровненном положении.
Теперь отпустить РУС, чтобы он вернулся в центральное положение.
Наконец, отпустить кнопку "Trimmer". Светодиод на Ардуино погаснет, а РУС снова получит управление самолётом.
Кнопка "Center" сбрасывает триммер в центр. Её нужно просто кратковременно нажать. После этого выровнять самолёт.
Настройки скетча и прошивка
Скетч LoadCellsJoy.rar
Все настройки скетча собраны в файле LoadCellsJoy.ino и снабжены подробными комментариями.
Настройки РУС при использовании HX711 ( #define useHX711 1 ):
#define DTX 4 // D4/A6 - X axe
#define SCK 5 // D5
#define DTY 6 // D6/A7 - Y axe
- цифровые контакты Ардуино Pro Micro, к которым подключена пара модулей HX711. Сигнал SCK общий для обоих модулей HX711.
Настройки РУС при использовании пары ОУ INA122 ( #define useHX711 0 ):
#define pin_axeX A0
#define pin_axeY A1
- аналоговые входы АЦП Ардуино Pro Micro, к которым подключена пара ОУ INA122.
Общие настройки РУС:
#define rotation_angle 32.7
- поворот тензобалок на основании джойстика относительно расположения балок "крестом". Значение 32.7 градуса - для расположения балок "квадратом". На чертеже с разметкой я пометил откуда взялся этот странный угол.
#define invertX 1 // инвертирование оси X
#define invertY 1 // инвертирование оси Y
- иногда поворота недостаточно. Если перепутаны местами балки или провода, проще инвертировать неправильную ось.
#define use_loadcontrol 1
#define pin_loadcontrol A1
- задано управление жёсткостью РУС от потенциометра "softstick-hardstick", подключенного к входу АЦП A1.
#define hardstick 512
#define softstick 200
- при повороте потенциометра регулировки жёсткости джойстика "softstick-hardstick" жёсткость будет изменяться в пределах 200...512. Для джойстика с INA122 hardstick не может быть больше 512 ( половина диапазона АЦП ).
#define roll2pitch 1.0
- в реальных самолётах загрузка по тангажу часто больше загрузки по крену. Если уменьшить roll2pitch до 0.5, управление по крену будет легче управления по тангажу в 2 раза.
#define quadratic 0
- Использование квадратичной кривой отклика осей X и Y (0 .. 2):
0 - линейный отклик. Это лучший выбор для опытных пилотов.
1 - квадратичный отклик по отклонению каждой из осей от центра по отдельности. Увеличивает точность джойстика в центре и уменьшает шум вблизи центра, но появляется "рельсовость" - отклонение вдоль осей проще отклонения по диагоналям. Круги вокруг центра в джойтестере становятся ромбами. Квадраты в джойтестере остаются квадратами.
2 - квадратичный отклик по отклонению положения РУС от центра. Увеличивает точность джойстика в центре и уменьшает шум вблизи центра, "рельсовость" не появляется. Круги вокруг центра в джойтестере остаются кругами. Квадраты в джойтестере становятся подушкообразными, с заострёнными углами. Но с этим вариантом новичкам удобнее целиться.
#define alpha 0.25
- Коэффициент экспоненциального фильтра осей 0.10..1.00.
0.10 - сглаженный отклик, шум заметно ослаблен.
0.25 - оптимальный отклик, шум средний.
1.00 - мгновенный отклик, шум не подавлен.
#define joyfreq 100 // Hz
- Частота опроса датчиков, в Герцах. Это значение не зачем менять.
100 Гц оптимально для джойстика с ОУ INA122 при частоте сети 220V 50Hz.
С АЦП HX711 в любом случае не получится более 80Гц (на практике 82Гц)
#define maxaxe 2046
- выходной диапазон осей X и Y для драйвера джойстика в Windows. Если ( quadratic > 0 ), то шум в центре снижен и можно увеличить значение maxaxe до 4094 или даже до 8194.
Для чёткого центра в джойтестере лучше выбирать значение степени двойки минус два ( 2046 = 2 ^ 11 - 2 ).
Дополнительные оси:
Кроме двух осей РУС X и Y, можно подключить дополнительные аналоговые оси к аналоговым входам АЦП A0 .. A7, всего до шести дополнительных осей.
В моём макете подключена одна дополнительная ось Z:
#define use_axeZ 1
#define pin_axeZ A0
#define inv_axeZ 0
Здесь указано, что ось Z подключена к контакту A0 и не инвертирована.
Остальные оси подключаются аналогично.
Кнопки джойстика:
Всего можно подключить до 16 кнопок, которые будут видны в драйвере джойстика. Один контакт у каждой кнопки соединён с GND, другой контакт подключен на любой цифровой вход Ардуино.
В моём макете подключены две кнопки:
#define Key01 16
#define Key02 14
Номера подключаемых кнопок должны быть без пропусков. Например, если будут заданы:
#define Key01 n
#define Key05 n
#define Key03 n
#define Key02 n
- то у джойстика будут только 3 кнопки Key01 .. Key03 , потому что Key04 пропущена.
Дополнительные полезные кнопки "Center" и "Trimmer" могут быть добавлены, и они не будут видны в драйвере джойстика. То есть физических кнопок может быть до 18 штук.
#define KeyCenter 9
#define KeyTrimmer 10
Если добавлена только кнопка "Center", она будет делать центровку джойстика по X и Y, а если добавлены обе кнопки, тогда кнопка "Center" будет сбрасывать триммер.
Если эти кнопки не нужны, нужно их задать равными 0.
Отладочный вывод в COM-порт.
#define serialdebug 0
Если включить serialdebug 1 , то кроме джойстика в Windows появится ещё и COM-порт, куда выводится на скорости 115200 некоторые текущие значения джойстика:
Новые значения в вывод можно добавлять в файле cpp/LoadCellsJoy.cpp , в самом конце.
Этот режим нужен только для решения проблем и для разработки, поэтому лучше его отключить: serialdebug 0
Наконец, в последней строке подключается основной скетч, поэтому эту строку нельзя изменять:
#include "cpp/LoadCellsJoy.cpp"
Таким образом, у меня получился макет джойстика с тремя осями, с двумя кнопками, с дополнительной осью "softstick-hardstick" и с дополнительными кнопками "Center" и "Trimmer":
Компиляцию и прошивку я делал в Arduino IDE 1.8.9. Для прошивки выбрал плату "Leonardo". Всё, как обычно.
После прошивки, или при подключении джойстика, на Ардуино загорится светодиод, затем светодиод в течение секунды поморгает во время настройки центра и погаснет. При подключении нельзя трогать РУС, чтобы центровка была верной.
Если светодиод загорелся и не моргает, значит скетч завис при считывании HX711. Нужно проверить, верно ли указаны контакты DTX, DTY, SCK в скетче, проверить монтаж или заменить модули HX711 на исправные.
Если всё сделано правильно, в Windows появится джойстик "Arduino Leonardo":
Видео
Заключение
Тензоджойстик очень отличается по управлению от традиционных джойстиков. РУС почти не двигается, отклоняется лишь на 3 .. 5 мм из-за упругой деформации пластиковых частей и резиновых ножек. Но если смотреть не на РУС, а в монитор, то есть полное ощущение отклонения и сопротивления отклонению РУС.
В положении "softstick" джойстик очень чувствителен. Кажется, что он реагирует уже на само намерение отклонения РУС или даже на пульс в руке. Сложно прицелиться.
В положении "hardstick" джойстик совсем жёсткий. Удобно целиться, но сложно делать длительные виражи, рука устаёт. Долго в одном положении РУС удерживать трудно. Хочется скорее завершить манёвр и опять вернуть РУС в центральное положение. Поэтому я добавил кнопку "Trimmer".
В любом случае, тензоджойстик настолько необычен, прост по конструкции и не дорог, что имеет смысл его собрать и опробовать в деле.
В дальнейшем может получиться интересно, если считывать телеметрию из игры и по ней управлять жёсткостью РУС и положением триммера. Для этого может пригодиться имеющаяся поддержка COM порта. Вполне возможно, что это будет похоже на действие FFB.
Ссылки
Скетч LoadCellsJoy.rar
Разметка Tenzo_BaseHoles.lay6
Вторая часть: Тензоджойстик на трёх весовых датчиках.
Обсудить: Для чего годятся джойстики на тензодатчиках?
Удачи!
#diy #straingauge #loadcell #joysticks