Removable crystal build with Blade Detect and Blade ID sanity check

Hi everyone.
I’m building one of the Goth3D’s grand master chassis with proffie 2.2 and currently going through wiring planning and mockup.

I’m here for a sanity check, a couple of questions, and to see if anyone has any pointers or advice.

This chassis has removable crystals that have 6 pads that can go to 2 pixel LEDs and an ID resistor.
My plan is to treat the crystal as a ‘removable blade’. Use Data 1 for Blade ID and wire an ID resistor between data1(16) and LED1(13) Pin inside the crystal part that gets removed.
And for Blade detect use Data4 and also wire it to LED1(13) pad that is used for ID and Pixel negative inside the crystal.

Questions:
Any reason that same LED1(13) Pin won’t work for both blade ID through a resistor and Blade Detect directly ?
Should I add a pull up Resistor between 3.3v Pin and Data1 for ExternalPullupBladeID workaround?
Any concerns with that if I’m also driving a small LED from that 3.3v. Since it’s just a pullup I’m assuming it should be OK.

I have a crude diagram I drew for myself to keep things organized that might help visualize:


If anyone would like a cleaner version and has software in mind I can clean it up. I like sketching things on ‘paper’ for myself.

If anyone has any thoughts or suggestions I’d appreciate them.
Thanks for taking a look.

It should work fine.

You shouldn’t need it, but it will make the values more stable and predictable.
With ExternalPullupBladeID, you should get ID values which are close to the resistor values. With the default blade ID, you have to test it to see what ID values you get, but it should still work.

In general. I don’t recommend using the 3.3v pad for anything unless you specifically need 3.3 volts. A small 20mA (or less) LED should be fine though.

Checking circuit diagrams (and not miss anything) is quite difficult, but I haven’t spotted anything wrong yet. However, I will offer one thought:

It seems like you could save one pin on the chassis connector by wiring the two buttons to BATT+ and use the PullDownButton class.

Also, you probably want to connect the two BATT+ pins together on the chassis side for better power sharing.

1 Like

I can contribute this from a config file I did for a guy doing that in his build, but there was also a motor, and we used SnapshotBladeID. It might help?

................
#ifdef CONFIG_TOP
#include "proffieboard_v2_config.h"
#define NUM_BLADES 7
#define NUM_BUTTONS 2
#define VOLUME 1800
const unsigned int maxLedsPerStrip = 144;
#define CLASH_THRESHOLD_G 3.5
#define ENABLE_AUDIO
#define ENABLE_MOTION
#define ENABLE_WS2811
#define ENABLE_SD
#define ENABLE_SSD1306
#define ENABLE_SERIAL
#define SHARED_POWER_PINS
#define DISABLE_DIAGNOSTIC_COMMANDS
#define DISABLE_BASIC_PARSER_STYLES
#define BLADE_DETECT_PIN blade4Pin
#define ENABLE_POWER_FOR_ID PowerPINS<bladePowerPin2,bladePowerPin3>
#define BLADE_ID_CLASS SnapshotBladeID<bladeIdentifyPin>
#define MOTION_TIMEOUT 60 * 15 * 1000
#define IDLE_TIME_OFF 60 * 5 * 1000
#define PLI_OFF_TIME 60 * 5 * 1000
#define ENABLE_SPINS
#define SAVE_STATE
#endif

#ifdef CONFIG_PROP
#include "../props/saber_BC_buttons.h"
#endif
 
// Blade 1 - Main Blade
// Blade 2 - Crystal Top
// Blade 3 - Crystal Bottom
// Blade 4 - LED strips
// Blade 5 - Arc Reactor
// Blade 6 - Speaker 3mm
// Blade 7 - Motor

#ifdef CONFIG_PRESETS

Preset crystal[] = {

{ "Cantina;common", "tracks/Cantina.wav",
// Main Blade
  StylePtr<Layers<
    // Base Blue
    Mix<SwingSpeed<400>,AudioFlicker<RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,128>>>,Mix<SwingSpeed<600>,RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<150,150,255>>>>,
    // Dim Blade 50% "Power Save" button combo
    EffectSequence<EFFECT_POWERSAVE,
        AlphaL<Black,Int<16384>>,
        AlphaL<Black,Int<0>>>,
    // Clash 1 - BladeAngle responsive. Yellowish impact
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<TransitionEffect<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,White,TrInstant,TrFade<300>,EFFECT_CLASH>,Bump<Scale<BladeAngle<>,Int<25000>,Int<8000>>,Int<18000>>>,TrFade<600>>,EFFECT_CLASH>,
    // Stab - OrangeRed stripes
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrWipeIn<300>,AlphaL<Stripes<5000,1000,Orange,DarkOrange,Rgb<150,60,0>,Rgb<60,30,0>,Rgb<150,14,0>,OrangeRed>,SmoothStep<Int<20000>,Int<20000>>>,TrJoin<TrSmoothFade<900>,TrWipe<700>>>,EFFECT_STAB>,
    // Blast
    TransitionEffectL<TrConcat<
        // Impact Flash - BC always
        TrInstant,GreenYellow,TrDelay<25>>,EFFECT_BLAST>,
        // Waves
        BlastL<White,850,250,351>,
        // Impact point afterimage
        //AlphaL<TransitionEffectL<TrConcat<TrFade<200>,Red,TrFade<600>>,EFFECT_BLAST>,BlastF<700,250,100000>>,
        AlphaL<TransitionEffectL<TrConcat<TrFade<300>,Rgb<255,70,70>,TrFade<300>>,EFFECT_BLAST>,BlastF<700,250,100000>>,
        // Impact point
        //BlastL<White,500,350,100000>,
        BlastL<White,300,350,100000>,
    // Lockup 1 - BC custom range mid-blade to hilt w/random strobe flash
    TransitionEffectL<TrConcat<TrInstant,Strobe<GreenYellow,Black,20,30>,TrFade<200>,BrownNoiseFlickerL<AlphaL<White,Int<16000>>,Int<5000>>,TrJoinR<TrWipe<200>,TrWipeIn<200>,TrFade<300>>>,EFFECT_LOCKUP_END>,
    LockupTrL<Layers<
        //Random Strobe Flash no dimming
        AlphaL<TransitionLoopL<TrConcat<TrDelayX<Scale<SlowNoise<Int<3000>>,Int<30>,Int<800>>>,Mix<SlowNoise<Int<1000>>,Black,Black,White,Black>,TrDelayX<Scale<SlowNoise<Int<1000>>,Int<10>,Int<50>>>>>,Int<32768>>,
        //AlphaL<White,StrobeF<Scale<SlowNoise<Int<1000>>,Int<1>,Int<3>>,Scale<SlowNoise<Int<1000>>,Int<10>,Int<50>>>>,
        // Bottom Layer Bump - random width
        AlphaL<Blinking<Tomato,Strobe<Yellow,Black,15,30>,60,500>,                                               Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Scale<SlowNoise<Int<3000>>,Int<8000>,Int<18000>>>>,
        // Top Layer Bump - fixed width
        AlphaL<Blinking<BrownNoiseFlicker<White,Black,50>,BrownNoiseFlicker<Yellow,Tomato,50>,100,500>,          Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Int<9000>>>>,
        // Begin Lockup Transition
        TrConcat<TrInstant,AlphaL<Blinking<White,Strobe<BrownNoiseFlicker<Yellow,Black,500>,Black,15,30>,60,500>,Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Scale<SlowNoise<Int<3000>>,Int<25000>,Int<32000>>>>,TrFade<500>>,
        // End Lockup Transition
        TrSmoothFade<900>,SaberBase::LOCKUP_NORMAL>,
    TransitionEffectL<TrConcat<TrInstant,AlphaL<Strobe<GreenYellow,Black,20,30>,                               Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Int<15000>>>,TrFade<600>>,EFFECT_LOCKUP_BEGIN>,
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,HumpFlickerL<Strobe<AlphaL<White,Int<20000>>,Black,20,30>,30>,TrSmoothFade<225>>,EFFECT_LOCKUP_BEGIN>,
    // Non-Responsive Drag - BC custom drag fadeout
    LockupTrL<AlphaL<AudioFlicker<BrownNoiseFlicker<Strobe<Black,OrangeRed,20,25>,Yellow,200>,White>,SmoothStep<Int<30000>,Int<2000>>>,TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrFade<150>>,TrColorCycle<1500,-2000,100>,SaberBase::LOCKUP_DRAG>,
    // Lightning Block - Non-responsive. BC custom color (purple hint w/ random strobe flashes because....lightning)
    LockupTrL<Layers<
        //Random Strobe Flash and 16000 = 50% base blade dimming to make lb pop
        AlphaL<Black,Int<16000>>,
        AlphaL<White,StrobeF<Scale<SlowNoise<Int<1000>>,Int<1>,Int<6>>,Scale<SlowNoise<Int<1000>>,Int<10>,Int<50>>>>,
        AlphaL<RandomFlicker<Strobe<White,Rgb<83,0,255>,50,10>,BrownNoiseFlicker<Rgb<83,0,255>,Black,500>>,LayerFunctions<
        Bump<Scale<SlowNoise<Int<2000>>,Int<3000>,Int<16000>>,Scale<BrownNoiseF<Int<10>>,Int<14000>,Int<8000>>>,
        Bump<Scale<SlowNoise<Int<2300>>,Int<26000>,Int<8000>>,Scale<NoisySoundLevel,Int<5000>,Int<10000>>>,
        Bump<Scale<SlowNoise<Int<2300>>,Int<20000>,Int<30000>>,Scale<IsLessThan<SlowNoise<Int<1500>>,Int<8000>>,Scale<NoisySoundLevel,Int<5000>,Int<0>>,Int<0>>>>>>,
        // Begin Lightning Transition
        TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlicker<Rgb<83,0,255>,Black,500>,TrFade<100>>,
        // End Lightning Transition    
        TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlicker<Rgb<83,0,255>,Black,500>,TrFade<150>,BrownNoiseFlickerL<AlphaL<White,Int<16000>>,Int<50>>,TrJoinR<TrWipe<200>,TrWipeIn<200>,TrFade<400>> >,SaberBase::LOCKUP_LIGHTNING_BLOCK>,
    // Melt - BC custom melt effects, uses twistangle<>
    LockupTrL<
        // OS 6 (Based on "Intensity Melt" - Fett263. Remap Fire to travel tip->emitter, Custom Begin and End Transitions)
        AlphaL<Remap<Scale<RampF,Int<65536>,Int<0>>,StaticFire<Mix<TwistAngle<>,Rgb16<20393,93,93>,DarkOrange>,Mix<TwistAngle<>,Rgb16<20393,93,93>,Orange>,0,4,5,4000,10>>,
        // Melt Shape
        SmoothStep<Scale<TwistAngle<>,Int<24000>,Int<29000>>,Int<4000>>>,
        // Melt Begin and End transitions
        TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrWipeIn<600>,AlphaL<Red,SmoothStep<Scale<TwistAngle<>,Int<24000>,Int<29000>>,Int<2000>>>,TrExtend<3000,TrFade<300>>,AlphaL<Mix<TwistAngle<>,Red,Orange>,SmoothStep<Scale<TwistAngle<>,Int<24000>,Int<29000>>,Int<2000>>>,TrFade<3000>>,TrColorCycle<1500,-2000>,SaberBase::LOCKUP_MELT>,
    InOutTrL<TrWipeSparkTip<White,400>,TrWipeInX<WavLen<EFFECT_RETRACTION>>>,
    TransitionEffectL<TrConcat<TrInstant,AlphaL<Green,Bump<Int<0>,Int<1000>>>,TrDelay<90>,AlphaL<DodgerBlue,Bump<Int<0>,Int<1000>>>,TrFade<100>,AlphaL<DeepSkyBlue,Bump<Int<0>,Int<1000>>>,TrDelay<200>>,EFFECT_PREON>,
    // On-Demand Battery Level
    AlphaL<TransitionEffectL<TrConcat<TrSmoothFade<500>,AlphaL<Mix<BatteryLevel,Red,Green>,SmoothStep<Scale<BatteryLevel,Int<0>,Int<35000>>,Int<-1>>>,TrDelay<1000>,AlphaL<Mix<BatteryLevel,Red,Green>,SmoothStep<Scale<BatteryLevel,Int<0>,Int<35000>>,Int<-1>>>,TrSmoothFade<1000>>,EFFECT_BATTERY_LEVEL>,Ifon<Int<0>,Int<32768>>>
  >>(),
// Crystal Top
  StylePtr<Layers<
    // Crystal Blue
    Stripes<1000,-2000,RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,128>>,Black>,
    TransitionEffectL<TrConcat<TrFade<600>,RandomFlicker<RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,160>>>,TrDelay<3000>,RotateColorsX<Variation,Blue>,TrFade<800>>,EFFECT_FORCE>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<400>>,EFFECT_CLASH>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<400>>,EFFECT_BLAST>,
    LockupL<AudioFlicker<White,Blue>,AudioFlicker<Yellow,SteelBlue>,Int<32768>,Int<32768>,Int<32768>>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<500>>,EFFECT_LOCKUP_END>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<500>>,EFFECT_DRAG_END>,
    LockupTrL<Pulsing<BrownNoiseFlicker<Red,Black,300>,Yellow,2000>,TrFade<300>,TrFade<300>,SaberBase::LOCKUP_MELT>,
    InOutTrL<TrConcat<TrInstant,White,TrSmoothFade<1000>>,TrConcat<TrSmoothFade<500>,White,TrSmoothFade<500>>,Pulsing<RotateColorsX<Variation,Blue>,Black,3000>>
  >>(),
// Crystal Bot
  StylePtr<Layers<
    // Crystal Blue
    Stripes<1000,-2000,RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,128>>,Black>,
    TransitionEffectL<TrConcat<TrFade<600>,RandomFlicker<RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,160>>>,TrDelay<3000>,RotateColorsX<Variation,Blue>,TrFade<800>>,EFFECT_FORCE>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<400>>,EFFECT_CLASH>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<400>>,EFFECT_BLAST>,
    LockupL<AudioFlicker<White,Blue>,AudioFlicker<Yellow,SteelBlue>,Int<32768>,Int<32768>,Int<32768>>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<500>>,EFFECT_LOCKUP_END>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<500>>,EFFECT_DRAG_END>,
    LockupTrL<Pulsing<BrownNoiseFlicker<Red,Black,300>,Yellow,2000>,TrFade<300>,TrFade<300>,SaberBase::LOCKUP_MELT>,
    InOutTrL<TrConcat<TrInstant,White,TrSmoothFade<1000>>,TrConcat<TrSmoothFade<500>,White,TrSmoothFade<500>>,Pulsing<Black,RotateColorsX<Variation,Blue>,3000>>
  >>(),
// LED Strips
  StylePtr<Layers<
    Stripes<1000,-2000,RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,128>>,Black>,
    TransitionEffectL<TrConcat<TrFade<600>,RandomFlicker<RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,160>>>,TrDelay<3000>,RotateColorsX<Variation,Blue>,TrFade<800>>,EFFECT_FORCE>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<400>>,EFFECT_CLASH>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<400>>,EFFECT_BLAST>,
    LockupL<AudioFlicker<White,Blue>,AudioFlicker<Yellow,SteelBlue>,Int<32768>,Int<32768>,Int<32768>>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<500>>,EFFECT_LOCKUP_END>,
    TransitionEffectL<TrConcat<TrInstant,White,TrFade<500>>,EFFECT_DRAG_END>,
    LockupTrL<Pulsing<BrownNoiseFlicker<Red,Black,300>,Yellow,2000>,TrFade<300>,TrFade<300>,SaberBase::LOCKUP_MELT>,
    InOutTrL<TrConcat<TrInstant,White,TrSmoothFade<1000>>,TrConcat<TrSmoothFade<500>,White,TrInstant>,ColorCycle<RotateColorsX<Variation,Blue>,10,30,Black,100,3000,1>>
  >>(),
// Arc Reactor
  StylePtr<Layers<Black,
    Pulsing<AlphaL<BrownNoiseFlicker<White,SteelBlue,10>,Int<16000>>,BrownNoiseFlicker<White,SteelBlue,200>,1500>,
    TransitionEffectL<TrConcat<TrFade<600>,RandomFlicker<RotateColorsX<Variation,Blue>,RotateColorsX<Variation,Rgb<0,0,160>>>,TrDelay<3000>,RotateColorsX<Variation,Blue>,TrFade<800>>,EFFECT_FORCE>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<400>>,EFFECT_CLASH>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<400>>,EFFECT_BLAST>,
    LockupL<AudioFlicker<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Blue>,AudioFlicker<Yellow,SteelBlue>,Int<32768>,Int<32768>,Int<32768>>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<500>>,EFFECT_LOCKUP_END>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<500>>,EFFECT_DRAG_END>,
    InOutTrL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrSmoothFade<1000>>,TrConcat<TrSmoothFade<500>,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrSmoothFade<500>>,Pulsing<Rgb<70,70,70>,Rgb<20,20,20>,2000>>
  >>(),
// Speaker 3mm White LED Data NA Power 6
  StylePtr<Layers<
    Blinking<Black,White,1500,500>,
    InOutTrL<TrInstant,TrInstant,Sequence<White,Black,200,30,0b0,0b10101010101000>>
  >>(),
// Motor Data NA Power 5
  StylePtr<InOutHelper<Rgb<128,128,128>,300,800>>(),
"cantina"}
};

Preset crystal_out[] = {

{ "WHITE;common", "tracks/Tron.wav",
// Main Blade - Blade is plain without crystal inserted...?
  StylePtr<Layers<
    HumpFlicker<White,SteelBlue,200>,
  // Dim Blade 50% "Power Save" button combo
    EffectSequence<EFFECT_POWERSAVE,
    AlphaL<Black,Int<16384>>,
    AlphaL<Black,Int<0>>>,
  // Clash
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<TransitionEffect<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Moccasin,TrInstant,TrFade<300>,EFFECT_CLASH>,Bump<Scale<BladeAngle<>,Int<25000>,Int<8000>>,Int<18000>>>,TrFade<600>>,EFFECT_CLASH>,
  // Stab - OrangeRed stripes
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrWipeIn<300>,AlphaL<Stripes<5000,1000,Orange,DarkOrange,Rgb<150,60,0>,Rgb<60,30,0>,Rgb<150,14,0>,OrangeRed>,SmoothStep<Int<20000>,Int<20000>>>,TrJoin<TrSmoothFade<900>,TrWipe<700>>>,EFFECT_STAB>,
  // Blast - for white blades
    TransitionEffectL<TrConcat<
    // Impact Flash - BC always
    TrInstant,GreenYellow,TrDelay<25>>,EFFECT_BLAST>,
    // Waves
    BlastL<EffectSequence<EFFECT_BLAST,Red,Green,Blue,Black>,850,250,351>,
    // Impact point afterimage
    AlphaL<TransitionEffectL<TrConcat<TrFade<300>,Red,TrFade<300>>,EFFECT_BLAST>,BlastF<700,250,100000>>,
    // Impact point
    BlastL<Black,300,350,100000>,
  // Lockup - BC custom range mid-blade
    TransitionEffectL<TrConcat<TrInstant,Strobe<GreenYellow,Black,20,30>,TrFade<200>,BrownNoiseFlickerL<AlphaL<White,Int<16000>>,Int<50>>,TrJoinR<TrWipe<200>,TrWipeIn<200>,TrFade<300>>>,EFFECT_LOCKUP_END>,
    LockupTrL<Layers<
      //Random Strobe Flash no dimming
      AlphaL<TransitionLoopL<TrConcat<TrDelayX<Scale<SlowNoise<Int<3000>>,Int<30>,Int<800>>>,Mix<SlowNoise<Int<1000>>,Black,Black,White,Black>,TrDelayX<Scale<SlowNoise<Int<1000>>,Int<10>,Int<50>>>>>,Int<32768>>,
      //AlphaL<White,StrobeF<Scale<SlowNoise<Int<1000>>,Int<1>,Int<3>>,Scale<SlowNoise<Int<1000>>,Int<10>,Int<50>>>>,
      // Bottom Layer Bump - random width
      AlphaL<Blinking<Tomato,Strobe<Yellow,Black,15,30>,60,500>,                                                Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Scale<SlowNoise<Int<3000>>,Int<8000>,Int<18000>>>>,
      // Top Layer Bump - fixed width
      AlphaL<BrownNoiseFlicker<Yellow,Black,50>,                                                                Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Int<10000>>>>,
      // Begin Lockup Transition
      TrConcat<TrInstant,AlphaL<Blinking<White,Strobe<BrownNoiseFlicker<Yellow,Black,500>,Black,15,30>,60,500>, Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Scale<SlowNoise<Int<3000>>,Int<25000>,Int<32000>>>>,TrFade<500>>,
      // End Lockup Transition
      TrSmoothFade<900>,SaberBase::LOCKUP_NORMAL>,
      TransitionEffectL<TrConcat<TrInstant,AlphaL<Strobe<GreenYellow,Black,20,30>,                             Bump<Scale<BladeAngle<5000,28000>,Scale<BladeAngle<8000,16000>,Int<3000>,Int<44000>>,Int<3000>>,Int<15000>>>,TrFade<600>>,EFFECT_LOCKUP_BEGIN>,
    TransitionEffectL<TrConcat<TrInstant,HumpFlickerL<Strobe<AlphaL<White,Int<20000>>,Black,20,30>,30>,TrSmoothFade<250>>,EFFECT_LOCKUP_BEGIN>,
    TransitionEffectL<TrConcat<TrInstant,GreenYellow,TrDelay<25>>,EFFECT_LOCKUP_BEGIN>,
    // Non-Responsive Drag
    LockupTrL<AlphaL<AudioFlicker<BrownNoiseFlicker<Strobe<Black,OrangeRed,20,25>,Yellow,200>,White>,SmoothStep<Int<30000>,Int<2000>>>,TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrFade<150>>,TrColorCycle<1500,-2000,100>,SaberBase::LOCKUP_DRAG>,
  // Lightning Block Non-Responsive    
    LockupTrL<Layers<
        //Random Strobe Flash and 16000 = 50% base blade dimming to make lb pop
        AlphaL<Black,Int<16000>>,
        AlphaL<White,StrobeF<Scale<SlowNoise<Int<1000>>,Int<1>,Int<6>>,Scale<SlowNoise<Int<1000>>,Int<10>,Int<50>>>>,
        AlphaL<RandomFlicker<Strobe<White,Rgb<83,0,255>,50,10>,BrownNoiseFlicker<Rgb<83,0,255>,Black,500>>,LayerFunctions<
        Bump<Scale<SlowNoise<Int<2000>>,Int<3000>,Int<16000>>,Scale<BrownNoiseF<Int<10>>,Int<14000>,Int<8000>>>,
        Bump<Scale<SlowNoise<Int<2300>>,Int<26000>,Int<8000>>,Scale<NoisySoundLevel,Int<5000>,Int<10000>>>,
        Bump<Scale<SlowNoise<Int<2300>>,Int<20000>,Int<30000>>,Scale<IsLessThan<SlowNoise<Int<1500>>,Int<8000>>,Scale<NoisySoundLevel,Int<5000>,Int<0>>,Int<0>>>>>>,
        // Begin Lightning Transition
        TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlicker<Rgb<83,0,255>,Black,500>,TrFade<100>>,
        // End Lightning Transition    
        TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlicker<Rgb<83,0,255>,Black,500>,TrFade<150>,BrownNoiseFlickerL<AlphaL<White,Int<16000>>,Int<50>>,TrJoinR<TrWipe<200>,TrWipeIn<200>,TrFade<400>> >,SaberBase::LOCKUP_LIGHTNING_BLOCK>,
  // Melt    
    LockupTrL<
    AlphaL<Mix<TwistAngle<>,Yellow,RandomPerLEDFlicker<Orange,OrangeRed>,BrownNoiseFlicker<Rgb16<20095,128,128>,Rgb16<35103,8175,298>,150>,StyleFire<Rgb16<20393,93,93>,Red,0,4,FireConfig<0,2000,5>,FireConfig<3000,0,0>,FireConfig<0,4000,0>>>,
    // Melt Shape
    SmoothStep<Scale<TwistAngle<>,Int<24000>,Int<29000>>,Int<2000>>>,
    //Melt Begin and End transitions
    TrConcat<TrInstant,GreenYellow,TrDelay<25>,AlphaL<Black,Int<0>>,TrWipeIn<600>>,TrColorCycle<1500,-2000,100>,SaberBase::LOCKUP_MELT>,
    InOutTrL<TrWipeSparkTip<White,400>,TrWipeInX<WavLen<EFFECT_RETRACTION>>>,
    // On-Demand Battery Level
        AlphaL<TransitionEffectL<TrConcat<TrSmoothFade<500>,AlphaL<Mix<BatteryLevel,Red,Green>,SmoothStep<Scale<BatteryLevel,Int<0>,Int<35000>>,Int<-1>>>,TrDelay<1000>,AlphaL<Mix<BatteryLevel,Red,Green>,SmoothStep<Scale<BatteryLevel,Int<0>,Int<35000>>,Int<-1>>>,TrSmoothFade<1000>>,EFFECT_BATTERY_LEVEL>,Ifon<Int<0>,Int<32768>>>
  >>(),
// Crystal Top
  StylePtr<Black>(),
// Crystal Bottom
  StylePtr<Black>(),
// Led Strips
  StylePtr<Layers<
    Stripes<1000,-2000,HumpFlicker<White,SteelBlue,200>,Black>,
    TransitionEffectL<TrConcat<TrInstant,Blinking<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Orange,20,500>,TrFade<400>>,EFFECT_CLASH>,
    TransitionEffectL<TrConcat<TrInstant,Blinking<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Orange,20,500>,TrFade<400>>,EFFECT_BLAST>,
    LockupTrL<Blinking<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Strobe<Black,Red,15,30>,60,500>,TrConcat<TrInstant,Blinking<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Strobe<BrownNoiseFlicker<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Black,500>,Black,15,30>,60,500>,TrFade<500>>,TrConcat<TrInstant,Blinking<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Strobe<BrownNoiseFlicker<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Black,500>,Black,15,30>,60,500>,TrFade<500>>,SaberBase::LOCKUP_NORMAL>,
    LockupTrL<RandomFlicker<Strobe<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Rgb<60,0,255>,50,10>,BrownNoiseFlicker<Rgb<60,0,255>,Black,500>>,TrConcat<TrInstant,GreenYellow,TrDelay<25>>,TrConcat<TrInstant,GreenYellow,TrDelay<25>,BrownNoiseFlickerL<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Int<50>>,TrFade<500>>,SaberBase::LOCKUP_LIGHTNING_BLOCK>,
    LockupTrL<AudioFlicker<BrownNoiseFlicker<Strobe<Black,OrangeRed,20,25>,Yellow,200>,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>>,TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<400>>,TrColorCycle<1500,-2000,100>,SaberBase::LOCKUP_DRAG>,
    LockupTrL<Pulsing<BrownNoiseFlicker<Red,Black,300>,Yellow,2000>,TrFade<300>,TrFade<300>,SaberBase::LOCKUP_MELT>,
    InOutTrL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrSmoothFade<1000>>,TrConcat<TrSmoothFade<500>,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrInstant>,ColorCycle<White,10,30,Black,100,3000,1>>
  >>(),
// Arc Reactor
  StylePtr<Layers<Black,
    Pulsing<AlphaL<BrownNoiseFlicker<White,SteelBlue,10>,Int<16000>>,BrownNoiseFlicker<White,SteelBlue,200>,1500>,
    TransitionEffectL<TrConcat<TrFade<600>,RandomFlicker<RotateColorsX<Variation,Red>,RotateColorsX<Variation,Rgb<90,0,0>>>,TrDelay<3000>,RotateColorsX<Variation,Red>,TrFade<800>>,EFFECT_FORCE>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<400>>,EFFECT_CLASH>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<400>>,EFFECT_BLAST>,
    LockupL<AudioFlicker<BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,Blue>,AudioFlicker<Yellow,SteelBlue>,Int<32768>,Int<32768>,Int<32768>>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<500>>,EFFECT_LOCKUP_END>,
    TransitionEffectL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrFade<500>>,EFFECT_DRAG_END>,
    InOutTrL<TrConcat<TrInstant,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrSmoothFade<1000>>,TrConcat<TrSmoothFade<500>,BrownNoiseFlicker<Rgb<255,150,0>,Black,50>,TrSmoothFade<500>>,Pulsing<Rgb<70,70,70>,Rgb<20,20,20>,2000>>
  >>(),
// Speaker 3mm White LED Data NA Power 6
  StylePtr<Layers<
    Blinking<Black,White,1500,500>,
    InOutTrL<TrInstant,TrInstant,Sequence<White,Black,200,30,0b0,0b10101010101000>>
  >>(),
// Motor Data NA Power 5
  StylePtr<Black>(),
"root\ncore"}

};

BladeConfig blades[] = {
 { 700, // clean ID resistor value as per Serial Monitor (blue)
// Main Blade 122 LEDs Data 3 Power 2&3
    WS281XBladePtr<122, blade3Pin, Color8::GRB, PowerPINS<bladePowerPin2, bladePowerPin3> >(),
// Crystals - 2 discrete blades for the 2 LEDS Data 1 Power 4
    SubBlade(1, 1, WS281XBladePtr<2, bladePin, Color8::GRB, PowerPINS<bladePowerPin4> >()),
    SubBlade(0, 0, NULL),
// LED strip (parallel w/ 2nd strip) and Arc reactor 1 LEDs Data 2 Power 6
    SubBlade(1, 6, WS281XBladePtr<7, blade2Pin, Color8::GRB, PowerPINS<bladePowerPin6> >()),
    SubBlade(0, 0, NULL),
// Speaker 3mm White LED Data NA Power 1
    SimpleBladePtr<CreeXPE2WhiteTemplate<0>, NoLED, NoLED, NoLED, bladePowerPin1, -1, -1, -1>(),
// Motor Data NA Power 5
    SimpleBladePtr<CreeXPE2WhiteTemplate<0>, NoLED, NoLED, NoLED, bladePowerPin5, -1, -1, -1>(),
 CONFIGARRAY(crystal), "01_clean_save", }, 


 {830, // cracked ID resistor value as per Serial Monitor (red)
// Main Blade 122 LEDs Data 3 Power 2&3
    WS281XBladePtr<122, blade3Pin, Color8::GRB, PowerPINS<bladePowerPin2, bladePowerPin3> >(),
// Crystals - 2 discrete blades for the 2 LEDS Data 1 Power 4
    SubBlade(1, 1, WS281XBladePtr<2, bladePin, Color8::GRB, PowerPINS<bladePowerPin4> >()),
    SubBlade(0, 0, NULL),
// LED strip (parallel w/ 2nd strip) and Arc reactor 1 LEDs Data 2 Power 6
    SubBlade(1, 6, WS281XBladePtr<7, blade2Pin, Color8::GRB, PowerPINS<bladePowerPin6> >()),
    SubBlade(0, 0, NULL),
// Speaker 3mm White LED Data NA Power 1
    SimpleBladePtr<CreeXPE2WhiteTemplate<0>, NoLED, NoLED, NoLED, bladePowerPin1, -1, -1, -1>(),
// Motor Data NA Power 5
    SimpleBladePtr<CreeXPE2WhiteTemplate<0>, NoLED, NoLED, NoLED, bladePowerPin5, -1, -1, -1>(),
 CONFIGARRAY(crystal), "02_cracked_save", }, 



 { NO_BLADE,
 // Main Blade 122 LEDs Data 3 Power 2&3 (orange)
    WS281XBladePtr<122, blade3Pin, Color8::GRB, PowerPINS<bladePowerPin2, bladePowerPin3> >(),
// Crystals - 2 discrete blades for the 2 LEDS Data 1 Power 4
    SubBlade(1, 1, WS281XBladePtr<2, bladePin, Color8::GRB, PowerPINS<bladePowerPin4> >()),
    SubBlade(0, 0, NULL),
// LED strip (parallel w/ 2nd strip) and Arc reactor 1 LEDs Data 2 Power 6
    SubBlade(1, 6, WS281XBladePtr<7, blade2Pin, Color8::GRB, PowerPINS<bladePowerPin6> >()),
    SubBlade(0, 0, NULL),
// Speaker 3mm White LED Data NA Power 1
    SimpleBladePtr<CreeXPE2WhiteTemplate<0>, NoLED, NoLED, NoLED, bladePowerPin1, -1, -1, -1>(),
// Motor Data NA Power 5
    SimpleBladePtr<CreeXPE2WhiteTemplate<0>, NoLED, NoLED, NoLED, bladePowerPin5, -1, -1, -1>(),
 CONFIGARRAY(crystal_out), "03_crystal_out_save" },
};

};
#endif
 
#ifdef CONFIG_BUTTONS
Button PowerButton(BUTTON_POWER, powerButtonPin, "pow");
Button AuxButton(BUTTON_AUX, auxPin, "aux");
#endif
1 Like

Yup, it’s just a small 3mm 2.2v 20mA one.
I think battery positive terminal might actually be easier to wire in this specific chassis so I might do just that.

Oh good suggestion! Aesthetically I still need all the pins in that connector, but not dragging a GND/BATT- over could possibly free up some space to bump the gauge on the main blade power wires.

Power sharing? As in to get more conductor for the power? am I understanding this correctly?
I was planning on giving the blade power at least it’s own 22AWG wire and motor it’s own.
And in general making all connections as close to the battery as possible and avoiding splices.
Guess it won’t hurt to have a bridge at the pins.

 

Yes! This definitely helps. Looks to be the same build – speaker LED, accent strips, motor and all.
This is pretty much exactly what I’m going for here! That’s a great jumping off point.

Gave me an idea to move the “Arc reactor” pixel as a SubBlade at the end of the accent LED strips since they’re both WS281. Lets the main blade data be a straight run from the board to the pins and on to the blade.
I’ll try to go for ExternalPullupBladeID, but if low on space SnapshotBladeID sounds like a good backup as well.

Again, thanks a lot for the help.

I just mean that both things that are using the + lead would share connection pins. I’m not sure what the other red wire goes to, but I doubt it would draw as much power as the blade, so essentially you would allow for more current going to the blade by bonding the two together.

1 Like