Nick Winz
Created April 18, 2018

Smart Nerf Blaster

A modded rapidstrike with ammo counter, select fire, chrono, and remote fire

AdvancedWork in progress6 hours45
Smart Nerf Blaster

Things used in this project

Hardware components

PIR Motion Sensor (generic)
PIR Motion Sensor (generic)
×1
Photon
Particle Photon
×2
Power MOSFET N-Channel
Power MOSFET N-Channel
×3
IR LED and IR sensor
×1
Fang 2.0 motors
×2
Mieshel 2.0 motors
×1
4xAA battery holder
4xAA battery holder
×1
Jumper wires (generic)
Jumper wires (generic)
×1
18 Gauge Silicone Wire
×1
2s LiPo Battery
×1
LCD Screen
×1
3 Position Switch
×1

Software apps and online services

SmartBlaster
TripWire

Hand tools and fabrication machines

Dremmel Tool
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Schematics

Original Circuit Diagram

Code

SmartBlaster

C/C++
the current version of the code meant to control the blaster photon.
SYSTEM_THREAD(ENABLED);
// set all variables
// IR dart sensors
int sens1 = D7;
int sens2 = D6;
// remote firing controls
int PWM = D5;
int Pusher = D4;
int F1 = D3;
int F2 = D2;
int ManualFire = D1;
int Fmode = 1;
int Rev = A4;
int FireCommand = 0;
// variables for velocity calcs and Ammo counter
int Darts = 0;
float t1 = 0;
float t2 = 0;
float dt = 1;
float Distance = 5;
float Vdarts = 0;
int Mag = 25;
double Reload = A5;
float Darts0 = 0;
// code for sensor interupts
void Sensor1(void);
void Sensor2(void);
void FireSet(const char *event, const char *data);


void setup() {
 pinMode(sens1, INPUT);
 pinMode(sens2, INPUT);
 pinMode(PWM, OUTPUT);
 pinMode(Pusher, OUTPUT);
 pinMode(F1, INPUT);
 pinMode(F2, INPUT);
 pinMode(Rev, OUTPUT);
 pinMode(Reload, INPUT);
 pinMode(ManualFire, INPUT);
}

void loop() {
// subscribe to recieve FireCommand
Particle.subscribe("FireCommand1", FireSet, MY_DEVICES);
    
// sensor 1 controls and ammo counter
attachInterrupt(sens1, Sensor1, FALLING);


// sensor 2 controls and velocity calc
attachInterrupt(sens2, Sensor2, FALLING);

// reload detection
if ( Reload = 1 ) {
    Mag = 25;
}



// fire mode selection
if (F1 == HIGH) {
    Fmode = 1;
}
else if (F2 == HIGH){
    Fmode = 2;
}
else {
    Fmode = 3;
}

// manual activation of remote fire feature
if (ManualFire == HIGH){
    FireCommand = 1;
}

// remote firing
// single fire
if ( FireCommand == 1 ) {
    if ( Fmode == 1 ) {
        int Fire = 1;
        Darts0 = Darts;
        digitalWrite(Rev, HIGH);
        delay(250);
        while ( Darts < Darts0 + Fire ) {
            digitalWrite(Pusher, HIGH);
            // stop if mag is empty
            if (Mag <= 0){
                 FireCommand = 0;
            }
        }
        // stop and spin down
        digitalWrite(Rev, LOW);
        digitalWrite(Pusher, LOW);
        FireCommand = 0;
    }
    // 3 round burst
    else if ( Fmode == 2 ){
        int Fire = 3;
        Darts0 = Darts;
        digitalWrite(Rev, HIGH);
        delay(250);
        while ( Darts < Darts0 + Fire ) {
            digitalWrite(Pusher, HIGH);
            // stop if mag is empty
            if (Mag <= 0){
                 FireCommand = 0;
            }
        }
        // stop and spin down
        digitalWrite(Rev, LOW);
        digitalWrite(Pusher, LOW);
        FireCommand = 0;
    }
    // full auto
    else {
        digitalWrite(Rev, HIGH);
        delay(250);
        while ( FireCommand == 1 ) {
            digitalWrite(Pusher, HIGH);
            // stop if mag is empty
            if (Mag <= 0){
                 FireCommand = 0;
            }
        }
        // stop and spin down
        digitalWrite(Rev, LOW);
        digitalWrite(Pusher, LOW);
    }
    Particle.publish("TripwireReset", "Reset", 60, PRIVATE);
}
    
// PWM



}

void Sensor1()
{
 t1 = millis();
  Darts = Darts + 1;
  Mag = Mag - 1;
}

void Sensor2()
{
  t2 = millis();
  dt = t1 - t2;
  Vdarts = Distance / dt;
}
void FireSet(const char *event, const char *data) {
    if (data == "Fire") {
        FireCommand = 1;
    } 
    else {
        FireCommand = 0;
    }
}

Tripwire

C/C++
the current version of the code meant to run the tripwire photon
SYSTEM_THREAD(ENABLED);
// declare variables
int tripwire = D4;
int fire = 0;
void TripwireReset(const char *event, const char *data);
int Reset = 1;


void setup() {
 pinMode(tripwire, INPUT);
}

void loop() {
    Particle.subscribe("TripwireReset", TripwireReset, MY_DEVICES);
if (Reset == 1) {
        if (tripwire == RISING) {
            Particle.publish("FireCommand1", "Fire", 60, PRIVATE);
            Reset = 0;
        
            //delay(1500);
         // Particle.publish("FireCommand1", "Stop", 60, PRIVATE);
         }
else {
    Particle.publish("FireCommand1", "Stop", 60, PRIVATE);
}
}
}

void TripwireReset(const char *event, const char *data) {
        Reset = 1;
}

Credits

Nick Winz

Nick Winz

1 project • 0 followers
Thanks to Grayson Ward.

Comments