fhoedemakers / pico-infonesPlus

NES Emulator with SD card and menu support for the Raspberry PI Pico and other RP2040 based microcontrollers. Play your games from SD card on a HDMI display.
GNU General Public License v3.0
232 stars 24 forks source link
adafruit adafruit-feather-dvi emulator hdmi nes pico pimoroni pimoroni-pico-dv raspberry raspberry-pi-pico rp2040 sdcard waveshare waveshare-rp2040-pizero

pico-infonesPlus.

Introduction

A NES (Nintendo Entertainment System) emulator for RP2040 based microcontrollers with SD card and menu support. Uses HDMI for display.

Supports two controllers for two player games. See "about two player games" below for specifics and limitations

The emulator used is Infones by Jay Kumogata which was ported to the Raspberry Pi Pico by Shuichi Takano with changes done by me to accomodate the SD card menu.

In stead of flashing a NES rom to the Pico using picotool, you create a FAT32 formatted SD card and copy your NES roms on to it. It is possible to organize your roms into different folders. Then insert the SD Card into the card slot. Needless to say you must own all the roms you put on the card.

A menu is added to the emulator, which reads the roms from the SD card and shows them on screen for the user to select, flash and play.

See also the Adafruit guide although it is somewhat outdated now. (No two player)

There is also an emulator port for the Sega Master System/Sega Game Gear. You can find it here https://github.com/fhoedemakers/pico-smsplus


Video

Click on image below to see a demo video.

Video


Possible configurations

You can use it with these RP2040 boards and configurations:

See below to see how to setup your specific configuration.


Gamecontroller support

Depending on the hardware configuration, the emulator supports these gamecontrollers:

When using Legacy Controllers, you can choose between:


About two player games

The emulator supports two player games using two NES controllers or an USB gamecontroller and a NES controller connected to controller port of player 2. The USB controller is always player 1.

[!NOTE] You cannot use two USB controllers for two player mode. At the moment only one USB controller is recognized by the driver. The second controller must be a NES controller. In this config the NES controller port must be wired up to the GPIO pins of player 2. See configurations below.


Warning

Repeatedly flashing your Pico will eventually wear out the flash memory.

The emulator overclocks the Pico in order to get the emulator working fast enough. Overclocking can reduce the Pico's lifespan.

Use this software at your own risk! I will not be responsible in any way for any damage to your Pico and/or connected peripherals caused by using this software.

I also do not take responsability in any way when damage is caused to the Pico or display due to incorrect wiring or voltages.


Setup

Click on the link below for your specific board configuration:


Raspberry Pi Pico, setup for Pimoroni Pico DV Demo Base.

materials needed

flashing the Pico

Pinout

NES controller port(s) (if you want to use legacy NES controllers).

Port 1 Port 2 (optional) Note
GND GND (- on board)
VCC (Power) Connect to 3V3
NES Clock GPIO14 GPIO1
NES LATCH GPIO16 GPIO20
NES Data GPIO15 GPIO21

[!NOTE] Soldering is required. There is only one 3v3 pin header on the board, the other 3V3 must be soldered directly onto pin 36 (3V3 OUT) of the Pico. For GND there are two pin headers available on the board. Clock Data and Latch for controller one must be soldered directly onto the Pico. The Clock, Data and Latch for the second controller can be soldered on the available pin headers on the board, no need to solder them directly onto the Pico.

PinHeadersPimoroniDV

Image

setting up the hardware

Image: Usb controller only

Image

Image: two player setup, usb controller and NES controller port

USB controller is player 1, NES controller is player two and must be wired to controller port 2.

Image

Image: Two player setup using NES controllers

(You can also connect an USB controller and a NES controller to port 2)

Controller Port 1 pins must be soldered directly onto the Pico

Controller Port 2 pins can be soldered to the available headers of the Pimoroni DV.

TODO


Raspberry Pi Pico, setup with Adafruit hardware and breadboard

materials needed

flashing the Pico

Pinout

See https://www.raspberrypi.com/documentation/microcontrollers/images/pico-pinout.svg for the pinout schema of the Raspberry Pi Pico.

Use the breadboard to connect all together:

Adafruit Micro-SD breakout board+

Breakout GPIO Note
CS GPIO5
CLK (SCK) GPIO2
DI (MOSI) GPIO3
DO (MISO) GPIO4
3V Pin 36 (3v3 OUT)
GND Ground on breadboard (-)

Adafruit DVI Breakout For HDMI Source Devices

Breakout GPIO Note
D0+ GPIO12
D0- GPIO13
CK+ GPIO14
CK- GPIO15
D2+ GPIO16
D2- GPIO17
D1+ GPIO18
D1- GPIO19
5 (*) VBUS Pin 40 (5volt)
GND (3x) Ground on breadboard (-)

(*) This is the via on the side of the board marked 5. (next to via D and C).

Image

NES controller port(s). (if you want to use legacy NES controllers).

Port1 Port 2 (optional) Note
GND Ground on breadboard (-)
VCC (Power) (3v3 OUT)
NES Clock GPIO6 GPIO9
NES LATCH GPIO8 GPIO11
NES Data GPIO7 GPIO10

Image

setting up the hardware

See image below.

[!NOTE] The Shotky Diode (VSYS - Pin 39 to breadboard + column) and the wire on breadboard left (+) to right (+) are not necessary, but recommended when powering the Pico from a Raspberry Pi. See Chapter 4.6 - Powering the Board of the Raspberry Pi Pico Getting Started guide

Image: One player setup only

USB controller and NES controller ar both player 1

Image

Image: Two player setup using NES controllers

(You can also connect an USB controller and a NES controller to port 2)

[!NOTE] The device on the left is a Pico Debug probe used for debugging. This is optional

Image


Adafruit Feather RP2040 with DVI (HDMI) Output Port setup

materials needed

When using a USB gamecontroller this is needed:

When using legacy controllers, this is needed:

flashing the Feather RP2040

Pinout

See: https://learn.adafruit.com/assets/119662 for the Feather pin scheme.

Use the breadboard to connect all together:

Adafruit Micro-SD breakout board+

Breakout GPIO
CS GPIO10
CLK (SCK) GPIO14
DI (MOSI) GPIO15
DO (MISO) GPIO8
3V + column on breadboard connected to feather 3.3V pin
GND - column on breadboard connected to feather ground pin

WII nunchuck breakout adapter.

Connect the nunchuck breakout adapter to the Feather DVI using the STEMMA QT cable.

NES controller port(s). (if you want to use legacy NES controllers).

Port 1 Port 2 (optional) Note
GND - column on breadboard connected to feather ground pin
VCC (Power) + column on breadboard connected to feather 3.3V pin
NES Clock GPIO5 GPIO26
NES LATCH GPIO9 GPIO27
NES Data GPIO6 GPIO28

Image

setting up the hardware

Image: One player setup only

USB, NES and WII-Classic are player 1

Image

Image: Two player setup using NES controllers

(You can also connect an USB controller and a NES controller to port 2)

Image


Waveshare RP2040-PiZero Development Board

materials needed

[!NOTE] When using an USB controller, connect the controller and the power adapter to the Y cable. Connect the Y-cable to the port on the board labelled USB. I do not recommend powering the board via the PIO-USB port. This caused some weird behaviour.

NES controller port.

When using a original NES controller you need:

For two player games you need an extra NES controller port, controller and wire

Port 1 Port 2 (Optional) Note
GND Any ground pin
VCC (Power) 5Volt pin
NES Clock GPIO5 GPIO10
NES LATCH GPIO9 GPIO11
NES Data GPIO6 GPIO12

[!NOTE] Contrary to other configurations where VCC is connected to 3Volt, VCC should be connected to a 5Volt pin. Otherwise the NES controller could possibly not work.

Image

flashing the Waveshare RP2040-PiZero Development Board

Note: When the emulator won't start and the screen shows "No signal", press the run button once again. The emulator will now boot.

Image: One player setup only

USB and NES are player 1

Image

Image

Image: Two player setup using NES controllers

(You can also connect an USB controller and a NES controller to port 2)

Image


PCB with Raspberry Pi Pico

Note: Soldering skills are required.

Create your own little Pico Based NES console and play with an orginal (S)NES controller. The PCB design files can be found in the assets/pcb folder. Several Companies can make these PCBs for you.

[!NOTE] The pcb is not designed for a second NES controller port for player 2, but the second port can be added without much hassle. You need to solder the gpio pins directly on to the Pico.

I personally recommend PCBWay. The boards i ordered from them are of excellent quality.

Image

Simply upload the design files packed as a zip archive when ordering. A zip file containing the design files can be found on the releases page.

Other materials needed:

For two player setup you need an extra NES controller port. You must solder the GPIO connections directly onto the pico.

Port 2 (Optional) Note
GND ground via on PCB
VCC (Power) VCC via on PCB
NES Clock GPIO9
NES LATCH GPIO11
NES Data GPIO10

Flash the Pico with piconesPlusAdaFruitDVISD.uf2 from the releases page.

Image: One player setup only

NES, SNES and USB controller are alle player 1

Image

Image: Two player setup using NES controllers

(You can also connect an USB controller and a NES controller to port 2)

clock, data and latch soldered directly on the Pico. Ground and vcc soldered on the pcb.

Todo

3D printed case (One player only)

DynaMight1124 designed a NES-like case you can 3d-print as enclosure for this pcb. This enclosure is suitable for one NES controller port. Click here for the design. Please contact the creator on his thingiverse page if you have any questions about this case.

image

image


Menu Usage

Gamepad buttons:

Emulator (in game)

Gamepad buttons:


Save games

For games which support it, saves will be stored in the /SAVES folder of the SD card. Caution: the save ram will only be saved back to the SD card when quitting the game via (START + SELECT)


Raspberry Pico W support

The emulator works with the Pico W, but without the onboard blinking led. In order for the led to work on the Pico W, the cyw43 driver needs to be initialised. This causes the emulator to stop with an out of memory panic.


USB game Controllers latency

Using a USB gamecontroller introduces some latency. The legacy controllers ((S)NES, WII-classic) have less latency.

Troubleshooting no image on TV or monitor

Image


Known Issues and limitations


Building from source

Best is to use the included build script buildAll.sh. You can then copy the correct .uf2 to your Pico via the bootsel option. The script builds three .uf2 files and puts them in the releases folder.

git clone https://github.com/fhoedemakers/pico-infonesPlus.git
cd pico-infonesPlus
git submodule update --init
chmod +x build*.sh
./buildAll.sh

When using Visual Studio code, choose the Release or the RelWithDebuginfo build variant.


Credits

InfoNes is programmed by Jay Kumogata and ported to the Raspberry Pi Pico by Shuichi Takano.

I contributed by adding SD card and menu support. For this reasons I made code changes to the emulator for accommodating the menu and SD card.

PCB design by @johnedgarpark.

NES gamepad support contributed by PaintYourDragon & Adafruit. If using Pimoroni Pico DV Demo Base: NES controller clock, data and latch go to GPIO pins 14, 15 and 16, respectively. If Adafruit DVI Breakout build, it's GPIO pins 6, 7, 8 instead. FeatherDVI Gamepad should be powered from 3.3V when connected to Pico GPIO, not 5V as usual...seems to work OK regardless.

WII-Classic controller support by PaintYourDragon & Adafruit.

Adafruit Feather DVI - RP2040 support by PaintYourDragon & Adafruit.


Other versions

There is also a version available for the Pimoroni PicoSystem handheld.

Image