If you grew up with a Nintendo Entertainment System, you probably remember playing games like Duck Hunt that used the Nintendo Zapper "light gun". The Zapper used a clever technique that depended on the game being displayed on a Cathode Ray Tube, or CRT television. These days, CRTs are rare, and are often prized collectors items among retro gaming enthusiasts. Since these Zappers don't work on modern TVs, most people don't have much use for them anymore. So, why not convert it into a toy/prop that lights up and plays sounds?
Overview
This project uses a Prop-Maker Feather RP2040 to repurpose the the Zapper's iconic shell and clicky trigger mechanism into a prop/toy that uses a NeoPixel for a "muzzle flash", a speaker to play sound effects, and 3D printed parts to contain the electronics. The code is written in CircuitPython, and sounds can be changed or added by dragging and dropping files with no code changes required!
Table of Contents
Materials
3D Printed parts
Four parts are needed for this mod. The STLs for these parts can be found here on Printables. All parts printed with a 0.2mm layer height and 15% infill. Each part may need other additional settings as well. Prusa Slicer .3mf and .gcode files are also provided.
1. NeoPixel mount
Model file: led-mount.stl
This part holds the NeoPixel in place. The part is printed upside-down in black filament, and tree/organic supports are used on the top surface of the bottom lip of the LED holder, as well as the top of the main cylinder (see image below).
2. NeoPixel Diffuser
There are two options for the diffuser. If you have an orange Zapper, the preferred option is to print the angled black-and-white diffuser, which helps prevent light bleed through the Zapper's plastic shell. A simpler alternative is the all-white diffuser, which can be used if you are using a gray Zapper shell (which does not suffer from the light bleed issue), or are not able to print the black-and-white version.
Angled black-and-white diffuser
Model file: barrel-tip-angled.stl
The NeoPixel diffuser is printed at a 30 degree angle with a brim using supports on build plate only, and is printed with black and white filament. The print starts with black filament, and then at layer 131 we change to white filament. This masks out the light from the LED along the contours of the Zapper barrel, preventing light bleed through the orange shell.
All-white diffuser
Model file: barrel-tip.stl
If you can't print the black and white version, or have a gray Zapper shell, you can print this non-rotated version without supports in white filament (you may need a brim).
3. Grip Attachment
Model file: zapper-mount-propmaker.stl
The grip attachment is printed using black filament with grid supports on the portions indicated in the image below.
Removing the supports from this part can be tedious, so take your time, be careful, and make sure to remove all of the support material to ensure the best fit possible when mounting to the Zapper shell.
4. Grip attachment cover/Prop-Maker Feather mount
Model file: zapper-mount-propmaker-cover.stl
This part acts as the cover for the electronics compartment. The Prop-Maker Feather is mounted onto this part using 2 screws and nuts. The cover is printed as-is with no supports using black filament.
1. Install CircuitPython and source code
Follow the instructions from this learn guide to install the latest version of CircuitPython 9 to your Prop-Maker Feather.
Then, download or clone the zapper-mod repo from github. Copy the contents of the CIRCUITPY-ZAPPER directory into the root of your Prop-Maker's CIRCUITPY drive.
2. Prepare Zapper Shell
Remove the screws circled in blue below from the outer shell of the Zapper. Set the screws and the outer shell aside in a safe place.
Remove the remaining screws circled in blue below. Use a Phillips head screwdriver for the big screws, and a small flat head screwdriver for the small barrel screws. Set the screws aside in a safe place.
Carefully remove the top shell. Observe the original parts, labeled below:
- Lens
- Barrel weight
- Original PCB
- Trigger mechanism
- Grip weight
- Cord
- Top half of Zapper inner shell
Remove the screws circled in blue below, and set aside in a safe place.
Remove the original PCB, trigger mechanism, and cord from the bottom shell.
Cut the wires from the leads on the trigger mechanism.
Remove the lens. The original PCB, lens, and cord are not needed for this project, feel free to repurpose them for other projects. We'll keep the weights, they make the Zapper feel nice and hefty.
Slide the stem of the the grip attachment down into the slot where the cord previously was mounted, as shown in the photos below.
3. Solder power toggle switch
Cut a piece of wire from the ribbon wire about 5 cm in length. Pull apart 2 wire strands, Discard the remaining 3 or use for another project. Strip and solder the other end of each wire to two adjacent pins on the slide switch. Apply heat shrink tubing. Strip and solder the other ends of the wire to the EN and GND pins of the Prop-Maker Feather.
4. Solder and wire speaker
Cut a piece of ribbon cable about 25 cm in length. Peel off 2 strands from the ribbon, keeping the strand with the white stripe and the adjacent strand. Discard the remaining 3 or use for another project. Cut the connector from the speaker. Cut 2 pieces of heat shrink tubing about 1 cm long. Place a piece of heat shrink tubing around each wire. Strip and solder the wires to the speaker, connecting the strand with the white strip to the red (positive) wire of the speaker, and the other wire to the black (negative) wire of the speaker. Apply heat to the heat shrink tubing to protect the solder joints.
Position the speaker in as shown in the photo below. Thread the wires through the strain relief pillars as shown in the photo, and insert the wire through the hole in the stem of the grip attachment.
Position the Feather as shown below, about 1 cm below the grip attachment. Cut the speaker wires to trim the excess, leaving enough to strip and plug in to the speaker terminals on the screw terminal block. Plug the wire with the white strip into the speaker + terminal on the Prop-Maker Feather, and the other wire into the speaker - terminal.
Power on the Feather. You should hear the speaker play a power-on sound effect. Power off the Feather.
Clean the plastic underneath the speaker with some rubbing alcohol. Remove the adhesive backing from the front of the speaker, and press firmly into place against the Zapper shell.
Cut the Data Out lead off of the NeoPixel as shown below. We don't need it and we'll need the space.
Trim the remaining 3 leads by half, making sure to keep the Ground lead just a little longer. Gently fan the leads out a little to make them easier to solder.
Cut a piece of ribbon cable to about 50 cm in length. Peel off three of the strands, the one the white stripe and the two adjacent strands. Discard the remaining two or use on another project. Note the wire ordering in the image below. The wire strand with the white stripe is matched to the 5V lead on the NeoPixel. The middle wire is matched to the Data In lead on the NeoPixel. The remaining wire is matched to the Ground lead on the NeoPixel.
Cut 3 pieces of heat shrink tubing about 1cm long and place over the wires. Solder the wires to the leads on the NeoPixel, and apply heat to the heat shrink tubing to protect the solder joints.
Mount the NeoPixel into the LED holder, gently bending the leads into the column if necessary, threading the wire through the body of the LED holder.
Place the LED holder near the end of the barrel as shown below. Thread the wire through the barrel weight, through the strain relief pillars, and through the hole in the stem of the grip attachment, as shown below.
Trim any excess wire from the ribbon cable, leaving enough slack to strip and insert the wires into the screw terminal mount. Insert the wire with the white stripe into the 5V terminal, the middle wire into the NEO terminal, and the remaining wire into the G terminal.
Power on the Prop-Maker Feather. If the NeoPixel is wired correctly, it should light up along with the power-on sound effect. Power off the Prop-Maker.
6. Solder and wire trigger
Cut a piece of ribbon cable about 25 cm in length. Peel off 2 strands, the one with the white stripe, and the adjacent one. Discard the remaining 3 or use for another project. Strip and solder the wire with the white stripe to the lead labeled ON on the trigger. Strip and solder the other wire to the lead labeled COM on the trigger.
Place the trigger on the bottom part of the Zapper shell, aligning the screw holes. Feed the wires you just soldered onto the trigger leads underneath the trigger mechanism, thread through the strain relief pillars, and insert into the hole in the stem of the grip attachment.
Trim any excess wire from the trigger ribbon cable, leaving enough slack to strip and insert into the Prop-Maker terminal blocks.
Remove the NeoPixel wire currently plugged into the G terminal of the Prop-Maker terminal block. On the wires connected to the trigger, strip the wire that does NOT have the white stripe. Twist this wire together with the NeoPixel Ground wire. Insert both of these wires into the G terminal on the Prop-Maker and tighten. Strip the wire with the white stripe, and insert into the terminal block BTN pin.
Power on the Prop-Maker Feather, and squeeze the trigger. The NeoPixel should light up and the speaker should play a firing sound effect. Power off the Prop-Maker Feather.
Screw the trigger mechanism back into the Zapper shell using 3 of the screws you set aside earlier.
7. Final assembly
Trim any leads on the bottom of the Prop-Maker Feather that may be poking out, so that the Feather will lay as flat as possible when mounted. Using 2 M2.5 screws and nuts, fasten the Prop-Maker Feather to the grip attachment cover.
Place the battery all the way into the compartment and plug into the Prop-Maker Feather's battery connector.
Insert the slide switch into the switch mount on the grip attachment.
Gently press the snap-fit cover onto the grip attachment, taking care not to pinch any wires.
Place the NeoPixel diffuser into the end of the barrel, sliding it over the NeoPixel, as shown below.
Place the top half of the Zapper shell onto the bottom half, taking care to insert the grip attachment mounting stem into place, and taking care not to pinch any wires.
Rotate the diffuser so that none of the black filament is visible. Screw in the two small barrel screws using a small flat-head screwdriver.
Screw the two shell halves together using 3 of the screws you set aside earlier.
Place the bottom half of the outer shell underneath the Zapper inner shell.
Place the top half of the outer shell onto the inner shell, and screw into place using the remaining 3 screws you set aside earlier.
That's it, you're done!
Operation
Operation is simple. Switching the power toggle switch to the ON position will play a random startup sound and play a NeoPixel animation. Partially squeezing and holding the trigger will dimly light up the NeoPixel white. Pulling the trigger all the way (or releasing the trigger after partially squeezing) will cause the Zapper to "fire", playing a random firing sound effect and flashing the NeoPixel a random color. Switching the power toggle switch to the OFF position will power down the Zapper.
To recharge the battery, edit the CircuitPython code, or upload new sounds, simply plug a USB cable into the USB port on the grip attachment.
Changing sounds
The sounds played by the Zapper are stored in 2 directories on the CIRCUITPY drive:
- sounds/power_on
- sounds/fire
When powering on or firing, a random sound will be chosen from the sounds in these directories. To add, remove, or change sounds, simply add, remove, or change the wave files in the sounds/power_on or sounds/fire directory. No code changes required! Currently, sounds must be .wav files at 44.1kHz sample rate, 16 bits per sample.
This page (Guide: Zapper Lights/Sound mod) was last updated on November 04, 2024.