Hi guys
My little brother is making an obstacle detecting robot car for his class, but unfortunately his teacher isn’t helpful at all. I’ve never made something like this before but doing some research I found some code that may work and used Microsoft Copilot to help. We are using the Arduino Elegoo starter kit.
Could you guys help out and let me know if the code might actually work?
#include <NewPing.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// -------------------------
// LCD Setup
// -------------------------
LiquidCrystal_I2C lcd(0x27, 16, 2);
// -------------------------
// Motor pins
// -------------------------
const int LeftMotorForward = 2;
const int LeftMotorBackward = 3;
const int RightMotorForward = 4;
const int RightMotorBackward = 5;
// -------------------------
// Ultrasonic sensor pins
// -------------------------
#define trig_pin A1
#define echo_pin A2
#define maximum_distance 200
// -------------------------
// Globals
// -------------------------
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance);
Servo servo_motor;
// -------------------------
// Setup
// -------------------------
void setup() {
// Motor pins
pinMode(RightMotorForward, OUTPUT);
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
// Servo
servo_motor.attach(8);
servo_motor.write(90); // center
delay(800);
// LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Robot Starting");
delay(1000);
distance = readPing();
}
// -------------------------
// Main Loop
// -------------------------
void loop() {
int distanceRight = 0;
int distanceLeft = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist: ");
lcd.print(distance);
lcd.print(" cm");
if (distance <= 20) {
lcd.setCursor(0, 1);
lcd.print("Obstacle!");
moveStop();
delay(200);
moveBackward();
lcd.setCursor(0, 1);
lcd.print("Backing Up ");
delay(350);
moveStop();
delay(200);
distanceRight = lookRight();
distanceLeft = lookLeft();
if (distanceRight >= distanceLeft) {
lcd.setCursor(0, 1);
lcd.print("Turning Right");
turnRight();
} else {
lcd.setCursor(0, 1);
lcd.print("Turning Left ");
turnLeft();
}
moveStop();
}
else {
lcd.setCursor(0, 1);
lcd.print("Forward ");
moveForward();
}
distance = readPing();
delay(50);
}
// -------------------------
// Look Right
// -------------------------
int lookRight() {
servo_motor.write(40);
delay(350);
int dist = readPing();
servo_motor.write(90);
delay(150);
return dist;
}
// -------------------------
// Look Left
// -------------------------
int lookLeft() {
servo_motor.write(140);
delay(350);
int dist = readPing();
servo_motor.write(90);
delay(150);
return dist;
}
// -------------------------
// Read Ultrasonic Sensor
// -------------------------
int readPing() {
int cm = sonar.ping_cm();
if (cm == 0) cm = 250; // treat no reading as "very far"
return cm;
}
// -------------------------
// Movement Functions
// -------------------------
void moveStop() {
digitalWrite(RightMotorForward, LOW);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(LeftMotorBackward, LOW);
}
void moveForward() {
if (!goesForward) {
goesForward = true;
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
}
void moveBackward() {
goesForward = false;
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorForward, LOW);
}
void turnRight() {
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
delay(450);
moveStop();
}
void turnLeft() {
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorForward, HIGH);
delay(450);
moveStop();
}