#4897285
The brightness is pure preference. I want them lit but not blindingly bright so I used 330. 220 is a little brighter but the current draw goes up quite a bit. The more current you draw the less time your battery works. You also have to watch the current draw on the SX1509. There are 2 modes. Sourcing current and Sinking current and they are wired differently. Sourcing currently only supports 8ma per pin and I've clocked my setup at 4ma with the 330 ohm resistor network so I'm safe. If you go smaller on the resistor network you may need to change how you wire it. I think the 220 was closer to 8ma current if I remember correctly which is pretty close to the limit.

xoff00 has experience wiring the sx1509 so you get more current per pin. I've not done that. You might be safe without a resistor because the sx1509 is limiting to 8ma current. Search for Source vs. Sink on this page for more info

I would suggest getting a resistor kit and testing various resistors to see the brightness you like. Then when you find it purchase the resistor network for that value. My guess is you'll like something closer to 100 ohm
#4897286
Hmmm. Those are interesting points. I certainly don't want to make the coding or the wiring any more difficult (I've got so much other things to do) so getting it as bright as possible without changing those might be a good way.

I did find this http://led.linear1.org/1led.wiz which is kinda neat. If I plug in 3V for source, the led takes 1.95V, and the current is 30mA (from the digikey website) it says I can put on as low as 39 Ohms.

I did buy a resistor pack (to have fun with) so maybe I'll try a few to see what makes me feel happy (except if I need different wiring and coding).
#4897287
I tried different resistors,

http://imgur.com/a/mi7Xi

The top one is 330 Ohms, the middle is 220 Ohms, and the bottom one is 100 Ohms (but I could use 110).

Again the camera's iso makes it much brighter than it really is, but if I got a strip of bussed 120 Ohms do you think it would work? (Would it work with the SX1509, and how much power consumption difference would there be?(I'm thinking like what, I'd lose 5 minutes?))
#4897288
Current usage depends on the number of leds lit at any given time and the brightness. Everything you use adds up. Remember it's not just the bar graph in the wand. You also have the end of wand lights for firing (I've got a neopixel there), the slo blo and top indicator lights (3 of them. I'm using 3mm leds there) and one 5mm led for the larger indicator on the shelf. I'll also have a blue 5mm led inside the body to cause a blue glow from the top vents like you see in the movies. All of those are tied to one pin on the arduino in my setup and turn on with the top switch. All of that just for the wand. I'll be keeping the brightness down for all accept the end of wand neopixel for firing

To determine savings you really need to know the current draw for each resistor led combo and then choose the best one for your setup. You can test that by sticking the meter inline with the LED or whatever you want to test the current on. Current should be under 8ma per led as that is the highest it can go off the sx1509.
#4897291
out of curiosity I hooked up my meter at the battery pack to get an idea of my total current usage. Here's where I am sitting right now. I still have the cyclotron jewels to wire up and 3 3mm leds and 1 5mm led but this is not too bad.

32 ma powered off
35-62ma power on sequence
35-65ma idle led sequence and speaker
103-106ma firing
xoff00 liked this
#4897293
I'll post an updated video of all the features of the code now that I have it all working again. I've also made a few tweaks. These are about as clear as I could get for pictures

overview
Image

sound board
Image

sound board and arduino
Image

buck converter, sx1509 and bar graph ribbon connection
Image

another look
Image
Tebasaki liked this
#4897297
And here's the video with current code as shown in the video. Some new features:

The powercell speeds up as you continue firing. I need to update the warning sound with a venting sound but that will be a sound file update not a code change.


Code: Select all
// for the sound board
#include <SoftwareSerial.h>
#include "Adafruit_Soundboard.h"

#include <Wire.h> // Include the I2C library (required)
#include <SparkFunSX1509.h> // Include SX1509 library
#include <Adafruit_NeoPixel.h>

// for led triggers
#define HIGH 0x1
#define LOW  0x0

// neopixel pins
#define NEO_NOSE 9 // for nose of wand
Adafruit_NeoPixel noseJewel = Adafruit_NeoPixel(7, NEO_NOSE, NEO_GRB + NEO_KHZ800);

#define NEO_POWER 10 // for cyclotron and powercell
Adafruit_NeoPixel powerStick = Adafruit_NeoPixel(16, NEO_POWER, NEO_GRB + NEO_KHZ800);

bool powerBooted = false; // has the pack booted up

// soundboard 
#define SFX_RST 2
#define SFX_RX 3
#define SFX_TX 4

SoftwareSerial ss = SoftwareSerial(SFX_TX, SFX_RX);
Adafruit_Soundboard sfx = Adafruit_Soundboard( & ss, NULL, SFX_RST);
const int ACT = 13;

// inputs
const int THEME_SWITCH = 5;
const int STARTUP_SWITCH = 6;
const int SAFETY_SWITCH = 7;
const int FIRE_BUTTON = 8;

// switch states
bool theme = false;
bool startup = false;
bool safety = false;
bool fire = false;
bool warning = false;

// audio track locations on soundboard
const int startupTrack = 0;
const int blastTrack = 1;
const int endTrack = 2;
const int idleTrack = 3;
const int shutdownTrack = 4;
const int clickTrack = 5;
const int warnTrack = 6;
const int texTrack = 7;
const int choreTrack = 8;
const int toolsTrack = 9;
const int themeTrack = 10;

// dialog trigger times/states
unsigned long startDialogMillis;
const int numDialog = 3;
int currentDialog = 1;
const int dialogWaitTime = 5000;
const int warnWaitTime = 10000;

// SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default):
const byte SX1509_ADDRESS = 0x3E;  // SX1509 I2C address
SX1509 io; // Create an SX1509 object to be used throughout

int seq_1_current = 0;  // current led in sequence 1
const int num_led = 15; // total number of leds in bar graph

// SX1509 pin definitions:
const byte SX1509_BAR_01 = 0; 
const byte SX1509_BAR_02 = 1; 
const byte SX1509_BAR_03 = 2; 
const byte SX1509_BAR_04 = 3; 
const byte SX1509_BAR_05 = 4; 
const byte SX1509_BAR_06 = 5; 
const byte SX1509_BAR_07 = 6; 
const byte SX1509_BAR_08 = 7; 
const byte SX1509_BAR_09 = 8; 
const byte SX1509_BAR_10 = 9; 
const byte SX1509_BAR_11 = 10; 
const byte SX1509_BAR_12 = 11; 
const byte SX1509_BAR_13 = 12; 
const byte SX1509_BAR_14 = 13; 
const byte SX1509_BAR_15 = 14; 

void setup() {
  // softwareserial at 9600 baud
  ss.begin(9600);

  // see if we have the soundboard 
  // if not we gotta flash lights or something
  if (!sfx.reset()) {
    while (1);
  }

  // set pin modes for the board
  pinMode(ACT, INPUT);
  
  // Call io.begin(<address>) to initialize the SX1509. If it
  // successfully communicates, it'll return 1.
  if (!io.begin(SX1509_ADDRESS)){
    while (1) ; // If we fail to communicate, loop forever for now but lets warn the user somehow
  }

  // configure nose jewel
  noseJewel.begin();
  noseJewel.show(); // Initialize all pixels to 'off'

  // configure powercell/cyclotron
  powerStick.begin();
  powerStick.setBrightness(10);
  powerStick.show(); // Initialize all pixels to 'off'

  // handle the switches
  pinMode(THEME_SWITCH, INPUT);
  digitalWrite(THEME_SWITCH, HIGH);
  pinMode(STARTUP_SWITCH, INPUT);
  digitalWrite(STARTUP_SWITCH, HIGH);
  pinMode(SAFETY_SWITCH, INPUT);
  digitalWrite(SAFETY_SWITCH, HIGH);
  pinMode(FIRE_BUTTON, INPUT);
  digitalWrite(FIRE_BUTTON, HIGH);

  // configuration for the bargraph
  io.pinMode(SX1509_BAR_01, OUTPUT);
  io.pinMode(SX1509_BAR_02, OUTPUT);
  io.pinMode(SX1509_BAR_03, OUTPUT);
  io.pinMode(SX1509_BAR_04, OUTPUT);
  io.pinMode(SX1509_BAR_05, OUTPUT);
  io.pinMode(SX1509_BAR_06, OUTPUT);
  io.pinMode(SX1509_BAR_07, OUTPUT);
  io.pinMode(SX1509_BAR_08, OUTPUT);
  io.pinMode(SX1509_BAR_09, OUTPUT);
  io.pinMode(SX1509_BAR_10, OUTPUT);
  io.pinMode(SX1509_BAR_11, OUTPUT);
  io.pinMode(SX1509_BAR_12, OUTPUT);
  io.pinMode(SX1509_BAR_13, OUTPUT);
  io.pinMode(SX1509_BAR_14, OUTPUT);
  io.pinMode(SX1509_BAR_15, OUTPUT);

  shutdown_leds();  
}

bool isFiring = false;

void playTrack(int num) {
  // stop track if one is going
  int playing = digitalRead(ACT);
  if (playing == 0) {
    sfx.stop();
  }

  // now go play
  if (sfx.playTrack(num)) {
    sfx.unpause();
  }
}

void stopTrack() {
  sfx.stop();
}

void resetSoundboard() {
  sfx.reset();
}

int pwr_interval = 60;     // interval at which to cycle lights for the powercell. We update this in the loop so must be declared here

void loop() {
  int currentMillis = millis();
  int theme_switch = digitalRead(THEME_SWITCH);
  int playing = digitalRead(ACT);
  
  if (theme_switch == 1) {
    if (theme == false) {
      playTrack(themeTrack); // send message to other board to play track
      theme = true;
    }
  } else {
    theme = false;
  }

  int startup_switch = digitalRead(STARTUP_SWITCH);
  int safety_switch = digitalRead(SAFETY_SWITCH);
  int fire_button = digitalRead(FIRE_BUTTON);
  if (startup_switch == 1) {
    if (playing == 1) {
      playTrack(idleTrack); // send message to other board to play track
    }

    if( powerBooted == true ){
      powerSequenceOne(currentMillis, pwr_interval);
    }else{
      powerSequenceBoot(currentMillis);
    }
    
    if (startup == false) {
      startup = true;
      playTrack(startupTrack); // send message to other board to play track

      if (safety_switch == 1 && safety == false) {
        safety = true;
      }
    }

    if( safety_switch == 1 && fire_button == 0){
      if( isFiring == false ){
        shutdown_leds();
        isFiring = true;
      }
      barGraphSequenceTwo(currentMillis);
    }else{
      if( isFiring == true ){
        shutdown_leds();
        isFiring = false;
      }
      barGraphSequenceOne(currentMillis);
    }

    // fire loop 
    if (startup == true && safety_switch == 1) {
      if (safety == false) {
        safety = true;
        playTrack(clickTrack); // send message to other board to play track
      }

      if (fire_button == 0) {
        fireStrobe();
        if (fire == false) {
          fire = true;
          startDialogMillis = millis();
          playTrack(blastTrack); // send message to other board to play track
        } else {
          if (playing == 1) {
            playTrack(blastTrack); // send message to other board to play track
          }
          
          long diff = millis() - startDialogMillis;
          if( diff > warnWaitTime){
              pwr_interval = 20;
          }else if( diff > dialogWaitTime){
              pwr_interval = 40;
          }
        }
      } else {
        if (fire == true) {
          clearFireStrobe();
          pwr_interval = 60;
          fire = false;
          // see if we've been firing long enough to get the dialog
          long diff = millis() - startDialogMillis;
          if( diff > warnWaitTime){
            playTrack(warnTrack); // send message to other board to play track
            clearPowerStrip();
          }else if( diff > dialogWaitTime){
            switch(currentDialog){
              case(1):
                playTrack(choreTrack); // send message to other board to play track
                break;
              case(2):
                playTrack(toolsTrack); // send message to other board to play track
                break;
              case(3):
                playTrack(texTrack); // send message to other board to play track
                break;
            }
            if( currentDialog >= numDialog ){
              currentDialog = 1;
            }else{
              currentDialog++;
            }
          }else{
            playTrack(endTrack); // send message to other board to play track
          }
        }
      }
    } else {
      if (safety == true) {
        safety = false;
        playTrack(clickTrack); // send message to other board to play track
      }
    }
  } else {
    clearPowerStrip();
    shutdown_leds();
    
    if (startup == true) {
      startup = false;
      safety = false;
      fire = false;

      playTrack(shutdownTrack); // send message to other board to play track
    }
  }
  delay(1);
}

/*************** Powercell Animations *********************/
unsigned long prevPwrBootMillis = 0; 
const long pwr_boot_interval = 300;     // interval at which to cycle lights (milliseconds).
unsigned long prevPwrMillis = 0; 

int powerSeqTotal = 16; // total number of led's for power
int powerBootSeqNum = 16;
int powerSeqNum = 0;

void clearPowerStrip(){
  powerBooted = false;
  for( int i=0; i< powerSeqTotal; i++) {
     powerStick.setPixelColor(i, 0);
  }
  powerStick.show();
  powerSeqNum = 0;
  powerBootSeqNum = 16;
}

void powerSequenceBoot(int currentMillis){
  // normal sync animation on the bar graph
  if (currentMillis - prevPwrBootMillis > pwr_boot_interval) {
      // save the last time you blinked the LED
      prevPwrBootMillis = currentMillis;

      for( int i = powerSeqTotal; i > 0; i--) {
        if( i <= powerBootSeqNum ){
          powerStick.setPixelColor(i, powerStick.Color(0,0,150));
        }else{
          powerStick.setPixelColor(i, 0);
        }
      }
      powerStick.show();
      if( powerBootSeqNum > 0){
        powerBootSeqNum--;
      }else{
        powerBooted = true;
        powerBootSeqNum = 16;
      }
  }
}

void powerSequenceOne(int currentMillis, int anispeed){
  powerBootSeqNum = 16;
  // normal sync animation on the bar graph
  if (currentMillis - prevPwrMillis > anispeed) {
      // save the last time you blinked the LED
      prevPwrMillis = currentMillis;

      for( int i=0; i< powerSeqTotal; i++) {
        if( i <= powerSeqNum ){
          powerStick.setPixelColor(i, powerStick.Color(0,0,150));
        }else{
          powerStick.setPixelColor(i, 0);
        }
      }
      powerStick.show();
      if( powerSeqNum < powerSeqTotal){
        powerSeqNum++;
      }else{
        powerSeqNum = 0;
      }
  }
}

/*************** Firing Animations *********************/
unsigned long prevFireMillis = 0; 
const long fire_interval = 2;     // interval at which to cycle lights (milliseconds).
int fireSeqNum = 0;
int fireSeqTotal = 3;

void clearFireStrobe(){
  for( int i=0; i< 7; i++) {
     noseJewel.setPixelColor(i, 0);
  }
  noseJewel.show();
  fireSeqNum = 0;
}

void fireStrobe(){
  switch( fireSeqNum ){
    case 0:
      noseJewel.setPixelColor(0, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(1, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(2, 0);
      noseJewel.setPixelColor(3, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(4, 0);
      noseJewel.setPixelColor(5, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(6, 0);
      break;
    case 1:
      noseJewel.setPixelColor(0, noseJewel.Color(0,0,255));
      noseJewel.setPixelColor(1, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(2, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(3, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(4, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(5, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(6, noseJewel.Color(255,255,255));
      break;
    case 2:
      noseJewel.setPixelColor(0, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(1, 0);
      noseJewel.setPixelColor(2, noseJewel.Color(0,0,255));
      noseJewel.setPixelColor(3, 0);
      noseJewel.setPixelColor(4, noseJewel.Color(0,0,255));
      noseJewel.setPixelColor(5, 0);
      noseJewel.setPixelColor(6, noseJewel.Color(0,0,255));
      break;
    case 3:
      noseJewel.setPixelColor(0, noseJewel.Color(0,0,255));
      noseJewel.setPixelColor(1, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(2, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(3, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(4, noseJewel.Color(255,255,255));
      noseJewel.setPixelColor(5, noseJewel.Color(255,0,0));
      noseJewel.setPixelColor(6, noseJewel.Color(255,255,255));
      break;
  }

  noseJewel.show();

  fireSeqNum++;
  if( fireSeqNum > fireSeqTotal ){
    fireSeqNum = 0;
  }
}

/*************** Bar Graph Animations *********************/
unsigned long prevBarMillis_on = 0;   // bargraph on tracker
const long pwrcl_interval = 60;     // interval at which to cycle lights (milliseconds).
bool reverseSequenceOne = false;
void barGraphSequenceOne(int currentMillis){
  // normal sync animation on the bar graph
  if (currentMillis - prevBarMillis_on > pwrcl_interval) {
    // save the last time you blinked the LED
    prevBarMillis_on = currentMillis;
    
    if( reverseSequenceOne == false ){
        switch_graph_led(seq_1_current, HIGH);
        seq_1_current++;
        if( seq_1_current > num_led ) { 
          reverseSequenceOne = true;
        }
    }else{
        switch_graph_led(seq_1_current, LOW);
        seq_1_current--;
        if( seq_1_current < 0  ) { 
          reverseSequenceOne = false;
        }
    }
  }
}

unsigned long prevBarMillis_fire = 0; // bargraph firing tracker
const long firing_interval = 40;    // interval at which to cycle firing lights (milliseconds).
int fireSequenceNum = 1;
void barGraphSequenceTwo(int currentMillis){
  // normal sync animation on the bar graph
  if (currentMillis - prevBarMillis_fire > firing_interval) {
    // save the last time you blinked the LED
    prevBarMillis_fire = currentMillis;

    switch (fireSequenceNum) {
      case 1:
        switch_graph_led(2, LOW);
        switch_graph_led(14, LOW);
        switch_graph_led(1, HIGH);
        switch_graph_led(15, HIGH);
        fireSequenceNum++;
        break;
      case 2:
        switch_graph_led(1, LOW);
        switch_graph_led(15, LOW);
        switch_graph_led(2, HIGH);
        switch_graph_led(14, HIGH);
        fireSequenceNum++;
        break;
      case 3:
        switch_graph_led(2, LOW);
        switch_graph_led(14, LOW);
        switch_graph_led(3, HIGH);
        switch_graph_led(13, HIGH);
        fireSequenceNum++;
        break;
      case 4:
        switch_graph_led(3, LOW);
        switch_graph_led(13, LOW);
        switch_graph_led(4, HIGH);
        switch_graph_led(12, HIGH);
        fireSequenceNum++;
        break;
      case 5:
        switch_graph_led(4, LOW);
        switch_graph_led(12, LOW);
        switch_graph_led(5, HIGH);
        switch_graph_led(11, HIGH);
        fireSequenceNum++;
        break;
      case 6:
        switch_graph_led(5, LOW);
        switch_graph_led(11, LOW);
        switch_graph_led(6, HIGH);
        switch_graph_led(10, HIGH);
        fireSequenceNum++;
        break;
      case 7:
        switch_graph_led(6, LOW);
        switch_graph_led(10, LOW);
        switch_graph_led(7, HIGH);
        switch_graph_led(9, HIGH);
        fireSequenceNum++;
        break;
      case 8:
        switch_graph_led(7, LOW);
        switch_graph_led(9, LOW);
        switch_graph_led(6, HIGH);
        switch_graph_led(10, HIGH);
        fireSequenceNum++;
        break;
      case 9:
        switch_graph_led(6, LOW);
        switch_graph_led(10, LOW);
        switch_graph_led(5, HIGH);
        switch_graph_led(11, HIGH);
        fireSequenceNum++;
        break;
      case 10:
        switch_graph_led(5, LOW);
        switch_graph_led(11, LOW);
        switch_graph_led(4, HIGH);
        switch_graph_led(12, HIGH);
        fireSequenceNum++;
        break;
      case 11:
        switch_graph_led(4, LOW);
        switch_graph_led(12, LOW);
        switch_graph_led(3, HIGH);
        switch_graph_led(13, HIGH);
        fireSequenceNum++;
        break;
      case 12:
        switch_graph_led(3, LOW);
        switch_graph_led(13, LOW);
        switch_graph_led(2, HIGH);
        switch_graph_led(14, HIGH);
        fireSequenceNum = 1;
        break;
    }
  }
}

/************************* Shutdown and helper functions ****************************/
void shutdown_leds(){
  // reset the sequence
  seq_1_current = 1; 
  fireSequenceNum = 1;
  
  // shut all led's off
  // shut all led's off
  for(int i=1;i<=15;i++){
      switch_graph_led(i, LOW); 
  }
}

void switch_graph_led(int num, int state){
  switch (num) {
    case 1:
      io.digitalWrite(SX1509_BAR_01, state); 
      break;
    case 2:
      io.digitalWrite(SX1509_BAR_02, state); 
      break;
    case 3:
      io.digitalWrite(SX1509_BAR_03, state); 
      break;
    case 4:
      io.digitalWrite(SX1509_BAR_04, state); 
      break;
    case 5:
      io.digitalWrite(SX1509_BAR_05, state); 
      break;
    case 6:
      io.digitalWrite(SX1509_BAR_06, state); 
      break;
    case 7:
      io.digitalWrite(SX1509_BAR_07, state); 
      break;
    case 8:
      io.digitalWrite(SX1509_BAR_08, state); 
      break;
    case 9:
      io.digitalWrite(SX1509_BAR_09, state); 
      break;
    case 10:
      io.digitalWrite(SX1509_BAR_10, state); 
      break;
    case 11:
      io.digitalWrite(SX1509_BAR_11, state); 
      break;  
    case 12:
      io.digitalWrite(SX1509_BAR_12, state); 
      break;  
    case 13:
      io.digitalWrite(SX1509_BAR_13, state); 
      break;
    case 14:
      io.digitalWrite(SX1509_BAR_14, state); 
      break;
    case 15:
      io.digitalWrite(SX1509_BAR_15, state); 
      break;
    }
  }
Tebasaki liked this
#4897300
That video is HOT! It makes me so excited to get something set up! (Got a test tomorrow morning, though)

Your bar graph is so bright! Must've been the iso on your camera as well.

With that cyclotron code I gave you don't think you'll have any issue copy-pasta into your code.

To measure your mA usage, what setting do you turn your multimeter to? (And do you just touch the leads to the + and -?)
#4897302
Thanks :) Yeah I'll check out the code you did. I've still not tried the fastled lib. Might end up redoing the other jewel code if I like it better. I have not soldered up the other jewel yet. Hope to do that tomorrow.

My meter has a ma setting range and I had to select the 200ma value. This was my ancient radio shack meter. I disconnected the positive lead from the battery into the buck converter and put the negative wire on the meter to the buck and the positive to the battery lead. Then just use as normal to get the current draw. You can put it in line anywhere to see individual component draw
#4897337
I made some more progress on the wand. It's coming out really nice. The filler primer is working well in thin coats. Here are some pics of the latest coat before sanding. I really like how the grips came out. They are really comfortable for me and my son. I just reprinted the clippard today and that was the first coat of primer on it. I need 2 or 3 more coats before that one is ready. I'm really pleased with how it's looking.

Image

Image

Image

Image

I got an order in from amazon today. It included a pack of the silicon 24 gauge wire. WOW is that stuff flexible. OMG there would be no issues in the PKE meter with this stuff. Now I have to build another one of those with the new wire. It's night and day between the 28 gauge I had before and the 24 gauge I just got. I think the 24 gauge might actually be thinner than the 28 gauge non silicon.

I've also started in on printing the pack. I will probably make another topic for that but I'm really pleased with how the model came out. It is a mishmash of models available on thingiverse as well as a bunch of custom stuff by me. I was even able to print the cyclotron top in one piece at 83% on my Monoprice Maker Select so it will look really nice not having to fill those seams. It's been designed specifically for my electronics and stuff so not fully matching the plans. Also reversed for a lefty :)

Image
#4897355
CountDeMonet wrote:The brightness is pure preference. I want them lit but not blindingly bright so I used 330. 220 is a little brighter but the current draw goes up quite a bit. The more current you draw the less time your battery works. You also have to watch the current draw on the SX1509. There are 2 modes. Sourcing current and Sinking current and they are wired differently. Sourcing currently only supports 8ma per pin and I've clocked my setup at 4ma with the 330 ohm resistor network so I'm safe. If you go smaller on the resistor network you may need to change how you wire it. I think the 220 was closer to 8ma current if I remember correctly which is pretty close to the limit.

xoff00 has experience wiring the sx1509 so you get more current per pin. I've not done that. You might be safe without a resistor because the sx1509 is limiting to 8ma current. Search for Source vs. Sink on this page for more info

I would suggest getting a resistor kit and testing various resistors to see the brightness you like. Then when you find it purchase the resistor network for that value. My guess is you'll like something closer to 100 ohm
Yeah, I'm doing sinking, and that requires individual resistors. In fact, I ended up making a custom PCB for it because it was so complex. I'll have the boards in my hands this weekend and will post about them!

Count's method of sourcing means you can use ladder/network resistors because you can use the common ground. In sinking I'm on the other side of the LED. See the SX1509 hookup guide, here:

https://learn.sparkfun.com/tutorials/sx ... ed-driving
CountDeMonet liked this
#4897359
Nice! Looking forward to seeing it. I was looking for a footprint to do that for the sx1509 but didn't have much luck finding one for eagle cad. The nano was easy to find. I started down the path of taking the real eagle files for the sx and pulling components and leaving just the pads but it was not easy
#4897362
Don't misunderstand me, it's obviously well done, but mirroring the entire pack like that just looks wrong. Why not simply rework the power cell to accept a compatible bracket for the left-handed neutrino wand?
#4897367
Yeah, taking a good look at the models I think if I bring the powercell up and have it touch the ion arm holder I could create a mount near the same height as the gun mount on the other side. Basically it would look something like this where the gun mount would be off the side of the powercell. To me it looks off balance visually with the gun on the left and not the right. What do you all think?

Image

To contrast it here is what it would look like with the full pack reversed with the wand mounted

Image
#4897476
I've been making some good progress printing out the rest of the pack. I decided to stick with the mirrored version as I don't really like the wand on the power cell. I think I have about 50% of it printed at this point and it's looking really good. I think I might actually finish this on time.

I noticed a little issue with my electronics that was interesting enough I wanted to share. I cranked up the volume on the amp to get a little more volume and the arduino started resetting sometimes when I would trigger the firing animation. It's a pretty loud sound and I guess it's spiking the buck converter enough that the voltage is dropping down causing some issues. I tried adding a large capacitor to the amp and it did help but did not stop it completely. I'm probably going to have to add a second buck converter for the audio amps as I'm planning to run 2 of these speakers. I only have one hooked up right now. I'll get it solved one way or another.

It could also be a bad battery. This pack is about 6 or 7 years old and may not be holding it's charge well and sagging under load.
#4897480
I am using two 2.5w 5.5v boards powering 1 inch 4 ohm 3 watt speakers. I have to cut the voltage to these and it appears that the little bit of sag I get from some of the sounds when the one board is turned up is enough to reset the arduino. I have redone this tonight and it appears to have resolved the issue. I can now go much louder with both speakers and see no issues on the arduino side. I kept the capacitor on the amp side. Basically the small breadboard will be an isolated power block just for the amps. Because these are 5.5v boards I upped the voltage on that buck converter to 5.35. I can put all of that on a single board and just send the audio signals to it. This setup might not have a lot of base but it is plenty loud for my son.

Image

Here's the progress on the full pack.

Image
#4897497
CountDeMonet wrote:Yeah, taking a good look at the models I think if I bring the powercell up and have it touch the ion arm holder I could create a mount near the same height as the gun mount on the other side. Basically it would look something like this where the gun mount would be off the side of the powercell. To me it looks off balance visually with the gun on the left and not the right. What do you all think?
Personally, I like just moving the gun to the other side.

If you needed a left-handed pack in a franchise, they wouldn't make a custom pack, they'd just customize the gun and the mount.
#4897499
Finally, progress on my wand electronics!

My boards from OSHPark arrived, and much to my amazement, they actually work! :)

Image
Image
Considering that was my very first time designing a PCB, I'm really pleased with myself!

The PCB is basically an adapter for the SX1509 and all the individual resistors to a 32 pin ribbon cable, leading to the individual flat LEDs. I'm using a convenient short 40-pin Raspberry Pi cable for testing, that may or may not be permanent.
CountDeMonet liked this
#4897503
talem84 wrote:Would anyone be able to give me a parts list ?
We're not really at that stage, Talem84, but assuming you're fairly Arduino savvy the key part that I found and CountDeMonet ran with is a good I2C I/O Expander called the SX1509, which has a great breakout board made by Sparkfun: https://www.sparkfun.com/products/13601

Both Count and I are using that to control our bargraphs. He's using 2 combined bargraphs, I'm doing a homebuilt one.

Both builds roughly consist of an Arduino in the Pack and an extension in the Wand to run it's lights.
#4897504
Right I get that . I was just looking for a breakdown on parts and maybe a small tutorial .
I want to get started soon before Halloween. Plus don't want to spend $200 on the sound board and lights everyone else is selling
#4897507
This post may contain an affiliate link that helps support GBFans.com when you make a purchase at no additional cost to you.

Congrats on your first board. Looks really good and should make things a lot easier for you.

I'm a bit too far down the path at this point with the mirrored pack and will just have to run with it.

The full parts list is not yet know as things are still breaking out. There are three of us building a version of this right now and we're all going a little bit differently. The basic list looks something like this based off features:

Bare minimum needed:
Buck converters to change an 11.1v battery to 5.0v
Arduino Nano
A way to power it. I'm using old 11.1v lipos in the 1800-2500mAh range.

For the pack lights:
I'm using 4 of these neopixel clones for the cyclotron
Two of these soldered together for the powercell

For the pack sounds:
Sound trigger board
Two of the audio amps although you could just go with a stereo one or a larger one if you want more power
Speakers I am using. No base but nice and loud with this setup

For the wand:
3 of these toggle switches
a button like this
One of these neopixel clones for the flashing end of the wand

the bar graph is the most complex part.
SX1509 breakout board for the bar graph. If you don't want the bar graph you can eliminate this
this graph
and this one together for 15 leds

Various 3mm and 5mm led's/resistors I have millions of that I have not hooked up yet. Still have to figure out what I need as I build it out.

I think I'm hovering around 70-80 right now for all of the components and various other stuff. I already had a lot of the protoyping thing/wires and soldering irons and stuff so I'm not adding that into the cost. I've already built and coded the bar graph but it's not going in my son's pack. Not enough room for the bargraph after scaling everything down to 83%. I'll save it for my pack when I build it :)
xoff00 liked this
#4897557
I'm making some good progress on the pack. I have all of almost all of it printed out now and a test fit looks like everything is good. We'll see if the angle I put on the gun mount is right but that part can be reprinted later. I'm printing the bumper now and then it's just hose mounts and stuff like that. I got the first bit of hose in today and the blue and green should be in tomorrow. Finding the solid yellow is a bit more difficult in anything less than 100 meters for $10 so I may just pick some up from here along with the correct ribbon cable.

Image

I also started in on the electronic mounts. The first being the cyclotron lights. I'm looking to find some red transparent file folders and cut those to make the lenses. Then those will be cut to fit under the lip and then the cup for the neopixel will be glued onto that. I think it'll work pretty good.

Image

Image

Image
  • 1
  • 3
  • 4
  • 5
  • 6
  • 7
  • 25

My Little Pony/Ghostbusters crossover done by my d[…]

Great work identifying the RS Temperature Control […]

I read Back in Town #1. Spoilers : Hate to b[…]

I'd really like to see the new t-shirt unlocks tra[…]