Постановка задачи
В связи с потребность в самосовершенствовании и необходимостью занять чем нибудь голову между рутиной на работе решил я еще немного продвинуться в изучении электроники. Из того, что мне интересно как хобби, в этой статье упоминается про:
- Симрейсинг
- Программирование микроконтроллеров
- Разводка и изготовление печатных плат
- Сборка электроники
- Изготовление корпусов для электроники на 3D принтере
- Куда девать собранные платы
Все картинки и рассказ что из этого вышло — под катом. Много рассуждений и совсем мало кода.
Более подробно что и зачем я собирался сделать
Итак, я некоторую часть своей жизни потратил на симрейсинг. Это когда человек сидит за компьютером и воображает себя крутым гонсчегом. Симрейсинг отличается от игры в «гоночки» типа нидфорспида, грида и прочих тем, что в симуляторе куда меньше внимания уделяется бонусам и визуальным развлекаловкам в пользу более точной симуляции поведения автомобиля, дорожных условий и самого процесса вождения. Соответственно, оборудование для «игры» в симуляторы тоже требуется достаточно серьезное. Часто в постройку гоночного кокпита денег вваливается практически как в настоящий автомобиль. Если для аркадных гоночек часто хватает геймпада или простенького руля за несколько тысяч рублей, то для симуляторов что-то типа Logitech G27 — это минимальные требования, а серьезные ездуны предпочитают продукцию Fanatec или конструкции с прямым приводом на основе промышленных сервомоторов.
Но мы настолько глубоко в дебри забираться не будем и рассмотрим ситуацию, когда у человека есть Logitech G25 или G27 и ему его возможностей немножко не хватает. Например, у G25 всего две кнопки на руле и если есть желание повесить туда «формульную» баранку — дополнительные кнопки взять просто неоткуда. Еще один косяк логитековских рулей — громкий стук, который издают косозубые шестерни при смене направления вращения моторов, обеспечивающих эффекты обратной связи. До кучи еще и люфты, снижающие информативность руля. Кроме глубокого моддинга руля (например, переделки под ременной привод) есть еще и более радикальный подход к вопросу — смена руля на тот же Fanatec, топовые модели Thrustmaster или OpenSimWheel с прямым приводом. Часто при этом остаются незадействованные педали Logitech, которые с прогрессивными пружинами или установленным load cell модом далеко не так уж плохи. Можно также попробовать задействовать шифтер Logitech (который мне совсем не нравится по эргономике и тактильным ощущениям, но есть и те, кого он устраивает).
Для решения этих проблем есть адаптеры от Leo Bodnar или Derek Speare, которые эти проблемы более менее решают. Ссылки приводить не буду, сами найдете если интересно. Недостатков у них несколько. Кроме высокой цены у адаптера DSD вылез еще косяк с периодическими задержками обновления состояния осей:
Это просто фееричный фейл, когда пилот уже бросил газ и вовсю давит тормоз, а машина продолжает уверенно разгоняться. Для Тойоты такое закончилось катастрофами с человеческими жертвами и судебными исками. В симрейсинге последствия куда менее фатальные, но закончить гонку в заборе из за глюканувшего контроллера тоже как то не очень хочется. Итак, решено, будем строить свой контроллер, со всеми свистками и перделками, но занедорого.
Начало большого пути
Из чего делать будем? Обычно джойстики делают из Teensy. Удобно, красиво, быстро, накидал скетч в стиле ардуино — готово, поехали! Но не дешево. Непонятно почему, но Teensy стоит весьма немало. К тому же я давно хотел спаять свою плату, чтобы все разъемы на ней уже стояли, никаких проводов, никакого навесного монтажа. Поэтому фтопку Teensy, берем дешевый STM32 и поехали:
Страшный прототип на 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 существуют… По быстрому накидал плату в DeepTrace:
Забегая вперед, скажу что серьезных косяков с этой платой не возникло, ну кроме того, что внешний кварц совершенно избыточен, HSI48 в STM32F042 работает отлично, можно было бы обойтись только им… Хорошо, что линейный регулятор поставил такой здоровый и мощный, на отладочной плате STM32F103 проседало напряжение при нажатии кнопок на шифтере, а с такой бандурой все стабильно и паять ее легко. Вот с типоразмером кондеров и резисторов я погорячился, 0603 это для новичка жестковато, не сразу научился делать красиво. Платы заказывал в Seeed Studio, делают дешево и хорошо.
После пайки получилось что-то типа этого:
Портировать прошивку с STM32F103 на STM042 оказалось несложно, за исключением нескольких интересных моментов, например, у STM042 более медленный ADC, нельзя задать ранги при последовательном преобразовании нескольких каналов, преобразование 12-битного значения при максимальной частоте составляет около 13 циклов. Опять же, нафиг не нужен внешний кварц…
Результат
Испытания прототипа в Assetto Corsa (быстрее всего было запустить :-))
После этого возник вопрос, из чего сгородить корпус. Под рукой был 3д принтер, после нескольких попыток получилось что-то более-менее приемлемое:
И относительно финальный результат:
На текущий момент планируются некоторые улучшения в прошивке, по железу больше ничего делать не предполагается. Выкладывать сюда примеры кода не буду, они побольше чем скетчи Ардуино. Все лежит на гитхабе: код, схемы, герберы, модель корпуса, некоторые спеки и еще много всего. Страничка проекта:
github.com/robotsrulz/SP_Adapter
PS: кстати, я еще скопировал схемотехнику шифтера чтобы организовать больше кнопок на руле G27 / G25 без дополнительных контроллеров, получилась вот такая маленькая плата:
Теперь можно сделать формульный руль с 14 кнопками на G25 и c 18 кнопками на G27…