Например TDA7294

РадиоКот >Конкурсы >Поздравь Кота по-человечески 2018! >

Теги статьи: Добавить тег

Понастольгируем? «Тайны океана» или как впихнуть невпихуемое.

Опубликовано 19.09.2018.
Создано при помощи КотоРед.

Здравствуйте, Уважаемые радиолюбители, радиочитатели и просто случайно зашедшие. Хотелось бы пожелать Коту здоровья и пушистой шерсти, и поделиться созданным мной устройством. Итак…

Понастольгируем? «Тайны океана» или как впихнуть невпихуемое.

Идея создания этого устройства пришла мне в голову, когда я случайно на полке одного магазина увидел одноименную игру из детства под брендом «Электроника» за «немалую» сумму. И хотя если задаться целью, то найти в продаже б/у шную «Электронику» можно было гораздо дешевле, но ведь покупать это как то не по нашему… В голове созрело техническое задание, со следующими основными требованиями:

            1.Размеры должны быть сопоставимы с оригиналом.

            2.Питание необходимо осовременить (литиевый аккумулятор, заряд от USB и т.д.).

            3.Автономностью можно пожертвовать  для уменьшения размеров (вряд ли кто-то будет играть в нее часами напролет)

Поэтому берем 2,2“ дисплей с контроллером ILI9340, от которых китайский рынок «разрывается», микроконтроллер семейства Atmega (в моем случае 16а) и за работу.

Делаю разводку платы:

Делаю плату ЛУТом (отверстия выпилены ювелирным лобзиком):

И начинаю читать даташит дисплея.

Библиотекой решил не пользоваться, позаимствовал код инициализации, с какого-то проекта на STM, а дальше все свое. После недолгих подсчетов прихожу в недоумение. Дисплей имеет 320х240=76800 пикселей, каждый пиксель описывается 18ю битами данных о цвете, таким образом, для того что бы загрузить хотя бы картинку фона, необходимо передать дисплею минимум 76800*18=1382400 бит данных, а это примерно 170 Кбайт. А еще эти данные надо где-то хранить, что бы было что передавать, и уж явно не в ATMEGA16a. После долгих раздумий был выбран следующий алгоритм. Берем один цвет, встречающийся в нашей картинке, и в массив данных записываем информацию в каких пикселях он есть, а в каких его нет. Но на весь дисплей так записать информацию невозможно, ибо для каждого цвета будет необходим массив с 76800 битами данных (~9 Кбайт). Поэтому, наряду с информацией о цвете, выделяем определенные области, где этот цвет встречается. Например, голубые волны встречаются с 20 по 25ю строки сверху, значит создаем массив в котором будет 320 пикселей*6 строк=1920 бит. Или, к примеру, коричневый канат,  спускающийся вниз, встречается с 11го по 15й столбец, значит пишем массив данных из 240 пикселей *5 столбцов=1200 бит. Массивы заполнены единицами и нулями, что означает  соответственно: есть цвет – нет цвета. Для того, что бы узнать в каком месте, какой нужен цвет, тянем картинку с экраном оригинальной игры из интернета. Вставляем ее в любой векторный редактор, например AUTOCAD. Расчерчиваем там область клетками 320х240 с шагом 1 мм, масштабируем картинку под эту область, чтобы линии были поверх картинки и вуаля. Для удобства можно подписать по оси Х и по оси Y, теперь каждый пиксель имеет свою координату и свой цвет. Я для удобства «раскрасил» клетки разноцветной штриховкой, а оригинальную картину потом удалил с фона. Пару недель и вышло вот так:

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

Остается написать подпрограмму, которая будет брать данные из этих массивов, определять координаты строк или столбцов и закрашивать их определенным цветом. Фон готов. С человечками и щупальцами поступаем также, за тем лишь отличием, что если они активны - закрашиваем черным цветом, если неактивны - закрашиваем серым цветом.

Контроллер работает на предельных 16 МГц, загрузка фона целиком занимает какое-то время, но во время игры перерисовываются только определенные области экрана, поэтому этого вполне достаточно для "безглючной" игры.

Поведение щупалец осьминога очень долго изучал из немногочисленных роликов в интернете. Пытался выявить какую-то закономерность поведения. Выискивал отличия в «Игре А» и «Игре Б». Ролики старался смотреть только из оригинальных игр, т.к. сейчас развелось много клонов на «андроиде» и т.д. А делать клон на клон не хотелось. В итоге вырисовалась какая-то «картина закономерностей с долей случайностей», которую я и попытался программно повторить максимально приблизив геймплей к оригиналу. Скорость щупалец с набором очков возрастает, призы в виде дополнительных жизней присутствуют. Естественно с первого раза все не поместилось в этот тесный контроллер, поэтому было произведено еще несколько оптимизаций данных фоновой картинки. И вот кое как в необходимый объем памяти вписываюсь.

С часами заморачиваться не стал, ибо с таким «жрущим» дисплеем, при работе от аккумулятора эта функция абсолютно бесполезная и кратковременная. Да и места в памяти уже нет. Зарядка аккумулятора контролируется микросхемой TP4056. Когда происходит зарядка горит синий светодиод в верхней части корпуса, по окончанию - зеленый. При запуске "Игры А" гоит зеленый светодиод снизу, при "Ире Б" - красный. На плате предусмотрены контакты под тактовые кнопки, а также сделаны отдельные платы с контактами под кнопки с «токопроводящими резинками», которые можно при необходимости изготовить и установить (приподняв на необходимый уровень) чтобы не «щелкать» во время игры, как в оригинале.

Корпус изготавливаю в основном из латуни, делаю фотошаблон для ЛУТ и последующего травления:

Травлю, пилю, зачищаю, паяю, подгоняю:

Уголки медные, задняя крышка из алюминия. Корпус патинирую, полирую. Ну и фото готового устройства:

 

 

 

 

Видео работы устройства:

Спасибо за внимание, всем добра!!!

 

PS: Да, можно было бы взять хотя бы Atmega32 или разобраться с STM, но мы ведь не ищем легких путей)))


Файлы:
Архив ZIP


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

70 6 5