-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path_2_Loop.ino
140 lines (119 loc) · 3.24 KB
/
_2_Loop.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
void loop() {
// calculateRPM();
// noInterrupts();
// Serial.println(wheelRPM);
// interrupts();
// delay(50);
if (Serial.available() > 0) {
char newState = Serial.read();
if (newState != '\n') {
state = newState;
Serial.print("State: ");
Serial.println(state);
}
}
switch (state) {
case STATE_BALANCING:
//idk lol
Serial.println("balancing");
break;
case STATE_RISING:
// Do something here, like delay
// delay(500);
// state = STATE_BALANCING;
Serial.println("rising");
break;
case STATE_CHARGING:
Serial.println("charging");
break;
case STATE_BRAKING:
analogWrite(pinMotorEnable, 0);
digitalWrite(pinMotorDir1, LOW);
digitalWrite(pinMotorDir2, LOW);
brakeServo.write(servoBrakePos);
Serial.println("braking");
break;
case STATE_IDLE:
// Set motor to 0
analogWrite(pinMotorEnable, 0);
digitalWrite(pinMotorDir1, LOW);
digitalWrite(pinMotorDir2, LOW);
brakeServo.write(servoRestPos);
Serial.println("idling");
break;
case STATE_FLIP_FORWARD:
if (abs(wheelRPM) < RPM_TO_BRAKE_FORWARD) {
digitalWrite(pinMotorDir1, LOW);
digitalWrite(pinMotorDir2, HIGH);
analogWrite(pinMotorEnable, 255);
} else {
state = STATE_BRAKING;
}
Serial.println(wheelRPM);
break;
case STATE_FLIP_BACKWARD:
if (abs(wheelRPM) < RPM_TO_BRAKE_BACKWARD) {
digitalWrite(pinMotorDir1, HIGH);
digitalWrite(pinMotorDir2, LOW);
analogWrite(pinMotorEnable, 255);
} else {
state = STATE_BRAKING;
}
Serial.println(wheelRPM);
break;
case STATE_POTENTIOMETER:
int potValue = analogRead(A0); // Read potentiometer value
int pwmOutput = map(potValue, 0, 1023, -255 , 255); // Map the potentiometer value from 0 to 255
if (pwmOutput < 0) {
digitalWrite(pinMotorDir1, LOW);
digitalWrite(pinMotorDir2, HIGH);
} else {
digitalWrite(pinMotorDir1, HIGH);
digitalWrite(pinMotorDir2, LOW);
}
Serial.print(wheelRPM);
Serial.print(" ");
Serial.print(pwmOutput);
Serial.println();
analogWrite(pinMotorEnable, abs(pwmOutput)); // Send PWM signal to L298N Enable pin
// Serial.println("flip charging");
break;
default:
// Set motor to 0
analogWrite(pinMotorEnable, 0);
digitalWrite(pinMotorDir1, LOW);
digitalWrite(pinMotorDir2, LOW);
brakeServo.write(servoRestPos);
Serial.println("idling");
break;
}
// Serial.println("loop");
delay(50);
}
//
// Main state update loop using a 20 Hz interrupt 50 ms delta time
//
ISR(TIMER1_OVF_vect) {
prevMicros = currMicros;
currMicros = micros();
// Serial.print("Update Delta: ");
// Serial.println(currMicros - prevMicros);
getWheelRPM();
getIMUValues();
// if (state == STATE_BALANCING) {
// // balance calculations
//
// } else if (state == STATE_CHARGING) {
//
// if (wheelRPM > RPM_TO_BRAKE) {
// // Set rpm to 0
// // brake
// state = STATE_RISING;
// }
//
// } else if (state == STATE_IDLE) {
// // idle
//
// }
TCNT1 = 53150;
}