Arduino nes emulator

Build a Portable NES Console Using an ESP32 and Arduino

The barebones NES console is outfitted with a TTGO ESP32 board, 4″ LCD module, amplifier, speaker, and several buttons.

Plenty of projects have been created using the versatile ESP32 microcontroller, but perhaps the most prominent are retro game consoles. SBCs, MCUs, and other development platforms have made it easy to replicate those systems, as the embedded CPUs have more than enough muscle to play your favorite retro games. That said, most DIY portable consoles tend to recreate Nintendo’s Game Boy, but maker Chen Liang decided to go with its big brother, Nintendo’s original NES.

Liang built his Arduino NES using parts from AliExpress, such as a TTGO v1.7 ESP32 development board, a 4″ ST7796S SPI LCD module, a MAX98357 I2S amplifier module, and a PCB-mount mini speaker. It also packs a PSP analog joystick, six buttons, and a LiPo battery, all of which are wired together on a compact 400-hole breadboard. For the emulator, Liang went with a modified version of Nofrendo designed to work with the Arduino IDE, rather than the default Windows, Unix, and BeOS.

To support as many display options as possible for the Arduino NES, Liang changed the display implementation to use Arduino_GFX, which can take advantage of different resolutions and formats. As with any retro emulator, users need ROMs to play the corresponding games, which can be downloaded from anywhere (insert a legal disclaimer here), and then saved to a media of your choice. Liang has uploaded a detailed walkthrough of his Arduino NES on his Intractables page for those who would like to replicate his setup, including links to the necessary code to get up and running.

Источник

Arduino.ru

8-ми битная консоль на базе Arduino

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Всем доброго здравия!

Пишу в общий раздел, так как он объединяет в себе несколько вопросов.

Первый из них — это возможность реализации данного проекта.

Задумка катастрофически простая: реализовать эмулятор 8ми битной консоли (NES, Dendy) на базе Arduino.

Возможно нужно будет объединить силу двух ардуинок, либо собрать свою обвязку на базе atmega не знаю. Я только в начале своего пути в вопросах конструирования.

Знаю, что это делается в два клика на «ягодном пироге», но Raspberry Pi — это полноценный компьютер и на нём пишут эмуляторы и более мощных систем, хватит ли мощности ардуинки для более простой задачи?

Если чисто железной мощности хватит, то дальше начинаются вопросы обвязки: вывод аудио и видео, обработка контроллера.

С обработкой контроллера, думаю, проблем не должно возникнуть, его можно собрать на базе всё той же ардуинки, благо там всего 8 (10) кнопок обработать.

Вывод видео: можно подключить небольшой 3-х дюймовый дисплей, но хотелось бы более качественную картинку, хотя бы 5 дюймовый экранчик от какого-нибудь смартфона и/или вывод сигнала наружу (для подключения к телевизору, например), но опять-таки читал, что мощности нашей Atmeg’и просто может не хватить для таких «серьёзных» экранов, опять-таки, возможно есть смысл видео модуль сделать на отдельной ардуине и передавать сигнал между головной и вспомогательной.

А вот с обработкой и выводом звука вообще не могу даже предположить как это должно выглядеть/работать.

Вопрос к тем, кто уже опытен: стоит ли игра свечь? Реальна ли она вообще?

Если кому-то нравится идея, можно было бы замутить коллективный проект (я программист, а вот с железной частью не очень пока дружу).

P.S. Если это имеет значение, то все свои проекты я ваяю на Arduino Pro Mini, а ещё у меня есть мешочек МК Atmega32А (smd), возможно есть смысл собрать на них.

Надеюсь, тема не покажется вам слишком дурацкой. Буду благодарен за любой совет.

Источник

Взаимодействие с контроллером NES на Arduino Uno

Nintendo Entertainment System, также известная как консоль NES (а в России известен ее клон, Dendy), была когда-то королем всех видеоигровых систем.

Пришло время захватить мир

В настоящее время они довольно устарели, и только самые ностальгирующие геймеры будут играть на ней. Для тех из нас, кто перешел на современные системы или просто пытается идти в ногу с повседневной работой, NES стала пылесборником. Но, если вы возитесь с электроникой, NES может стать полезной в DIY мире с помощью своего простого в управлении контроллера. Контроллер NES может управлять множеством предметов от освещения до робота и даже до вашего устройства судного дня – его возможности зависят только от вашего воображения! Для этого проекта мы будем использовать не более чем Arduino Uno и контроллер NES, чтобы продемонстрировать, насколько просто они могут взаимодействовать.

Перечень компонентов

Аппаратное обеспечение:

  • Arduino Uno;
  • перемычки для макетной платы;
  • NES контроллер (оригинальный или аналог);
  • макетная плата (необязательно);
  • удлинитель NES (необязательно).

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

Теория

Если вы откроете контроллер NES, то обнаружите, насколько он прост и элегантен. Он состоит не более чем из одного сдвигового регистра и нескольких подтягивающих резисторов. В частности, это называется «параллельный-ввод-последовательный-вывод» (Parallel-In-Serial-Out, сокращенно PISO). Сдвиговый регистр, который используется внутри этих контроллеров, это 4021. Хотя для понимания кода Arduino в этом проекте нет необходимости, но любознательный читатель может найти здесь техническое описание типовой версии.

Способ использования 4021 можно увидеть ниже. Это схема того, как контроллер NES выглядит изнутри.

Схема контроллера NES

Как вы можете видеть, 4021 – это 8-разрядный регистр, которого достаточно, чтобы все восемь кнопок контроллера были подключены к нему. Одна сторона каждой кнопки подключена к земле, а другой конец каждой кнопки идет к отдельному входу данных сдвигового регистра. Чтобы сохранить определенное состояние входов регистра, используются подтягивающие резисторы. Это означает, что когда кнопка не нажата, сдвиговый регистр будет интерпретировать состояние на входе как логическую «1». Если кнопка нажата, регистр сдвига будет интерпретировать состояние на входе как логический «0». Это важно, так как здесь впервые появляется точка пользовательского ввода.

Чтобы сдвиговый регистр «захватил» состояние входов линий данных, требуется сигнал, указывающий о необходимости сделать это. Для этого используется линия LATCH. При переходе линии LATCH низкий-высокий-низкий уровень состояние кнопок, подключенных к выводам регистра, будут зафиксированы в регистре. Продолжительность высокого уровня может быть довольно короткой, но для справки протокол NES будет делать это примерно 12 микросекунд. После того, как данные зафиксированы, состояние первой кнопки становится доступным на линии DATA. Линия DATA будет прокручивать состояния кнопок каждый раз, когда на выводе CLOCK будет проходить импульс так же, как было на линии LATCH. Это означает, что после фиксирования данных семь тактовых импульсов вытянут все данные о состоянии кнопок. Точный порядок кнопок, которые будут отправляться последовательно, четко описывается в коде для Arduino.

Чтобы подвести итог, код Arduino должен выполнять следующее:

  1. Выдать импульс на линию LATCH, чтобы сдвиговый регистр мог «собрать» данные.
  2. Прочитать состояние на линии DATA и сохранить состояние кнопки.
  3. Выдать импульс на линию CLOCK и сохранить состояние кнопки.
  4. Повторить шаг 3 еще шесть раз.
  5. Сделать что-нибудь крутое со всеми этими данными!

Чтобы лучше понять конструкцию контроллера NES, вы всегда можете разобрать его. Хотя это совершенно необязательно, это даст вам более полное представление о том, как вы будете создавать свой собственный проект, и дополнительный опыт с точки зрения проектирования и сборки электроники. Чтобы начать разборку, вам понадобится небольшая отвертка с крестообразным шлицем. На задней панели контроллера находится шесть винтов.

Задняя панель контроллера NES

Будьте осторожны, отвинчивая их. Эти винты находятся на немного более дешевой стороне, поэтому у них легко срывается шлиц. Обязательно найдите отвертку, которая позволяет прикладывать достаточное давление при повороте винта. Как только винты будут удалены, положите контроллер кнопками вниз. Затем осторожно снимите заднюю крышку.

Печатная плата контроллера NES

Теперь вы можете увидеть обратную сторону печатной платы. Конкретно эта печатная плата изготовлена из гетинакса, что является обычным явлением в бытовой электронике, поскольку он намного дешевле в производстве. Однако, в качестве примечания, большинство качественных печатных плат изготавливаются из стеклотекстолита. Помимо печатной платы, вы можете увидеть микросхему 4021 вместе с проводами кабеля. Можно поразиться, насколько всё просто. Инженеры Nintendo сделали это, сохранив высокую функциональность, всего на одной микросхеме. Чтобы увидеть другую сторону печатной платы, осторожно снимите ее. Если вы внимательно посмотрите на дорожки, то сможете заметить, что их рисовали вручную. Должно быть, это был довольно сложный процесс. Вы можете заметить, что на другой стороне нет резисторов. Но для опытного взгляда они находятся на виду. На самом деле это черные прямоугольники с блестящей зеленой поверхностью. Это углеродные резисторы, которые были напечатаны на печатной плате, чтобы сэкономить время и деньги. И так как они имеют одинаковый номинал, это, вероятно, было идеальным решением в то время. Последнее, что нужно убрать с контроллера, – это контакты кнопок и резиновые кнопки. Они работают за счет того, что черная круглая часть резиновой прокладки устанавливает соединение между контактами кнопки с помощью углеродного слоя. Хотя он не кажется проводящим, его достаточно, чтобы установить логический высокий или низкий уровень состояния кнопки.

Передняя часть платы контроллера NES

Соединим всё вместе

Схема соединений в этом проекте довольно проста, так как разъем контроллера NES легко позволяет использовать перемычки для макетных плат. Конечно, если вы хотите что-то более надежное, то можно купить удлинитель кабеля контроллера NES, разрезать его и воспользоваться проводами из него. Таким образом, вы можете вставить их напрямую в Arduino, получив надежное соединение и ответный разъем для контроллера.

Схема соединений показана ниже.

Схема подключения контроллера NES (Dendy) к Arduino Uno

Как вы можете видеть, контроллеру для взаимодействия требуются только 5 из 7 контактов. Два для питания (+5V и GND), один для фиксирования состояния кнопок (D2), один для тактового сигнала состояний кнопок (D3) и один для считывания последовательных данных о состояниях кнопок (D4)

Код Arduino

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

Мысли на будущее

Если вам понравился данный проект, и вы хорошо научились взаимодействовать с контроллером NES, то контроллер SNES – это почти то же самое, но с большим регистром сдвига (16 бит вместо 8 бит).

Источник

Подключаем джойстики от Dendy к PC через Arduino

Думаю многие из вас помнят те славные времена, когда мы часами рубились в танчики, черепашки ниндзя, батлтодс энд даблдрагон и еще пару десятков других суперских игр на Денди. Это было шикарное время! Большинство игр были чертовски сложные, но даже несмотря на это, неудача за неудачей, мы, все равно, шли к своей цели и начинали игру заново, чтобы уж сегодня-то пройти ее до конца.

Поностальгировав всласть, я решил, что очень хочу поиграть в Dendy и поиграть хочу на ноутбуке, но не на клавиатуре, а на старом добром джойстике.

Ниже я опишу, с какими проблемами я столкнулся и как их решил.

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

Встала проблема, как подключить джойстик от Денди к ноутбуку.

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

0. Определение распиновки на джойстике

Первая проблема оказалась в том, что коннекторы у джойстиков внутренние, а все описания распиновок найденные в интернете, были для внешних коннекторов.

Найти спецификацию на мою noname денди мне не удалось, поэтому я стал рассматривать внутреннюю плату, чтобы найти там питание и землю, и понять какие из пяти контактов на джойстике с ними соединяются. С этим я справился быстро. Оказалось это два крайних контакта.

К Ардуино, я подсоединил все напрямую, питание — питание 5В, земля — земля, остальные три контакта подсоединил к 2, 3 и 4 цифровому пину.

1. Описание протокола работы джойстика

Оказалось не так-то просто найти эту информацию. Лишь несколько сообщений на паре форумов. Лично мне помогла эта запись: code.google.com/p/avrtoys/wiki/joystick, а именно этот код: avrtoys.googlecode.com/svn/trunk/joystick/main.c. А вот ссылка на упомянутую в этой записи заметку в журнале Радио: ftp.radio.ru/pub/arhiv/1996/06-96/46-6-1996.gif. Из всего этого я сделал вывод, что нужно подать сигнал на Latch, а потом 8 раз подавать сигнал на Clock и каждый раз считывать значение с Data, в котором после каждого Clock-а будет содержаться информация о следующей кнопке джойстика.

2. Настройка среды

Если у вас уже все настроено или вас устраивает Arduino IDE, можете перейти к 3 пункту.
Не знаю, как вас, но лично меня официальная Arduino IDE ужасно угнетает, поэтому коротко расскажу, как использовать свою любимую IDE.
Первым делом я скачал исходники Arduino IDE и нашел там код отвечающий за компиляцию и аплоад прошивки. Потратив немного времени я выделил все команды, которые там используются:

В приведенной выше команде, при линковке, используется библиотека libArduino.a, ее можно получить скомпилировав все *.c и *.cpp файлы из папки с хэдэрами и собрав все объектники в один архив. А можно просто запустить Arduino IDE, скомпилировать любой проект и скопировать файл /tmp/build*.tmp/core.a. Это будет абсолютно эквивалентно.
Все эти команды актуальны для Arduino Uno, для других ардуин следует изменить некоторые параметры.

Теперь используя эти команды можно легко настроить свою IDE, на автоматическую компиляцию и загрузку прошивки.

3. Написание кода прошивки

Здесь нужно было лишь определить какие из 2, 3 и 4 пина отвечают за Latch, Clock и Data. Это я решил методом проб и ошибок. Предполагаем, что 4 это Data, и делаем Serial.println(digitalRead(4)), если при нажатии кнопок есть какая-то реакция, значит это оно. Остальные 2 контакта определились, когда уже была написана прошивка, если все работает значит угадали, нет — меняем местами.

В результате я получил 1 байт содержащий в себе информацию о всех 8-ми кнопках джойстика, о каждой в соответствующем бите. У меня получилось следующее расположение: A, B, Select, Start, Up, Down, Left, Right. После этот байт отправляется на компьютер, где принимается и обрабатывается моим «драйвером».
Несложно заметить, что можно легко подключить второй джойстик.

4. Написание «драйвера»

Здесь нужно было принять этот самый байт от Arduino и эмулировать нажатия кнопок клавиатуры. Да-да, нажатия на джойстике будут обрабатываться, как нажатия на клавиатуре, хорошо это или плохо.
В качестве языка программирования я выбрал Python. Простой и эффективный, полагаю, он отлично подошел для этой задачи.

Единственная проблема, которая здесь возникла это дребезг контактов джойстика. Я ее решил путем введения временного интервала, наступающего после смены состояния кнопки, в течение которого состояния не изменяется. Хватило 0.05 с.

Для эмуляции нажатия кнопок клавиатуры я использовал утилиту xte, идущую в комплекте Xautomation. Она очень проста в использовании, вот пример: xte ‘keydown Left’ . За дополнительной инфорацией смотрите man xte.

Для выхода из драйвера я использовал состояние, когда нажата вся крестовина целиком. Этому состоянию соответствует число 0xf0.

5. Ура! Играем!

Все! Осталось лишь настроить эмулятор денди, я выбрал FCEUX.
Указываем в настройках те клавиши, которые указаны в драйвере ииии вспоминаем детство!

Заключение

На самом деле есть и другие, возможно, более эффективные способы использования Ардуино в данной ситуации. Например, если у вас Arduino Leonardo, то можно использовать объект Keyboard для прямой посылки команд клавиатуры на компьютер. Так же можно, как я понял, перепрошить Ардуино так, чтобы она отображалась, как джойстик/клавиатура/мышь и так же напрямую посылать команды. Вот туториал: http://mitchtech.net/arduino-usb-hid-keyboard/. Впрочем, мой способ меня полностью устраивает и результатом я более чем доволен.

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

Источник

Adblock
detector