Как компенсировать значение смещения джойстиков в нейтральном положении?

joystick map

У меня есть джойстик, который выводит значения от 0 до 4095. Я хочу сопоставить эти значения следующим образом (да, предназначено обратное сопоставление):

outputValue = map(inputValue, 4095, 0, -2048, 2047);

Однако нейтральное центральное положение джойстика смещено, поэтому выводится 145 вместо 0.

Есть ли способ сопоставить эти значения, принимая во внимание значение смещения, и при этом иметь выходные значения в диапазоне от -2048 до 2047? Мне не удается сделать это только с помощью функции map(), и мне может понадобиться помощь по конкретной математике.

, 👍2

Обсуждение

ваш джойстик может иметь механическую регулировку, @jsotola


1 ответ


Лучший ответ:

6

Можно только приблизиться, чем-то придется пожертвовать.

Основная проблема заключается в том, что ваш диапазон ввода асимметричен относительно средней точки. Давайте представим это так (с небольшим визуальным преувеличением):

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