Создаем игровую приставку Pong-типа с помощью блочного языка и Arduino

Игровые приставки Pong (или как их еще называют Pong-типа) стали одним из первых видов домашних развлечений для детей  и взрослых. Еще до появления Atari 2600, NES и других приставок, можно было подключить к телевизору «коробочку» с джойстиками и поиграть с другом или одному в простую, но достаточно увлекательную игру.

На экране было видно поле, движущиеся по краям «биты» и летающий по экрану квадратик-мячик. Для управления нужно было крутить ручку на джойстике, а кнопка предназначалась для «вброса» мяча в игру.

51d3a3ee298f13baf330d4f6404d5965.png

На игровых автоматах разработка от Atari появилась еще в 1972 году, а в 1975 году была выпущена домашняя версия Pong. Успех игровой приставки привел к массовому появлению её клонов: та же Nintendo выпускала аналог под именем Color TV Game 6.

В СССР не отставали (копировать), и уже в 1978 году на прилавках магазинов появилась приставка Турнир, которая стоила 150 рублей, не в последнюю очередь из-за применения импортной микросхемы AY-3–8500. Клонировав ее как К145ИК17, в том же году в СССР наладили выпуск множества других приставок Pong-типа. В 1989 году в 10 номере журнала «Юный техник» вышла публикация «Сквош по пятому каналу», в которой было рассказано, как сделать самому теле-игровую приставку на микросхеме К145ИК17.

752f9e439d8fe536e14e5f1a5d7fd0f2.png

Что-то подобное мы решили воплотить в жизнь вместе с детьми младшего школьного возраста. Для этого нужно было использовать что-то привычное по среде и языку программирования, и выбор пал на Scratch и что-то недорогое по элементной базе. Поэтому использовался вариант с Arduino Nano, цена которой «у китайцев», на момент написания статьи, была в районе 150 рублей.

Из дополнительных элементов нам понадобилась кнопка, переменный резистор-крутилка (для аутентичности) на 100Ком (у меня это B100K), мини макетная плата, резистор на 4.7 КОм для устранения дребезга контактов кнопки (подтяжки на землю) и пара перемычек для макетной платы. Переменный резистор лучше вынести отдельно, как сделали мы, так как если его воткнуть напрямую в макетную плату, то работать ничего не будет (а у нас даже начал выходить «синий дым», без которого платы обычно не работают). Один из возможных вариантов — это прикрепить вторую макетную плату ниже (они есть с разъемами для объединения нескольких плат в одну) и разместить кнопку и «крутилку» на ней.

d5881046a6a03a49df23bc1b6b43e2fd.png

А вот как выглядит готовый «джойстик»:

812c2dd1179322e6392d386fa924740c.png

Теперь все это надо подключить к Scratch и запрограммировать саму игру. Для первого приближения решено было делать «сквош» для одного игрока, когда нужно отбивать битой мяч с одной стороны экрана, а от трех остальных он должен отскакивать. В Scratch версий 1.4 и 2 простым способом подключения необходимых нам кнопки и переменного резистора была эмуляция платой Arduino другой платы PicoBoard, поддержка которой была «встроена» внутрь ПО.

Но в Scratch 3.0 поддержку этой платы «выпилили» и необходимо было найти варианты решения данной проблемы. Забегая вперед, скажем, что решение для «оригинального» Scratch найдено не было, и во всех вариантах нам пришлось использовать его модифицированные версии.

mBlock

Первым делом в голову пришла мысль посмотреть в сторону mBlock. Эта среда программирования заслуживает отдельной статьи, так как ее возможности работы с аппаратным обеспечением и наличие плагинов превосходят Scratch. Плюс этой среды –есть русский язык, онлайн и оффлайн редактор, поддержка огромного числа плат и роботов и простота настройки работы с ними. Вам достаточно поставить на компьютер ПО mLink2 и настроить аппаратуру, затем можно начинать программировать те же платы Arduino в режиме «прямого» подключения, не требующего заливки на плату кода. А можно создать код для платы и залить его для автономной работы.

Минусы (относительные) — работа оффлайн только под Windows и Mac (на ПК, есть и мобильные версии, а для Linux есть пакеты mLink и предлагается программировать в веб-редакторе) и разделение кода на «аппаратный» и «программный», то есть в нашем случае необходимо обязательно использовать переменные и сигналы для передачи данных между двумя составляющими кода.

77055da1ce39bde7b57d56e036cfb64b.png

Код самой игры (Персонажи + Фон) будут в этом случае аналогичны, вам нужно будет только переделать его на необходимые переменные. Причем mBlock понимает как свой формат файлов, так и формат файлов Scratch 3.

Scratch 3 OneGPIO Extensions

На это расширение мы возлагали большие надежды, так как думали, что сможем обойтись «старой» прошивкой эмуляции PicoBoard. Увы, что-то пошло не так, и в этом клоне Scratch нам тоже пришлось использовать работу с платой Arduino на уровне аналоговых и цифровых выходов.

Расширение работает на уровне сервера, считывая информацию с платы и передавая ее в веб-версию Scratch (онлайн или запускаемую оффлайн). Порядок настройки сервера описан пошагово в инструкции. Вам нужно установить Python 3.7, затем через pip установить само расширение s3-extend. Все это можно проделать как в Windows, так и в OSX или Linux.

Если все сделано правильно, то командой s3a для Arduino можно запустить сервер, а затем можно зайти в модифицированный веб-редактор, добавить нужные блоки и написать программу, взаимодействующую с вашей платой. Для работы в оффлайн режиме авторы предлагают скачать с Github исходный код и запускать редактор из него.

Саму плату Arduino тоже необходимо предварительно подготовить. В Arduino IDE вам нужно добавить библиотеку FirmataExpress,   выбрав и установив ее через Tools/Manage Libraries.

После этого нужно в библиотеке примеров (меню File/Example) найти код FirmataExpress и залить его в нашу Arduino Nano.

aeb36ba1719e3fb3a4d55fab2173ae02.png

В итоге плату будет видно в среде программирования, и с ней можно будет работать.

Программируем Сквош

У нас есть две вводные: кнопка подключена к цифровому входу D11, а резистор подключен к аналоговому входу A5. Запускаем из терминала Командной строки сервер расширения командой s3a, затем сам редактор кода. Перед нами откроется привычный Scratch 3. Добавляем необходимые нам блоки Arduino через меню (в левом нижнем углу) Добавить расширения и выбрав OneGpio Arduino. У нас будут два спрайта: биты и шарика.

В спрайте биты-ракетки мы реализуем код работы с платой. Одним блоком кода мы считываем с цифрового пина 11 статус нажатия кнопки (0 или 1) и передаем Сообщение в код игры, чтобы перезапустить шарик из центра экрана.

Вторым блоком мы выводим на экран Биту в местоположении, определяемым значением переменного резистора, подключенного к аналоговому пину 5. Это значение меняется от 0 до 1023, поэтому нам нужно перевести его в систему координат Scratch.

«Экранчик» в Scrarch имеет размер 480×360 точек и координаты от -240 до 240 и от -180 до 180 (координата 0,0 находится в центре экрана). Поэтому мы переводим значение с резистора в текущие координаты по формуле: Значение _с_A5 / 2.85 – 180

0da841759d90a584daf2c8506c56bd7e.png

Сам код игры простой. Мы имеем две переменные xpong и ypong, которые содержат приращение координат для мяча на экране. При старте игры мы задаем их случайно от 5 до 15, чтобы у нас мяч всегда летел под разными углами. При достижении мячиком краев экрана мы просто меняем знак у этих приращений, симулируя упругий удар. В случае биты-ракетки мы определяем соударение через касание спрайтов мяча и биты, также меняя значение xpong на противоположное. И если координата мяча по оси X оказывается меньше координаты края биты, засчитываем игроку гол.

0d74708dcb737fda9514bbfbf3c51f3b.png

Нажатие кнопки вызывает передачу Сообщения и перезапуск кода игры. Код игры для Scratch 3 OneGPIO можно скачать по этой ссылке.

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

Мы в RoboUniver будем рады узнать и даже увидеть ваши проекты, созданные по типу нашего, а также прочитать ваши отзывы. Если вам будет интересно узнать побольше о том же MBlock, подключении разных датчиков, или как работать в Scratch-подобных средах с другими платами, такими как Raspberry Pi или Micro: bit, то напишите об этом в комментариях.

© Habrahabr.ru