ESP32 VMU Handheld Console - Yes, It Plays Doom!

by DynaMight in Circuits > Electronics

5944 Views, 59 Favorites, 0 Comments

ESP32 VMU Handheld Console - Yes, It Plays Doom!

PXL_20250612_182645188.jpg
PXL_20250607_161636363.jpg
PXL_20250607_161844160.jpg

UPDATE 25 OCTOBER 2025: I have been working on and off on an updated PCB to resolve a few issues that the original had such as poor DPad & hiss from the speaker. What started off as a project for rainy Sunday afternoon got a little more involved but turned out nice! The below guide has been updated to reflect the VMU V2. Incase anyone has a V1 on the way or needs instructions, the archive for V1 including the BOM, Gerbers, firmware and original PDF of this Instructables is HERE


Improvements over V1:

ESP32 S3 chip - very slightly faster however it is smaller and costs almost half the price

Improved controls - the original used ADC for the DPad, which relies of picking up voltage changes, however I found that different VMU membranes acted differently due to their age and use, now uses direct GPIO so is much more responsive

Improved sound - this was kinda a by-product of changing to the S3 chip as it doesnt have a built-in amp, the new chip is simpler in terms of additional components but also has crisp sound

Status LED - as it says, added a status LED, mainly to tell you if the battery level is low.

Onboard flashing - this is another by-product of using the S3, which supports onboard flashing meaning no external programmer is needed and be easily flashed via the MicroUSB port.


This is my first Instructables project so be gentle! So heres a quick introduction into the ESP32 VMU. Its a combination of things I've been working on recently such as RetroGo, the amazing software which runs on the ESP32, as well as the Null Nano designed by Ampersand (All info here) and also a device that was super popular a few years ago, the Circuit Gem by Kite, which fits a Raspberry Pi Zero into a Dreamcast VMU.

I had recently built up a Null Nano, which was an awesome project. I then went down a little rabbit hole of trying to port the latest RetroGo software to the Null Nano so had a good understanding of how it worked. If I'm being honest, if you want something to play for longer, just go ahead and build the Null Nano!

One day, I looked up at my Circuit Gem and wondered if I could fit a RetroGo ESP32 into a VMU shell.

I'm not great with electronics, I wouldnt be able to look at a bunch to component datasheets and know what resistors or capacitors are required to properly make the circuit but I can copy/paste & drag/drop :) so I basically took Ampersand's Null Nano schematics and re-arranged it to fit in a VMU, thankfully it all worked out. Obviously massive credits go to him to creating an amazing device and also opening up the schematics for idiots like me.

Supplies

Screenshot 2025-10-27 212220.png

For the VMU, I would recommend searching eBay, there are usually plenty on there. Ideally get one with a cap, its not essential but does look better. Colour is up to you, the standard white ones tend to be cheaper but the translucent ones look nicer in my opinion. The VMU itself doesnt actually have to work, you only need the shell/buttons and membranes.

There are also repo cases now, these do look nice but not sure on availability outside of the US as looks like preorders are in progress. They should be compatible and could potentially be a cheaper option: Link


Here's a list of the components used. I've tried to list parts from AliExpress Choice service but some are not.

ESP32 S3 N16R8 (No antenna): https://www.aliexpress.com/item/1005008168727665.html

1.69" IPS Display: https://www.aliexpress.com/item/1005006916285489.html

Micro USB Port (Micro-23): https://www.aliexpress.com/item/1005007360060905.html

Micro 3Pin 1P2T Slide Switch: https://www.aliexpress.com/item/1005009651088272.html

MicroSD Socket (TF-05): https://www.aliexpress.com/item/1005006273533788.html

S8050 J3Y: https://www.aliexpress.com/item/1005006307277263.html

AP2112: https://www.aliexpress.com/item/32998839398.html

NS4168 SOP8: https://www.aliexpress.com/item/1005006412432539.html

MCP73831/OT: https://www.aliexpress.com/item/1005006809469170.html

0805 LED Kit: https://www.aliexpress.com/item/1005006417226949.html

SMD Tach Buttons (3X4X2mm 2Pin): https://www.aliexpress.com/item/4001317902663.html

15X3.5 Speaker: https://www.aliexpress.com/item/1005007674241739.html

or Z5 Compact: https://www.aliexpress.com/item/33041127225.html


Battery:

403035 400mAh battery - I find using eBay is better for batteries, however there are plenty on AliExpress, just not on their Choice service: https://www.aliexpress.com/w/wholesale-403035-400mAh-battery.html


0805 Resistors:

https://www.aliexpress.com/item/1005005600798857.html (Individual)

https://www.aliexpress.com/item/1005003737088895.html (Kit)


0805 Capacitors:

https://www.aliexpress.com/item/32964553793.html (Individual)

https://www.aliexpress.com/item/1005002782324319.html (Kit)


Probably best to buy the kit for the resistors and individual for the capacitors. Info in Step 2 on what resistors and capacitors are needed.

Ordering the PCB

PXL_20250612_103126570.jpg

You can order the PCB from your chosen PCB manufacturer. JLCPCB and PCBWay are popular ones in China, or maybe Oshpark if you're US based.

Download the gerber file, upload to your chosen provider. The most important part is that you select a 1.0mm PCB if its not 1.0mm it wont fit in the case properly. All other settings apart from a funky colour, I leave standard personally.

You can download the gerber file from here: https://github.com/DynaMight1124/retro-go/releases/tag/VMU

Building the PCB

PXL_20251025_125337376.jpg
PXL_20251025_130217948.jpg
PXL_20251025_133312449.jpg
PXL_20251025_135930950.jpg
PXL_20251025_140410204.jpg

You will need to be pretty good at soldering and have a good soldering iron with a suitable tip for some fairly small soldering plus the usual leaded solder, flux, solder wick.

I personally start off by soldering the ESP32, I would tack down one corner to make sure its very well lined up, this does need to be pretty accurate as its very easy to bridge pads. Once you're lined up, solder one side but I would suggest using a multimeter to check for bridges before soldering the other side and top. Once all sides are soldered without any bridges, if you have a good PCB holder, I'd probably recommend doing the MicroUSB socket next, but if you dont, its easier to have a flat base to solder the rest of the components on that side so go onto the Micro SD socket.

Now continue to solder the components however you see fit, just try to be smart so you have space, I tend to work from the inside outwards. Once the back side is done, start on the front side, it doesnt matter massively on the order, except for the screen, which should be last. You will need to snip the legs off the bottom of the power switch. As for LED's, the charge ones are marked as Green and Red, for the status, I have been using Blue, but its up to you.

When you get to the component marked as 'CHARGE RATE' this resistor controls the charge rate. The 'kit' resistor is 5.6k which gives 179mA charge rate however this can be adjusted to charge quicker. I have personally been using 4.7k. The max the chip supports is 500mA (2k resistor) and ideally you shouldnt go above 1C (this depends on the battery size but basically 1C on a 300mAh battery would be 300mA, & 400mAh battery would be 400mA etc). Other common resistor values could be 4.7k = 217mA or 2k = 500mA (max). 5.6k is very safe but can be quite slow. You can use this to calculate your desired charge rate: 1000/X = Y e.g. 1000/5.6 = 179mA.

Once you have both sides soldered, its time to solder the screen. I recommend putting some kapton tape on the back of the screen so it doesnt short anything, just make sure you dont overlap as may effect the spacer. I would recommend lightly tinning the pads on the PCB and flex cable first, just very lightly mind! It is quite important this is lined up as accurately as possible else the screen position will be off and it may bug you. It can be de-soldered if you're careful but its not super easy with a flex cable so probably best to get it right first time!

The resistors/capacitors values are labelled on the board however heres whats needed:

10uF x5

100nF x4

1uF x1

100k x3

10R x1

10k x4

1k x2

470R x2

4.7k x1 (charge rate)

Flashing RetroGo

Screenshot 2025-06-09 173252.png

Thanks to V2 this step is now a lot easier!

You can download the firmware image file here: https://github.com/DynaMight1124/retro-go/releases/tag/VMU

You will need the .IMG file to flash to the ESP32, but you will also want VMU SD Files.zip as this contains the folder structure of the SD card. Theres no roms or BIOS files included so you'll have to find those yourself.

I have been using this app to flash: https://github.com/Jason2866/ESP_Flasher/releases I find it simple to use. The official app 'Flash Download Tool' is quite clunky and requires a lot of settings to be set properly to allow proper flashing whereas ESP Flasher just sorts all this out for you, plus it supports other OS's.

It doesnt exactly matter what order you do this but I tend to plug in the USB cable into the MicroUSB port with the power switch off, hold the BOOT button at the top then switch on via the power switch, it should recognise on your PC/Laptop as a COM port.

You can then use ESP Flasher to flash the firmware, note that when you click on 'Browse' to add the firmware, it wont automatically see .IMG files, so at the bottom change from .BIN to All Files and then select the .IMG file. Then click Flash ESP

P.S. I believe you need to connect the battery for the flashing to work rather than powering via the MicroUSB port, but not 100% sure tbh.

Cutting the VMU Shell

PXL_20250607_160307437.jpg
PXL_20250607_165636757.jpg
PXL_20250607_165858133.jpg
PXL_20250607_181520974.jpg
PXL_20250607_181525659.jpg
PXL_20250607_183815040.jpg
PXL_20250607_183822590.jpg
PXL_20250607_202925201.jpg
PXL_20250607_203236992.jpg
PXL_20250607_203526178.jpg
PXL_20250607_204649693.jpg
PXL_20250609_182258939.MP.jpg
PXL_20250609_183019582-EDIT.jpg
PXL_20250609_182241529-EDIT-EDIT.jpg
PXL_20250612_182234019.jpg

Now that the image is flashed, its time to work on the shell. This could be the trickiest part depending on your experience as it requires quite a bit of work. If you're not super confident on this part, I would recommend the white shell as you can hack the inside a lot and it wont show any of that in the outside, however the translucent shells will show through so you have to be way more careful and only cut the minimum, even a scratch from a hobby knife can be seen from the outside.

Theres two parts to this section. First is the front shell, this requires a lot less cutting so best to start here. If you make a total mess of this, then it's a good learning experience for the hell that awaits!


Front Shell

You can trim the front shell using just some flush cutters and hobby knife, like the ones you get with 3D Printers: https://www.aliexpress.com/item/1005005544592970.html or you can just go straight in with a rotary tool/Dremel if you prefer. It doesnt matter how you get there, you just need to make sure it doesnt interfere with the screen. I found it easier to cut vertical in small sections then rock back and forth until it broke away, then I used a hobby knife clean up the edges. Check the pics for the amount of material I cut away, which was mostly to allow the screen to fit.


Rear Shell

This part requires quite a bit of cutting as pretty much the whole back section needs to be cut away to allow space for the battery and speaker, even without a battery a lot of the VMU's original coin cell battery compartment needs to be removed due to the ESP32's thickness so once you start you may aswell keep going.

This part does require the careful use of a rotary tool/Dremel (theres a pic of the two attachments I used, I didnt use a cutting disc, just two different sanding attachments for different angles), I did try using only flush cutters when creating this project but in my opinion it wouldnt had left enough space unless you used a very small battery. I spent quite a bit of time cutting away small bits to check for fitment and space to try to cut away the minimum but ended up with a very similar setup to the Circuit Gem i.e pretty much everything.

If you have a translucent shell you need to be super careful not to scuff up the inside as it will show through the shell, you can see this in the above images around the battery door. If you have a white shell, then just go to town.

The battery door, needs to be trimmed flat and essentially superglued into place, I place on a flat surface, glue a few corners and make sure its even, then once thats set, I tend to run a bead around it to ensure its secure. Obviously try not to use too much so its not thick. You can retain the original screw on the battery cover by cutting it flush and super gluing it on.

I have tried to show this in the pictures and a few badly edited to show where I have cut, one ended up looking at person so got legs ha!

Also the top cap does need the middle section removed, just use some flush cutters and its all good.

Final Shell

PXL_20250609_182312217.jpg
PXL_20250609_183026775.jpg
PXL_20250612_165841631.jpg

Just adding a new section to show the shells after all the cutting as its easier to show here rather than mixed in the above section. Also included a white shell which is quite a bit more hacked up but totally fine as not translucent.

Batteries and Speakers

PXL_20250609_191702032.jpg

This has its own section because you do have some choice here. There isnt a lot of space so there needs to be some compromise. The battery needs to be a maximum of 4mm thick and 30mm wide but depending on your choice of speaker can be quite long.

Initially I had intended on a 403035 400mAh battery, but when hunting around I found quite a few 4030XX batteries that will fit, pretty much up to around 700mAh can be found, but once you go above 403035 you lose the space for the 15mm speaker. I can confirm 403048 600mAh battery fits quite nicely.

The 15mm speaker is nice and crisp but limits the battery choice. There are 10mm speakers which can be crammed between the PCB and battery but you will muffle the sound.

I would recommend sticking with the 403035 400mAh battery and the 15mm or Z5 speaker as they both sound great and 400mAh gives plenty of battery life!

Putting the Shell Together and Screen Spacer

Theres a 3mm spacer needed between screen and PCB. I have created a small simple 3D printable spacer. Just place it using the locating holes and it should keep the screen in the right place. You can use something else if you wish, like foam, needs to be 3mm from my testing.

Place the whole unit into the VMU shell, screw the PCB into place using the original VMU's smaller screws, then place the back cover on using the original VMU's 4 bigger screws and its done.

The screen might need a little moving, just you your finger to push it around. Its a fine line between too tight in the shell and causing issues with the display and too loose where the screen moves around. I tried to get it close! I didnt design it for use with double sided tape as I felt it wouldnt be easy to line up before placing in the shell, but you are welcome to use tape but you'll probably want to either sand down or adjust the spacer so its not too thick.

To be honest, the screen flapping in the breeze while its out of the shell is my worst part about this project, I was thinking off a cradle for the screen to slot into for perfect alignment but the space around the screen is quite limited however it is fairly solid when its in the shell even if its only help in my a little pressure.

RetroGo Setup and Usage

So its all together, ensure you have copied the file structure from VMU SD Files.zip onto your FAT32 formatted MicroSD card. You dont need a massive card, it doesnt support a large amount of systems and even if you had the entire library of every console supported it wouldnt be any bigger than about 4GB. I've actually been using a 512MB card with my curated games list, which still manages to be over 1,300 games as some of the smaller systems have the whole library, all of those games including all the romart etc still fit on a 512MB card.

The SD structure has all the folders setup but no roms, so you will need to obtain these yourself, however I have included the shareware version of Doom to get you going. Once you have backed up all your legally acquired games, copy them to the Roms directory. They can be in a zip file if needed. There is a BIOS directory in the retro-go folder, I believe this is only needed for MSX so you will need to locate these yourself also.

Theres lots of information about supported systems and features on the RetroGo Github page: https://github.com/ducalex/retro-go

When you boot up you should be greeted with the menu screen. Left and right scroll through the menu, A to enter a console, B to back out. When in a game, Mode acts as Start and Sleep acts as Menu, there are also 2 virtual buttons Select and Option. You can use these by pressing Mode and A or Mode and B together. You can also get to Options by pressing Sleep and going down to Options.

The rest of the system is fairly easy to use, have a play around. If you mess something up, it'll likely be easy to fix by resetting the settings or overwriting the files again from the VMU SD Files.zip.

As for charging the device. Plugging it in will charge it obviously, I wouldnt recommend playing and charging at the same time. When its charged the green LED will come on.

The ESP32 isnt super powerful and although there are SNES and MegaDrive emulators, the device will struggle with these higher end consoles. I have found that disabling sound in the SNES & MegaDrive emulators helped to get them very playable.

Its Done!

PXL_20250612_182734925.MP.jpg
PXL_20250612_182730575.jpg
PXL_20250612_182718921.jpg

Thats it, its all done. Now play on it for a bit, realise its a nice novelty, put in on a shelf or in a drawer and never play it again :)

Controls Not Great?

PXL_20250705_110532738.MP.jpg

NOTE: The controls are now massively improved in V2, however its still not a bad idea to clean the pads.


The controls on the VMU were never gonna be amazing due to the size of the device, obviously Sega never built it to be a proper gaming device so the DPad is very small, the other buttons are just rubber so dont give great feedback however there are some things that can cause issues and things we can do to get the most out of it. The VMU is over 25 years old now and I'd imagine most were made almost 25 years ago also, so depending on how much use your one had over the years or how it was stored it could need a little freshen up.

For me the main thing I came across is the conductive pads, these need to be fairly clean else you will run into a lot of problems, unlike large devices with large conductive pads these are quite small so if they are dirty they wont make good contact with the pads on the PCB and can cause incorrect or missing inputs.

I find the best way to clean these is using paper as its just a little abrasive. As per the pic above, I usually rub one of the pads across the paper, not lots of force as you dont want to remove all the carbon, just a bit of the top layer. When I've done this I also clean with some IPA & swab to remove any residue. I found this massively helped to get the best out of the device.

I'll be honest, it probably still wont be perfect, I found the original VMU also missed some inputs and some devices may have had a lot more use than others leading to softer button presses and worn out conductive pads so I'm not taking all the blame but some of it could be the design as well :) Its probably something I notice more in the menu system as you tend to use light presses to navigate through the games list but when you play a game you tend to use firm longer presses and I dont get many issues.