Proton Pack Lights Script and Diagram

If you are ever interested in building a full size Proton Pack I highly recommend Ben of Kent Props. My proton pack is amazing and it all started with the parts produced by this excellent company.

Also check them out on facebook in the most friendly group. https://www.facebook.com/groups/364457410396568

This might look like a bizarre post but for those following my proton pack build this is all the details you need for the electronics within my Ghostbusters Proton pack. I’m not electronic expert and these are presented as seen.

Also of note this is to integrate the amazing Hasbro Spengler wand into the pack build. The sound of the wand is connected to the speaker inside the pack and the microphone picks up the sound from the wand and speeds up the lights.

If you want to connect the internal speaker to an external jack, I suggest checking out this video…

I didn’t go as far as changing the vent but it looks into the whole dismantling. Just be very, very, careful and don’t do it if you are not sure.

It might be very specific but it was fun to build and might be of use to other Ghostheads.

This is all thanks to Tim Wappat. Without his genius help my pack would be dark and not so disco.

This was chapter six of my Ben of Kent Proton pack build videos. The full video can be seen at the bottom of this blog post and the rest on my Youtube Channel. Don’t forget to like and subscribe! 🙂

Hopefully all of this info, might either encourage you to get one or at least help with your build.

This post includes details of a cheaper method of creating the light sequence without expensive hardware. I’m sure there are better ways to build, but here’s how we did it.

3D printed Parts :

You need the printed parts to hold all the LEDs and the boards.

LED Power Barhttps://www.thingiverse.com/thing:4894963
Slip Case for Port Expanderhttps://www.thingiverse.com/thing:4894960
Sound Detector Board Casehttps://www.thingiverse.com/thing:4894965
Raspberry Pi Pico Casehttps://www.thingiverse.com/thing:4818638

Electronics :

MCP23017 16 bit port expander breakout boardhttps://www.ebay.co.uk/itm/193477088071
pi picohttps://shop.pimoroni.com/products/raspberry-pi-pico?variant=32402092294227
Ribbon Cablehttps://proto-pic.co.uk/product/sparkfun-cab-10647-ribbon-cable-10-wire-15ft/
LEDshttps://www.ebay.co.uk/itm/152508668100?var=451865158130
Microphone Modulehttps://www.ebay.co.uk/itm/233754667746?hash=item366cdd2ae2:g:i4YAAOSwj2Jfke6s

Costs :

MCP23017 I2C interface 16bit IO Extension Module Pin Board IIC to GIPO Convert£4.70
KY-037 High Sensitivity Microphone/Sound Detection Sensor For Arduino Module PIC£1.98
Raspberry Pi Pico – Board Only£3.60
LED 5mm or 3mm Superbright-Clear/Diffused – Choose Colour/Mix Pack UK£2.45
Resistors 68ohm£1.88
Ribbon cable£3.86
Total£18.27

Wiring Diagram

Script for Raspberry Pi Pica

############################################################################
# Proton pack sound activated LEDs
# 2021 Tim Wappat
# ##########################################################################
import time
import board
import busio
import digitalio

from adafruit_mcp230xx.mcp23017 import MCP23017

i2c = busio.I2C(board.GP1, board.GP0)
mcp = MCP23017(i2c, address=0x20)
soundPresent = False
soundPresentCounter = 0
soundAbsentCounter = 0
soundPresentTimedAt = time.monotonic_ns()


# Optionally change the address of the device if you set any of the A0, A1, A2
# pins. Specify the new address with a keyword parameter:
# mcp = MCP23017(i2c, address=0x21) # MCP23017 w/ A0 set

# Now call the get_pin function to get an instance of a pin on the chip.
# This instance will act just like a digitalio.DigitalInOut class instance
# and has all the same properties and methods (except you can't set pull-down
# resistors, only pull-up!). For the MCP23008 you specify a pin number from 0
# to 7 for the GP0...GP7 pins. For the MCP23017 you specify a pin number from
# 0 to 15 for the GPIOA0...GPIOA7, GPIOB0...GPIOB7 pins (i.e. pin 12 is GPIOB4).
pin0 = mcp.get_pin(15)
pin1 = mcp.get_pin(14)
pin2 = mcp.get_pin(13)
pin3 = mcp.get_pin(12)

pin4 = mcp.get_pin(11)
pin5 = mcp.get_pin(10)
pin6 = mcp.get_pin(9)
pin7 = mcp.get_pin(8)

pin8 = mcp.get_pin(0)
pin9 = mcp.get_pin(1)
pin10 = mcp.get_pin(2)
pin11 = mcp.get_pin(3)
pin12 = mcp.get_pin(4)
pin13 = mcp.get_pin(5)
pin14 = mcp.get_pin(6)
pin15 = mcp.get_pin(7)

# Setup pin0 as an output that's at a high logic level.
pin0.switch_to_output(value=True)
pin1.switch_to_output(value=True)
pin2.switch_to_output(value=True)
pin3.switch_to_output(value=True)
pin4.switch_to_output(value=True)
pin5.switch_to_output(value=True)
pin6.switch_to_output(value=True)
pin7.switch_to_output(value=True)
pin8.switch_to_output(value=True)
pin9.switch_to_output(value=True)
pin10.switch_to_output(value=True)
pin11.switch_to_output(value=True)
pin12.switch_to_output(value=True)
pin13.switch_to_output(value=True)
pin14.switch_to_output(value=True)
pin15.switch_to_output(value=True)


soundSensor = digitalio.DigitalInOut(board.GP5)
soundSensor.switch_to_input(pull=digitalio.Pull.UP)

def TimeSinceSoundPresenceSetMs():
global soundPresentTimedAt
return (((time.monotonic_ns() - soundPresentTimedAt) + 500000) // 1000000)

def SetSoundState():
global soundPresentCounter
global soundAbsentCounter
global soundPresent
global soundPresentTimedAt

# look for x samples in a row of sound present to trigger sound present state
# leave triggered for min amount of time
if(soundSensor.value):
print(soundPresentCounter)
if(soundPresentCounter < 1):
soundPresentCounter = soundPresentCounter + 1
soundAbsentCounter = 0
else:
if(soundAbsentCounter < 30):
soundAbsentCounter = soundAbsentCounter + 1
soundPresentCounter = 0

# x samples in a row positive then we have sound
# set the flag we have sound, otherwise after delay unset the flag
if(soundPresentCounter == 1):
# print("Sound on counter max")
if(soundPresent == False):
soundPresent = True
# Need to latch on so record time latched
soundPresentTimedAt = time.monotonic_ns()

if(soundAbsentCounter == 30):
# print("Sound off counter max")
if (TimeSinceSoundPresenceSetMs() >2000 ):
# print("Sound off")
soundPresent = False
#else:
# print("waiting for timeout")
# print(TimeSinceSoundPresenceSetMs())

def BarOff():
pin11.value = True
pin10.value = True
pin9.value = True
pin8.value = True
pin7.value = True
pin6.value = True
pin5.value = True
pin4.value = True
pin3.value = True
pin2.value = True
pin1.value = True
pin0.value = True

# time between cyclo lights (s)
def InterBarDelay():
if(soundPresent):
return 0.05
else:
return 0.105

# Time between indvidiual bars on power meter (s)
def interseqDelay():
if(soundPresent):
return 0.001
else:
return 0.001

def BarSeq():
pin0.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin1.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin2.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin3.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin4.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin5.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin6.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin7.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin8.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin9.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin10.value = False
time.sleep(InterBarDelay())
SetSoundState()
pin11.value = False

def startupsequence():
pin0.value = False
pin11.value = False
time.sleep(InterBarDelay())

pin1.value = False
pin10.value = False
time.sleep(InterBarDelay())

pin2.value = False
pin9.value = False
time.sleep(InterBarDelay())

pin3.value = False
pin8.value = False
time.sleep(InterBarDelay())

pin4.value = False
pin7.value = False
time.sleep(InterBarDelay())

pin5.value = False
pin6.value = False
time.sleep(1)


startupsequence()
BarOff()
startupsequence()
BarOff()

while (True):

pin12.value = False
pin13.value = True
pin14.value = True
pin15.value = True
BarSeq()
time.sleep(interseqDelay())
BarOff()

pin12.value = True
pin13.value = False
pin14.value = True
pin15.value = True
BarSeq()
time.sleep(interseqDelay())
BarOff()

pin12.value = True
pin13.value = True
pin14.value = False
pin15.value = True
BarSeq()
time.sleep(interseqDelay())
BarOff()

pin12.value = True
pin13.value = True
pin14.value = True
pin15.value = False
BarSeq()
time.sleep(interseqDelay())
BarOff()


This is the full Proton Pack build video, which includes the various parts and the electronics. Hope it’s useful.

Enjoy and have a great Halloween.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s