Возможно вы слышали про дешевый желтый дисплей, он же CYD (Cheap Yellow Display), если нет, то это плата с ESP32, с дисплеем, желтая и, сюрприз, дешевая. У платы достаточно активное сообщество, хотя проектов готовых не так уж много, но на Instructables мне встретился один, который использует эту плату для создания ретро-консоли. Но при этом она получилась приятной на вид и рекомендуется самим сайтом (т.е. имеет метку feature). Поэтому я сразу захотел собрать её.
В данной статье расскажу о процессе создания данной консоли полностью в домашних условиях, покажу как она работает и расскажу сколько действительно она стоит. Если вы размышляли чтобы такое собрать самому, то возможно вам будет интересно почитать про данный проект.
Рекомендации к чтению
Воспринимайте данную статью больше как дополнение к основной инструкции по сборке ретро-консоли. В моей статье больше будет рассказано про проблемы и особенности с которыми столкнулся я, но без подробных инструкций как повторить проект.
Статья состоит из 4х частей: введение, разработка и сборка, обзор (с видео), выводы. Вы можете смело переходит к тому разделу, который считаете более интересным.
Введение
Началось все на самом деле просто, в какой-то момент мне в рекомендациях стали попадаться разные гаджеты, один из которых был Cardputer. Это небольшое интересное устройство на ESP32, но о нем не сегодня. Просто потом я как-то заинтересовался больше ESP32 и гаджетами, поэтому очень быстро наткнулся на такое устройство как Cheap Yellow Display (CYD) или дешевый желтый дисплей.

Фото CYD, которое встречается на карточке товара
Повторюсь, но по своей сути CYD это устройство с ESP32, с экраном, в желтом цвете. Оригинальный CYD имел кодовое название 2432S028R, точно не знаю как оно расшифровывается, но скорее всего 028 означаете 2.8 дюйма диагональ экрана, а R в конце это резистивный тачскрин. В нем используется классическая ESP32, TFT экран 320х240 и если говорить о цене, то его легко можно приобрести за 600 рублей (но с долгой доставкой).
Как вы могли догадаться, с популярностью данного устройства появились и другие модели, например, с диагональю 3.5 и 5 дюймов, но также и с емкостным тачскрином (в конце стоит C), а некоторые даже другой микроконтроллер ESP32-S3. Поэтому, при желании есть из чего выбирать. В интернете нет полного списка всех моделей CYD, но я нашел лайфхак — зайти на проект M5Launcher и выбрать CYD, после чего появится понятный список.
Про другие модели я тогда еще не знал, да интересно по большей счету оригинальное устройство. Поэтому в данной статье будет разговор о 2432S028R и если вы захотите повторить проект из статьи на другом устройстве, то оно может не заработать.
Из интересного, название CYD появилось, кажется из вот этого ролика на YouTube. Автор этого же канала, создал проект на Github, в котором собрал всю необходимую информацию о данном устройстве (даже принципиальные схемы имеются). Думаю, если вы интересовались, то уже посещали эти ссылки.
Одна из первых мыслей, которая меня посетила, это узнать какие есть готовые проекты на этой плате. Сходу находится вот этот список с готовыми проектами для этой платы, но больше всего меня привлекло внимание проект ретро-консоли на Instructables.

Фото консоли с Instructables
Первое, что бросалось в глаза то, что консоль выглядит приятно, это не куча проводов с макетной платой и большими кнопками, какие часто попадаются в сети. Ответ, как мне кажется находится в том, что для данного проекта используется своя печатная плата, а с учетом того что CYD сам по себе законченное компактное устройство, то если соединить эти два компонента, то получается плотная компоновка. И главное все это обернуто в корпус, напечатанный на 3д принтере.
С корпусом проблем не должно быть, у меня есть 3д принтер и его можно распечатать. А вот печатную плату заказывать никак не хочется, но я посмотрел и сделал вывод, что печатную плату можно сделать самому на фрезерном станке. Только есть один нюанс, что принципиальной схемы или разводки печатной платы на странице проекта нет, но есть же Gerber файл. Поэтому должно получится, если в него подглядеть.
Разработка и сборка
Детали
Вот перечень материалов для созданиях данной консоли:
- CYD
- Расширитель выводов PCF8575
- Провод с разъемом JST 1.25 мм с 4-мя выводами. (мое дополнение: еще 2-х контактный)
- Модуль TP4056 c USB Type-C
- SMD кнопка (4х4x1.5mm)
- Переключатель питания (SS-12F23)
- Винты M3 на 16 мм
- Динамик (8 Ом)
- PSRAM
- Резисторы 0603, 22кОм и 47кОм (не пригодились)
- Литиевая батарея 503035 3.7В
- Резисторы 1206, 0R (мое дополнение)
Коротко распишу каждый пункт и то, что я с ним сделал.
CYD
Брать стоит версию 2432S028R. Возможно версия с емкостным экраном тоже подойдет, но можно не переплачивать, т.к. вместо тачскрина все равно будут кнопки. Как вы понимаете, если вы возьмете, например, CYD с экраном отличным от 2.8 дюйма, то в корпус он не поместится.
PCF8575
В CYD мало портов ввода/вывода или другими словами мало доступных для подключения выводов. Но нашлось интересно решение, использовать плату-расширения, которая работает по I2C, потому что как раз разъем для подключения I2C есть на плате. На этом модуле есть 16 GPIO.
Разъемы JST
На плате есть два разъема, один для подключения I2C устройства и одно для подключения динамика. Оба JST с шагом 1.25мм, один с 4-мя контактами, другой с 2-мя. Я не стал искать легкого пути и решил обжать эти разъемы самостоятельно. Для этого купил вот этот наборчик разъемов.

Наборчик JST с шагом 1.25мм
Обжимаются очень сложно, если есть вариант взять готовый, то лучше так сделать. У меня есть кримпер, так он такие маленькие не обжимает, пришлось припаивать и обжимать плоскогубцами. На один удачно обжатый таким образом разъем у меня по началу приходилось две, а то и три попытки.
Модуль TP4056
Народный модуль заряда, но есть нюанс, что он с USB Type-C, если возьмете другой, то размеры могут не совпасть, надо будет подправить разводку платы.
Не забываем заменить резистор PROG. В модуль устанавливают обычно его на 1.2 кОм и получается ток зарядки 1А, я часто ставлю 2.4 кОм и получается ток зарядки 0.5А.
SMD кнопка
Кнопка, как кнопка. Когда-то я купил вот этот наборчик, и там как раз оказалось ровно 10 кнопок.

Наборчик SMD кнопок. В пустом отсеке были те самые кнопки
Выключатель питания
Большой выключатель питания.
Винты M3
И тут мне опять помог наборчик, но уже с винтами. Винты вкручиваются прямо в пластик, без каких либо гаек.

Наборчик M3 винтов
Динамик
В инструкции предлагалось использовать один динамик, но у меня уже был очень дешевый и простой 8-омный динамик, поэтому я взял его. Звук, конечно, не очень, но не совсем плохо.
PSRAM
Для работы ретро-консоли нужно будет припаять отдельную микросхему с 4Мб оперативной памяти. Брал ESP-PSRAM64. Инструкции по добавлению этой микросхемы можете почитать в инструкции проекта или на странице в Github.
0603 резисторы
Эти резисторы нужны для того, чтобы улучшить характеристики звукового усилителя. Например, на плате R8 и R7 могут быть 0 Ом резисторы, тогда их нужно будет заменить, но у меня все было хорошо и эти резисторы не пригодились.
Литиевый аккумулятор
У меня не нашлось аккумулятора 503035, но здесь главное, чтобы высота была не больше 5мм, а такой аккумулятор у меня уже был, хоть и в два раза меньше (на 300 mAh), но все равно.
1206 резисторы
Эти резисторы единственное дополнение, которое пришлось мне добавить. 0 Ом резисторы я использую как перемычки на печатной плате.
Еще детали
Эти детали не упоминаются в инструкции, но их можно привести для общей картины:
- SD карта
- Двухсторонний скотч
- Провода
- Пластик
Коротко о каждой:
SD карта
Пробовал на многих проектах с ESP32, где нужна SD карта и везде все что больше 2 Гб, не видит. M5Launcher видит, а вот Bruce или другие прошивки (Retro-Go не исключение) не видят, что на Cardputer, что на CYD. Поэтому берите лучше 2 Гб SD карту.
Двухсторонний скотч
Лучше тоньше, если взять толстый, то крышка корпуса может не закрыться.
Провода
Для разъемов JST провода должны быть очень тоненькими, а для подключения питания, наоборот толстые.
Пластик
Минимум 2 цвета: один на корпус, другой на кнопки.
Печатная плата
Теперь перейдем к, как мне кажется, самому интересному для меня части — разработка печатной платы. Она такая потому, что эта как последний кусочек головоломки, после которой вся картина становится целой и дает право, чтобы начать заниматься проектом.

Оригинальная печатная плата с Instructables
Напомню, что в инструкции предлагалось заказать изготовление печатной платы и приложен файл Gerber. Мне же хочется её сделать самому на фрезерном станке, но до этого еще не пробовал восстанавливать принципиальную схему и разводку по Gerber файлу.

Вот так выглядит отображение Gerber файла в KiCAD
Для проектирования печатных плат я пользуюсь EasyEDA, вот только в ней нельзя открывать Gerber файлы и использовать их в своих проектах. Но решение нашлось быстро, потому что в KiCad можно открыть Gerber файл для просмотра и экспортировать увиденное в файл разводки. Потом я этот файл разводки импортировал в EasyEDA и у меня получилось создать печатную плату подглядывая в тот файл разводки.

Вот такая у меня получилась принципиальная схема

А вот разводка
По принципиальной схеме нечего добавить, в основном одни кнопки.
А вот по разводке, есть пара нюансов. Т.к. я делаю плату на фрезерном станке, то выставил безопасное расстояние в 0.27 мм, потому что приблизительно столько у меня получается без проблем снимать фрезой. Исходя из этого поставил ширину дорожек в 0.4 мм, у этого есть несколько причин: они фрезеруются без проблем, в отличие от 0.2 мм (какие были в оригинальной инструкции) и нельзя поставить больше, т.к. дорожка должна проходить между отверстиями.
Еще именно на разводке добавил резисторы 0R в виде перемычек, получилось 4-е штуки. Этот способ еще мне подсказали на хабре в комментариях к прошлой моей статье и теперь часто им пользуюсь.

То, что у меня получилось во FlatCAM
Во FlatCAM (приложение для создания управляющий программы для фрезера), я поставил плату вертикально, так, что уместилось бы две платы на лист текстолита 100х150 мм и решил снять всю медь. На скриншоте все, что синее, то снимается, правда я не заметил, как осталось два пустых поля, но ничего, я даже не стал их снимать вручную, т.к. они не мешают.
Фрезеровка заняла у меня где-то 6 часов. 1.5 часа изолированный слой (указанная толщина фрезы 0.27мм), 1.2 часа промежутки между изолированным слоем и слоем без меди (толщина 0.27 мм), 2.5 часа на слой без меди (толщина 0.9 мм). Возможно так долго, потому что скорость немного в этот раз уменьшил на 20%, т.к. текстолит оказался прочнее обычного.

После фрезеровки на столе

Плата после фрезеровки на просвете
После станка плату пришлось дорабатывать чертилкой, т.к. во многих местах медь не счистилась. Но конечный результат уже вышел хорошо.

Шелкография
Здесь можно видеть шелкографию, много мест, где не отпечаталось, но я обычно так и оставляю, если все надписи можно прочитать или догадаться, что там написано. В противном случае, надо было бы переделывать ее. А так, плата же в корпусе, шелкографию, можно и не делать.
Еще вы могли обратить внимание, что текстолит серого цвета. Это я недавно заказывал дешевый текстолит из Китая, хотя мне очень нравится как он выглядит и шелкография ложится приятно, но почему-то фрезеруется плохо и пыли больше. (А может это станок мой потрепался?) Поэтому в будущем от него откажусь.
Рассуждения о страхах при передачи Gerber файлов
На самом деле интересный вопрос, допустим вы заказываете платы на стороне и отдаете Gerber файл, ведь ничего страшного нет? Оказалось, что в целом восстановить печатную плату по Gerber файлу более чем реально и обеспокоенность этим оправдана.
Но на самом деле об этом никто сильно не переживает. На то есть причины. Восстановить принципиальную схему сложно, т.к. не до конца известны компоненты, другими словами, за место одних компонентов могут пролезть другие. Особенно это чревато конденсаторами, резисторами, которые никак не подписаны. (Но, если заказывать сборку, то и эту информацию можно узнать.)
Другая причина, что нет никакой сопроводительной документации о ПО, о чем плата и где она будет использоваться.
Но в целом, этот вопрос меня давно волновал, а что вы по этому поводу думаете?
3д печать
Перед тем как приступать к сборке, стоит рассказать про корпус на 3д принтере.
Файлы моделей можете посмотреть на Thingiverse. Всего имеется два вида корпуса, один, который нужно разбирать, чтобы перепрограммировать, другой, наоборот, с разъемом под USB от CYD и место для кнопки BOOT. Я выбрал второй вариант. Главное понимайте, что если вставить одновременно в разъем питания провод и в разъем USB от CYD, то может произойти что-то неприятное, т.к. никаких защит нет. Поэтому отключаете питание и вставляете USB провод от компьютера.
При печати возникли некоторые сложности, кнопка BOOT плохо печаталась, слипалась на первом слое, пришлось поднять Z offset на своем принтере, стало лучше, но все равно не очень. Она плохо нажимается, но все же нажимается. У меня плата прошивается и без нажатия на BOOT, но один раз пришлось её нажать, т.к. до этого была неудачная операция прошивки.
Другая проблема, что кнопки туго влезали в свои места, решается масштабированием кнопок в 0.975 раз. Меньше лучше не стоит, они у меня и так немного, но болтаются.
Сборка
Из сборки, самое сложное, кроме обжимания JST с шагом 1.25мм, это припаять PSRAM. Там надо будет отпаять светодиод, перерезать две дорожки, припаять на посадочное место микросхему и еще припаять два проводка. Получается так, что CYD для полноценной работы придется дорабатывать, но как по мне это добавляет больший задор.
Еще есть нюанс, лучше чтобы на верхнем слое печатной платы припаянные разъемы не заходили за высоту кнопок, а они очень тоненькие.
Еще, когда вы будете припаивать провода к разъемам S1 и S3, то возникнет вопрос откуда автор узнал, что они значат? Ответ, как потом я понял, очень простой, в репозитории CYD лежит готовая принципиальная схема, на которой все подписано.

Все устройство в сборе, осталось закрыть крышку
Retro-Go
Теперь пришло время приступить к программной части, а именно к установке Retro-Go. Retro-Go это платформа с эмуляторами, очень популярная и много что поддерживается, эдакий RetroArch для встраиваемых систем на ESP32. Создатель инструкции CYD ретро-консоли добавил поддержку этой платы в Retro-Go.
Теперь осталось прошить и запустить её. Запускаю и у меня на экране полоски. Видно, что экран не определился. Придется пересобирать программу самому.

Экран не определился. (Изначально корпус я сделал серым)
Для того, чтобы пересобрать Retro-Go нужно установить ESP-IDF. Я установил последний и на самом деле компиляция очень простая, надо зайти в папку retro-go и выполнить python rg_tool.py --target=cyd release launcher retro-core prboom-go gwenesis. (Эту команду подсмотрел в Docker файле.)
После того, как скомпилировал сам прошивку, зашил её и убедился, что полоски остались, стал разбираться как это исправить. Могу сказать, что кнопки заработали сразу, а звука не было, но позже я узнал, что звука в меню нет, только в играх.
Пришлось править файл config.h:
#define ST7789_MADCTL 0x36 // Memory Access Control
#define ST7789_MADCTL_MV 0x20
#define ST7789_MADCTL_MX 0x40
#define ST7789_MADCTL_MY 0x80
#define ST7789_MADCTL_RGB 0x00
#define ST7789_MADCTL_BGR 0x08
#define RG_SCREEN_INIT() \
ILI9341_CMD(ST7789_MADCTL, (ST7789_MADCTL_BGR | ST7789_MADCTL_MY | ST7789_MADCTL_MX)); \
ILI9341_CMD(0xC0, 0x1B); /* Power control //VRH[5:0] */ \
ILI9341_CMD(0xC1, 0x12); /* Power control //SAP[2:0];BT[3:0] */ \
ILI9341_CMD(0xC5, 0x32, 0x3C); /* VCM control */ \
ILI9341_CMD(0xC7, 0x91); /* VCM control2 */ \
ILI9341_CMD(0xB2, 0x0C, 0x0C, 0x00, 0x33, 0x33); /* Porch Setting (0x0C, 0x0C=Std or 0x0F, 0x0F=Slow */ \
ILI9341_CMD(0xC6, 0x03); /* ST7789 Frame Rate Control (0F=60, 07 to 00=75 to 119, 6Hz steps) */ \
ILI9341_CMD(0xB6, 0x0A, 0x82); /* Gate Scan Direction (82=Std, A2=Inv, 22=Alt) */ \
ILI9341_CMD(0xF6, 0x21, 0x00); /* Interface Control (01=Std, 21=Interleave */ \
ILI9341_CMD(0xE0, 0xD0, 0x00, 0x05, 0x0E, 0x15, 0x0D, 0x37, 0x43, 0x47, 0x09, 0x15, 0x12, 0x16, 0x19); \
ILI9341_CMD(0xE1, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19); \
Первую ошибку я исправил достаточно быстро, т.к. на моем фото с дефектом вы могли заметить, что есть выраженные полоски. Я сразу понял, что это относится к Interleave (чередование). Поставил и экран ожил, но текст был верх ногами.
В итоге я нашел даташит по ILI934 и узнал, что по команде 0x36 можно инвертировать направление строк и столбцов. Поменял и все заработало.
Хотя, что-то было странное, оказывается цвета были инвертированы, убрал нужную строчку и все уже заработало правильно.
Еще наверно надо сказать немного слова про BIOS файлы, они нужны для эмуляции. Никто их в открытую не распространяет, но есть занятный лайфхак, который я использую — эти файлы можно взять с SD карты, которая идет в комплекте с ретро-консолью, например, r36s. Их там пока кладут охотно.
Обзор
Сборка прошла успешно и приставка теперь полностью функционирует. Давайте посмотрим как оно работает, вдруг вам интересно на что оно способно.
Я записал для вас видео, чтобы вы могли все посмотреть сами, но текстом приведу свои выводы.
Лучше всего работает или эмулируется NES или Денди. Разрешение её игр 256×240 или 256×224, масштабирование можно убрать и это будет почти на полный экран. Другими словами, выглядит без искажений, но самое главное не тормозит. Это скорее всего потому, что она 8-ми битная.
Лучше всего картинка это у Sega Mega Drive у неё как раз разрешение 320х240, но умеренно подтормаживает и это если не включен звук. Звук, кстати, выключен по-умолчанию, а с включенным звуком тормозит очень сильно, играть невозможно.
Хуже всего работает SNES, выглядит может быть и красиво, но тормозит ужасно как со звуком, так и без.
Лучше всего по производительности это эмуляторы Game Boy и Game Boy Color. Работают быстро и шустро, но разрешение у них заметно меньше (160x144), если такое выставить, то будет еле все видно. Поэтому без масштабирования играть никак, оно хоть и искажает немного, но играть приятно, сильного дискомфорта нет.
А вот DOOM работает без нареканий, но это скорее всего из-за того, что не эмулируется. Поэтому если писать игру под эту приставку, то можно получить достаточно хороший результат, но это по большей части про 2д игры.
Сколько приставка работает от одного заряда?
У меня вышло около 2х часов и 20 минут на полном заряде на 300 мАч литьевом аккумуляторе. Я думал будет в два или в три раза меньше.
Непонятный артефакт

Артефакт с вертикальными полосками
Пока играл, обнаружил, что если бежать персонажем, то при передвижении камеры вправо или влево, появляются вертикальные полоски. Может быть эмулятор, может быть код работы с дисплеем, точно не знаю.
Себестоимость
Давайте ради забавы посчитаем во сколько это обошлось. Действительно ли дешево получилось?

Таблица с расходами
В итоге получаем, что цена за одно изделие (или расходы) 1225 рубля и если немного еще докинуть, то можно было бы купить r36s! Оно может быть и дешево, но на грани. При этом в таблицу я вписывал самое дешевое комплектующее.
Другая цифра, это 3983 рублей, это если покупать полный комплект деталей на все случаи, например, 2 килограмма пластика (потому что нужно 2 цвета), а использовать из него только 50 грамм. Остальное, думаю вы можете сами развить, например, что можно еще посчитать и включить 3д принтер, фрезерной станок, электричество или личное время.
Выводы
Это проект было приятно повторить, потому что он идеально подходил к моему инструментарию, т.е. все необходимое для создания печатной платы или пластикового корпуса уже имелось, но главное конечный результат приятен, можно взять приставку с полки и начать играть, либо достать SD карту и записать новые игры, она не занимает много места и её удобно брать с собой, т.е. такое же отношение как к полноценной приставке. Но назвать эту приставку дешевый все же нельзя, а так я её назвал, только потому что используется CYD.
Но получившая приставка больше близка к DIY самоделкам, чем к полноценным приставкам. Больше потому, что у неё есть два USB разъема и можно навредить, если одновременно подсоединить оба. Решается, конечно, просто — печатается корпус без доступа ко второму USB. Это наиболее существенная проблема, но суть не меняется, можно найти и другие, например, не подписаны кнопки, никак не узнать о состоянии батарее или мало эмулирующих платформ, которые не тормозят. Главное, что она удивляет, т.к. от самоделок рассчитываешь, что про неё можешь сразу забыть как только сделал, а тут с удовольствием хочется достать с полки и проверить теорию как на ней запустится та или иная игра.
CYD однозначно интересное устройство, которое можно пустить на различные самоделки, например часто возникает желание выводить какую-нибудь информацию с Home Assistant на дисплей. Возможно еще к ней вернусь, но не раньше чем сформируется проект под неё.
И заходите в мою группу Планета M039 во ВК, возможно вы там найдете что-то для себя тоже.
Все файлы проекта можете найти в репозитории cyd-retro-console. (Прошивка находится в секции Release.)
