airsoft turret program help

Hi im new to programming and microcontrollers and i need help with my code for my airsoft turret. i am planning on using the ping sensor to detect objects. what i am planning on it doing is spinning around and when it detects an object within a certain range it will stop and fire at it and when the object moves out of range it will start spinning again. i got this idea based off of a rubber band turret from bunedoggle.com. My code is based off of the ping example that comes with the software. i am just testing the inches variable to see if it passes a certian point, and then telling the base motor to stop spinning and the gun motor to turn on. can someone tell me what is wrong with my code?

here it is:

int rightMotorPin = 5;
int leftMotorPin = 6;
int pingPin = 7;
int gunPin =8;
int ledPin = 13;
void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(rightMotorPin, OUTPUT);
  pinMode(leftMotorPin, OUTPUT);
  pinMode(gunPin, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // We give a short LOW pulse beforehand to ensure a clean HIGH pulse.
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  // The same pin is used to read the signal from the PING))): a HIGH
  // pulse whose duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  
  if(inches > 30){
 digitalWrite(rightMotorPin, LOW);
 digitalWrite(leftMotorPin, HIGH);
 digitalWrite(ledPin, LOW);
 digitalWrite(gunPin, LOW);      
  
  if(inches < 30){ 
  digitalWrite(ledPin, HIGH);
  digitalWrite(leftMotorPin, LOW); 
  digitalWrite(gunPin, HIGH);
    }
   } 
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  
  delay(100);
  }
long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

Hello!

This code:

if(inches > 30){
digitalWrite(rightMotorPin, LOW);
digitalWrite(leftMotorPin, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(gunPin, LOW);

if(inches < 30){
digitalWrite(ledPin, HIGH);
digitalWrite(leftMotorPin, LOW);
digitalWrite(gunPin, HIGH);
}
}

Will not function as intended.
This is because you first say ‘if inches is above 30’ and later asks ‘if inces is below 30’.

I think you meant to write this:

if(inches > 30){
digitalWrite(rightMotorPin, LOW);
digitalWrite(leftMotorPin, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(gunPin, LOW);
}
else if(inches < 30){
digitalWrite(ledPin, HIGH);
digitalWrite(leftMotorPin, LOW);
digitalWrite(gunPin, HIGH);
}

Notice that if inces is exactly the same as 30, nothing will happen.

yeah i think thats the problem. thanks! ill check if it works now!

Yeah that fixed it!

Ain't nothing better than that :slight_smile: