I am making an Arduino project in which I have to control speed of DC motor with an ultrasonic sensor.
I have written an Arduino program to do this work but unfortunately my motor only rotates in forward and backward direction and when it comes in specific range like (50-95),(105-150) where I have to decrease the motor speed by 50 and 40 % then the motor only makes some noise - it does not rotate.
Components I am using:
- Arduino Uno
- L293D motor driver IC
- external 5 V/1.5 A power supply
- 9 volt motor
Code:
#define echoPin 2
#define trigPin 4
int enA = 9;
int in1 = 8;
int in2 = 7;
// defines variables
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
if (95<=distance && distance<=105)
{
Serial.println("forwrd");
analogWrite(enA, 255);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(2000);
}
else if(50<=distance && distance <=95){
Serial.println("forward 40 %");
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);// forward
analogWrite(enA,102);
delay(2000);
}
else if(105<=distance && distance <=150){
Serial.println("reverse 50%");
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA,127);
delay(2000);
}
else if(10<= distance && distance<=50){
Serial.println("10-50 forwrd 40 %");
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);// forward
analogWrite(enA,102);
delay(2000);
}
else if(150<= distance && distance<=200){
Serial.println("105-200 reverse 50%");
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA,127);
delay(2000);
}
}
Circuit diagram: