Друзья, привет! С наступающим вас Новым, 2025-м годом!
А давайте-ка я поддержу это ваше праздничное настроение а также ожидание длинных, и, не будем стесняться этого слова, плодотворных каникул! Поддержу я его при помощи ма-а-а-а-ленькой такой игровой консольки, которую можно повесить на елку в качестве новогоднего подарка! Консоль довольно проста по конструкции и содержит недорогие и вполне доступные комплектующие. Но главное, конечно, это игры. А игры найдутся!
Вообще, изготовление игровых аксессуаров это моя слабость! Ну а программированию игрушек посвящена целая страница моей indie-game-жизни! Немудрено, что я регулярно возвращаюсь к этой теме. В последний раз это был настоящий вызов для программиста-оптимизатора! Ведь речь шла об игровой консоли на микроконтроллере ATtiny13 с 1 килобайтом памяти программ и 64-мя байтами (байтами, Карл!!!) оперативной памяти!
С тех пор утекло не так уж и много воды, но теперь в нашем распоряжении гораздо более мощный, а, главное, гораздо более дешевый микроконтроллер на ядре RISC-V, созданный в Китае. Конечно, речь идет о микроконтроллерах серии CH32V003, которые потихоньку начинают отгрызать свое место под солнцем у различных Ардуин. И конечно это был только вопрос времени - сделать игровую консоль на этом чипе. Сегодня я расскажу о законченном проекте игрового устройства на CH32. Поехали!
Проект игровой консоли на CH32V003
Вообще, мне не повезло стать первопроходцем в вопросе игровых консолей на CH32! Несмотря на то, что эти чипы на рынке относительно недавно, активные исследователи уже неплохо так продвинулись в вопросах их освоения. За это им большое спасибо, поскольку их труд делает гораздо более простыми первые шаги для всех остальных! В вопросе игростроения дела тоже обстоят неплохо.
Немного покопавшись в интернете я обнаружил, что уже существует проект игровой консоли на китайском чипе. Его автор тот самый Stefan Wagner, который создал неплохие заголовочные файлы и темплейты для многих микроконтроллеров, В том числе и для CH32V003. Именно у него я нашел проект игровой консоли. И даже не просто консоли, а консоли для самого младшего чипа в семействе - CH32V003J4M6 в 8-пиновом корпусе. Кроме того, он адаптировал для этой консоли несколько игр, в числе которых Арканоид, Тетрис, Пакман и другие...
Вот так выглядит консоль в исполнении Стефана:
Все очень неплохо! Все схемы и чертежи есть в открытом доступе. Тем не менее, чем дальше я изучал его проект, тем больше возможностей для улучшения я находил.
- Открытый техно-гиковский дизайн. Его нельзя отнести к недостаткам. Скорее, внешний вид соответствует определенной тенденции в радиолюбительском творчестве, позволяющей не прятать "доморощенные электронные кишки" за сомнительным фасадом в виде мыльниц и коробок от сигарет (ага, я помню эти времена). А что? Промышленная плата, технологичный SMD-монтаж... И так красиво! Верно, красиво. Но я хочу корпус. Я хочу ощущение завершенного пути, которое появляется, когда ты завинчиваешь последний винтик. В конце-концов, я хочу признания домашних, которые могут оценить лишь что-то напоминающее заводскую конструкцию!
- Печатная плата. Что я точно не хочу, так это заказывать ее на производстве! Я хочу сделать сам! Полагаю, что многие мои читатели разделяют это желание. Объяснение у меня есть, но объяснять долго. Не буду. Кроме того, печатная плата Стефана подразумевает использование определенных деталей, которых у меня может не быть. Поэтому делаю свою плату под более доступные детали. Плату делаю одностороннюю! С 2-х сторонней много возни. А значит придется полностью ее пересмотреть.
- Питание я хочу от аккумулятора. Ну их эти CR2032. Там в схеме (чуть ниже приведу) используется динамик с сопротивлением обмотки 13...16 Ом. Он неплохо так нагружает батарейки. Даже экран тускнеет. Или батарейки нужны дорогие. Не мой путь. Пусть будет аккумулятор. С перезарядкой, естественно.
Были и еще соображения, которые сейчас уже не упомню. Но, по большому счету главное перечислил. Теперь принципиальная схема.
Схема очень проста. Есть две ее ревизии, которые почти ни чем не отличаются.
Ревизия первая.
С небольшим количеством выводов 8-пинового микроконтроллера Стефан обошелся очень бережно! Четыре кнопки висят на одной ноге. Каждая кнопка подключается к питанию через резистор (R2...R5) с определенным сопротивлением. Совместно с резистором R6 они образуют делитель напряжения, величина которого считывается АЦП микроконтроллера. Сопротивления подобраны так, что АЦП способен отличать даже совместные комбинации при нажатии даже кнопок одновременно. Например Вверх и вправо. Кнопка ACT (действие, "огонь"), висит на отдельном пине. А вот необходимости задействовать пин 8, используемый для программирования, не возникло! Значит без всяких проблем можно перезаливать прошивку с игрой!
Небольшой OLED-экран на основе контроллера SSD1306 подключается через пины, обеспечивающие аппаратную поддержку протокола I2C. Это хорошо, но не принципиально. Контроллер конечно будет загружен меньше, в отличие от варианта с эмуляцией, который я использовал для ATtiny13, хотя его мощности было бы достаточно и для программной эмуляции протокола.
Схема 2-й ревизии почти не отличается от 1-й.
Отличие только в способе подключения динамика, который подключается к микроконтроллеру без транзистора. Только через балластный резистор. Полагаю, что сделано это по двум причинам. Во-первых, возможно автор хотел дополнительно упростить конструкцию. А во-вторых, уж слишком громко и неприятно звучат эти маленькие динамики. Заодно и мощность уменьшить...
Мне такое подключение не очень нравится. Я оставлю транзисторный ключ. Кто захочет проще, его можно не ставить, соединив площадки базы и эмиттера на печатной плате перемычкой, а балластный резистор установив вместо базового.
Конструкция игровой консоли
Раз схему нам разрабатывать не придется, займемся печатной платой. Еще раз повторюсь, я решил делать ее для 1-й ревизии. Мне подключение динамика через ключ, без дополнительной нагрузки микроконтроллера импонирует больше. А выкинуть транзистор, если он кому-то кажется лишним всегда можно!
Итак, печатная плата. Делал ее в SprintLayout 6 под более доступные детали. Кнопки использую в выводном исполнении, а не для поверхностного монтажа. Динамик MLT5030 (5x5x3 мм), который использовал автор я решил поменять на чуть больший MLT7525 (7.5ч7.5ч2.5 мм) не в последнюю очередь из-за цены. Он в 3 раза дешевле! А так здесь пойдет практически любой. Можно и вообще без звука!
Вот такая печатная плата получилась у меня. Напомню, она односторонняя.
Чертеж платы будет в архиве, в конце статьи. Получилось обойтись всего лишь 4-мя перемычками. Если же не устанавливать транзистор, то и вообще тремя! Левая верхняя перемычка (перемычки обозначены зеленым цветом) может быть установлена без промежуточной точки.
Точка фиксации предусмотрена лишь одна (отверстие в правом нижнем углу). Полигоны "земли" занимают существенную площадь лишь потому, что так моему фрезерному станочку будет меньше работы по съему лишней меди. Если вам травить, то и расход химии будет меньше! А так, можно их и убрать. Принципиального значения они не имеют. Высокочастотный цепей снаружи микроконтроллера нет.
Желтые прямоугольники снизу - контуры кнопок. Большой прямоугольник - дисплей. Желтый и зеленые цвета это те компоненты, которые устанавливаются с другой стороны. Красные устанавливаются со стороны печатной платы. Большой красный прямоугольник в левом нижнем углу платы - модуль заряда. О нем чуть позже.
Корпус был спроектирован в программе Компас-3D.
Размеры корпуса определяются, главным образом, размерами использованных деталей. Снизу видно отверстие для зарядки. Справа - отверстие выключателя питания. Слева еще есть отверстие под контакты, предназначенные для прошивки устройства.
Изготовление игровой консоли
Изготовление начинаем с печатной платы. Я вырезаю печатки на ЧПУ-станочке CNC1610 с размером рабочего поля 16 на 10 сантиметров. Этого мне вполне хватает! Изготовление происходит в несколько этапов. Вот так выглядит 1-й этап - вырезание дорожек по контуру.
Фреза 0,2 мм. Ее толщина определяет, по-сути, точность изготовления. Минимальная толщина дорожек в моих домашних проектах - 0,25...0,3 мм с примерно такими же зазорами.
Следующий этап - съем лишней фольги между дорожками.
Вот как раз чтобы ускорить этот процесс я оставляю всю возможную земляную фольгу.
Потом в патрон заряжается сверло и сверлятся отверстия. Затем сверло заменяется фрезой и происходит вырезание. Результат.
Весь процесс изготовления платы занял примерно 2 часа. Затем я покрываю плату сплавом Розе. Делается это в кипятке с добавлением лимонной кислоты.
Так плата не окисляется и легко паяется.
Корпуса своих устройств я печатаю на 3D-принтере. У меня Anycubic i3 Mega. Мои постоянные читатели знают мою тягу к желтому цвету. В этот раз я решил не отступать от традиций. По-моему, желтый цвет как нельзя лучше соответствует статусу изделия-игрушки!
Корпус состоит всего из двух деталей, которые стягиваются между собой одним винтом M2. Под винт в корпус вплавляется латунная резьбовая вставка.
Можно обойтись и без вставки. Например, саморезами.
Сборка игровой консоли
Сборка начинается с установки деталей на печатную плату. Прежде всего, ставим перемычки.
В качестве перемычек использованы выводы от резисторов. Обратите внимание, что верхняя правая, горизонтальная перемычка составная. Еще раз обращаю внимание. Если транзистор динамика устанавливать не планируется, то ее можно протянуть между двумя крайними точками и не заводить в среднее отверстие - к транзистору.
Далее устанавливаются все SMD-компоненты (контроллер, резисторы, конденсаторы) и кнопки. Вид со стороны поверхностного монтажа.
Подходящего p-n-p-транзистора у меня под рукой не оказалось. Поставил MOSFET с p-каналом что был в наличии AO3401. По выводам они совпадают, а работают все равно в ключевом режиме. Только для разрядки затворной емкости установил между затвором и истоком дополнительный резистор на 2,2 кОм.
Один нюанс! При запайке кнопки ACT. Точки пайки нужно сделать как можно более низкими. Для этого выводы кнопки перед пайкой следует загнуть. Вот так.
Вид со стороны кнопок.
Кнопки обычные 5,5x5,5 мм с высотой толкателя 3...5 мм. У меня 4,5 мм, какие были. Лучше чуть поменьше. Выключатель питания 3-пиновый с боковым ползунком.
На следующем этапе устанавливаем динамик. Напомню, я использовал MLT7525. Вот такой.
Сопротивление его обмотки составляет 16 Ом. Вот так он выглядит с обратной стороны.
Контактов очень много, но функциональных только два - те, между которыми стоят символы MH. Динамик предназначен для поверхностного монтажа, но мы будем монтировать его со стороны выводных компонентов. Значит, снабдим его выводами. Вот так.
Теперь немного изогнем выводы, подогнав их под имеющиеся для монтажа отверстия. У меня получилось так.
Можно выводы оставить большей длины. Динамик легкий (около 1 грамма) и будет держаться надежно.
Устанавливаем модуль зарядки. Он стандартный, с разъемом type-С. Последнее время я такой использую во всех проектах.
Предварительно к модулю подпаиваю два контакта для подключения аккумулятора. Вообще, этого делать не обязательно. Можно аккумулятор подпаять непосредственно к модулю. Но я рассказываю как делал. Привык делать отключаемые, легко разбираемые, ремонтируемые конструкции...
Контакты обычные, от дюпонтовских гребенок. При пайке обратите внимание, чтобы с другой стороны они не выступали за плоскость платы. Для этого их можно покороче откусить.
Теперь наклеим на поверхность зарядного модуля кусочек каптонового скотча.
Можно наклеить и обычный. Просто каптоновый не боится нагрева, если что-то потом подпаивать будем. Другой кусочек каптонового скотча наклеивается на плату, на место установки модуля зарядки.
На фото видно, что перед этой операцией я подпаял к плате два толстых вывода. Эти, по-моему от электролитических конденсаторов.
Теперь можно "нанизать" модуль на эти выводы и припаять его так,чтобы между платой модуля и общей платой остался зазор около 1 мм.
По окончании процедуры результат должен быть примерно такой.
Настало время установить на свое место OLED-дисплей. Перед установкой модуля нужно снять с гребенки его контактов пластиковый ограничитель. Вот так модуль выглядит до этой операции:
А вот так после:
Затем наклеиваем на плату, на место установки модуля дисплея несколько кусочков каптонового скотча.
Дисплей устанавливается так, чтобы высота от печатной платы до поверхности его экрана составляла примерно 4,5 мм.
Наконец, последняя операция - установка выводов для прошивки микроконтроллера. Для этого также используются 90-градусные дюпонтовские контакты, только с удаленной пластиковой частью и укороченные на ее длину.
На этом сборка начинки устройства закончена.
Софт для игровой консоли
Начать тестирование консоли имеет смысл с прошивки программы калибровки геймпада. Ее можно найти по ссылке, которую я давал в начале статьи. Программа выводит на экран значения, получаемые с АЦП при нажатии клавиш стрелок. Клавиша ACT обрабатывается отдельно, поэтому на нее реакции не будет. Вот так выглядит работа программы-калибратора.
Видно, что я нажал клавишу "Влево" и получаю значение от 510 до 512. Берем среднее - 511 и записываем его. Тоже самое проделываем и с другими клавишами и со всеми комбинациями соседних клавиш. например лево-вверх или право-низ. Лево-право и верх-низ - не нужно. Если вы использовали те же резисторы, что указано в документации, то, возможно, калибровка и не понадобится даже если имел место разброс номиналов. Во всех программах используется защитный интервал (константа deviation) от разброса. Кстати, все настройки клавиатуры содержатся в модуле driver.h. Если какая-то игра не будет вас слушаться, то нужно зайти в этот модуль и перед компиляцией поравить соответствующие константы. Кстати, в этом же файле расположена управляющая константа, которая позволяет скомпилировать игру без звука. ДЛя этого достаточно установить JOY_SOUND в 0.
Дальше я решил загрузить Тетрис. И вот тут меня ожидал сюрприз другого рода. Вот так выглядела картинка.
Видно, что картинка как бы съехала почти на половину экрана. С такого рода проблемами я уже имел дело ранее и знал где искать ее решение. Дело в том, что при инициализации дисплея для новых дисплеев иногда бывает нужно хоть раз указать в явном виде начальную строку вывода. По-идее, с фабрики они должны идти со строкой по-умолчанию - 0. Но, сплошь и рядом строка указана произвольно. Поэтому к последовательности инициализации в файле oled_min.c я добавляю одну строчку кода.
Строка выделена и комментарий в ней на русском языке. После этого дисплей будет инициализироваться нормально даже без этой строчки. Но, во избежание сюрпризов лучше ее оставлять.
На этом отладка завершена. Можно убирать консоль в корпус. Подключаем аккумулятор на 200 мА и компонуем примерно так:
После этого вся начинка помещается в корпус и фиксируется одним винтом. Итак, консоль в сборе с загруженной игрой Tiny Lander.
Эта, кстати, мне больше всего по душе! А вот сыну больше нравится Арканоид.
Размеры получившейся консоли составляют 40x52x14 мм. При зарядке на плате модуля зарядки загорается красный светодиод. Он хорошо виден сквозь корпус с обратной стороны
По завершении зарядки цвет светодиода становится синим.
Для прошивки новой игры консоль подключается к компьютеру через программатор.
По ссылке в начале статьи вы найдете следующие игры, адаптированные Стефаном Вагнером: Tetris, Arcanoid, Tiny Lander, Pacman, Tiny Invaders. Есть игра "Жизнь" для тех, кто любит созерцать как течет вода, горит огонь и работают люди...
Со своей стороны я наконец-то исполнил давнюю задумку - доделал игру Змейка, которую прикладываю к архиву в конце статьи. Вот так выглядит ее заставка.
А вот так геймплей.
И змейка как настоящая и подсчет результатов есть! Если будут пожелания - пишите, доработаю. В будущем обязательно еще что-то напишу для такой милой безделушки!
Когда я только начинал изучать микроконтроллеры, а начинал я это делать ка и все нормальные люди с Ардуино, я тоже делал игровую консоль. В ее памяти разместились сразу две игры: тетрис и змейка. И вот теперь любопытно стало их сравнить. Для этого положил их рядом.
В тетрис на Ардуино-консоли мы даже домашние чемпионаты устраивали!
Друзья, еще раз поздравляю вас с наступающим Новым годом! Пусть в 2025 году вам сопутствует удача и благополучие! Пусть ваши мечты сбываются, а замыслы успешно воплощаются в жизнь! Мира и здоровья вашему дому!
Архив с файлами, необходимыми для изготовления консоли и игрой Змейка можно скачать здесь:
Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, микроконтроллеры, мини-ПК, необычные компьютерные решения и инновационные разработки! Спасибо всем, кто поддерживает меня своими комментариями и лайками!
Наша группа ВК: https://vk.com/terrabyte
Наш канал на VK-Video: https://vk.com/video/@terrabyte/all