Настройки скетча для кольцевой матрицы

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

Все настройки скетча делаются в файле ino. В папке cpp находятся остальные файлы скетча, эти файлы не нужно изменять без необходимости. Приступим к настройке.

Шаг 1. Задаём подключение кольцевой матрицы к контактам Ардуино.

Находим список контактов кольцевой матрицы:

#define RingMatrixPins   8,  9, 15, 14, 16

и изменяем в ней список контактов на свой. Всего в кольцевой матрице может быть от 2 до 16 контактов, что даёт до 16 * 15 = 240 физических кнопок. Названия контактов в списке совпадают с надписями на Arduino Pro Micro. Контакты в списке могут быть перечислены в любом порядке.

Если кольцевая матрица не подключена, то комментируем (символами // в начале строки) или удаляем эту строку.


Шаг 2. Задаём прямое подключение кнопок, если такие есть.

Находим список контактов прямого подключения кнопок:

#define DirectKeysPins   5,  6,  7, A3

и изменяем в ней список контактов на свой. Всего напрямую к Ардуино может быть подключено от 1 до 18 кнопок. Названия контактов в списке совпадают с надписями на Arduino Pro Micro. Контакты в списке могут быть перечислены в любом порядке.

Если прямого подключения кнопок нет, то комментируем (символами // в начале строки) или удаляем эту строку.

Нужно проверить, чтобы контакты из списков RingMatrixPins и DirectKeysPins были все разными.


Шаг 3. Проверка физического подключения кнопок.

При сканировании кнопок скетч создаёт объединённый список сканкодов нажатых физических кнопок, в который входят кнопки из кольцевой матрицы и кнопок, подключенных напрямую. Общее количество всех подключенных физических кнопок не должно превышать 255.

Не нажатой кнопке соответствует сканкод nc (в скетче также можно указывать NC, na, NA, -1, 0xFF, 255). Нажатой кнопке соответствует код от 0 до RM * (RM - 1) + DK - 1 , где RM - это количество контактов кольцевой матрицы (0 ... 16), а DK - количество кнопок прямого подключения (0 .. 18). В моём случае максимальный скан код равен:

RM * (RM - 1) + DK - 1 = 5 * ( 5 - 1 ) + 4 - 1 = 23

Для проверки подключения физических кнопок нужно прошить скетч, включив отладку по COM-порту:

#define serialdebug 1

В Мониторе порта выберем скорость 115200 и введем команду

#scan [Отправить] (можно #s или #S)

Если ни одна кнопка не нажата, видим строки:

#Scan:

Это режим сканирования кнопок. При нажатии кнопок джойстика выводятся строки вида:

#Scan: 12 16

где 12 16 - это сканкоды нажатых кнопок.

Теперь, нажимая по очереди все подключенные кнопки, хатки и поворачивая энкодеры, проверяем, что все выдаваемые физическими кнопками сканкоды разные. Если сканкоды у двух кнопок совпадают или у какой то кнопки не выводятся, ищем ошибку в монтаже. Добиваемся того, чтобы все нажатия вызывали чёткую выдачу сканкода.

Остановить поток данных в Мониторе порта можно командой #0 (можно #n или #N).

Физическое подключение настроено. Больше списки RingMatrixPins и DirectKeysPins не изменяем, чтобы не сбить следующие настройки.


Шаг 4. Привязка логических кнопок джойстика.

Находим список

#define RemapButtons     0,  9, 14, 19,  4,  5, 10, 15,  1,  8, \

                        13, 18, 12,  2,  6, 11, 16,  3, 17,  7, \

                        23, 22, 21, 20 

В списке указаны сканкоды логических кнопок по порядку.

Чтобы исправить список на свой, действуем в таком порядке:

#Scan: 0

Записываем код 0 в первым в списке


#Scan: 9

Записываем код 9 вторым в списке

Список сгруппирован по 10 кодов в строке, в конце строки для перехода списка на новую строку обязательно указываем символ backslash: "\"

Можно и в одной строке написать весь список, только тогда проще сбиться со счёта, ведь в этом списке может быть до 128 кнопок.

Теперь нужно задать общее число логических кнопок джойстика, которые будут видны в драйвере, как кнопки:

#define BUTTONcount     24

Это число равно длине списка RemapButtons

Настройка логических кнопок завершена. Можно прошить скетч и проверить работу кнопок джойстика в DXJoyTester или в Joy.cpl.


Шаг 5. Настройка хаток (Hat switches).

Скетч поддерживает работу до 4 хаток. Могут использоваться 8ми, 4х или 2х позиционные хатки.

Хатки задаются в строках #define HAT1 ... #define HAT4, строго по порядку. Неиспользованные строки нужно закомментировать (символами // в начале строки) или удалить.


#define HAT1          hat8,  6, 11,  7, 17 

задано подключение 8ми позиционной хатки. Верхняя, правая, нижняя и левая физические кнопки хатки выдают сканкоды 6, 117, 17.

Сканкоды физических кнопок можно узнать в режиме #Scan в Мониторе порта (Шаг 3).

 

#define HAT2          hat4, 12,  2,  3, 16

задано подключение 4х позиционной хатки. Верхняя, правая, нижняя и левая физические кнопки хатки выдают сканкоды 1223, 16.


#define HAT3          hat4, 23, nc, 22, nc

задано подключение 2х позиционной хатки: вверх - вниз. Верхняя и нижняя физические кнопки хатки выдают сканкоды 23, 22. Правая и левая физические кнопки не используются, поэтому для них задан сканкод nc (not connected).


#define HAT4          hat4, nc, 20, nc, 21

задано подключение 2х позиционной хатки: налево - направо. Правая и левая физические кнопки хатки выдают сканкоды 20, 21. Верхняя и нижняя физические кнопки не используются, поэтому для них задан сканкод nc (not connected).

Настройка хаток (Hat switches) завершена. Можно прошить скетч и проверить работу хаток джойстика в DXJoyTester или в Joy.cpl.


Шаг 6. Настройка цифровых осей на энкодерах и аналоговых осей на потенциометрах.

Два энкодера с кнопками сброса в центр я задал как оси RX и RY.

Настройки оси RX:

  #define use_axeRX         ENC

- использование оси RX:


#define RX_pina         A3 - контакт АЦП Ардуино для аналоговой оси ( A0 ... A10 ). Для энкодера эта строка не используется

#define RX_key1         2 - сканкод первого контакта энкодера

#define RX_key2         12 - сканкод второго контакта энкодера

#define RX_keyc         19 - сканкод кнопки центровки энкодера. Если центровка не используется, нужно указать сканкод nc (not connected).


Настройки оси RY делаются аналогично: 

// Ось RY:

#define use_axeRY       ENC // - использование оси RY: 1 - аналог, 2 - энкодер 

#define RY_pina         A3  // - контакт АЦП Ардуино для аналоговой оси

#define RY_key1         3   // - 1й сканкод контакта энкодера

#define RY_key2         16  // - 2й сканкод контакта энкодера

#define RY_keyc         15  // - сканкод кнопки центровки энкодера        


Также я подключил потенциометр, как аналоговую ось Z. Для аналоговой оси настройки Z_key1, Z_key2, Z_keyc не используются: 

// Ось Z:

#define use_axeZ        AN  // - использование оси Z: 1 - аналог, 2 - энкодер 

#define Z_pina          A2  // - контакт АЦП Ардуино для аналоговой оси

#define Z_key1          nc  // - 1й сканкод контакта энкодера

#define Z_key2          nc  // - 2й сканкод контакта энкодера

#define Z_keyc          nc  // - сканкод кнопки центровки энкодера

Физическое подключение осей сделано. Теперь нужно настроить диапазон изменения осей.


Для используемых механических энкодеров нужно задать делитель encdevider, который равен числу шагов, на которое изменяется код энокдера при повороте на один тик. Обычно делитель равен 4, реже 2:

#define encdevider      4

Настройки диапазона оси RX на энкодере:

// Ось RX:

#define RX_min          -20

#define RX_max          20

#define RX_invert       0

Задан диапазон энкодера в 40 тиков. Без инверсии.

Если RX_min = -RX_max, то кнопкой сброса энкодер будет сбрасываться точно в центр.

Можно задать сброс и не в центр. Например, чтобы сброс был в точку 25%, нужно задать:

#define RX_min          -10

#define RX_max          30

Для сброса в 0% нужно задать:

#define RX_min          0

#define RX_max          40

Строка

#define RX_invert       0 - задаёт есть или нет инвертирование направления вращения оси энкодера. Этого же эффекта можно добиться, поменяв местами сканкоды контактов RX_key1 и RX_key2.

Настройки диапазона оси RY на энкодере аналогичны:

// Ось RY:

#define RY_min          -20

#define RY_max          20

#define RY_invert       0


Настройки диапазона оси RZ на потенциометре:

// Ось Z:

#define Z_min           0 - задаёт минимальное значение оси. Для АЦП Ардуино это 0.

#define Z_max          1023 - задаёт максимальное значение оси. Для АЦП Ардуино это 1023.

#define Z_invert        0 - задаёт есть или нет инвертирование направления вращения оси потенциометра.

Также для аналоговых осей нужно задать коэффициент экспоненциального фильтра, снижающего шум осей (0.1 ... 1.00):

#define analogalpha     0.25

Чем меньше коэффициент analogalpha, тем более сглаженным будут изменения значений осей и меньше дрожание.

Чем больше коэффициент analogalpha, тем быстрее будет реакция на поворот, но и шум будет заметнее.


Настройки сделаны, прошиваем скетч и делаем проверку работы осей в DXJoyTester или в Joy.cpl.

Если настройки сделаны без ошибок, оси на энкодерах уже должны работать отлично.


Для осей на потенциометрах можно сделать ещё калибровку, уточнив значения Z_min и Z_max.

Для этого откроем Монитор порта и введём команду

#axes [Отправить] ( можно #a или #A ).


На экране видим сырые значения осей с АЦП и энкодеров:

#Axes: 543 0 0

Поворотом потенциометра оси Z от упора до упора находим и исправляем минимальное и максимальное значения оси Z:

// Ось Z:

#define Z_min           175

#define Z_max           915

#define Z_invert        0

Остановить поток данных в Мониторе порта можно командой #0 (можно #n или #N).

Теперь прошиваем исправленный скетч. Оси откалиброваны.


Шаг 7. Отключение отладки по COM-порту.

После всех настроек в скетче задаём:

#define serialdebug     0

и прошиваем скетч.

Если этого не сделать, то бедной Ардуинке придётся тратить свои скромные ресурсы на опрос COM-порта. Это может привести к снижению максимального FPS джойстика, особенно после открытия и закрытия COM-порта Ардуино.

Кроме того, отключение serialdebug заметно уменьшает размер прошивки.

Удачи!

RingMatrix 

#joystick #ringmatrix #charlieplexing #ringbuttonbox #diy #чарлиплексинг #матрица