Игровая приставка на ардуино. Arduino UNO R3 (Игра в пинг-понг делаем сами). А теперь к играм

Игровая приставка на Arduino? Правда-правда. С экранчиком, кнопками и играми. И это не фантазия. Существовало (и существует) несколько проектов, которые попытались это сделать и один из них (Gamebuino) мы и попытаемся самостоятельно реализовать.

Так как проект открытый, то вся схематика доступна на ВИКИ , как и ссылки на ПО, игры и другая полезная информация.

Для создания своей игровой консоли нам понадобятся недорогие компоненты - экран Nokia 5110, шесть кнопок и пьезодинамик. Все это легко находится на Aliexpress или других сайтах китайских магазинов (в основном проблема найти экран) и даже в России. Экран можно назвать «массовым» и он хорошо описан, поэтому подключить его также не проблематично, как и достать.

Так как Gamebuino использует разводку удобную для размещения элеметов на плате, то при попытке подключить элементы через стандартные пины Arduino мы получаем вот такую картину:

На самом деле часть элементов уже была «упущена», так как в Gamebuino используются контакты микропроцессора, которые не разведены на Arduino или просто не нужны. В «утиль» пошли датчик заряда аккумулятора, кнопка C и SD-карта (они взаимосвязаны) и датчик внешнего освещения. Также решено было убрать резисторы - мы не собираемся использовать дисплей в режиме 24/7 и можно обойтись без этой защиты.

Можно было бы сделать «красиво», но тогда пришлось бы исправлять код всех библиотек и «мэпить» контакты по новой схеме. Я решил ограничиться лишь косметикой - то есть использовать «стандартные» контакты и лишь по необходимости внести небольшие правки в код.

Итак - после сборки схемы необходимо установить IDE Arduino и скачать вот этот архив . Его необходимо разархивировать в директорию Документы/Arduino и после этого запустить Arduino IDE. В этот архив уже внесены изменения в код библиотек и он будет «из коробки» работать с данной схемой.

У вас должны появиться примеры Gamebuino, которые позволят проверить дисплей, кнопки и т.п. и даже запусить Pong. Для платы «используйте» стандартную Arduino UNO или Leonardo (на других пока не тестировал).

Когда у вас все заработало, двигается, пищит и т.п. возникает закономерный вопрос - а где же игры? Gamebuino использует свой загрузчик для работы с SD-картами, поэтому загрузить HEX через их loader не получится безе перепрошивки самой Arduino. Но даже если вы это сделаете, то из-за отстуствия сигнала с аккумулятора вы ничего не сможете запустить, так как прошивка будет ругаться и выключаться. Прекомпилированные HEX с играми тоже не запустить из-за проблем с датчиком заряда аккумулятора.

Но не все потеряно - можно скачать исходные коды, открыть их в Arduino IDE и «залить» в нашу консоль.

Я проверил часть игр и они… РАБОТАЮТ! Вы можете скачать архив с исходными кодами игр отсюда , открыть их в Arduino IDE и скомпилировать и загрузить самостоятельно. Остальные игры вы можете сами опробовать, скачав исходные коды с Вики Gamebuino .

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

Слово от переводчика: когда-то, когда страна и деревья были большими, а воображение просто безграничным, была у меня мечта – возможность выводить изображение с моего программируемого микрокалькулятора Электроника МК-61 (ну, там графики всякие, кривые, картинки ) на экран телевизора. Времена были дикие позднесовковые, и не то что игровая приставка и очень персональный МИКРОкомпьютер («Правец 8Д» или «Специалист» или «Сикнклер»), но и видеомагнитофоны были в диковинку. В общем, народ требовал зрелищ и те, кто помнит цикл учебно – развлекательных публикаций для программируемых калькуляторов под общим названием «Путь к Земле» (журнал «Техника – Молодежи») меня поймут.

Если кратко, то в виде научно-фантастического романа с неплохим сюжетом описывалось путешествие двух идиотов случайных знакомых – профессионального космонавта и мажора кибернетика с Луны на Землю. Отдельной остроты всему сюжету придавало то, что путешествовали они на т.н. «Лунолете», то есть малом космическом судне с химическим двигателем, предназначенным для передвижения в условиях прямой видимости над лунами и прочими небесными телами похожими на биллиардный шар с простым рельефом. В каждом выпуске цикла присутствовало упрощенное правда, но вполне обоснованное математическое описание каждого маневра как в условиях сильной (относительно) гравитации близкого небесного тела, так и при влиянии на небесный снаряд героев гравитаций Земли и Луны, а также программа для расчета очередного этапа полета. В общем, глядеть на циферки на экране калькулятора не то чтоб доставало, но хотелось красивых кривых на экран (как в ЦУПе).

С другой стороны, не будем забывать что даже примитивные микроконтроллеры семейства Arduino на порядок превосходят по производительности не только микропроцессоры тогдашних флагманов – МК-52 и МК-61, но и вычислительные возможности некоторых 8-битовых игровых приставок поздних времен (Atary 2600 и прочих Рембо так точно).

В общем, вступление вышло слегка затянутым, так что перейдем к теме сегодняшнего занятия – выводе видеоизображения с Arduino на экран телевизора.

К сожалению, конструктивные особенности Arduino позволяют выводить только монохромное (черно – белые) изображения, хотя и это может быть полезным в некоторых проектах, а ЧСВ поднимет у нубов так точно…

Шаг первый. Детали и ПО

Вам понадобятся:

Детали и агрегаты:

  1. Микроконтроллер Arduino
  2. Телевизор (без него точно никуда)
  3. Макетная плата или шилд для Arduino
  4. 2 резистора номиналом 470 Ом и 1 Ком
  5. 2 двухпиновых монтажных переходника папа-папа
  6. Экранированный телевизионный кабель с тюльпаном на конце

Программное обеспечение:

  1. Среда разработки/прошивки Arduino. Официальная ссылка

Шаг второй. Сборка

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

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


Распиновка:

Sync — цифровой вывод 9 микроконтроллера

Video — цифровой вывод 8 микроконтроллера

GND — вывод GND микроконтроллера

Шаг третий. Программирование

Самая веселая часть – программирование.

В принципе, уже вышла новая версия ТВ – библиотеки, однако она еще более глючна нестабильна чем R5.91, которую использует автор, так что лучше качайте библиотеку по приведенной выше ссылке.

Текс программы для ленивых тех, кому лень перенабирать код с копии экрана:

#include TVout TV; unsigned char x, y; void setup () { TV.start_render(_NTSC); } void loop () { TV.clear_screen (); TV.print_str (10, 10, «TVout FTW!!!»); TV.delay (60); }

Предполагается, что базовые принципы работы и программирования Arduino – подобных микроконтроллеров вам известны, так что автор решил не растекаться мыслью по древу, порекомендовав ознакомится с командами библиотеки ниже:

  • begin(mode) Начало вывода информации на экран. Разешение стандартное — 128х96
  • begin(mode,x,y) Начало вывода информации на экран. Разешение определяется пользователем аргументами x,y
  • end() Очистка видеобуфера
  • force_vscale(sfactor) Force the number of times to display each line.
  • force_outstart(time) Force the time to start outputting on an active line.
  • force_linestart(line) Force line to start outputting on.
  • set_vbi_hook(func) Set the function to be called once per vertical blanking period.
  • set_hbi_hook(func) Set the function to be called once per horizontal blanking period.
  • hres() Команда возвращает значение горизонтального разрешения,
  • vres() Команда возвращает значение вертикального разрешения,
  • char_line() Команда возвращает значение количества символов, которые поместятся в строку.
  • set_pixel(x,y,color) Установка цвета пикселя по заданным координатам
  • get_pixel(x,y) Установка пикселя с заданными координатами в качестве точки отсчета.
  • fill(color) Заливка экрана заданным цветом.
  • clear_screen() Очистка экрана.
  • invert() Инвертирование изображение на экране.
  • shift(distance,direction) Прокрутка экрана на заданную дистанцию в любом из 6 направлений.
  • draw_line(x0,y0,x1,y1,color) Создание прямой с координат (x0,y0) до координат (x1,y1).
  • draw_row(row,x0,x1,color) Заполнение строки с координатами от x0 to x1 заданным цветом.
  • draw_column(column,y0,y1,color) Заполнение столбца с координатами от у0 до у1 заданным цветом.
  • draw_rect(x,y,w,h,color,fillcolor) Отображение прямоугольника с началом в координатах (x,y) с размерами(h,w), и заполнение заданным цветом.
  • draw_rect(x,y,w,h,color) Отображение прямоугольника с началом в координатах (x,y) с размерами(h,w).
  • draw_circle(x,y,radius,color,fillcolor) Отображение окружности с центором в координатах (x,y) с радиусом (RADIUS) и его заполнение заданным цветом
  • draw_circle(x,y,radius,color) Отображение окружности с центором в координатах (x,y) с радиусом (RADIUS).
  • bitmap(x,y,bmp,i,width,height) Отображение заданного изображения в координатах..
  • print_char(x,y,c) Печать символа в координатах (x,y).
  • set_cursor(x,y) Установка позиции для вывода слеующего символа.
  • select_font(font) Установка шрифт для вывода текста.
  • print() Вывод текста.
  • println() Вывод пстой строки.
  • printPGM() Вывод строки с текстом из памяти программы.
  • tone(frequency) Тональный сигнал с заданной частостой.
  • tone(frequency,duration) Тональный сигнал заданной частоты и длительности.
  • noTone() Прикращение вывода тонового сигнала.

Шаг четверый. Завершение

И так, друзья мои, если у вас уже есть набор конструктор Arduino UNO R3 (стартовый набор) или вам стало скучно, с точки зрения техники — пожалуйста. У нас есть целая серия «уроков» для Ардуино. Хочу напомнить, что из этого набора можно сделать если не всё, то почти всё что будет работать или чем-то управлять. Игровая консоль, ну считайте джойстик для игры в пинг-понг и те только. У кого-то остался старый компьютер со старым не работающим джойстиком, теперь, всё это логика, которая управляется через Ардуино Кит (http://arduinokit.ru/).

С чего начать делать проект?

Я создал простую игровую приставку, которая может играть в пинг-понг и другие игры, помните как на стареньком компе Atari 2600, которой сейчас легко может эмулировать Arduino R3. Ардуино стал бы как тот старый компьютер, считывая входы и выходы данных с джойстика подключенного к телевизору через стандартную библиотеку TVout (Для Ардуино). Я создал этот проект только для того, что бы продемонстрировать, что любой (без особых навыков) может создавать свои собственные миниатюрные консоли и играть. Также я хотел бы что все кто прочитал эту статью смогут пользоваться этим советом совершенно бесплатно.

Что нужно для игровой приставки на Arduino?

5. Теперь, для игры в пинг-понг, нам нужно только 4-контактный разъём: Вперед (1) , Назад (2) , Кнопка (6) , и Земля (8). А для 2-го джойстика, нам нужно только контакты 1, 2 и 8 (Кнопка «главный» используется только, чтобы «начать игру» от имени Администратора, так вот почему только 1 игрок должен иметь эту кнопку — управлять) .

6. Если посмотреть на контакты сбоку, то я подключил эти 4 запайки с простыми проводами, которые идут к Arduino («Вперед» к выводу 2 , «Назад» к контакту 3, и в «Управление» к контакту 4). Я проделал то же самое для других 3 контактов для игрока 2 (на второй Джойстик): «Вперед» с контактом 7 и «Назад» к контакту 10). Не забудьте подключить оба джойстиков Контакт 8 на землю (экранный провод)!

7. Теперь, загрузите игру Ping-pong и проверить входы джойстика. Вставьте Arduino UNO R3 и все провода в необходимые разъёмы (я использовал сломанный внешний корпус старого жесткого диска) .

Когда я впервые попробовать сам сделать эту задачу, я сильно переживал, чтобы начать работу над этим проектом. Фуф было не легко, хотел завершить этот проект как можно скорее. Изначально моя главная проблема, то что я пытался реализовать старые джойстики от Атари к Arduino. Из-за этого некоторые интернет-блоггеры не правильно написали на своих форумах, что мол типа входы невозможно прочитать или припаять изнутри джойстика, однако глядя на это было весело использовать их стандартные контроллеры подсоединившись к ним из-вне, я почесал репу и много выслушал высказываний в свой адрес, мол «руки у меня не оттуда растут» или я паяльник не умею держать в руках. Тем не менее — мой проект работает! А вам слабо?

PS: Я думаю, что единственное, что я бы пересмотрел теперь по другому — хм. Ну например бы взял картридж от Сеги или Денди и сделал бы некий карт-ридер. Вот вам и телевизионная игровая приставка своими руками. Главное, что мой проект масштабирован, можно делать если не летающих роботов, так игровые приставки своими руками. Кстати говоря, в у наших друзей есть различные компоненты для Arduino UNO R3 (Конструкторы Ардуино). Если сильно захотеть, то всё можно сделать своими руками. И это работает!

Привет, Гик Таймс!
Сегодня я поведаю вам одну не очень интересную историю о том, как создал простую игровую консоль на базе arduino и сделал несложную игру для нее в моем любимом игровом движке - Unity.

Игры

Вот уже почти четыре года я занимаюсь разработкой игр на популярном игровом движке Unity (ранее Unity3D). За это время я успел создать несколько небольших игр для мобильных устройств, а также объемный многопользовательский проект.
Это область для меня очень интересна и доставляет огромное удовольствие работать в ней.

Девайсы

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

А как это объединить?

Однажды на просторах интернета я наткнулся на запись о том, как один из пользователей собрал свою простенькую игровую консоль на базе arduino, снабдив ее маленьким жк дисплеем 84x48 пикселей и написал на нее пару простых игр: понг и арканоид.
Эта разработка меня очень заинтересовала, и я решил создать свою версию игровой консоли на базе микроконтроллера atmega328.

Сама консоль

Первым делом я спроектировал и сделал ЛУТ-ом печатную плату для портативной консоли. Это было ошибкой - сначала надо было протестировать программу на отладочной плате, например arduino uno, так как я не предусмотрел возможность быстро и удобно заливать программы в контроллер. А еще я ошибся в самой схеме, это можно было исправить проводами, но все же обидно.
После того, как я понял, что ошибся, я подключил кнопки через плату к arduino uno, а экран я подключил напрямую.
Вот что вышло:



А теперь к играм

Для создания игр я решил использовать игровой движок Unity. Писать компилятор из Mono C# в программу для arduino я не стал, но решил написать набор скриптов с помощью которых можно легко собирать игры.
Все скрипты я разделил на 3 группы - действия, условия и комбайнеры.
Я думаю что назначение действий и условий объяснять не надо, а вот для чего нужен комбайнер я объясню. Комбайнер проверяет выполняется условие, а затем выполняет действие.
Из скриптов, а точнее их наличия и комбинаций алгоритм создает программу для arduino.

А что за игра?

Начать я решил с чего нибудь простого. А какая сама простая игра которую вы знаете? Правильно - понг. Но я решил сделать не совсем понг, а понг на одного - есть одна ракетка, мяч и стена, вместо второй ракетки.
Я собрал ее из написанного конструктора, скомпилировал и залил в контроллер. Работает!

А теперь приведем все в порядок

Когда игра запустилась, и я в нее наигрался, я решил, что стоит переделать плату, предать ей красивый вид, использовать smd компоненты и убрать все лишнее. Я переделал схему и сделал плату.
Вот что вышло



Исходники

Исходный код - очень простой.
Что делает Unity - в редакторе пользователь собирает игру из ui объектов, вешает на них скрипты действий, условий и комбайнеры.
Что делает компилятор (скрипт parser.cs) - он пробегает по всем объектам, смотрит на их скрипты и добавляет в текст файла build.ino куски кода, отвечающие за исполнение аналогов этих скриптов в микроконтроллере.

Ссылка на исходники - drive.google.com/open?id=0B5INc3_98cSJMEMxZmlWUTh1Ukk
Компиляция производится при запуске игры. и сохраняется в папку Assets/build/text/builded.ino
Этот скетч и надо заливать в контроллер.

В заключении

Хочу сказать, что это было очень интересно.
Я получил возможность совместить 2 своих любых занятия - разработка игр и создание девайсов.
Надеюсь вас это тоже заинтересовало, и теперь вы тоже сделаете свой крутой девайс =)