Как компенсировать значение смещения джойстиков в нейтральном положении?
У меня есть джойстик, который выводит значения от 0 до 4095. Я хочу сопоставить эти значения следующим образом (да, предназначено обратное сопоставление):
outputValue = map(inputValue, 4095, 0, -2048, 2047);
Однако нейтральное центральное положение джойстика смещено, поэтому выводится 145 вместо 0.
Есть ли способ сопоставить эти значения, принимая во внимание значение смещения, и при этом иметь выходные значения в диапазоне от -2048 до 2047? Мне не удается сделать это только с помощью функции map(), и мне может понадобиться помощь по конкретной математике.
@Erik, 👍2
Обсуждение1 ответ
Лучший ответ:
Можно только приблизиться, чем-то придется пожертвовать.
Основная проблема заключается в том, что ваш диапазон ввода асимметричен относительно средней точки. Давайте представим это так (с небольшим визуальным преувеличением):
min mid max
0----------------------2193-----4095
Другая проблема заключается в том, что весь диапазон 0..4095 может быть физически недоступен для джойстика, поэтому ваш полезный диапазон может выглядеть следующим образом:
min mid max
433---------------2193-------3722
Итак, чтобы откалибровать джойстик, вам необходимо измерить минимальную, среднюю и максимальную точки, которых вы можете физически достичь с помощью именно этого джойстика на шкале ввода (джойстики являются аналоговыми устройствами, поэтому их фактические диапазоны могут отличаться от джойстика к джойстику). и даже от оси к оси одним и тем же физическим джойстиком).
Теперь, если у вас есть эти числа (я называю эти значения калибровки joy_min
, joy_mid
и joy_max
), вам нужно сопоставьте
обе части вашего диапазона отдельно:
if( joy_input < joy_mid ) {
output = map(joy_input, joy_min, joy_mid, -2048, 0);
} else {
output = map(joy_input, joy_mid, joy_max, 0, 2047);
}
Обратной стороной является то, что любой шаг в выходных данных может представлять собой немного другое расстояние в движении, в зависимости от того, находитесь ли вы в данный момент ниже или выше измеренной средней точки int. Но я ожидаю, что это будет незначительно.
Также имейте в виду, что это только для одной оси джойстика. Для другой оси вам могут потребоваться совершенно другие значения калибровки. Кроме того, вы можете захотеть реализовать «мертвую зону»; вокруг средней точки, т.е. всегда возвращая output = 0
для joy_mid-10 < радость_вход < joy_mid+10
или что-то в этом роде.
И поскольку диапазон джойстика может меняться (в зависимости от температуры, возраста и т. д.), а map
не ограничивает диапазон вывода, было бы неплохо применить вывод = constrain(output, -2048, 2047)
после этого.
(В моем коде я предполагаю, что вы хотите сопоставить 0..4095 с -2048..2047, как вы говорите в тексте; но в вашем коде вы сопоставляете 4095..0 с -2048..2047, по сути меняет направление. Если эта часть вашего кода верна, а текст нет, просто поменяйте местами -2048 на 2047 в моем коде.)
Спасибо за ваш ответ. Что касается обратного отображения, оно так и задумано. Я обновил свой вопрос., @Erik
- Чтение нескольких аналоговых входных контактов
- Arduino std::map, возвращающий случайные значения
- Вибрационный геймпад Arduino с силовой обратной связью
- Экспонируйте два устройства HID Joystick с одной платой RP2040 (Waveshare Pi Pico Zero)
- Можно ли использовать Arduino UNO для эмуляции джойстика PS4?
- Библиотека джойстиков Arduino не распознается играми (Steam)
- Как использовать защитный экран USB-хост с различными джойстиками HID
- Переменная скорость разгона для двигателей, управляемых джойстиком
ваш джойстик может иметь механическую регулировку, @jsotola