Тензоджойстик на четырёх весовых датчиках

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

( Если у вас не отображаются картинки, используйте VPN клиент )


Макет этого джойстика я собрал после прочтения ветки форума: Для чего годятся джойстики на тензодатчиках?

Особенности джойстика:

РУС

В джойстике на весовых датчиках в качестве датчиков осей 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:

Tenzo_BaseHoles.lay6

К верхней панели четыре тензобалки привинчены восемью винтами 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" позволяет установить новое центральное положение РУС, если самолёт выпустил закрылки или самолёт получил повреждения и не может лететь прямо. Порядок действий такой:

Кнопка "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):


  #define alpha 0.25

- Коэффициент экспоненциального фильтра осей 0.10..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


Вторая часть: Тензоджойстик на трёх весовых датчиках. 

Обсудить: Для чего годятся джойстики на тензодатчиках? 


Удачи!

Joystick 

#diy #straingauge #loadcell #joysticks