-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblaster.ino
159 lines (127 loc) · 2.75 KB
/
blaster.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <math.h>
#define firePin A3
#define triggerPin 13
#define flywheelPin 12
#define fireRate 650
enum FireState
{
Full = 0,
Burst = 1,
Single = 2
};
struct Motor
{
public:
unsigned int in1;
unsigned int in2;
unsigned int pwm;
unsigned int stby;
};
int triggerIn;
int flywheelIn;
bool isShooting;
Motor triggerMotor;
Motor flywheelMotor;
FireState fireState;
unsigned int timeModifier;
unsigned long previousTime;
void initMotor(Motor* motor, unsigned int in1, unsigned int in2, unsigned int pwm, unsigned int stby)
{
motor->in1 = in1;
motor->in2 = in2;
motor->pwm = pwm;
motor->stby = stby;
pinMode(motor->in1, INPUT);
pinMode(motor->in2, INPUT);
pinMode(motor->pwm, INPUT);
pinMode(motor->stby, INPUT);
}
void setup() {
pinMode(firePin, INPUT);
pinMode(triggerPin, INPUT);
pinMode(flywheelPin, INPUT);
triggerIn = 0;
flywheelIn = 0;
isShooting = false;
initMotor(&triggerMotor, 11, 10, 9, 8);
initMotor(&flywheelMotor, 4, 5, 6, 7);
fireState = Single;
timeModifier = 1;
previousTime = 0;
//Serial.begin(9600);
}
void manageFireState()
{
int state = round(3 * analogRead(firePin))/ 1023;
if(state == 0)
{
fireState = Single;
timeModifier = 1;
}
else if(state == 1)
{
fireState = Burst;
timeModifier = 3;
}
else if(state == 2)
{
fireState = Full;
timeModifier = 1;
}
}
void motorDrive(Motor* motor, bool motorDirection, int motorSpeed = 255)
{
bool pinIn1;
//Clockwise: In1 = HIGH and In2 = LOW
//Counter-Clockwise: In1 = LOW and In2 = HIGH
if (motorDirection)
pinIn1 = HIGH;
else
pinIn1 = LOW;
digitalWrite(motor->in1, pinIn1);//drive motors
digitalWrite(motor->in2, !pinIn1);
analogWrite(motor->pwm, motorSpeed);//speed
digitalWrite(motor->stby, HIGH);
}
void motorStop(Motor* motor)
{
digitalWrite(motor->in1, LOW);
digitalWrite(motor->in2, LOW);
}
void motorBrake(Motor* motor)
{
analogWrite(motor->pwm, 0);
digitalWrite(motor->stby, LOW);
}
void loop() {
int previousState = triggerIn;
triggerIn = digitalRead(triggerPin);
flywheelIn = digitalRead(flywheelPin);
manageFireState();
unsigned long currentTime = millis();
if(flywheelIn == HIGH && previousState == LOW && triggerIn == HIGH)
{
isShooting = true;
previousTime = currentTime;
}
if(isShooting && (currentTime - previousTime) >= fireRate * timeModifier)
{
if(fireState == Full)
{
if(triggerIn == LOW)
isShooting = false;
else
previousTime = currentTime;
}
else
isShooting = false;
}
if(flywheelIn == HIGH)
motorDrive(&flywheelMotor, true);
else
motorBrake(&flywheelMotor);
if(isShooting)
motorDrive(&triggerMotor, true);
else
motorStop(&triggerMotor);
}