Ретро-гейминг на Pico Pi: создаём свою Dendy
Игровая консоль Dendy на базе Pico Pi с экраном от смарт часов и беспроводной зарядкой.
Все началось с покупки в магазине игровой консоли SUP, на которой были представлены игры моего детства.
Большой яркий экран и возможность играть вдвоем - так было написано на коробке от игры за 600 рублей. Однако дома меня ждало разочарование: экран оказался ужасного качества, углы обзора отвратительные, а из 400 предустановленных игр большинство оказались незнакомыми и неинтересными. В итоге консоль отправилась в дальний ящик.
Но...
Дома у меня уже давно лежала плата Pico Pi с контроллером RP2040, купленная ранее для экспериментов.
Однажды в поисках интересных проектов для нее я наткнулся на проект Thumby – миниатюрную консоль на базе RP2040 с монохромным OLED-экраном 72x40 пикселей.
Мне удалось повторить эту консоль, используя Pico Pi и OLED-экран 128x64 пикселей. В качестве корпуса для нее я использовал джойстик от ранее купленной приставки SUP. Консоль работала, позволяя играть в игры Thumby и разрабатывать свои.
Но этого было мало. Я продолжил поиск вариантов игровых консолей на Pico Pi и наткнулся на Picosystem от Pimoroni – консоль на базе RP2040 с IPS-экраном 240x240 пикселей. Picosystem, как и Thumby, предлагает API для разработки своих игр.
Среди проектов на GitHub для Picosystem я нашел эмулятор игровой консоли NES (Dendy) – и загорелся идеей его повторения
Итак, вдохновившись идеей создания Dendy-консоли на Pico Pi, я начал сборку.
Первое, что мне предстояло сделать – это найти подходящий дисплей. Из схемы и репозитория на GitHub я знал, что это IPS-дисплей на чипе ST7789 с разрешением 240 на 240 пикселей и 20-контактным разъемом. Особенностью этого дисплея является выход VSYNC, который также используется в прошивке.
Поиски на Wildberries данного дисплея с доставкой в мою локацию не увенчались успехом. На Ozon и AliExpress такие дисплеи есть, но без контакта VSYNC, и доставка в мою локацию все равно невозможна.
Я решил посмотреть, какие готовые товары с цветными дисплеями и похожими характеристиками есть на Wildberries. Уже зная, что экраны на ST7789 с разрешением 240 на 240 используются в смарт-часах, я начал поиск именно с них.
Первым я нашел смарт-часы, в описании которых было указано наличие IPS-экрана с разрешением 240 на 240 за 400 рублей. Я их заказал, но получив, понял что меня обманули: экран был не IPS, с разрешением 128 на 128, и работал на чипе ST7735. Продавцу, конечно же, я влепил одну звезду за наглую ложь и продолжил искать.
Следующими были смарт-часы T800 Ultra, в которых заявлен IPS-дисплей с разрешением 240 на 280 и беспроводная зарядка. Судя по отзывам, часы не отличались особым качеством, но, посмотрев отзывы с картинками, я увидел, что качество дисплея в них действительно лучше. Поэтому я решился их заказать. Обошлись они мне в 570 рублей.
Получив часы, я убедился, что экран действительно IPS (судя по углам обзора). Я приступил к их разбору. Никаких болтиков на корпусе нет, нижняя часть пластиковая и не поддавалась демонтажу, верхняя часть вся занята экраном. Я пробовал достать его иголкой и картой но они в щель не лезли. Потом я попробовал снять экран присоской, и у меня получилось. Аккуратно отсоединив экран, я пошел искать информацию о нем.
У экрана оказался шлейф с 15 выводами с шагом 0,3 мм. Я искал документацию на похожие экраны и нашел с точно таким же шлейфом. Там я подсмотрел распиновку шлейфа, а также узнал, что он работает на чипе NV3030B и имеет разрешение 240 на 280 (по факту оказалось 284).
Следующим испытанием стало подключение дисплея к Pico Pi для его проверки. Припаяться к шлейфу было невозможно, да и я боялся его испортить. Поэтому я решил найти такой разъем в ближайшем радио магазине (конечно же, его там не нашел). Я решил снимать разъем с платы часов, но паяльного фена у меня не было (остался в России). Паяльником снять его тоже не получалось, так как я не мог достаточно прогреть плату, не испортив разъем.
И тут я вспомнил, что когда-то до появления фена я снимал SMD-детали в кухонной духовке! Я закинул плату в духовку и выставил ее на 240 градусов. Спустя 10 минут я без проблем пинцетом снял коннектор.
Коннектор имеет 2 ряда контактов (расположенных не симметрично) с шагом 0,6 мм. К нему можно припаять тонкую проволоку, но промучившись неделю, я снова пошел в радио магазин и нашел там макетную плату под микросхему SSOP16 (шаг 0,65 мм). Дома мне удалось припаять к ней коннектор, поставив его немного криво так как выводы у коннектора расположены не симметрично.
Таким образом я получил возможность быстро подключать дисплей к макетной плате, а саму плату удобными проводами припаять к Pico Pi. Для начала я опробовал прошивку из документации к дисплею и я был приятно удивлен когда дисплей у меня показал изображение. Таким образом я получил рабочий IPS дисплей, к которому у меня была понятная документация и из плюсов на дисплее был контакт vsync
Я прошил Pico Pi готовой прошивкой от проекта PicoSystem_InfoNes. Подключение дисплея я выполнил по схеме PicoSystem, за исключением подсветки, которую подключил через резистор к плюсу питания.
К моему удивлению, на экране сразу же появилась игра Blade Buster, загруженная вместе с прошивкой. Однако изображение занимало только левую часть экрана (240x240), а правая часть была заполнена шумом.
Доработка кода
Я скачал исходники проекта и доработал код инициализации дисплея:
Повернул изображение на 90 градусов.
Отцентрировал вывод изображения по центру дисплея.
Заполнил области за пределами 240x240 черным цветом, чтобы убрать шум.
В PicoSystem кнопки подключаются к плюсу через подтягивающие резисторы. Меня удивила такая реализация, ведь Pico Pi позволяет использовать внутреннюю подтяжку.
Я проверил код и обнаружил, что на кнопки уже была установлена подтяжка к плюсу. Решив не использовать внешние резисторы, я подключил кнопки напрямую. Однако кнопки не работали!
Проверка мультиметром показала, что внутренняя подтяжка не работает. Изучив интернет, я выяснил, что подтяжка может не работать из-за инициализации контактов как PIO (Peripheral Input/Output). Он использовался в проекте для вывода изображения на дисплей.
Я переместил код инициализации кнопок выше инициализации PIO и скомпилировав получил работающую внутреннюю подтяжку. После компиляции код заработал, и кнопки стали функционировать.
Изначально консоль была привязана к питанию проводом. Но у меня оставался аккумулятор от часов (200 мАч) и беспроводная зарядка.
Я подключил аккумулятор (с встроенной платой контроля заряда), беспроводную зарядку и выключатель. В итоге получилась полностью автономная игровая консоль с беспроводной зарядкой.
В режиме игры консоль работала около 1,5 часов, что показалось мне мало. Я заменил аккумулятор на другой, емкостью 1000 мАч. Теперь консоль работает на одном заряде 6-8 часов.
Я также подключил к выводам звука динамик от часов. Он работает, но довольно тихо.
В результате я создал полностью автономную игровую консоль Dendy на базе Pico Pi с беспроводной зарядкой. Она позволяет играть в игры моего детства, даря приятные ностальгические воспоминания.