Ретро-гейминг на Pico Pi: создаём свою Dendy

в 16:42, , рубрики: dendy, Nes, pico pi, Raspberry, rp2040, st7789, денди, дисплей, игровая консоль, эмулятор nes

Игровая консоль Dendy на базе Pico Pi с экраном от смарт часов и беспроводной зарядкой.

Все началось с покупки в магазине игровой консоли SUP, на которой были представлены игры моего детства.

Игровая консоль SUP
Игровая консоль SUP

Большой яркий экран и возможность играть вдвоем - так было написано на коробке от игры за 600 рублей. Однако дома меня ждало разочарование: экран оказался ужасного качества, углы обзора отвратительные, а из 400 предустановленных игр большинство оказались незнакомыми и неинтересными. В итоге консоль отправилась в дальний ящик.

Но...

Дома у меня уже давно лежала плата Pico Pi с контроллером RP2040, купленная ранее для экспериментов.

Pico Pi

Pico Pi

Однажды в поисках интересных проектов для нее я наткнулся на проект Thumby – миниатюрную консоль на базе RP2040 с монохромным OLED-экраном 72x40 пикселей.

Thumby
Thumby

Мне удалось повторить эту консоль, используя Pico Pi и OLED-экран 128x64 пикселей. В качестве корпуса для нее я использовал джойстик от ранее купленной приставки SUP. Консоль работала, позволяя играть в игры Thumby и разрабатывать свои.

Но этого было мало. Я продолжил поиск вариантов игровых консолей на Pico Pi и наткнулся на Picosystem от Pimoroni – консоль на базе RP2040 с IPS-экраном 240x240 пикселей. Picosystem, как и Thumby, предлагает API для разработки своих игр.

Pimoroni Picosystem

Pimoroni Picosystem

Среди проектов на 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 рублей.

T800 Ultra

T800 Ultra

Получив часы, я убедился, что экран действительно 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 с беспроводной зарядкой. Она позволяет играть в игры моего детства, даря приятные ностальгические воспоминания.

Код моего проекта и готовая прошивка.

Автор: Кирилл Антропов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js