-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrobot_car.ino
More file actions
398 lines (324 loc) · 10.5 KB
/
robot_car.ino
File metadata and controls
398 lines (324 loc) · 10.5 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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
/*
* ESP32 Robot Car with Bluetooth Control
*
* Controls a 4-motor robot car using:
* - ESP32 microcontroller
* - HC-06 Bluetooth module
* - 2x BTS7960 motor drivers (left and right)
* - 4x 12V 500 RPM DC gear motors
*
* Command Protocol:
* Movement: F (Forward), B (Back), L (Left), R (Right)
* G (Forward Left), 1 (Forward Right)
* H (Back Left), J (Back Right), S (Stop)
* Speed: 0-9 (0-90% in 10% steps), q (100%), D (Stop All)
*/
#include "BluetoothSerial.h"
// Check if Bluetooth is available
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error "Bluetooth is not enabled! Please run `make menuconfig` to enable it"
#endif
// Bluetooth Serial object
BluetoothSerial SerialBT;
// Left Motor Driver Pins (BTS7960)
#define LEFT_L_EN 25
#define LEFT_R_EN 26
#define LEFT_LPWM 27
#define LEFT_RPWM 14
// Right Motor Driver Pins (BTS7960)
#define RIGHT_L_EN 33
#define RIGHT_R_EN 32
#define RIGHT_LPWM 13
#define RIGHT_RPWM 12
// PWM Channel Definitions
#define LEFT_LPWM_CHANNEL 0
#define LEFT_RPWM_CHANNEL 1
#define RIGHT_LPWM_CHANNEL 2
#define RIGHT_RPWM_CHANNEL 3
// PWM Settings
#define PWM_FREQUENCY 1000 // 1 kHz
#define PWM_RESOLUTION 8 // 8-bit (0-255)
// Current speed (0-255, updated by speed commands)
int currentSpeed = 128; // Default to 50% speed
// Current movement state
char currentMovement = 'S'; // S = Stop
void setup() {
// Initialize Serial for debugging
Serial.begin(115200);
Serial.println("ESP32 Robot Car Starting...");
// Initialize Bluetooth
SerialBT.begin("ESP32_RobotCar"); // Bluetooth device name
Serial.println("Bluetooth device is ready to pair!");
Serial.println("Device name: ESP32_RobotCar");
// Configure Left Motor Driver Pins
pinMode(LEFT_L_EN, OUTPUT);
pinMode(LEFT_R_EN, OUTPUT);
pinMode(LEFT_LPWM, OUTPUT);
pinMode(LEFT_RPWM, OUTPUT);
// Configure Right Motor Driver Pins
pinMode(RIGHT_L_EN, OUTPUT);
pinMode(RIGHT_R_EN, OUTPUT);
pinMode(RIGHT_LPWM, OUTPUT);
pinMode(RIGHT_RPWM, OUTPUT);
// Initialize all pins to LOW (motors stopped)
digitalWrite(LEFT_L_EN, LOW);
digitalWrite(LEFT_R_EN, LOW);
digitalWrite(RIGHT_L_EN, LOW);
digitalWrite(RIGHT_R_EN, LOW);
analogWrite(LEFT_LPWM, 0);
analogWrite(LEFT_RPWM, 0);
analogWrite(RIGHT_LPWM, 0);
analogWrite(RIGHT_RPWM, 0);
// Setup PWM channels for ESP32
ledcSetup(LEFT_LPWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION);
ledcSetup(LEFT_RPWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION);
ledcSetup(RIGHT_LPWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION);
ledcSetup(RIGHT_RPWM_CHANNEL, PWM_FREQUENCY, PWM_RESOLUTION);
// Attach PWM channels to pins
ledcAttachPin(LEFT_LPWM, LEFT_LPWM_CHANNEL);
ledcAttachPin(LEFT_RPWM, LEFT_RPWM_CHANNEL);
ledcAttachPin(RIGHT_LPWM, RIGHT_LPWM_CHANNEL);
ledcAttachPin(RIGHT_RPWM, RIGHT_RPWM_CHANNEL);
// Stop all motors initially
stopMotors();
Serial.println("Setup complete! Waiting for Bluetooth commands...");
}
void loop() {
// Check for incoming Bluetooth data
if (SerialBT.available()) {
char command = SerialBT.read();
Serial.print("Received command: ");
Serial.println(command);
// Process the command
processCommand(command);
}
// Small delay to prevent excessive CPU usage
delay(10);
}
void processCommand(char cmd) {
// Convert to uppercase for case-insensitive commands
cmd = toupper(cmd);
switch (cmd) {
// Movement Commands
case 'F': // Forward
moveForward();
currentMovement = 'F';
break;
case 'B': // Backward
moveBackward();
currentMovement = 'B';
break;
case 'L': // Turn Left
turnLeft();
currentMovement = 'L';
break;
case 'R': // Turn Right
turnRight();
currentMovement = 'R';
break;
case 'G': // Forward Left
forwardLeft();
currentMovement = 'G';
break;
case '1': // Forward Right (Note: '1' conflicts with Speed 10% - movement takes precedence)
forwardRight();
currentMovement = '1';
break;
case 'H': // Back Left
backLeft();
currentMovement = 'H';
break;
case 'J': // Back Right
backRight();
currentMovement = 'J';
break;
case 'S': // Stop
stopMotors();
currentMovement = 'S';
break;
// Speed Control Commands
case '0': // Speed 0%
setSpeed(0);
break;
// Note: '1' is used for Forward Right movement
// Speed 10% can be achieved by sending '0' then '2' and adjusting, or use default speed
// Alternative: Use a Bluetooth RC app that sends different codes for speed vs movement
case '2': // Speed 20%
setSpeed(51); // 20% of 255 ≈ 51
break;
case '3': // Speed 30%
setSpeed(77); // 30% of 255 ≈ 77
break;
case '4': // Speed 40%
setSpeed(102); // 40% of 255 ≈ 102
break;
case '5': // Speed 50%
setSpeed(128); // 50% of 255 = 128
break;
case '6': // Speed 60%
setSpeed(153); // 60% of 255 ≈ 153
break;
case '7': // Speed 70%
setSpeed(179); // 70% of 255 ≈ 179
break;
case '8': // Speed 80%
setSpeed(204); // 80% of 255 ≈ 204
break;
case '9': // Speed 90%
setSpeed(230); // 90% of 255 ≈ 230
break;
case 'Q': // Speed 100%
case 'q':
setSpeed(255); // 100% of 255 = 255
break;
case 'D': // Stop All (Emergency Stop)
stopMotors();
currentSpeed = 128; // Reset to default speed
currentMovement = 'S';
Serial.println("Emergency Stop - All motors stopped");
break;
default:
// Unknown command - stop motors for safety
Serial.print("Unknown command: ");
Serial.println(cmd);
stopMotors();
break;
}
}
// Set motor speed (0-255)
void setSpeed(int speed) {
if (speed < 0) speed = 0;
if (speed > 255) speed = 255;
currentSpeed = speed;
Serial.print("Speed set to: ");
Serial.print((speed * 100) / 255);
Serial.println("%");
// Reapply current movement with new speed
if (currentMovement != 'S') {
processCommand(currentMovement);
}
}
// Move Forward - Both sides forward at current speed
void moveForward() {
// Enable both sides
digitalWrite(LEFT_L_EN, HIGH);
digitalWrite(LEFT_R_EN, LOW);
digitalWrite(RIGHT_L_EN, HIGH);
digitalWrite(RIGHT_R_EN, LOW);
// Set PWM for forward direction
ledcWrite(LEFT_LPWM_CHANNEL, currentSpeed);
ledcWrite(LEFT_RPWM_CHANNEL, 0);
ledcWrite(RIGHT_LPWM_CHANNEL, currentSpeed);
ledcWrite(RIGHT_RPWM_CHANNEL, 0);
Serial.println("Moving Forward");
}
// Move Backward - Both sides backward at current speed
void moveBackward() {
// Enable both sides
digitalWrite(LEFT_L_EN, LOW);
digitalWrite(LEFT_R_EN, HIGH);
digitalWrite(RIGHT_L_EN, LOW);
digitalWrite(RIGHT_R_EN, HIGH);
// Set PWM for backward direction
ledcWrite(LEFT_LPWM_CHANNEL, 0);
ledcWrite(LEFT_RPWM_CHANNEL, currentSpeed);
ledcWrite(RIGHT_LPWM_CHANNEL, 0);
ledcWrite(RIGHT_RPWM_CHANNEL, currentSpeed);
Serial.println("Moving Backward");
}
// Turn Left - Right forward, left backward
void turnLeft() {
// Right side forward, left side backward
digitalWrite(LEFT_L_EN, LOW);
digitalWrite(LEFT_R_EN, HIGH);
digitalWrite(RIGHT_L_EN, HIGH);
digitalWrite(RIGHT_R_EN, LOW);
ledcWrite(LEFT_LPWM_CHANNEL, 0);
ledcWrite(LEFT_RPWM_CHANNEL, currentSpeed);
ledcWrite(RIGHT_LPWM_CHANNEL, currentSpeed);
ledcWrite(RIGHT_RPWM_CHANNEL, 0);
Serial.println("Turning Left");
}
// Turn Right - Left forward, right backward
void turnRight() {
// Left side forward, right side backward
digitalWrite(LEFT_L_EN, HIGH);
digitalWrite(LEFT_R_EN, LOW);
digitalWrite(RIGHT_L_EN, LOW);
digitalWrite(RIGHT_R_EN, HIGH);
ledcWrite(LEFT_LPWM_CHANNEL, currentSpeed);
ledcWrite(LEFT_RPWM_CHANNEL, 0);
ledcWrite(RIGHT_LPWM_CHANNEL, 0);
ledcWrite(RIGHT_RPWM_CHANNEL, currentSpeed);
Serial.println("Turning Right");
}
// Forward Left - Right full speed, left reduced speed
void forwardLeft() {
digitalWrite(LEFT_L_EN, HIGH);
digitalWrite(LEFT_R_EN, LOW);
digitalWrite(RIGHT_L_EN, HIGH);
digitalWrite(RIGHT_R_EN, LOW);
// Right side at full speed, left side at reduced speed (50%)
int leftSpeed = currentSpeed / 2;
ledcWrite(LEFT_LPWM_CHANNEL, leftSpeed);
ledcWrite(LEFT_RPWM_CHANNEL, 0);
ledcWrite(RIGHT_LPWM_CHANNEL, currentSpeed);
ledcWrite(RIGHT_RPWM_CHANNEL, 0);
Serial.println("Moving Forward Left");
}
// Forward Right - Left full speed, right reduced speed
void forwardRight() {
digitalWrite(LEFT_L_EN, HIGH);
digitalWrite(LEFT_R_EN, LOW);
digitalWrite(RIGHT_L_EN, HIGH);
digitalWrite(RIGHT_R_EN, LOW);
// Left side at full speed, right side at reduced speed (50%)
int rightSpeed = currentSpeed / 2;
ledcWrite(LEFT_LPWM_CHANNEL, currentSpeed);
ledcWrite(LEFT_RPWM_CHANNEL, 0);
ledcWrite(RIGHT_LPWM_CHANNEL, rightSpeed);
ledcWrite(RIGHT_RPWM_CHANNEL, 0);
Serial.println("Moving Forward Right");
}
// Back Left - Right backward full, left backward reduced
void backLeft() {
digitalWrite(LEFT_L_EN, LOW);
digitalWrite(LEFT_R_EN, HIGH);
digitalWrite(RIGHT_L_EN, LOW);
digitalWrite(RIGHT_R_EN, HIGH);
// Right side backward at full speed, left side backward at reduced speed (50%)
int leftSpeed = currentSpeed / 2;
ledcWrite(LEFT_LPWM_CHANNEL, 0);
ledcWrite(LEFT_RPWM_CHANNEL, leftSpeed);
ledcWrite(RIGHT_LPWM_CHANNEL, 0);
ledcWrite(RIGHT_RPWM_CHANNEL, currentSpeed);
Serial.println("Moving Back Left");
}
// Back Right - Left backward full, right backward reduced
void backRight() {
digitalWrite(LEFT_L_EN, LOW);
digitalWrite(LEFT_R_EN, HIGH);
digitalWrite(RIGHT_L_EN, LOW);
digitalWrite(RIGHT_R_EN, HIGH);
// Left side backward at full speed, right side backward at reduced speed (50%)
int rightSpeed = currentSpeed / 2;
ledcWrite(LEFT_LPWM_CHANNEL, 0);
ledcWrite(LEFT_RPWM_CHANNEL, currentSpeed);
ledcWrite(RIGHT_LPWM_CHANNEL, 0);
ledcWrite(RIGHT_RPWM_CHANNEL, rightSpeed);
Serial.println("Moving Back Right");
}
// Stop All Motors
void stopMotors() {
// Disable all motor drivers
digitalWrite(LEFT_L_EN, LOW);
digitalWrite(LEFT_R_EN, LOW);
digitalWrite(RIGHT_L_EN, LOW);
digitalWrite(RIGHT_R_EN, LOW);
// Set all PWM to 0
ledcWrite(LEFT_LPWM_CHANNEL, 0);
ledcWrite(LEFT_RPWM_CHANNEL, 0);
ledcWrite(RIGHT_LPWM_CHANNEL, 0);
ledcWrite(RIGHT_RPWM_CHANNEL, 0);
Serial.println("Motors Stopped");
}