Найти тему
Terrabyte

Игровая консоль на ATtiny13 или вызов для программиста - 3

Оглавление

Привет, друзья!

Натолкнулся я недавно на одном иностранном сайте на конкурс по созданию простых игрушек - Tiny Games Challenge. Много интересных идей типа одномерного пинг-понга, но что меня больше всего поразило, что почти все простые игрушки сделаны отнюдь не на простой элементной базе. Обычно это те-же AVR328 или, по крайней мере, AVR164. Есть и ESP-шные процессоры. На мой взгляд, это все решения никак не претендующие на гордое звание "tiny".

Отдавая должное творцам и самодельщикам, принявшим участие в конкурсе, я все же решил попробовать "тинькнуть" до предела! Взять да и создать игровую консоль на моем любимом, самом, что ни на есть крошечном в смысле ресурсов, ATtiny13. О том, что у меня получилось, речь и пойдет дальше.

Постановка задачи

Размышляя о возможностях будущей будущей консоли я конечно не мечтал запустить на ней Doom или Cyberpunk. Ясно, что даже с проектами на старших AVR-ках ей будет тягаться тяжело. Значит написание игрового софта тоже придется взять на себя. Ничего, это как раз самое интересное.

Что должна уметь игровая консоль?

Во-первых, выводить картинку на экран. Это ATtiny13 умеет. С точки зрения минимализма ей как раз подходят дюймовые монохромные OLED-дисплейчики с разрешением 128x64 пикселя. Как раз такой я использовал при изготовления микро-FM радио, кстати, на том же ATtiny13. К преимуществам этих дисплеев смело можно отнести возможность работать по 2-проводному интерфейсу I2C, что очень экономит нам ножки микроконтроллера, которых и так не слишком много. Кроме того, дисплейчики эти очень экономичные в отличие от TFT панелей и хорошо подходят для низковольтного питания. Повышающий преобразователь встроен в сам дисплей. Очень жаль, правда, что память такого дисплея доступна лишь для записи. Возможность чтения резко увеличила бы наши шансы на успех! Но, что есть, то есть...

Во-вторых, надо как-то взаимодействовать с пользователем. Как минимум нужно несколько кнопок. Скажем две. Мало? А три? Все ведь будет определяться играми. Но ведь игры мы договорились писать сами! А значит адаптировать их под 2-кнопочный контроль тоже в наших силах. Да, остается еще один вывод. Да, можно и на него повесить кнопку, но есть одно соображение...

В третьих, нужен звук! Ого у тебя замах, сказал я себе! Это конечно хорошо, когда приставка играет музыку или хотя бы попискивает, но не слишком ли это для ATtiny13? Честно? Не знаю! Посему один вывод пока оставляем неиспользованным. А там как пойдет... Хотя для звука у меня тоже было решение! Но, не верен, насколько оно уживется вместе с дисплеем...

В четвертых,... Все остальное! Все это возложим на тиньку и алгоритмы, над которыми придется хорошенько потрудиться!

Собираем "железо"

Самое интересное в этом то, что я не рисовал заранее принципиальную схему. Взял все детали какие были под рукой, скомпоновал их вместе и подогнал схему под удобство сборки конструкции.

Набор деталей для сборки консоли на ATtiny13
Набор деталей для сборки консоли на ATtiny13

Итак, для сборки нам понадобятся:

  • кусок макетной платы,
  • OLED-Дисплей 0,96",
  • держатель для батарейки CR2032,
  • выключатель питания,
  • две кнопки,
  • панелька для ATtiny в DIP-корпусе.

Панелька облегчает перепрошивку, хотя можно микросхему и впаять, выведя провода для интерфейса прошивки. Я люблю на панельке. Мало ли чип пригодится где-то еще!

Вырезаем из макетки подходящий кусок.

Разметка макетной платы
Разметка макетной платы

Требуемый размер - 10 на 18 точек пайки. Можно чуть меньше или чуть больше - не принципиально. Я люблю побольше для "мало-ли что". Стеклотекстолит я режу обычной ножовкой по металлу.

Отрезанный кусок макетной платы
Отрезанный кусок макетной платы

Начинаем монтаж нашей нано-консоли. Сперва устанавливаем выключатель питания. Устанавливается он в три верхних левых отверстия. Вот так.

Установлен выключатель питания
Установлен выключатель питания

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

Впаянный выключатель с обратной стороны
Впаянный выключатель с обратной стороны

Устанавливаем и впаиваем держатель батареи.

Держатель батареи CR2032
Держатель батареи CR2032

С обратной стороны точки пайки выглядят так.

Запаянный держатель батареи с обратной стороны
Запаянный держатель батареи с обратной стороны

В результате выключатель и держатель батареи должны оказаться на разных сторонах макетной платы.

Теперь соединяем цепи питания следующим образом.

Соединение цепей питания консоли
Соединение цепей питания консоли

Крайний контакт выключателя соединяем с ближайшим контактом держателя (белый провод). Провод пропускается через отверстия в печатной плате. Два провода (медные) выводятся на две точки пайки. Один от среднего вывода выключателя, второй - от второго контакта батареи. Вот так это выглядит с обратной стороны.

Провода питания
Провода питания

Излишки проводов пока не откусываем. В качестве проводов я использую либо откушенные при монтаже выводы резисторов либо жилы витых пар Ethernet-кабелей. Медные провода это как раз они.

С другой стороны устанавливаем и запаиваем дисплей так, чтобы его контакты попали в отверстия ниже двух выводов питания.

Установленный OLED-дисплей
Установленный OLED-дисплей

При этом дисплей верхним краем опирается на выключатель. Это предохраняет его от смещения, а контакты от излома.

С обратной стороны провода от цепей питания соединяются с выводами питания дисплея.

Цепи питания дисплея подключены.
Цепи питания дисплея подключены.

Теперь лишние провода можно откусить.

Устанавливаем и запаиваем кнопки и панель для ATtiny13.

Установлены панель и кнопки
Установлены панель и кнопки

Ключ панели направлен вверх.

Сзади при помощи тех же проводов соединяем контакты установленных элементов. Должно получиться как-то так.

Соединенные контакты
Соединенные контакты

Внимательно следите, чтобы провода не замыкались между собой через контактные площадки монтажной платы. Для полной ясности привожу принципиальную схему устройства. Она обязательно будет в архиве с документацией, ссылку на который я дам в конце статьи.

Принципиальная схема игровой консоли на ATtiny13
Принципиальная схема игровой консоли на ATtiny13

Последний штрих - устанавливаем подтягивающий резистор на пин сброса. Резистор обычный, на 10 кОм, в DIP-корпусе.

Подтягивающий резистор на пин сброса ATtiny13
Подтягивающий резистор на пин сброса ATtiny13

Резистор соединяет между собой 1-ю и 8-ю ножки ATtiny13.

Монтаж полностью закончен! Теперь в Ваших руках потрясающее игровое устройство, предназначенное для того, чтобы лишить вас сна! Не из-за игр, разумеется, в которые вы быть может и играть-то не будете, но из-за трудности алгоритмов и решений, которые вам придется найти в ходе разработки софта для этой экстремально-минималистичной консоли.

Тех же, кто просто хочет повторить устройство поздравляю! Ва осталось лишь зашить ATtiny13 и можно наслаждаться!

Софт игровой консоли

Для проверки потенциальной возможности реализации игровых сценариев на нашем девайсе я написал небольшую техно-демку. Хотя, как небольшую...

Результат компиляции технодемки
Результат компиляции технодемки

В результате компиляции почти вся память оказалась занята! Так что тут есть еще за что побороться!

Технодемка представляет собой псевдо-игру в пинг-понг со стенкой. Ракеткой нужно отбивать мячик, который отражаясь от стен, стремится улететь за пределы игрового поля. Со временем темп игры возрастает и отбивать становится все сложнее.

Процесс игры в пинг-понг
Процесс игры в пинг-понг

В ходе написания приложения я отработал вывод на экран, работу с таймерами, обработку нажатия на кнопки, и конечно какие-то игровые механики. Исходник я вложу в архив в конце статьи. Там же будет ссылка на видео, которое позволяет оценить результат разработки.

Основная сложность, на мой взгляд, состоит в невозможности создать экранный буфер. Результат вывод на экран приходится просчитывать прямо в ходе вывода. При побайтно-постраничной адресации OLED-дисплея (не попиксельной) с этим возникают определенные проблемы - растет размер кода. Поэтому алгоритмы вывода следует "шлифовать" особенно тщательно.

Также приходится мириться и с малым размером оперативной памяти. К сожалению ее только 64 байта. Хотя в технодемке осталось свободной больше половины.

Заключение

В ближайшее время я собираюсь адаптировать для консоли парочку популярных игр. Хотел попробовать сначала змейку.

Кроме того, очень хочу найти единомышленников для обмена идеями, алгоритмами, фрагментами кода. Было бы приятно встретить людей, получающих удовольствие от решения сложных задач! Лично я получаю колоссальное удовлетворение занимаясь вещами радикально отличающимися от процесса тыкания пальцем в телефон!

Ссылка на архив со схемой и софтом: https://disk.yandex.ru/d/j4uwMZccC-z9Pg

Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, мини-ПК, необычные компьютерные решения и инновационные разработки! Спасибо всем, кто нас поддерживает своими комментариями и лайками!

Наша группа ВК: https://vk.com/terrabyte

Наш канал на VK-Video: https://vk.com/video/@terrabyte/all