I got my Ping))) Ultrasonic Rangefinder working so that it turns on a light and turns a servo one way when an object is more than 3 inches away. It then turns off the light and turns the servo in an opposite direction when an object gets within 3 inches of the “eyes”. This may be hard to explain, but here goes: There is a major problem either with my code or the servo. I think its the servo it which case ill have to buy another, The problem is that if i do not put an object in front of the servo within 2 seconds of me letting it go with no object, it takes over 10 seconds for the servo to realize that there is an object in its way and it should change to the opposite direction. The LED responds immediately though, leading me to believe that it is the servo’s error. I cannot figure out the problem. The counter argument that it may be the code’s fault, is that the same thing happens with both servos. Does anyone see anything wrong with this code?
#include <Servo.h>
Servo myservo;
int pos = 0;
int pingPin = 7;
const int ledPin = 13;
void setup()
{
Serial.begin(9600);
pinMode (ledPin, OUTPUT);
myservo.attach(9);
}
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);
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print(“cm”);
Serial.println();
if (inches >= 3) {
digitalWrite (ledPin, HIGH);
pos++;
myservo.write(pos);
}
else {
digitalWrite (ledPin, LOW);
pos–;
myservo.write(pos);
}
}
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 / 73.746 / 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;
}