-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathnerf-select-fire.ino
109 lines (94 loc) · 5.96 KB
/
nerf-select-fire.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*----------------------------------------------------------------------*
* nerf-select-fire v1.0 *
* Monty Choy, Nov 2017 *
* *
* Arduino sketch for saftey, single shot, three round burst, and full *
* auto. Schematics can also be found in the repository. *
*----------------------------------------------------------------------*/
#include <Button.h> //library to deal with buttons easier
//pins
#define IR_GATE_PIN 0 //analog input
#define TOGGLE_FIRE_MODES_BTN_PIN 7 //digital inpit
#define TRIGGER_PIN 11 //digital input
#define DART_COUNTER_SWITCH_PIN 4 //digital input
#define MOTOR_OUTPUT_PIN 3 //digital output
//for buttons/switches
#define PULLUP true //internal pullup, so we dont need to wire resistor
#define INVERT true //invert required for proper readings with pullup
#define DEBOUNCE_MS 20 //check btn time every 20ms
#define IR_GATE_TRIP 90 //'trip' value for IR gate
//code for fire modes. 4 modes total
#define SAFETY 0 //SAFTEY is mode 0
#define SINGLE_FIRE 1 //singe fire is mode 1
#define BURST_FIRE 2 //burst fire is mode 2
#define FULL_AUTO 3 //full auto is mode 3
byte fireMode = 0; //keep track of fire modes.
byte dartsFired = 0; //keep track of how many darts fire
bool isCheckingForDartsFired = false; //some modes need to check if a certain number of darts to fire
Button trigger (TRIGGER_PIN, PULLUP, INVERT, DEBOUNCE_MS); //trigger button, using the library
Button dartCountingSwitch (DART_COUNTER_SWITCH_PIN, PULLUP, INVERT, DEBOUNCE_MS); //dart counting button, using the library
Button toggleFireModesBtn (TOGGLE_FIRE_MODES_BTN_PIN, PULLUP, INVERT, DEBOUNCE_MS); //toggle fire modes button, using the librarys
void setup () {
pinMode(MOTOR_OUTPUT_PIN, OUTPUT); //set motor output pin to an output pin
digitalWrite(MOTOR_OUTPUT_PIN, LOW); //make sure motor is off
resetDartsFired(); //reset all dart firing values so they dont get messed up later
}
void loop () {
toggleFireModes(); //constantly check for changes in firemodes
fire(); //constantly check if dart is fired
checkForDartsFired(); //do stuff if dart is fired
selectFire(); //do fancy select-fire stuff
}
//switch between the various modes
void toggleFireModes () {
toggleFireModesBtn.read(); //read button
if (toggleFireModesBtn.wasPressed()) { //check if it was pressed
fireMode = ((fireMode == 3) ? 0 : fireMode + 1); //increment fireMode
resetDartsFired(); //reset darts fired stuff so it doesn't get messed up later
}
}
//when dart fired
void fire() {
dartCountingSwitch.read(); //read button
dartsFired += ( (isCheckingForDartsFired && //detect and keep track if dart is fired through
( (map(analogRead(IR_GATE_PIN), 0, 1023, 0, 100) > IR_GATE_TRIP) || //switch or IR gate.
dartCountingSwitch.wasPressed()) )
? 1 : 0);
}
void checkForDartsFired () {
if (isCheckingForDartsFired && //if checking for darts being fired. Not all
(fireMode == SINGLE_FIRE || fireMode == BURST_FIRE)) { // modesneed to check if a dart is fired
byte dartsToFire = (fireMode == SINGLE_FIRE ? 1 : 3); //determine max amounts of darts to be fired
if (dartsFired < dartsToFire) { //if can still fire (hasn't reached threshold of
digitalWrite(MOTOR_OUTPUT_PIN, HIGH); //how many darts can fire), power pusher motor
} else if (dartCountingSwitch.isPressed() && //if can't fire anymore darts and pusher
dartsFired >= dartsToFire) { //retracted
resetDartsFired(); //Reset darts fired stuff so it can happen again
}
}
}
//do all the fancy select fire stuff
void selectFire () {
trigger.read(); //read trigger
if (trigger.isPressed()) { //check of trigger is pressed
if (fireMode == SAFETY) { //if in safety mode, turn off motor
digitalWrite(MOTOR_OUTPUT_PIN, LOW);
} else if (fireMode == SINGLE_FIRE || fireMode == BURST_FIRE) { //if in burst fire or single shot mode
isCheckingForDartsFired = true; //allow for darts to be fired, handled elsewhere
} else if (fireMode == FULL_AUTO) { //if full auto turn on motor
digitalWrite(MOTOR_OUTPUT_PIN, HIGH);
}
} else if (!trigger.isPressed()) { //if trigger isn't pressed
if (fireMode == FULL_AUTO || fireMode == SAFETY) { //if firemode is fullauto or safety, turn off motor
digitalWrite(MOTOR_OUTPUT_PIN, LOW);
} else if ( !isCheckingForDartsFired //if all darts fired
&& (fireMode == SINGLE_FIRE || fireMode == BURST_FIRE) ) { //and in burstfire
resetDartsFired(); //reset darts fired stuff
}
}
}
void resetDartsFired () {
digitalWrite(MOTOR_OUTPUT_PIN, LOW); //turn of motor
dartsFired = 0; //darts fired set to 0
isCheckingForDartsFired = false; //no longer checking if darts are being fired
}