DIY Контроллер для педалей и кнопок

Контроллер предназначен для использования в баттон-боксах, платах на рулях, педалях, для подключения шифтеров, ручников,  т.е. для подключения различных кнопок, энкодеров и аналоговых осей.

  • эмуляция Joystick/Keyboard/Mouse
  • поддержка до 6х аналоговых осей (12 бит — 4096 дискретных значений)
  • калибровка осей, шейпинг осей
  • поддержка кнопок в матрице
  • поддержка одиночных кнопок
  • поддержка энкодеров
  • поддержка галетников
  • поддержка POV Hat Switch
  • поддержка аналоговых входов как кнопок
  • 1KHz частота обмена с ПК

Возможности устройства:

Со стороны ПК контроллер выглядит как обычный джойстик/клавиатура/мышь, установки драйверов не требует.

Для этого проекта я решил использовать не Ардуино, а плату для разработчиков на основе STM32F103C8T6. Вот для сравнения их характеристики:

Arduino LeonardoSTM32F103C8T6
Flash32KB64KB
SRAM2.5KB20KB
EEPROM1KBAbsent
Architecture8-bit ATMEL AVR32-bit ARM CORTEX-M3
Frequency16MHzup to 72MHz
GPIO pins2026
PWM712
Timers1x 16-bit, 2x 8-bit3x 16-bit, 1x pwm
Peripheral10-bit ADC (6 channels)
1x I2C
1x SPI
1x UART
USB
2 x 12-bit, 1 μs A/D converters (7 channels)
7-channel DMA controller
3x USART
2x I2C
2x SPI
CAN
USB

Как видите, STM32F103C8T6 на фоне Ардуино выглядит вполне неплохо, а стоит дешевле. Один из основных минусов состоит в том, что для заливки прошивки в него нужен отдельный программатор, но он тоже недорог.

Я покупал все на алиэкспрессе, например вот и вот. Также можно встретить BlackPill плату — линк. У нее чуть меньше выводов, но есть монтажные отверстия.

Схема борды:

STM32Mini

В pdf формате

Black_Pill_Schematic

Распиновка — The-Generic-STM32F103-Pinout-Diagram

Распиновка после первоначальной заливки прошивки:

             STM32F103C8T6
	   -------------------
	- |3VB		 +3.3V| -
  	- |C13		   GND| -
  COL1	- |C14		   +5V| - 
  COL2	- |C15		    B9| - ROW6
  ADC0 	- |A0		    B8| - ROW5
  ADC1 	- |A1		    B7| - ROW4
  ADC2	- |A2		    B6| - ROW3
  ADC3	- |A3		    B5| - ROW2
  ADC4	- |A4		    B4| - ROW1
  ADC5	- |A5		    B3| - COL4
  ADC6	- |A6		   A15| - ROT11
  COL5	- |A7		   A12| - 
  ROT1	- |B0		   A11| - 
  ROT2	- |B1		   A10| - ROT8
  ROTA	- |B10		    A9| - ROT7
  ROTB	- |B11		    A8| - ROT6
	- |R		   B15| - ROT5
	- |+3.3V	   B14| - ROT4
	- |GND		   B13| - ROT3
	- |GND		   B12| - COL3
	   -------------------

Кроме этого, я написал небольшую программу OSHStudio, которая позволяет переконфигурить пины под конкретно ваши нужды. Выбор функции для пинов осуществляется на вкладке Pins Configuration, здесь же можно выбрать ваш тип платы (это влияет только на графическое отображение расположения пинов)

Мышь

Можно настроить аналоговый вход как одну из 2х осей мыши, либо колесо прокрутки, левая/правая/средняя кнопки настраиваются на вкладке кнопки

Кнопки

Если кнопки подключаете в матрице, то столбцы подключайте к пинам «Button Matrix COLUMNS», а строчки — к «Button Matrix ROWS». Отдельные кнопки можно подключать к пинам «Single Button +3.3V» и «Single Button GND». Если кнопка подключается  к «Single Button +3.3V», то вторую ногу кнопки подсоединяйте к +3.3V, если к «Single Button GND», то вторую ногу соответственно на землю. Пример матрицы:

buttonMatrixDia_bb

Работу кнопок можно протестировать на вкладке «Buttons». Также любой кнопке можно задать «функцию» — то, как она будет транслироваться в ПК — как кнопка джойстика, клавиша клавиатуры и т.д. По умолчанию все кнопки работают как кнопки джойстика.

Энкодеры

Поддерживаются инкрементальные энкодеры видов FULL step, HALF step и QUARTER step. Энкодеры можно подключать как отдельно (single конфигурация), так и связанными между собой (chained конфигурация). При подключении в chained конфигурации крайние выводы энкодеров нужно соединить между собой и одну сторону подключить к пину «Chd Rot Enc PINA», другую — к пину «Chd Rot Enc PINB». Средние выводы энкодеров — к пинам «»Chd Rot Enc 1/1», «Chd Rot Enc 1/2» или «Chd Rot Enc 1/4» в зависимости от типа энкодера. Можно соединять разные типы энкодеров. Пример:

RotariesChainedDia_bb

При одиночном (single) режиме, крайние выводы подключаются к «Sng Rot Enc PINA 1/1» и «»Sng Rot Enc PINB 1/1» (либо 1/2, либо 1/4), а центральный пин — к +3.3V. Пример:

RotariesSingleDia_bb

При необходимости можно переназначить какие выводы к какому конкретно энкодеру будут принадлежать на вкладке Single Encoders Config

sgl_enc_tab

Работу энкодеров можно также протестировать на вкладке «Buttons».

Галетники

Одномоментное нажатие виртуальной кнопки происходит при смене положения вала.

SwitchesDia_bb

Аналоговые входы

Аналоговые входы — ADC0 — ADC7 (A0 — A7). Оси можно откалибровать на вкладке Axises Configuration, калибровочные значения хранятся в самом МК, т.е. не нужно будет калибровать заново при переустановке Windows или на другом ПК. После калибровки ось «растягивается» в МК, поэтому ПК всегда видит ось в 4096 значений. Вместо ручной калибровки можно использовать автоматическую (AutoCalibration). При калибровке можно ориентироваться на реальные значения датчиков — красная полоска значений «Sensor Value» (Эти значения никак не зависят от калибровки). Значения осей представлены зелеными полосками значений «Axis Value» (на них калибровка действует непосредственно).

Также есть возможность объединить два аналоговых входа в одну ось — combined axis. Сделано преимущественно для баранок с двумя лепестками сцепления. При этом есть два режима работы:

  • cooperative work — значения обоих входов складываются, ползунком можно увеличить или уменьшить вес одного из входов на конечный результат оси.
  • each on his own — каждый их входов работает независимо, но на одну и ту же ось. Входы при этом можно откалибровать по-разному и использовать в различных ситуациях.

Также есть возможность сделать шейпинг оси. Есть 6 предопределенных пресетов, каждый из них можно изменить любым образом и присвоить собственное название

Analog2Button — Аналоговые входы в кнопки

C 0.15 версии появилась более продвинутая возможность преобразования аналоговых входов в кнопки. Можно сконфигурировать до 10 аналоговых входов (тип пина Analog2Button) и на каждом иметь до 10 кнопок (общее кол-во кнопок, тем не менее, не может превышать 64). Все это настраивается на вкладке Analog 2 Buttons, каждая ось может иметь свое кол-во кнопок:

Analog2buttons_tab

 Вкладка Tuning

На вкладке Tuning можно настроить при необходимости такие параметры (сверху вниз):

  • «Your identifier for the device» — уникальный идентификатор для платы, может пригодиться, когда несколько подключенных плат и одну можно, например, пометить как «педали»,  вторую — «buttonbox» и т.д.
  • «USB polling interval» — частота USB обмена с ПК. Для критичных к задержке устройств можно выставить максимально возможную частоту 1kHz (1ms между пакетами), для всего остального дефолтной частоты в 60Hz должно быть достаточно.
  • «Amount of time a button will be pressed when Rotary Encoder position changed» — время, в течение которого виртуальная кнопка фиксируется нажатой для энкодера
  • «Amount of time a button will be pressed when Rotary Switch position changed» -время, в течение которого виртуальная кнопка фиксируется нажатой для галетника
  • «Amount of time a button will be pressed when Analog Input position changed» -время, в течение которого виртуальная кнопка фиксируется нажатой для Analog2Button типов входа
  • «Time since previous Rotary Switch change» —
Tuning_tab

Все неиспользуемые ноги МК рекомендуется сконфигурировать как «Not Used»

Исходники в моем проекте на github.

Готовые прошивки:

Версия 0.16 — добавлена эмуляция клавиатуры/мыши, функции кнопок, шейпинг осей

Версия 0.15 — более стабильная работа по USB, более продвинутая функция Analog2Button

Версия 0.14 — добавлены автокалибровка осей, Analog2Button и combined axis

Версия 0.13 — добавлена вкладка Single Encoders Config

Версия 0.12 — добавлена вкладка Tuning

Версия 0.11 — добавлена поддержка одиночных энкодеров

Версия 0.10 (начальная)

Если у Вас есть вопросы о том, как залить прошивку, то можно посмотреть эту запись.

DIY Контроллер для педалей и кнопок: 36 комментариев

  1. Доброго времени суток. Два вопроса:
    1 — получится ли на базе этой платы сделать полноценный руль с педалями и прочим?
    2 — оптические энкодеры будут работать?

    Нравится

  2. Приветствую
    1. Без обратной связи (Force Feedback) — да. С ФФБ — нет.
    2. В данной прошивке энкодеры транслируются в нажатия виртуальных кнопок в Windows. Для руля нужна другая обработка их работы

    Нравится

    1. Отлично. До ффб я пока не дорос, так что будем лепить обычный.
      Спасибо огромное за проект, кнопок и крутилок хватит на все задуманное!

      Нравится

  3. Здравствуйте.
    При включении МК к компьютеру через usb вылетает программа настройки,
    также она не запускается если МК подключен.
    Проверенно на двух компьютерах с вин 8 и 10.
    И вопрос можно ли подключать к осям переменные резисторы, хотелось применить датчики положения дросельной заслонки от авто

    Нравится

    1. Добрый день,
      в последнее время почему-то стали часто жаловаться на вылет программы настройки. Пока разбираюсь с этим, у себя воспроизвести не получается. Один из пользователей сообщал, что на проблемном ПК на одну из QT библиотек ругался антивирус, на другом ПК у него все заработало. Попробуйте поотключать антивирусы и все другие USB устройства, плюс подключайте контроллер напрямую к разъему материнсокй платы, а не в хаб.
      Резисторы подключать можно, естественно нельзя превышать при этом допустимые пороги по напряжению/току

      Нравится

      1. Спасибо.
        Перепробовал все прошивки, на 0,11 не слетает, данные с осей показывает ( дребезжание, я не подключал пока к МК перефирию).
        При запросе на получение конфигурации, или смене конфигурации программа не отвечает.
        на плате горит только красный диод, зеленый нет.
        По компьютерам, первый планшет с виндой 8 антивирь аваст.
        второй стационар с вин 10 антивирь awg.
        Подключаю на прямую к портам.
        Да забыл оба диода на МК горят на всех прошивках кроме 0,11.
        По аналоговым входам питание на резистор брать с 3.3 вольт‽

        Нравится

      2. да, 3.3В. Если используете старые версии конфигурялок, то и прошивки к ним нужно использовать той же версии, они лежат в тех же архивах

        Нравится

  4. Проверил, работают только 0,1 и 0,11 программы остальные вылетают.
    При конфигурировании МК программа не виснет но вроде ни чего не делает, при попытке получить конфигурацию не отвечает, но при отключении МК сразу вылетает.

    Нравится

      1. я собираю кнопочную панель для авто симулятора euro track sim. 2 пробовал собрать ардуино на 32 кнопки с ютуба (канал amstudio), но там при нажатии двух кнопок, третья сама трабатывает нажатие. В идеале конечно найти вариант работы кнопки с фиксацией по принципу — каждое изменение положения кнопки выдает в комп одно нажатие (кнопка вкл — нажата один раз кнопка joy1, кнопка выкл — еще раз нажата кнопка joy1.

        Нравится

      2. Здесь все просто — сколько нажали кнопок, столько и фиксируется на ПК. Изменение положений не реализовано — если поставить тумблер, то кнопка на ПК будет нажата все время, пока он в положении ВКЛ

        Нравится

  5. Очень интересный проект. Добавлю в копилку будущего, вдруг сможете реализовать. Можно сделать кнопки-шифты, как в логитеч G25/27. Одна из кнопок выбирается как кнопка-модификатор, всех кнопок пусть 11 (-1 на модиф., или шифт, называйте как угодно). С отпущенным шифтом имеем эти кнопки под номерами 1-10, если держим нажатым шифт, то кнопки будут с номерами 11-20. Я не знаю как объяснить, с шифтом кнопок получается вдвое больше. Вот, есть 2 кнопки, одна шифт, на второй фары и сигнал. Когда просто нажимаю на кнопку 2 — сигнал, когда зажимаю первую шифтовую (или модиф.) и нажимаю на 2 — фары. Было бы неплохо реализовать несколько шифтов. Это здорово расширило бы маленькую матрицу. Из матрицы 5*4 можно было бы получить 4 ряда по 16 кнопок. И было бы неплохо реализовать резюки в кнопки в паре, как сделано в кпп от 25/27, стало бы возможно переделывать на коленке кпп, если мать руля сгорела. Что есть конвертеры знаю.

    Нравится

      1. Как дело продвигается с шифтами? Скоро платки приедут, буду собирать.

        Нравится

      2. Как дела с расширением функционала? И вопрос появился. Есть 2 резюка на педалях. Как их подключить? Края резюков запараллелить и выставить на них Analog Low и High (или gnd и +3,3в всё же?), а движки на Mtdium? Так прокатит? Или 2 резюка должны занять 6 входов? На аналогах не совсем понятны назначения.

        Нравится

      3. Пока не делал ничего, другим занят все время. Крайние ноги резюков цеплять на +3.3В и Землю, средний — на Analog. Разные типы аналогов отличаются только степенью сглаживания сигнала — Analog High — макс сглаживание, Analog No smooth — соответственно без сглаживания. Можно начать с малого сглаживания, если ось будет сильно дребезжать, то попробовать сглаживание посильнее. Если ось будет работать в противоположную сторону — просто поменять +3.3В и Землю местами

        Нравится

      4. Понял. Меня запутало слово сглаживание в аналоге. Спасибо.

        Нравится

  6. Виталий, нифига себе инструкция, сколько пользуюсь g27, а такие настройки вижу впервые, даже мысли не было покопаться в этом направлении — только аппаратный модинг (замена колеса на 32″, переворот педалей, стрекозу приколхозил на ардуино). С Вашего позволения инструкцию утащил к себе в берлогу — изучать буду, спасибо.

    Нравится

    1. да наздоровье, будут вопросы — подскажу, есть в наличии G25, смогу что-то опробовать или показать. Есть ещё подробные инструкции по мышкам A4Tech серии Bloody, тоже от меня, вдруг тоже решите себе макросную мышь прикупить. https://vk.com/topic-54726107_30303191

      Нравится

  7. Слушай. А что представляют из себя твои исходники? Их в кокосе или эклипсе юзать? Завалялось пару плат, хочу себе рычаг поворотников сделать с выводом сигнала на реле — чтобы визуальные были сигналы. Написать код не проблема, но я пока не понимаю как использовать)

    Нравится

  8. Hello, i think the usb connection problems are caused by a wrong resistor on the board. r10 has the wrong value it should have around 1,5 kOhm but it has about 10 kOhm. so the usb conenction is often not detected. i am not that good with soldering and with programming. there is a softwarehack to . can you include this hack ? http://amitesh-singh.github.io/stm32/2017/05/27/Overcoming-wrong-pullup-in-blue-pill.html

    //This is required if proper pullup is not present at D+ line.
    // This is must for chinese stm32f103c8t6 aka «blue pill»
    rcc_periph_clock_enable(RCC_GPIOA);
    gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
    GPIO_CNF_OUTPUT_PUSHPULL, GPIO12);
    gpio_clear(GPIOA, GPIO12);
    msleep(5); //delay

    jens

    Нравится

Оставьте комментарий