-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmazeslolver.ino
More file actions
214 lines (176 loc) · 6.25 KB
/
Copy pathmazeslolver.ino
File metadata and controls
214 lines (176 loc) · 6.25 KB
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
// ===================================================================================
// FINAL MAZE SOLVER (Handling '0' Error as Clear Path)
// ===================================================================================
// --- 1. HARDWARE PINS ---
// Right Motor
#define ENA 5
#define IN1 4
#define IN2 7
// Left Motor
#define ENB 6
#define IN3 8
#define IN4 12
// Sensors
#define TRIG_L A0
#define ECHO_L A1
#define TRIG_F A2
#define ECHO_F A3
#define TRIG_R A4
#define ECHO_R A5
// --- 2. SETTINGS (Tuned for your Maze) ---
// Distances
#define TARGET_DIST 15 // Koshish karo k Left wall se 18cm door raho
#define WALL_THRESHOLD 90 // Agar faasla 80cm se barh jaye, tab hi Turn lena
#define FRONT_STOP 15 // Samne rukne ka faasla
// Speeds (L298N Voltage Drop Compensated)
#define BASE_SPEED 90 // Seedha chalne ki speed
#define TURN_SPEED 70 // Turn lene ki speed (Thori tez taake phans na jaye)
#define MAX_SPEED 90
// PID Variables
float Kp = 4.0;
float Kd = 14.0;
float lastError = 0;
// Variables
int distL, distF, distR;
// State Machine
enum RobotState {
PID_WALL_FOLLOW,
CHECK_INTERSECTION
};
RobotState currentState = PID_WALL_FOLLOW;
void setup() {
Serial.begin(9600);
// Pins Setup
pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(TRIG_L, OUTPUT); pinMode(ECHO_L, INPUT);
pinMode(TRIG_F, OUTPUT); pinMode(ECHO_F, INPUT);
pinMode(TRIG_R, OUTPUT); pinMode(ECHO_R, INPUT);
Serial.println("Robot Ready! Place inside Maze...");
delay(2000); // 2 Second ka time taake aap hath hata lein
}
void loop() {
readAllSensors(); // Sensors parho
switch (currentState) {
// --- STATE 1: SEEDHA CHALO (WALL FOLLOW) ---
case PID_WALL_FOLLOW:
// 1. Agar Samne Rasta Band Hai (15cm se qareeb) -> Ruk jao
if (distF < FRONT_STOP) {
stopMotors();
currentState = CHECK_INTERSECTION;
}
// 2. Agar Left par Rasta Khul Gya (Gap agya)
// (Yahan '0' wala masla solve hoga. Agar 0 aya to distL=200 hoga, jo 35 se bara hai)
else if (distL > WALL_THRESHOLD) {
moveForward(); // Thora aagay jao
delay(400); // Intersection k beech mein anay ka time
stopMotors();
currentState = CHECK_INTERSECTION;
}
// 3. Normal Deewar k sath sath chalo
else {
runPID();
}
break;
// --- STATE 2: FAISLA KARO (LSRB Logic) ---
case CHECK_INTERSECTION:
readAllSensors(); // Dobara check karo
char turn = decideTurn();
performTurn(turn);
currentState = PID_WALL_FOLLOW; // Wapis chalna shuru karo
break;
}
}
// ===================================================================================
// SENSOR READING (Error Handling Logic)
// ===================================================================================
void readAllSensors() {
distL = getDistance(TRIG_L, ECHO_L);
delay(5); // Crosstalk delay
distF = getDistance(TRIG_F, ECHO_F);
delay(5);
distR = getDistance(TRIG_R, ECHO_R);
// Serial Monitor par dekhein
Serial.print("L:"); Serial.print(distL);
Serial.print(" F:"); Serial.print(distF);
Serial.print(" R:"); Serial.println(distR);
}
int getDistance(int trig, int echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo, HIGH, 12000); // Timeout (~200cm)
int cm = duration * 0.034 / 2;
// *** YE HAI ASAL FIX ***
// Agar sensor ko kuch na mile (0), to samjho rasta saaf hai (200cm)
if (cm == 0) return 200;
return cm;
}
// ===================================================================================
// PID LOGIC (Smooth Wall Following)
// ===================================================================================
void runPID() {
// Target (18) - Actual (e.g. 22) = -4
float error = TARGET_DIST - distL;
// Error Limit
if (error < -12) error = -12;
if (error > 12) error = 12;
float P = Kp * error;
float D = Kd * (error - lastError);
float correction = P + D;
lastError = error;
int leftSpeed = BASE_SPEED + correction;
int rightSpeed = BASE_SPEED - correction;
leftSpeed = constrain(leftSpeed, 0, MAX_SPEED);
rightSpeed = constrain(rightSpeed, 0, MAX_SPEED);
move(leftSpeed, rightSpeed);
}
// ===================================================================================
// NAVIGATION DECISION (Left Hand Rule)
// ===================================================================================
char decideTurn() {
if (distL > WALL_THRESHOLD) return 'L'; // Left Open
else if (distF > FRONT_STOP) return 'S'; // Front Open
else if (distR > WALL_THRESHOLD) return 'R'; // Right Open
else return 'B'; // Dead End (U-Turn)
}
// ===================================================================================
// MOTORS MOVEMENT
// ===================================================================================
void move(int leftSpeed, int rightSpeed) {
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); analogWrite(ENB, leftSpeed);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, rightSpeed);
}
void stopMotors() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); analogWrite(ENA, 0);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); analogWrite(ENB, 0);
delay(200);
}
void moveForward() {
move(BASE_SPEED, BASE_SPEED);
}
void performTurn(char turn) {
switch(turn) {
case 'L': // Left Turn
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, TURN_SPEED);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENB, TURN_SPEED);
delay(300); // Check 90 degree turn
break;
case 'R': // Right Turn
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); analogWrite(ENA, TURN_SPEED);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); analogWrite(ENB, TURN_SPEED);
delay(300);
break;
case 'B': // U-Turn
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); analogWrite(ENA, TURN_SPEED);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENB, TURN_SPEED);
delay(250);
break;
case 'S': // Straight
moveForward();
delay(300);
break;
}
stopMotors();
delay(100);
}