Please drop any info about the spirit Halloween proton pack modifications here! I have painted mine flat black, attached gb2 ribbon cable, weathered pack, attached to Alice frame. Can't figure out how to post pics here. :/ does anyone know if someone is already making what I am wanting?
Pull em! Heat em up! SmOokin! We better go full stream Lets show this prehistoric bitch how we do things down town!
This post may contain an affiliate link that helps support GBFans.com when you make a purchase at no additional cost to you.
My spirit pack probably won't be here until close to halloween so my plan has switched to a minimal lighting upgrade. I'm not going to touch the wand or the sounds. I plan to stick an arduino in it that is programmed to do the normal idle powercell/cyclotron patterns. To me it needs to have the idle sequence at least.
The setup basically consists of 1 arduino nano to control the lights, 1 power converter for the battery, 10 - 12 neopixel leds for the powercell and probably 2 neopixels per cyclotron. Then just power it separately from the spirit pack and add a switch somewhere to turn it on and off. I'll probably make a 4 AAA powerpack for it and use the converter to adjust down to 5v
so for around $30 bucks I get a nice power cycle in the spirit pack and keep the firing stuff. I'll decide if I want to keep the pack firing animations or move them maybe. For next halloween I plan to update the sounds and replace the small wand with an 83% 3d printed version.
Code for the arduino is easy. It's just a subset of my current full pack code. I've already tested it and works fine.
It is only the idle sequence animation from this video of the full pack code
#include <Adafruit_NeoPixel.h>
#define NEO_POWER 2 // Arduino pin for cyclotron and powercell
// my full pack uses 44 neopixels for the powercell (16) and cyclotron (7 each)
// adjust for the number of neopixels used. Probably 20 for the spirit pack
Adafruit_NeoPixel powerStick = Adafruit_NeoPixel(44, NEO_POWER, NEO_GRB + NEO_KHZ800);
void setup() {
// configure powercell/cyclotron
powerStick.begin();
powerStick.setBrightness(80);
powerStick.show(); // Initialize all pixels to 'off'
}
int pwr_interval = 60; // interval at which to cycle lights for the powercell.
int cyc_interval = 1000; // interval at which to cycle lights for the cyclotron.
void loop() {
// get the current time
int currentMillis = millis();
powerSequenceOne(currentMillis, pwr_interval, cyc_interval);
}
void setCyclotronLightState(int startLed, int endLed, int state ){
switch ( state ) {
case 0:
for(int i=startLed; i <= endLed; i++) { // red
powerStick.setPixelColor(i, powerStick.Color(150, 0, 0));
}
break;
case 1:
for(int i=startLed; i <= endLed; i++) { // orange
powerStick.setPixelColor(i, powerStick.Color(255, 106, 0));
}
break;
case 2:
for(int i=startLed; i <= endLed; i++) { // off
powerStick.setPixelColor(i, 0);
}
break;
}
}
/*************** Powercell/Cyclotron Animations *********************/
// These are the start and end locations for each cyclotron led in the chain. It is assumed that the powercell is the first
// 0-15 neopixels
int c1Start = 16;
int c1End = 22;
int c2Start = 23;
int c2End = 29;
int c3Start = 30;
int c3End = 36;
int c4Start = 37;
int c4End = 44;
unsigned long prevPwrMillis = 0; // last time we changed a powercell light in the idle sequence
unsigned long prevCycMillis = 0; // last time we changed a cyclotron light in the idle sequence
int powerSeqTotal = 15; // total number of led's for powercell 0 based
int powerSeqNum = 0; // current running powercell sequence led
int cycOrder = 0;
// normal animation on the bar graph
void powerSequenceOne(int currentMillis, int anispeed, int cycspeed) {
bool doUpdate = false;
if (currentMillis - prevCycMillis > cycspeed) {
prevCycMillis = currentMillis;
// START CYCLOTRON
switch ( cycOrder ) {
case 0:
setCyclotronLightState(c1Start, c1End, 0);
setCyclotronLightState(c2Start, c2End, 2);
setCyclotronLightState(c3Start, c3End, 2);
setCyclotronLightState(c4Start, c4End, 2);
cycOrder = 1;
break;
case 1:
setCyclotronLightState(c1Start, c1End, 2);
setCyclotronLightState(c2Start, c2End, 0);
setCyclotronLightState(c3Start, c3End, 2);
setCyclotronLightState(c4Start, c4End, 2);
cycOrder = 2;
break;
case 2:
setCyclotronLightState(c1Start, c1End, 2);
setCyclotronLightState(c2Start, c2End, 2);
setCyclotronLightState(c3Start, c3End, 0);
setCyclotronLightState(c4Start, c4End, 2);
cycOrder = 3;
break;
case 3:
setCyclotronLightState(c1Start, c1End, 2);
setCyclotronLightState(c2Start, c2End, 2);
setCyclotronLightState(c3Start, c3End, 2);
setCyclotronLightState(c4Start, c4End, 0);
cycOrder = 0;
break;
}
doUpdate = true;
// END CYCLOTRON
}
if (currentMillis - prevPwrMillis > anispeed) {
// save the last time you blinked the LED
prevPwrMillis = currentMillis;
// START POWERCELL
for ( int i = 0; i <= powerSeqTotal; i++) {
if ( i <= powerSeqNum ) {
powerStick.setPixelColor(i, powerStick.Color(0, 0, 150));
} else {
powerStick.setPixelColor(i, 0);
}
}
if ( powerSeqNum <= powerSeqTotal) {
powerSeqNum++;
} else {
powerSeqNum = 0;
}
doUpdate = true;
// END POWERCELL
}
if( doUpdate == true ){
powerStick.show();
}
}