Представим задачу, когда в некую систему управления необходимо добавить устройства ввода. Это может быть что угодно, например, комбинация кнопок, джойстика, тачпада, а также элементы подсветки и вибрации.
Самое простое - это найти готовую клавиатуру, тачпад, джойстик и т.д. и подключить к GPIO или нескольким портам USB основного контроллера. Нормальный вариант, многие так и делают. Но возможно, что либо GPIO не хватит, а может быть USB портов.
Тогда может быть имеет смысл добавить небольшой и дешевый микроконтроллер и всё-таки собрать свой собственный геймпад или пульт, оснастив его при этом стандартным USB HID Joystick драйвером для игровых контроллеров. В таком случае контроллер можно будет подключить к любой Win / Linux системе, без необходимости разработки драйвера для USB.
Сразу скажу, месяц назад я даже не задумывался, что оказывается есть стандартный USB HID, который предназначен для игровых контроллеров. В данном случае название игровой чисто условно, не будем обращать на это особое внимание. Но пришла нужда (работа) и пришлось искать оптимальные варианты, а тут мой коллега-программист возьми и скажи, что достаточно выбрать контроллер с USB интерфейсом и дело можно сказать в шляпе.
Почему то сразу решили, что будем делать на RP2040. Дешевый микроконтроллер, встроенный USB интерфейс, легко доставаемый. При этом можно найти много других вариантов ничем не хуже RP2040, что говорит в пользу самого подхода.
На тему разработки софта и конкретно как подцепить USB HID Joystick к RP2040, мой коллега планирует опубликовать небольшую статью в нашем блоге. Я бы хотел далее остановиться только на схемотехнике и ряде моментов, которые могут немного попить крови разработчика.
Если посмотреть на рисунок выше, то кнопки и аналоговый джойстик (не кнопочный как на Sinclair) с двумя переменными резисторами не представляют особого труда в плане подключения и использования. С другой стороны, есть элемент, который не так просто кастомизировать. Речь идет о Touchpad (тачпаде).
Попробуйте найти самостоятельно тачпад размером так 40мм х 60мм или около того. Если вы не применяли нечто подобное раньше, то поиск займет несколько часов. Мы начали с тачпада для Playstation, его даже кто-то научился вроде бы окучивать, но в целом дохлый номер, так как вещь очень специфичная и кастомизации практически не поддаётся. Если у кого-нибудь есть положительный опыт применения данного контроллера, то было бы здорово услышать об этом.
В процессе поиска я вспомнил, что уже делал что-то подобное на основе емкостных сенсоров и контроллера MSP430. Задача была реализовать на печатной плате емкостные сенсоры в виде кнопок и шаттла. Нужно было сделать нечто вроде кубика, внутри которого размещался центральный контроллер и еще динамик. Поэтому, нужны были еще вырезы на плате для звука.
Выглядела одна сторона-плата следующим образом:
В тот раз пришлось использовать MSP430, для которого не было специальных входов для емкостных сенсоров, так что во многом мы действовали на свой страх и риск. Сразу отмечу, что есть контроллеры, специально разработанные для ёмкостных сенсоров.
Начитавшись руководств от TI, я разместил 9 электродов на плате и предусмотрел их сцепку для того, чтобы круговое движение происходило без особой потери заряда на границе двух электродов. В итоге, поигравшись с кодом, приятелю удалось таки реализовать все задуманные движения, но при этом он крыл меня матом и говорил, что в следующий раз чип должен быть специальным.
Вернёмся к основному топику. Поиск тачпада, с нужными размерами, открытым протоколом обмена и стандартным интерфейсом, навел нас на продукцию компании Azoteq (это не реклама, просто так вышло). Самое главное, удалось даже заказать несколько готовых тачпадов.
При ближайшем рассмотрении такого тачпада можно определить наиболее характерные элементы типового дизайна. При этом сама технология широко используются не только в электронных устройствах, но уже давно применяется при изготовлении так называемого Wearable Textile, встречаются и другие похожие названия.
Посмотрим на плату типового тачпада:
На плате установлен специальный контроллер IQS572 для образования матрицы сенсоров размером 8 строк на 9 столбцов (строки или столбцы не принципиально):
Судя по разводке, размещение выводов на чипе упрощает дизайн платы и позволяет без особых проблем подвести все цепи.
Не мог пройти мимо чтобы не попинать разводчика, специально обвел красным те места, где явно можно было сделать лучше. Самое провальное - висящий в воздухе отвод от земляного полигона - ну хоть бы отверстие в конце поставил, а то земля так и осталась в воздухе висеть фактически превратившись в антенну. Да и сами эти отводы с земли следствие плохой настройки констрейнов в проекте. Я понимаю, что землю не пролить в этом узком месте, но сделай ты зону отдельную что ли для этих узких мест, а самое главное - поставь отверстие на землю в конце висящего отрезка. В любом случае, если это реально так надо делать, то хотя б ссылочку бы увидеть.
Для лучшего понимания конструкции, на следующем рисунке я обозначил те самые особенные детали дизайна - строки, столбцы и элементы экранирования:
На рисунке можно увидеть 8 строк, которые выполнены на основе соединенных электродов без использования переходных отверстий. Ну а для того чтобы образовать из электродов столбцы, понадобятся переходные отверстия в местах где строки пересекаются с 9-ю столбцами. Далее соединение происходит уже на другой стороне платы.
Более детально особенности дизайна можно рассмотреть на следующем рисунке:
Что интересно, подобный дизайн электродов и их соединений довольно часто можно встретить в различных исследовательских работах по этой теме, а также в других примерах, включая упомянутую ранее ткань для одежды.
К слову сказать, в случае с одеждой, строки и столбцы выполняются на разных сторонах ткани, так называемый двухслойный дизайн. Следующий рисунок скопирован из текста статьи, упомянутой выше. Я лишь привел его здесь для лучшего понимания принципа работы двухслойного дизайна (лицензия СС вроде позволяет так делать при необходимости):
На рисунках a и с, приведены стороны, образующие электроды, на рисунке b - изоляционный материал (возможна сама ткань), d - финальный результат.
Принцип действия тачпада на емкостных сенсорах основан на измерении заряда взаимных (mutual) электродов в месте касания их пальцем или пальцами. Рекомендую самостоятельно прочитать руководство на эту тему от самой компании Azoteq. Честно говоря, не люблю пересказывать теорию своими словами. Там потребуется простая регистрация для того чтобы прочитать документ, это займет буквально полминуты, так как файл сразу откроется после заполнения формы.
Для общего понимания того, что происходит в момент касания тачпада, можно посмотреть на следующий рисунок:
На рисунке видно, что в месте пересечения строки со столбцом присутствует некая ёмкость Cm, которая представляет собой межэлектродную ёмкость. Если поднести палец к этому пересечению, то заряд начнет активно утекать через палец на землю, причем не только землю самой платы, но в первую очередь ту самую землю, по которой мы ходим. Фактически это означает, что мы начинаем эффективно красть ёмкость Cm, что естественно не остаётся незамеченным контроллером тачпада.
Далее контроллеру остается только провести обработку результата измерения и выдать точные координаты места касания через интерфейс I2C.
Еще раз повторюсь, что не ставлю перед собой цели раскрыть физику самого процесса измерения, обработки результата и других механизмов работы контроллера, так как они изложены в самой документации. Мне лишь хотелось показать, что реализация тачпада может быть довольно простым делом и хорошо поддаваться кастомизации в случае применения специализированных контроллеров (отсылка к началу рассказа про мой опыт с MSP430).
Еще одним элементом управления является блок кнопок. Как правило кнопки подключаются к отдельным выводом GPIO микроконтроллеров, используя дополнительные схемы подавления дребезга, фильтров или даже напрямую.
Но, как оказалось, в последнее время все чаще блоки кнопок подключаются ко входу АЦП микроконтроллера. Первый раз я столкнулся с такой массовой практикой в одноплатниках с ограниченным количеством GPIO. В них для решения проблемы подключения нескольких кнопок как раз были задействованы схемы подключения блока из кнопок с собственным “весом”. По сути нажатие кнопки или нескольких кнопок равносильно формированию уникального напряжения на входе АЦП.
Для примера, на рисунке показана схема реального блока из восьми кнопок механизма контроля положения сиденья водителя одного из автопроизводителей (реверс-инжиниринг от @DeJQit):
По схеме видно, что все кнопки разделены на два блока по четыре кнопки в каждом блоке. По сути два делителя напряжения, выходное напряжение которых зависит от нажатия кнопок SW1-SW4 и SW5-SW8, соответственно.
Плюсы такого решения - сокращение цепей подключения кнопок и очевидно улучшенная фильтрация дребезга контактов за счет интегрирования / усреднения отсчетов АЦП.
Последним элементом нашего геймпада будет джойстик. Самый обычный - два потенциометра и центральная кнопка. Судя по всему, входов АЦП потребуется даже больше чем GPIO. Хотя на плате джойстика обозначено напряжение +5В, на практике реальная величина напряжение особой роли не играет, так как по сути вся схема представляет собой два пассивных делителя напряжения:
Осталось только посмотреть на общую схему подключения тачпада, блока кнопок и джойстика к одной из самых доступных плат на основе RP2040. Я специально нарисовал схему в стиле DIY, а еще несколько её упростил за счет отсутствия общих цепей питания:
Для упрощения, на схеме не показаны цепи питания 3.3В / GND. Питание 3.3В, к которому подключены все внешние блоки и модули, формируется LDO, размещенном на плате RP2040-Zero. Для подтяжки I2C используются внутренние резисторы RP2040.
Каких либо внешних фильтрующих конденсаторов не требуется, достаточно тех, что есть на платах модулей.
Насколько я понял, USB HID Joystick поддерживает до 8 осей и 32 кнопок. В нашем примере, получилось использовать 4 оси (две оси для джойстика и еще две оси для тачпада) и 9 кнопок (8 в блоке кнопок и одна джойстика).
Итого, был рассмотрен пример дизайна кастомного контроллера, состоящего из джойстика, тачпада и двух блоков кнопок. Основная идея дизайна подобного контроллера заключается в упрощении разработки за счет использования стандартного драйвера USB HID Joystick со стороны софта, а со стороны железа подобное решение позволяет реализовать функции контроля и управления на простом микроконтроллере типа RP2040.
Из того, что еще можно было бы добавить в контроллер ввода, реальный интерес представляют такие компоненты как вибромоторы и светодиоды. Подключение этих компонентов не должно вызвать каких-либо трудностей, но вот с поддержкой светодиодов и вибромоторов драйвером USB HID Joystick у нас не получилось с ходу разобраться, да и особой необходимости в этих компонентах также не было. Будет здорово, если кто-нибудь поделится своими мыслями на этот счет.
Спасибо @DeJQit и @sfsdart за помощь в подготовке материала. Надеюсь на скорый выход статьи @sfsdart по рассмотренному контроллеру ввода на RP2040 с описанием программного обеспечения устройств ввода, особенностям отладки и другими интересными фактами из жизни программиста встраиваемых систем.
Комментарии (10)
innokenty_vyz
21.04.2023 05:29+4"Не мог пройти мимо чтобы не попинать разводчика..."
Собственно, автор не проходит мимо и пинает разводчика примерно в 95% случаев, когда видит PCB :).
quaer
21.04.2023 05:29Самое провальное - висящий в воздухе отвод от земляного полигона - ну
хоть бы отверстие в конце поставил, а то земля так и осталась в воздухе
висеть фактически превратившись в антенну.Если там низкочастотные сигналы, особого смысла так делать нет, разве что ради перфекционизма. По виду, там угол 45 градусов, так что похоже на трассу экрана между двумя сигналами, а не на заливку.
Fen1xL
21.04.2023 05:29+4Отличная статья, спасибо.
Сам недавно обдумывал сделать себе кастомный джойстик. Поэтому вопрос. А почему используете обычный аналоговый стик, а не стик с датчиками холла? Дорого, сложно? У таких стиков лучше с дребезгом и долговечностью дела обстоят.
К примеру вот есть ребятки, которые предлагают подобные:
https://thegamingsetup.com/guides/hall-effect-joystickssdy Автор
21.04.2023 05:29+3Надо было быстро сделать из того, что можно было купить в обычной рознице. Джойстик работает норм, но у него есть мертвая зона в районе до 3-4 градусов отклонения, скорее всего люфты механики. Насчет более продвинутых не смотрели, т.к. для концепта делали.
svitoglad
21.04.2023 05:29Когда делал USB клавиатуру на RP2040 столкнулся с проблемой отсутствия драйвера UF2 на старой машине с Windows XP.
Klochko
21.04.2023 05:29А подскажите, где можно подсмотреть реализацию USB HID/CUSTOM HID для этого чипа?
Javian
Для любительского проекта это over… Правильно развести плату, правильно запрограмировать… Интересно. Но для одного раза проще отклеить тачпад от сломаного ноутбука.
SADKO
Иногда да, иногда нет, например если вы делаете специфический контроллер, самому оно проще и технологичней.
sdy Автор
На самом деле, класс сложности платы самый обычный, плата двухслойная. Такие платы делают без повышающих коэффициентов. К тому же можно сделать достаточно простой дизайн тачпада, если не нужна высокая точность позиционирования.
Насчет тачпада для ноута, не все тачпады на USB вешают, да и драйвер возможно понадобится нестандартный.
Так что на первый взгляд тач от старого ноута может и кажется более простым, но во-первых он будет выглядеть очень убито, так как обычно тачи стираются, а во-вторых размер не тот окажется.