Адаптер педалей и/или шифтера Logitech G25/G27 на STM32

Постановка задачи


В связи с потребность в самосовершенствовании и необходимостью занять чем нибудь голову между рутиной на работе решил я еще немного продвинуться в изучении электроники. Из того, что мне интересно как хобби, в этой статье упоминается про:

  • Симрейсинг
  • Программирование микроконтроллеров
  • Разводка и изготовление печатных плат
  • Сборка электроники
  • Изготовление корпусов для электроники на 3D принтере
  • Куда девать собранные платы


Все картинки и рассказ что из этого вышло — под катом. Много рассуждений и совсем мало нет кода.
Более подробно что и зачем я собирался сделать

Итак, я некоторую часть своей жизни потратил на симрейсинг. Это когда человек сидит за компьютером и воображает себя крутым гонсчегом. Симрейсинг отличается от игры в «гоночки» типа нидфорспида, грида и прочих тем, что в симуляторе куда меньше внимания уделяется бонусам и визуальным развлекаловкам в пользу более точной симуляции поведения автомобиля, дорожных условий и самого процесса вождения. Соответственно, оборудование для «игры» в симуляторы тоже требуется достаточно серьезное. Часто в постройку гоночного кокпита денег вваливается практически как в настоящий автомобиль. Если для аркадных гоночек часто хватает геймпада или простенького руля за несколько тысяч рублей, то для симуляторов что-то типа Logitech G27 — это минимальные требования, а серьезные ездуны предпочитают продукцию Fanatec или конструкции с прямым приводом на основе промышленных сервомоторов.

Но мы настолько глубоко в дебри забираться не будем и рассмотрим ситуацию, когда у человека есть Logitech G25 или G27 и ему его возможностей немножко не хватает. Например, у G25 всего две кнопки на руле и если есть желание повесить туда «формульную» баранку — дополнительные кнопки взять просто неоткуда. Еще один косяк логитековских рулей — громкий стук, который издают косозубые шестерни при смене направления вращения моторов, обеспечивающих эффекты обратной связи. До кучи еще и люфты, снижающие информативность руля. Кроме глубокого моддинга руля (например, переделки под ременной привод) есть еще и более радикальный подход к вопросу — смена руля на тот же Fanatec, топовые модели Thrustmaster или OpenSimWheel с прямым приводом. Часто при этом остаются незадействованные педали Logitech, которые с прогрессивными пружинами или установленным load cell модом далеко не так уж плохи. Можно также попробовать задействовать шифтер Logitech (который мне совсем не нравится по эргономике и тактильным ощущениям, но есть и те, кого он устраивает).

Для решения этих проблем есть адаптеры от Leo Bodnar или Derek Speare, которые эти проблемы более менее решают. Ссылки приводить не буду, сами найдете если интересно. Недостатков у них несколько. Кроме высокой цены у адаптера DSD вылез еще косяк с периодическими задержками обновления состояния осей:

e31e4f77264b4ef8aa3077dacf242a58.png

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

Начало большого пути

Из чего делать будем? Обычно джойстики делают из Teensy. Удобно, красиво, быстро, накидал скетч в стиле ардуино — готово, поехали! Но не дешево. Непонятно почему, но Teensy стоит весьма немало. К тому же я давно хотел спаять свою плату, чтобы все разъемы на ней уже стояли, никаких проводов, никакого навесного монтажа. Поэтому фтопку Teensy, берем дешевый STM32 и поехали:

ffdb80213d3f48609e49a451d8b565c0.JPG
Страшный прототип на STM32F103

В качестве среды разработки — CooCox CoIDE v2 beta, рисуем скелет USB HID с помощью STM32CubeMX, добавляем опрос потенциометров в педалях, опрос потенциометров в шифтере и опрос кнопок через сдвиговые регистры, поехали. В процессе работы над прошивкой полезли совершенно адовые глюки, после нескольких дней изучения ситуации была найдена причина — связка CoIDE и GNU ARM GCC выдавала какой то совершенно адский трэш, который работал непонятно как и мог при добавлении совершенно невинной строчки в код сгенерить нечто невообразимое. Разбираться в том, почему оно так работает, мне было не интересно, поэтому пришлось переползти на бесплатную версию Atollic TrueStudio. Да, оно еще более тормозное (Eclipse на не самом мощном планшете с Атомом мягко говоря работает неспешно), но зато прошивка получается более-менее беспроблемная, если какие глюки и есть — то только мои.

После того, как все более-менее заработало, возник следующий вопрос, как все это упаковать в красивый корпус. Оставлять отладочную плату я не хотел, хотелось сделать именно плату адаптера в виде готового конечного устройства. Ну и может быть продать потом несколько штучек… Если повезет… Возникла задача сделать плату подешевле. Минимальный контроллер семейства STM32 на котором есть аппаратный USB и достаточно ног, чтобы задействовать SPI — это STM32F042. Самый дешевый и простой в пайке вариант — в корпусе TSSOP20. Выбираем версию, где побольше доступной памяти. Итого получился контроллер STM32F042F6P6. К тому же у него есть такая мега полезная фича, как заливка прошивки через USB (DFU). В STM32F103 такого нет, хотя колхозные способы обновления прошивки без ST-LINK существуют… По быстрому накидал плату в DipTrace:

74c8d39e2d374117a36d0dae896e3167.png

Забегая вперед, скажу что серьезных косяков с этой платой не возникло, ну кроме того, что внешний кварц совершенно избыточен, HSI48 в STM32F042 работает отлично, можно было бы обойтись только им… Хорошо, что линейный регулятор поставил такой здоровый и мощный, на отладочной плате STM32F103 проседало напряжение при нажатии кнопок на шифтере, а с такой бандурой все стабильно и паять ее легко. Вот с типоразмером кондеров и резисторов я погорячился, 0603 это для новичка жестковато, не сразу научился делать красиво. Платы заказывал в Seeed Studio, делают дешево и хорошо.

После пайки получилось что-то типа этого:
92e6044f6dc24f9aa7bcb35442fafa08.JPG

Портировать прошивку с STM32F103 на STM32F042 оказалось несложно, за исключением нескольких интересных моментов, например, у STM32F042 более медленный ADC, нельзя задать ранги при последовательном преобразовании нескольких каналов, преобразование 12-битного значения при максимальной частоте составляет около 13 циклов. Опять же, нафиг не нужен внешний кварц…

Несколько фоток рабочего процесса
1a46d8d064a84ae19a249566c865befd.JPG
ac1cc098eb124b2aab17dbcb7dc20cfb.JPG

Результат

Испытания прототипа в Assetto Corsa (быстрее всего было запустить :-))

После этого возник вопрос, из чего сгородить корпус. Под рукой был 3д принтер, после нескольких попыток получилось что-то более-менее приемлемое:

Прототип
ee4f70f04b494605b426ea898172a4c9.JPG
b1a01f7de6c549aa92581564ffe86825.JPG


И относительно финальный результат:

480550ca506a480da87e40bf65bc1664.JPG

На текущий момент планируются некоторые улучшения в прошивке, по железу больше ничего делать не предполагается. Выкладывать сюда примеры кода не буду, они побольше чем скетчи Ардуино. Все лежит на гитхабе: код, схемы, герберы, модель корпуса, некоторые спеки и еще много всего. Страничка проекта:

github.com/robotsrulz/SP_Adapter

К вопросу «Куда девать собранные платы» — ну, одну я себе оставлю, для экспериментов. Например, давно хотел попробовать совместить несколько устройств в одной железке (composite device), можно сделать программно нажимаемые кнопки в зависимости от телеметрии, например…

PS: кстати, я еще скопировал схемотехнику шифтера чтобы организовать больше кнопок на руле G27 / G25 без дополнительных контроллеров, получилась вот такая маленькая плата:

f38c49bc5b32453aab8cd6cfb5b76b02.JPG

Теперь можно сделать формульный руль с 14 кнопками на G25 и c 18 кнопками на G27…

© Geektimes