Доработка отечественного промышленного клона Arduboy

Отечественная промышленность освоила выпуск конструктора для сборки игровой приставки на ардуино нано. А выпуск ПО для игровой приставки почему-то не освоила (в комплекте 8 игр). В рекламе обещаны 500 игр, но, чтобы их получить (скомпилировать из исходников), пришлось приложить некоторые усилия.

Консоль в отличии от дизайна Arduboy сделана на Arduino Nano/Atmega 328p. Оригинальная разработка выполнена на Atmega32u4, из-за чего двоичные файлы оригинального проекта не подходят. А от проекта SLIMBOY (тоже на Arduino Nano) отличается привязкой клавиш к пинам.

В процессе доработки было выполнено:

  • I2C экран SSD1306 0,96" заменен на I2C экран SSD1306 2,4" (программно решена проблема с шумом дросселя на плате экрана; дополнительно проверена работа с экраном I2C SH1106 1,3")

  • доработка библиотеки Arduboy2 для сборки игр под аппаратную платформу (библиотека из проектов harbaum/SLIMBOY и MLXXXp не подошли для экрана 2,4 - работал не стабильно; кроме того старые библиотеки не поддерживали работу с экраном 1,3” на SH1106)

  • разработан корпус под экран 2,4”

Результат: сын, которому был подарен конструктор, играет в Dark&Under и доволен.

Патченные библиотеки и корпус лежат здесь: GitHub - krrrysha/Arduboy-homemade-package: Arduino IDE board package for Arduboy and homemade versions making things easy

Есть еще одна особенность дорабатываемого варианта Arduboy: пьезоизлучатель подключен между пином и землей, тогда как во всех остальных вариантах (оригинальный ардубой, slimboy) и в самих библиотеках вывода звука подключение выполняется между двумя пинами (пока не менял). Пока не совсем понятно, как сильно это влияет на работу в играх.

Звук громче раза в два.

Спасибо!
Очень хотел применить экран 2,42", благодаря вашим библиотекам всё получилось!!!
Зуммер включил через резистор 220 Ом на землю, чтоб не так громко пищало!

1 лайк

В новой версии добавил поддержку аналогового джойстика на Joystick Shield (в этом случае приходится пожертвовать экономией энергии за счет включения АЦП, и немного памятью - добавляется 3 глобальные переменные)
На фото - экран 1.3" SH1106. Плата UNO. Если кто-то захочет повторить, имейте в виду, что из-за длинных проводов и плохого контакта на интерфейсе I2c экран может не запуститься (я припаял интерфейс к интерфейсу I2c Joystick Shield-а с обратной стороны). Кроме того для игры неплохо всё это установить на диэлектрическое основание (если коснуться интерфейса экрана, изображение сбивается)

2 лайка


Да. С 2,4" прямо человеком себя чувствуешь :slight_smile:
У меня такая (STL на корпус тоже выложен, правда там версия без отверстия под дополнительный порт экрана, сделал этот вырез для тестирования разных OLED - дисплеев)

2 лайка

Продолжаем.
По ссылке из первого поста доступна новая версия библиотек.
Основное отличие - поддержка контроллера RISC-V MIK32 АМУР К1948ВК015/К1948ВК018 (версии v2, на v0 не пробовал). BSP v0.5.0 для Arduino IDE v и платы ELBEAR UNO/NANO

Причина использования MIK32: больше ОЗУ. Можно было бы и Mega2560 ради этого попробовать, благо есть примеры портирования Arduboy туда, но захотелось импортозамещения и взглянуть на Terra incognita :slight_smile:

По Atmega328p основная задача была - не сломать что есть. (ну и текст под AVR использовался как образец).

Для обеих платформ доступны (через правку Arduino2Core.h):

  • поддержка SSD1306(SSD1309)_I2C и SH1106_I2C
  • поддержка кнопок “а-ля приставка от EnjoyRobotics” (без опций), JOYSTICKDISCRETE - курсорные КНОПКИ Joystick shield (кнопка “K” (D8) под джойстиком - это “A” ; кнопка “F” (D7) - это “B”) ), “JOYSTICKANALOG” - аналоговый джойстик Joystick shield (“B” D3 и "С"D4 джойстика - это “B” и “А” приставки).

Для аналогового джойстика доступна настройка чувствительности (порог отклонения, при котором будет фиксироваться виртуальное нажатие курсорной клавиши. Это параметры JOYSENSX и JOYSENSY). При включении джойстик сам калибруется на нулевую точку, поэтому при старте он должен стоять неподвижно.

Проверены библиотеки Arduboy2Tone и Arduboy2Beep. Но на одном пине (потом как нть на двух погоняю).

MIK32 имеет большую встроенную флеш-память, поэтому возможно в будущем попробую попробовать размещение нескольких игр в памяти. (в оригинальном ардубое - это вроде какой-то дополнительный модуль FX).

В папке mik32_games - несколько игр, собранных под АМУР.
Собираются почти без исправления но есть несколько нюансов, которые попробую позже описать и возможно обойти. (Самый неприятный, это когда игре в функциях нет возврата значения и обычная платформа AVR это проглатывает, а на АМУР-е приходится гадать, зарыта собака). Соответственно там две игры, которые не помещались в 328p: StarHonor и Arduboy3d: Catacombs of the damned (в стиле Wolf3d, рука только пока не прорисована, позже буду разбираться почему).

FX библиотеку и соответствующие игры пока не пробовал адаптировать.

PS замечания к стилю написания кода буду учитывать, но не сразу (я не программист ни по образованию ни по роду деятельности :slight_smile: )

Немного про самую простую и доступную (на мой взгляд) конструкцию приставки (в т.ч. на отечественном контроллере).

Схема (нужно подключить 4 провода от экрана и 2 от динамика и запитать от USB):


Реализация на отечественной плате в формате UNO:

“Пламенный мотор”:

как-то первое со вторым плохо сочетается… Напомните, сколько там сейчас Амур стоит? И сколько за эти деньги можно купить “не_патриотичных” Нано?

я ничего не перепутал? Это же оно?

Сам камень оптом 1к. р. Платы итого дороже (в 4-5 раз)

Много. 15 штук где-то.

Доступная конструкция (схема) на “не_патриотичной” УНО ничем не отличается. Т.е. 4 провода, OLED на 0.96"-1,3" и Joystick Shield.

Немного перепутали. У Вас на скриншоте родная микроновская. Здесь применяется новосибирская плата. Она в 1.5 раза дешевле. Но всё равно пока не бюджетно.

1 лайк

Говорят, существует концепция под названием “Doom running on everything”, в рамках которой легендарную игру запускали на осциллографах, калькуляторах, внутри pdf файлов и т.д. и т.п.
Существует игра doom-nano для Atmega 328p (по правде говоря, это не настоящая игра doom а лишь демонстрация упрощенного движка рендеринга и нескольких спрайтов из оригинальной игры).
И эта doom-nano уже была портирована как минимум для микроконтроллеров Миландр 1986ВЕ91Т (milandr-doom) и ESP8266 (ESP boy_doom-nano), но ни один из известных портов doom-nano не использует библиотеки Arduboy (и насколько я могу понять - не воспроизводит звук).
А еще отечественные производители электроники объявляли до 1 апреля 2025 года (шуточный?) конкурс проектов портирования DOOM на Амур.
Короче, всё располагало к тому, чтобы перенести doom-nano на Arduboy и MIK32 АМУР.

Перевести doom-nano на использование библиотеки Arduboy оказалось не сложно, т.к. проект использует процедуры библиотеки Adafruit, имеющие функциональные аналоги в Arduboy и отличающиеся только названиями. Кроме того, удалось портировать под Arduboy и звук doom-nano.
Но оказалось, что Arduboy-порт doom-nano работает нормально на Atmega328p, и крайне медленно на MIK32 АМУР (4 fps на MIK32 против предельно ограниченных в коде 14 fps на Atmega328p). Основной вклад в замедление на АМУРе-е вносит процедура отрисовки стен лабиринта, выполняющая в цикле множество вычислений с плавающей точкой. При этом у обоих МК нет математических сопроцессоров, и было непонятно, почему на более производительном АМУРе скорость работы программы ниже.

Однако знающие люди подсказали, что в BSP контроллеров AVR включены оптимизированные математические библиотеки, а для MIK32 подобных “родных” математических библиотек нет.

В итоге пришлось еще раз переработать порт doom-nano, на этот раз промасштабировав дробные единицы длины игрового мира - в целые “санти”-единицы длины. После чего программа стала работать одинаково быстро и на Atmega328p и на АМУР-е.

В репозитории оставил также предварительный вариант порта doom-nano для Arduboy (на вычислениях с плавающей точкой).
На случай, если в будущем для MIK32 оптимизируют математические библиотеки, этот вариант можно будет использовать для оценки скорости их работы.