#include <Servo.h>
#include <DCMotor.h>
#define SERVORIGHT 50
#define SERVOCENTRE 100
#define SERVOLEFT 150
#define SERVOPIN 4
Servo servo;
#define TRIGPIN 2
#define ECHOPIN 3
DCMotor motors(6,7,8,255,9,10,11,255);
int ping()
{
delay(50);
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
long duration = pulseIn(ECHOPIN, HIGH);
unsigned int centimetres = int(duration / 2 / 29.1);
return centimetres;
}
char scan()
{
unsigned int left_scan, centre_scan, right_scan;
char choice;
servo.write(SERVOLEFT);
delay(300);
left_scan = ping();
servo.write(SERVORIGHT);
delay(600);
right_scan = ping();
servo.write(SERVOCENTRE);
delay(300);
centre_scan = ping();
if (left_scan>right_scan && left_scan>centre_scan)
{
choice = 'l';
}
else if (right_scan>left_scan && right_scan>centre_scan)
{
choice = 'r';
}
else
{
choice = 'c';
}
return choice;
}
void setup()
{
servo.attach(SERVOPIN);
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
}
void loop()
{
unsigned int distance = ping();
if (distance < 50 && distance > 0)
{
if (distance < 10)
{
motors.backward();
delay(300);
motors.left();
delay(500);
}
else
{
motors.stop();
char turn_direction = scan();
if (turn_direction == 'l')
{
motors.left();
delay(200);
}
else if (turn_direction == 'r')
{
motors.right();
delay(200);
}
}
}
else
{
motors.forward();
}
}