Найти в Дзене
RedSpirit

Создаю компьютер и игровую консоль на ESP32. DevBlog 1

Привет читатель! Начинаю серию статей о процессе разработки своего персонального компьютера и игровой консоли в одном флаконе на базе микроконтроллера ESP32-S3. (кому не интересно листайте дальше до деталей самого проекта) В детстве я видел, как в старых журналах Радио публиковали полную схему самодельного компьютера Микро 80, я мечтал его собрать так как никакого другого компьютера в нашей семье не было. Это конец 90х и начало 00-х, я активно занимался радиотехникой и был уверен, что спокойно соберу все по готовой схеме из журнала, на каждый лишний рубль покупал микросхемы и другие элементы, платы травить умел, но когда уже приступил к сборке понял на сколько это сложный и комплексный проект, и только тогда понял, что надо еще и конструировать программатор ПЗУ, а как его программировать если никакого другого компьютера под рукой нет. Где-то на этом этапе грандиозный проект зачах и я о нем на много лет забыл. Пока как-то случайно на YouTube не наткнулся на канал www.youtube.com/@Alemo
Оглавление

Привет читатель!

Начинаю серию статей о процессе разработки своего персонального компьютера и игровой консоли в одном флаконе на базе микроконтроллера ESP32-S3.

История и идея

(кому не интересно листайте дальше до деталей самого проекта)

В детстве я видел, как в старых журналах Радио публиковали полную схему самодельного компьютера Микро 80, я мечтал его собрать так как никакого другого компьютера в нашей семье не было. Это конец 90х и начало 00-х, я активно занимался радиотехникой и был уверен, что спокойно соберу все по готовой схеме из журнала, на каждый лишний рубль покупал микросхемы и другие элементы, платы травить умел, но когда уже приступил к сборке понял на сколько это сложный и комплексный проект, и только тогда понял, что надо еще и конструировать программатор ПЗУ, а как его программировать если никакого другого компьютера под рукой нет. Где-то на этом этапе грандиозный проект зачах и я о нем на много лет забыл. Пока как-то случайно на YouTube не наткнулся на канал www.youtube.com/@Alemorf Алексея Морозова, который как раз таки записал видео о том, как он собирает тот самый Микро 80 со своими доработками и улучшениями. Выражаю огромную благодарность автору! Это вдохновило меня на свой проект, реализовать давнюю мечту о создании компьютера своими руками.

Однако паять сейчас что-то столь древнее и дышать клубами дыма от флюса очень не хотелось, стал думать над альтернативами аппаратной платформы. Сначала выбор пал на FPGA-микросхемы, опыт работы с ПЛИС и Verilog в прошлом уже был, но я побоялся, что все равно это будет слишком высокая рамка для меня одного начинать амбиционный проект на технологиях в которых еще не столь уверенно себя чувствую. Дальше стал рассматривать что-то более попсовое, какой-нибудь ходовой микроконтроллер, хоть вайбы и не те, но лучше так, чем вообще ничего не делать. Надо было такой микроконтроллер, который сможет сам генерировать VGA сигнал и хранить framebuffer (желательно двойной), в итоге выбрал для себя ESP32-S3, достаточно производительная и дешевая штука с хорошей обвязкой. В S3 есть дополнительная микросхема памяти на 8Мб работающая по SPI, она более медленная, но ее достаточно для буфферов видеопамяти.

Для отработки понимания архитектуры и софта я начал разработку компьютера на ESP32, но держу в голове, что скорее всего "портирую" его на какую-нибудь FPGA, чтобы компьютер был больше компьютером а не просто софтом для микроконтроллера.

Аппаратная платформа

Итак, в роли базы для разработки был выбран МК ESP32-S. С ним имеем 2х ядерный процессор 240 Мгц, ~380Кб SRAM и 8Мб PSRAM, звучит как очень богатая начинка для "рето-пк". Плюс к этому на каждом ESP32 есть встроенный модуль Wi-Fi, с ним можно реализовать какое-либо взаимодействие с интернет-сервисами, но этот функционал пока всерьез не рассматриваю.

У моего компьютера должно быть:

  • подключение к монитору (VGA)
  • подключение клавиатуры (PS/2)
  • подключение SD карты памяти (вместо жесткого диска)
  • звуковой ЦАП для вывода звуков и музыки
  • и еще возможность подключение периферии (например, геймпада), это можно сделать с помощью USB-host встроенного в микроконтроллер.
-2

Вывод видео на монитор

Это один из самый интересных аспектов, то, смогу ли я нормально выводить графику зависело смогу ли я вообще начинать этот проект. На ESP32-S3 нельзя генерировать VGA-сигналы нативно, специального интерфейса нет, а для видео нужно генерировать высокочастотный сигнал с очень точными таймингами с DMA, чтобы иметь быстрый доступ до памяти где хранится буффер с массивом пикселей. К статью есть некий хак, который позволяет использовать интерфейс видеокамеры и библиотеку LCD_CAM, за основу я взял код из вот этого проекта https://github.com/bitluni/ESP32-S3-VGA там автор жестко разобрался во всех таймингах и реализовал готовое решение с двойным буффером и 16-битным цветом, благодаря этой наработке можно без боли выводить графику на монитор.

Дебаг всех вариантов цвета, по 7 красного и зеленого и всего 3 у синего
Дебаг всех вариантов цвета, по 7 красного и зеленого и всего 3 у синего

Поскольку выводы у контроллера цифровые а VGA сигнал на цвета аналоговые (чем больше напряжение тем выше яркость), то нужно еще соорудить резисторную матрицу с делением напряжения. Я храню значение цвета в 8 битах. Всего 256 цветов, 3 пина на красный, 3 на зеленый и оставшиеся 2 на синий. Сначала я паял резисторы на своей плате, но потом наткнулся вот на такой адаптер:

VGA PS2 Board
VGA PS2 Board

Тут 2 в одном, распаяная матрица RGB333 и PS/2 порт. Сразу рекомендую покупать что-то подобное или паять плотно без длинных проводов, что на VGA, что на PS/2 помехи и наводки сильно влияют на качество передачи информации. Я долго софтерно дебажил драйвер клавиатуры не понимая почему приходят байты, которых не должно быть, оказывается из-за проводов без изоляции, они ловят помехи и вносят мусор, в итоге клавиатура реагировала на кнопки через раз. Данный адаптер проблему решил полностью.

Софт

Список доступных команд
Список доступных команд

Изначально начал писать прошивку на платформе esp-idf, но оказалось, что указанный выше проект ESP32-S3-VGA использует ардуиновский драйвер LCD_CAM, портировать его в esp-idf и заставить хоть как-то работать не получилось, решил не застревать на этом месте и в итоге весь проект у меня вырос на программной платформе arduino, в какой-то степени это несет накладные расходы в плане лишних абстракций, с другой стороны это даже удобней, можно использовать бесчисленное количество готовых библиотек.

Я даже добавил интепретатор lua, могу прямо из командной строки выполнять разные математические выражения, но полноценного API с lua еще не реализовал, в будущем я планирую, что какой-либо софт и даже игры будут выполняться на моей платформе с помощью пользовательских lua-скриптов.

Промежуточный результат

Сейчас проект еще далек от завершения, но я все равно решил записать короткий видеоролик с демонстрацией того, что уже сделано:

Там я показываю, что сделал shell, добавил больше десятка разных команд, работу с файловой системой SD-карточки (список файлов, навигация, создание и удаление файлов).

Сделал менеджер приложений, shell который отображается при старте это лишь отдельное приложение, оно может загружать другие приложение (игра, плеер, что угодно еще), при этом выгружается из памяти само освобождая ресурсы. Так же и другие приложения, если приложение хочет выйти, менеджер освобождает занятые им ресурсы и загружает shell.

Кадр из видеоплеера (внизу номер кадра и fps)
Кадр из видеоплеера (внизу номер кадра и fps)

Еще демонстрирую видеоплеер, я сделал свой видеоформат оптимизированный под воспроизведение на этой компьютере. Все это большая тема для рассказа, обязательно расскажу подробнее в следующих статьях.

Вот мой гитхаб, все исходные коды там

GitHub - redspirit/BOX-87: BOX-87 video game system