hello, i am doing project of obstacle avoiding robot in which dc motors are controlled by using joystick. i had completed the controlling part of dc motors using joystick but when i used ultrasonic sensor with it, it is not operating in all direction(left, right, forward, backward) when obstacle is not detected, it should move in all direction but it moves in only one axis, for example it either moves in forward and backward or left and right direction. also there is one more thing when obstacle is detected, it should not move forward but it should move in backward, here also it only moves in only left and right direction. i think i am missing some logic in code. i would appreciate your advice.
the code i am using is mentioned below
#define echopin 2 // echo pin
#define trigpin 3 // Trigger pin
int maximumRange = 30;
long duration, distance;
const byte joyStickPin1 = A1;
const byte joyStickPin2 = A0;
const byte motorSpeedPin1 = 11;
const byte motorDirPin1 = 13;
const byte motorSpeedPin2 = 5;
const byte motorDirPin2 = 12;
//Joystick input variables
int joyValue = 0;
int joyValueMax = 1023;
int joyValueMin = 0;
int joyValueMid = 512;
int joyValueMidUpper = joyValueMid + 20;
int joyValueMidLower = joyValueMid - 20;
//DC motor variables
byte motorSpeed = 0;
byte motorSpeedMax = 255;
byte motorSpeedMin = 0; //set to smallest value that make motor move (default 0)
// DC motor that I use start to move at 90 pwm value
void setup()
{
Serial.begin (9600);
pinMode(trigpin, OUTPUT);
pinMode(echopin, INPUT );
pinMode(joyStickPin1, INPUT);
pinMode(motorSpeedPin1, OUTPUT);
pinMode(motorDirPin1, OUTPUT);
pinMode(joyStickPin2, INPUT);
pinMode(motorSpeedPin2, OUTPUT);
pinMode(motorDirPin2, OUTPUT);
}
void loop()
{
{
digitalWrite(trigpin,LOW);
delayMicroseconds(2);
digitalWrite(trigpin,HIGH);
delayMicroseconds(10);
duration=pulseIn (echopin,HIGH);
distance= duration/58.2;
delay (50);
Serial.println(distance);
}
if (distance >= 20)
{
{
joyValue = analogRead(joyStickPin2);
if(joyValue > joyValueMidUpper) //left
{
motorSpeed = map(joyValue, joyValueMidUpper, joyValueMax, motorSpeedMin, motorSpeedMax);
MotorLeft(motorSpeed);
}
else if(joyValue < joyValueMidLower) //front
{
motorSpeed = map(joyValue, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
MotorRight(motorSpeed);
}
else
{
MotorStop();
}
}
{
joyValue = analogRead(joyStickPin1);
if(joyValue > joyValueMidUpper) //Forward
{
motorSpeed = map(joyValue, joyValueMidUpper, joyValueMax, motorSpeedMin, motorSpeedMax);
MotorForward(motorSpeed);
}
else if(joyValue < joyValueMidLower) //Backward
{
motorSpeed = map(joyValue, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
MotorBackward(motorSpeed);
}
else
{
MotorStop();
}
}
}
else if (distance < 20)
{
joyValue = analogRead(joyStickPin2);
if(joyValue > joyValueMidUpper) //left
{
motorSpeed = map(joyValue, joyValueMidUpper, joyValueMax, motorSpeedMin, motorSpeedMax);
MotorLeft(motorSpeed);
}
else if(joyValue < joyValueMidLower) //right
{
motorSpeed = map(joyValue, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
MotorRight(motorSpeed);
}
else
{
MotorStop();
}
joyValue = analogRead(joyStickPin1);
if(joyValue < joyValueMidLower) //Backward
{
motorSpeed = map(joyValue, joyValueMidLower, joyValueMin, motorSpeedMin, motorSpeedMax);
MotorBackward(motorSpeed);
}
else
{
MotorStop();
}
}
}
void MotorForward( byte Spd)
{
digitalWrite(motorDirPin1, HIGH);
analogWrite(motorSpeedPin1, Spd);
digitalWrite(motorDirPin2, HIGH);
analogWrite(motorSpeedPin2, Spd);
}
void MotorBackward( byte Spd)
{
digitalWrite(motorDirPin1, LOW);
analogWrite(motorSpeedPin1, Spd);
digitalWrite(motorDirPin2, LOW);
analogWrite(motorSpeedPin2, Spd);
}
void MotorLeft( byte Spd)
{
analogWrite(motorSpeedPin2, 0);
digitalWrite(motorDirPin1, LOW);
analogWrite(motorSpeedPin1, Spd);
}
void MotorRight( byte Spd)
{
analogWrite(motorSpeedPin1, 0);
digitalWrite(motorDirPin2, LOW);
analogWrite(motorSpeedPin2, Spd);
}
void MotorStop()
{
analogWrite(motorSpeedPin1, 0);
analogWrite(motorSpeedPin2, 0);
}