Хочу представить развлекательный проект выходного дня — простая игровая консолька, если её можно так назвать, собранная из готовых модулей: отладочной платы «black pill» на STM32F411 и модуля дисплея на ili9225 разрешением 176х220 точек. Которую можно собрать даже на макетной плате. Для сборки будет достаточно двух вышеперечисленных модулей, пяти тактовых кнопок и немного проводов. Схема подключения модулей — элементарная, даже не требует подтягивающих резисторов для кнопок:
Всего реализовано 3 игры.
Тетрис:
Змейка:
Гонки:
На фото видно, что устройство собрано на объединительной плате, да ещё и с каким-то разъёмом. На самом деле, я не стал бы заморачиваться с платой ради такой безделушки. Просто, этот проект является, скажем так — «развлекательной» частью более крупного проекта (https://github.com/AndrejChoo/portable_programmer), из которого я решил просто по-быстрому вырезать ту самую «развлекательную» часть, так как она проста в повторении и может заинтересовать новичков, желающих осваивать микроконтроллеры.
Проект написан в STM32CubeIDE с использованием CubeMX (HAL). Поэтому может быть легко адаптирован под другие камни STM.
Немного расскажу по программной реализации проекта. Дисплей управляется по SPI. Для более быстрой отрисовки объектов в играх я не использовал перерисовку всего экрана целиком, а перерисовывал только подвижные объекты (в тетрисе только движущиеся фигурки, в змейке только сегменты головы и хвоста, в машинках только движущуюся стену и машину только во время движения и в момент проезда через стену), благодаря этому в первых двух играх мерцание не заметно, в третьей игре из-за большего количества движущихся объектов уже есть некоторые артефакты. DMA я не использовал.
Обработка нажатия кнопок происходит в обработчике прерывания от таймера. Интервалы можно настроить для более-менее комфортного срабатывания кнопок (при большей задержке будет меньше шансов «дребезга», но и меньшая отзывчивость, при меньшей задержке — всё наоборот).
Также реализовано элементарное текстовое меню выбора игры. Оно не имеет подпунктов, только один экран со списком и курсор. Более разветвлённое меню можно посмотреть в «материнском» проекте, исходники и прошивка имеются по ссылке выше.
Для переноса проекта на микроконтроллеры от других производителей или другой архитектуры будет необходимо реализовать небольшое количество платформа-зависимых функций: прерывание по таймеру для обработки кнопок, SPI для управления дисплеем, реализовать миллисекундную задержку. Последние две игры я сам изначально отлаживал на CH32V203C8T6 (RISC-V) и с другим дисплеем (ST7735 128×160), а потом уже переносил на STM32.
Учитывая большое количество памяти у микроконтроллера STM32F411, можно будет реализовать ещё несколько простых игрушек. Есть планы и идеи по арканойду и танкам. Возможно, если будет настроение и желание, попробую сделать и эти игры.
А пока на этом — всё.