I have built a line follower with collision avoidance but am experiencing some issues.
I have used a single motor with two free motion wheels. A servo is attached to the motor to turn either left o right if obstacle detected either left or right by the left or right ultrasonic sensor respectively.
The issue is the servo is continuously turning left or right without the input o the ultrasonic sensor.
Another issue is the two IR sensors aren't detecting line, but are detecting proximity and stopping the motor when they detect.
code is below
#include <Servo.h>
#define leftIr 2
#define rightIr 3
#define MotorSpeed 8
#define MotorP 4
#define MotorN 5
int potValue;
#define leftultrasonicTrigger 6
#define leftultrasonicEcho 7
#define rightultrasonicTrigger 11
#define rightultrasonicEcho 12
Servo myservo;
// motors speed (0 - 255)
const float FORWARD_SPEED = 150;
const float CURVE_SPEED = 120;
void setup() {
Serial.begin(115200);
myservo.attach(13);
pinMode(leftIr, INPUT);
pinMode(rightIr, INPUT);
pinMode(MotorSpeed, OUTPUT);
pinMode(MotorP, OUTPUT);
pinMode(MotorN, OUTPUT);
pinMode(leftultrasonicTrigger, OUTPUT);
pinMode(leftultrasonicEcho, INPUT);
pinMode(rightultrasonicTrigger, OUTPUT);
pinMode(rightultrasonicEcho, INPUT);
}
void loop() {
long leftduration, leftdistance;
digitalWrite(leftultrasonicTrigger, HIGH);
delayMicroseconds(1000);
digitalWrite(leftultrasonicTrigger, LOW);
leftduration = pulseIn(leftultrasonicEcho, HIGH);
leftdistance = (leftduration / 2) / 29.1;
Serial.print(leftdistance);
Serial.println("CM");
delay(10);
potValue = leftdistance;
potValue = map(potValue, 0, 1023, 0, 180);
long rightduration, rightdistance;
digitalWrite(rightultrasonicTrigger, HIGH);
delayMicroseconds(1000);
digitalWrite(rightultrasonicTrigger, LOW);
rightduration = pulseIn(rightultrasonicEcho, HIGH);
rightdistance = (rightduration / 2) / 29.1;
Serial.print(rightdistance);
Serial.println("CM");
delay(10);
potValue = rightdistance;
potValue = map(potValue, 0, 1023, 0, 180);
if ((leftdistance <= 50)) //&& !(rightdistance >= 50))
{
// PWM
analogWrite(MotorSpeed, 0);
// Direction
digitalWrite(MotorP, LOW);
digitalWrite(MotorN, LOW);
myservo.write(87);
delay(2000);
// PWM
analogWrite(MotorSpeed, CURVE_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(132);
delay(3000);
// PWM
analogWrite(MotorSpeed, FORWARD_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(87);
delay(5000);
// PWM
analogWrite(MotorSpeed, CURVE_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(42);
delay(3000);
// PWM
analogWrite(MotorSpeed, FORWARD_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(87);
delay(5000);
Serial.println('leftdistance');
}
else if ((rightdistance <= 50))// && !(leftdistance >= 50))
{
// PWM
analogWrite(MotorSpeed, 0);
// Direction
digitalWrite(MotorP, LOW);
digitalWrite(MotorN, LOW);
myservo.write(87);
delay(2000);
// PWM
analogWrite(MotorSpeed, CURVE_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(42);
delay(3000);
//PMW
analogWrite(MotorSpeed, FORWARD_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(87);
delay(5000);
analogWrite(MotorSpeed, CURVE_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(42);
delay(3000);
//PMW
analogWrite(MotorSpeed, FORWARD_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(87);
delay(5000);
Serial.println('rightdistance');
}
if ((leftdistance <= 100) && (rightdistance <= 100))
{
// PWM
analogWrite(MotorSpeed, 0);
// Direction
digitalWrite(MotorP, LOW);
digitalWrite(MotorN, LOW);
myservo.write(87);
}
if ( digitalRead(leftIr) && digitalRead(rightIr)){
// PWM
analogWrite(MotorSpeed, FORWARD_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(87);
}
if (digitalRead(leftIr) && !digitalRead(rightIr)){
// PWM
analogWrite(MotorSpeed, CURVE_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(132);
}
if (!(digitalRead(leftIr)) && digitalRead(rightIr)){
// PWM
analogWrite(MotorSpeed, CURVE_SPEED);
// Direction
digitalWrite(MotorP, HIGH);
digitalWrite(MotorN, LOW);
myservo.write(42);
}
if (!(digitalRead(leftIr)) && !digitalRead(rightIr)){
// PWM
analogWrite(MotorSpeed, 0);
// Direction
digitalWrite(MotorP, LOW);
digitalWrite(MotorN, LOW);
myservo.write(87);
}
}