По следам черного самурая, или делаем игру «Sokoban» своими руками (Часть 1 из 3).



Но ясный пень, в таком виде (вывод в COM-порт) игра представляет скорее академический интерес для очень маленького круга заинтересованных людей. Давайте двигаться дальше. А не реализовать ли нам все это в виде портативной игровой консоли? ? Я понимаю, что ПОРТАТИВНАЯ ИГРОВАЯ КОНСОЛЬ звучит достаточно громко, но попытка-не пытка.

Давайте разберемся в составных частях (модулях) настоящих приставок (Tetris, GameBoy,PSP, NDS и т.п.).

1) Экран. Отображает игровую ситуацию и всякую полезную информацию;
2) Органы управления (кнопки, джойстики, сенсорный ввод и т.п.);
3) Система энергоснабжения (АКБ, зарядное, преобразователь и т.п.);
4) Звуковая подсистема;
5) Основной “мозг”-процессор приставки.

Так вот, все эти модули (в том или ином виде) будут и в нашем сокобане.

Экран.
Это самый важный компонент будущей игровой приставки. С него то я и начал. Если бы этот этап завершился неудачей, я вряд ли бы продолжил работу над этим проектом.
Очень-очень долго у меня валялась парочка графических экранов 128×64. Ну никак я не мог найти им достойного применения. Экранчик достаточно большой по габаритным размерам (больше самого Arduino). Я уже как-то давно пытался найти ему применение и даже сделал некий шилд для удобного и быстрого подключения к Ардуино. Но при использовании стандартной библиотеки на МК Atmega8 практически не оставалось памяти для чего-то полезного. Экран пролежал у меня на столе пару дней с демонстрашкой работы (наверняка вы ее видели, там что-то типа круга, и рисуются диагональные линии с подсчетом FPS) и отправился отдыхать на неопределенное время в коробочку со всякими остальными “проектами-недоделками”.

А тут такой вариант. Зачем что-то искать или покупать! Как говорит Иванович — “Используй то, что под рукою и не ищи себе другого”!

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

А на официальном сайте Arduino рассматривают как минимум 3 варианта такого рода дисплеев (в основном варианты различаются распиновкой и типом контроллера). Можно ознакомиться тут.

Очень важно ПРАВИЛЬНО определить назначение разъемов вашего GLCD дисплея. Тут четких советов дать не могу. В ходе поисков я встречал разные варианты и подключения и управления дисплеев.
Тот, что у меня (POWERTIP PG12864K) — это тип «B» и подключается так:

Толкового и полного даташита я на него так и не нашел, но распиновка подошла. Блин, фига се… Почти все пины Ардуино нужно задействовать! “Что-то не так в этом супе… “.
Попытаемся немного «ужаться».

Во первых, линию данных (D0…D7) подключим через сдвиговый регистр 74HC595 (вместо 8 пинов нам потребуется только 3) — уже сэкономили 5 пинов.
Забегая вперед, кину “лопату говна ДЕГТЯ”. В память экрана можно не только отправлять данные, но и читать то, что там уже установлено. Так вот, эту возможность (читать содержимое видео памяти) при таком подключении мы ТЕРЯЕМ!!
Ай-ай, «потеря потерь» (с) Кузя.

В данной игровой приставке это не страшно. Планируемая видеоподсистема будет “квадратно-гнездового” принципа. Т.е. каждый элемент (коробки, человечек, стена, буквы и цифры) будет стандартного размера: 8х8 точек. Человечек смещается- значит на освободившемся месте выведем “ничего”, а затем человечка прорисовываем уже на новом месте. Ну или наоборот 🙂

Далее по схеме. Такое подключение (данные передаются только в одну сторону MK->GLCD) не подразумевает чтение из GLCD, а это значит, что линию R/W тоже можно принудительно посадить на землю. Вот тебе и еще один сэкономленный пин!

Для проверки этой идеи на скорую руку была разведена простенькая печатная плата “GLCD -74HC595-Adapter”:

И на порыве энтузиазма достаточно быстро этот адаптер был воплощен в жизнь:

Понятное дело, при таком подключении «штатная» библиотека не подходит. Поэтому пришлось разбираться с программной частью самостоятельно. Более подробно работу программной части я опишу в соответствующей части этого опуса.

Управление.
Для нормального управления игрой будет достаточно пяти кнопок: ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО и кнопки МЕНЮ (или SELECT). Я встречал как минимум три более-менее разных варианта подключения нескольких кнопок к микроконтроллерам. Самый простой и расточительный вариант: 1 кнопка — 1 пин, я даже не рассматривал.
Схемы более достойных вариантов ниже:

Первая схема — используется аналоговый мультиплексор /демультиплексор 74HC4051. Кратко его функционал такой: выставляем на линиях A,B,C соответствующий адрес (смотри даташит) и у нас происходит соединение соответствующего входа с единственным выходом OUT (можно представить себе что-то типа коммутатора-телефониста). При таком подключении, чтобы прочитать состояние кнопок (каждая кнопка может быть в “0” или в “1”), нужно перебрать все возможные комбинации адресов.
Плюсы:
-для опроса 8-ми кнопок нужно всего 4 пина (3-для указания нужного входа и 1- выход, с которого читается состояние);
-возможно отследить одновременное нажатие нескольких кнопок;
Минусы:
— относительно медленное сканирование состояний всех кнопок

Вторая схема на 74HC165. Это сестра-антипод моей любимой 74HC595. Эта микросхема преобразует параллельный интерфейс в последовательный. Толковое описание тут. Такой вариант по функционалу полностью аналогичен первой схеме (со всеми недостатками и достоинствами), но более экономичен в плане необходимых пинов — 3 штуки.

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

Как говорят, “Коней на переправе не меняют”. Меня во всех моих проектах вполне устраивал вариант подключения нескольких кнопок через ОДИН аналоговый вход. Работает такой вариант вполне стабильно и четко. Единственный «минус» — трудно отследить одновременное нажатие нескольких кнопок. В данном проекте это абсолютно не нужно.

По сути, это обычный резистивный делитель напряжения, с изменяющимся значением резистора в верхнем плече, в зависимости от нажатой кнопки. Да, я знаю, что в приведенной схеме эти резисторы подобраны не рационально. А отсюда и сдвиг получаемых с АЦП значений в верхний диапазон. Но пересчитывать было лениво, тем более все нормально и так работает. Так эти значения и перекочевали в основную схему.

Энергоснабжение.
Это тоже важный компонент автономного устройства.
Естественно, источником энергии будет аккумулятор (АКБ). Вначале думал использовать три пальчиковых АА аккумулятора. Но более компактными, эффективными и очень популярными на сегодняшний день (а еще и легкодоступными) все же являются Li-ion АКБ. Купить такой можно практически за копейки, а зачастую и вообще найти у себя (от разбитого/старого/не нужного мобильника, например). Единственное на что следует обратить внимание — наличие контроллера.

Это реально очень важная штука для обеспечения безопасной эксплуатации Li-Ion АКБ. Даже именитые-маститые производители зачастую дают маху в этом вопросе (многие наверняка слышали о случаях самопроизвольного воспламенения какого-нибудь мобильного устройства). Я осознаю, что наличие контроллера — это не 100% гарантия безопасности эксплуатации АКБ, но с ним все же поспокойнее. Подробнее об устройстве и принципах работы такого контроллера можно почитать тут: http://go-radio.ru/sxema-kontrollera-litiy-ionnogo-akkumulatora.html.
Не совсем понятно из этой статьи, можно ли считать, что наличие этого контроллера позволяет заряжать АКБ напрямую от USB порта (т.е. 5 Вольтами). Я решил не рисковать, а сделать более-менее нормальное зарядное от внешнего блока питания (9..12 Вольт). Надеюсь, у каждого Ардуинщика такой имеется 🙂
Какие варианты схем зарядного рассматривались мною:

Вариант №1 (на спецмикросхеме) — самый идеальный вариант. Но я так и не смог найти LTC4054.
Вариант №2. На LM317 (чего-чего, а их у меня вагон и маленькая тележка). Схема №2 — это типовое включение LM317 в режиме источника тока. Схема проста до безобразия, но отсутствует автоматическое отключение зарядного устройства, что не есть хорошо.
Вариант №3 — более продвинутый вариант на LM317. Тут уже есть автоматическое отключение устройства с помощью биполярного транзистора при полном заряде АКБ. Но… нету индикации заряда.
Ищем дальше…. Пам-пам-парам!!! Нашел!

Схема очень похожа на вариант схемы №3. Добавлен только узел индикации заряда. Все устраивает. Ее и выбираем в качестве основной.

Обычно производители рекомендуют заряжать Li-Ion АКБ постоянным током не более 70% от емкости АКБ. Странная связь — “Емкость — ток”?!?!? Как в анекдоте про прапорщика, связавшего время и пространство: ”Копать отсюда и до обеда”. Лучше я поясню примером: АКБ 1000 mAh (или 1Ah), значит максимальный ток заряда должен быть не более 0.7А. Меньше — не страшно. В данной схеме максимальный ток определяется номиналом резистора R13.
Расчет такой: R13=0.65/Imax. Для заряда током 0.5А => R13=0.65/0.5=1.3 Ома.
Магическая константа 0.65 — это всего лишь напряжение на базе для полного открытия биполярного транзистора T2.

Настройка схемы трудностей не вызывает.
1. Без нагрузки (не подключая АКБ) устанавливаем подстроечным резистором R12 напряжение 4.2 Вольта на выходе подключения АКБ.
2. Подключаем батарею.
3. Проверяем ток зарядки (напомню, что он не должен превышать расчетного. Читай выше).
4. Ожидаем погасания светодиода (может занять прилично времени). Батарея заряжена.

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

Преобразователь напряжения.
Для питания всего нашего устройства нужно 5 вольт. Li-ion АКБ выдает 3.7 Вольта. А это значит, что нам нужен DC-DC преобразователь, причем Step-Up, т.е. из низкого напряжения в высокое. Такой преобразователь можно купить у китайцев в виде готовой платы, но долго ждать. Да и не наш это метод. Сделаем сами. Теорию о принципах работы такого рода преобразователей советую почитать у DiHalta.
Схема такая:

Нетипичное соотношение резисторов R8 и R9, а именно эта парочка определяет значение напряжения на выходе, обусловлено наличием в схеме диода D6. Кстати, как оказалось при дальнейшем проектировании схемы, он не особо нужен. Если выбросить из схемы этот диод, то значения резисторов (для получения на выходе 5 вольт) должны быть такие R9=3kOm, R8=1kOm.
Конечно же, я предварительно протестировал работоспособность зарядной части и преобразователя. Первоначальный прототип силовой части (для тестирования и отладки) выглядел у меня так:

Плата сделана под SMD элементы из-за лени сверлить отверстия 🙂

Звук.
Ну и для воспроизведения звука в данной поделке вполне достаточно обычного биппера.
Конденсатор С5 и подключение к пину с аппаратным ШИМ — лишние и в схеме остались рудементально. Это часть так называемой RC-цепочки. Дело в том, что когда я смотрел на проект в “крупную клетку”, я думал, что звук будет полифоническим… Не осилил 🙁 По крайне мере пока. А в схеме решил оставить, так сказать, на перспективу.

Ой! “А слона-то я и не приметил”!
Чуть не забыл. Естественно, мозгом всей системы будет… будет.. (барабанная дробь)… АР-ДУ-И-НО!!! (Хм, прямо как в песне : “Ту-ру-ту-ту-ту-ту, скажите как его зовут!!!”). Но небольшое уточнение. Дело в том, что после приобретения корпуса, я понял, что стандартную Ардуино разместить внутри его не получится. Но у меня уже давно лежал без дела один из подарков за участие в конкурсе “Кибервесна” — это контроллер универсальный ORduino Nano v. 1.1+. Маленький, с mini-USB на борту, полностью совместимый по функционалу с “большой Ардуиной”. Он идеально подойдет для моих целей.

Окончательно схема нашей игровой консоли выглядит так:

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

Чуть чуть лирики. Процедура “разместить в корпус” у моих друзей на работе всегда вызывает улыбку. В моем близком окружении сделать “это” хорошо никогда никому не удавалось. Из какого бы материала ни был корпус (пластик, металл, дерево, стеклотекстолит), какие бы ухищрения для предварительной разметки ни использовали, какие бы ( из доступных нам) инструментов ни применялось — результат никогда не был “идеальным”. Да, мы можем сделать и спаять практически идеальную плату или схему, но получить законченное, подогнанное изделие с аккуратными отверстиями пока никак. Да и честно говоря, мы уже перестали на работе подтрунивать друг над другом за кривые отверстия, неровно расположенные элементы управления, разношерстные болты и гайки, которые присутствуют на наших самоделках.

На радиорынке был приобретен пластиковый корпус 149x80x32мм (основным критерием выбора был размер экрана).
Важно!!!
Мой вариант печатной платы — под мой вариант размещения в корпусе. Имейте это ввиду

Большого количества перемычек можно было бы избежать, если “забить” на линейность развода контактов под шлейф дисплейчика (это означает, что разъем на плате по нумерации выводов «1 в 1» аналогичен выводам на дисплее) и расположить выводы более рационально. Но я решил, что перекрученные жилы шлейфа будут занимать непростительно много места.

Часть соединений выполнены проводами, а именно: от разъема питания до входа зарядной части, а так же соединение АКБ и узла Step-up через выключатель.

На верхней половинке корпуса я разместил экран и пять кнопок. Под круглыми накладками-грибками (колпачками) размещена печатная плата с кнопками.


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

В ходе тестовых испытаний узла зарядки (от БП 12 вольт) очень сильно грелась LM317. Поэтому я расположил ее с краю, установить радиатор и сделал под ней большую медную площадку (что-то типа теплоотвода).
Из непредвиденных нюансов. Из-за высокого соединения «штыри PLS + гнезда PBS» (между Ардуино и основной платой) возникли проблемы. При совмещении половинок корпуса, экран соприкасался с Arduino, нажимая (вот сволочь) на кнопочку Reset. Пришлось немного сточить напильником полоски (гнезда PBS — “мама”) по высоте и откусить немного штырьки (PLS) запаянные в Аrduino. Так стало гораздо лучше.

Ниже фото “предпоследней примерки”. Верхняя половинка — экран и кнопки, нижняя — основная плата и Ардуино. АКБ пока не установлен.

Окончательно готовая игровая приставка выглядит так:

вид сбоку:

С такого ракурса видны: кнопка включения, индикатор заряда и кривенькое отверстие под mini-USB разъем 🙂

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

В следующей части расскажу, как «вдохнуть жизнь» в эту коробку с кнопками.


0 комментариев на «“По следам черного самурая, или делаем игру «Sokoban» своими руками (Часть 1 из 3).”»

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение