Pages: [1]   Go Down
Author Topic: Robot help  (Read 517 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I am attempting to make a robot go forward until it detects an obstacle then turns left... I am using a 3 pin
Ping ultrasonic sensor, Arduino Uno, and a Seeed Motor shield v2.
The sensor works fine until I add the motor header file & add code for the movement, the code is below. Any help would be greatly appreciated.

Code:
#include "MotorDriver.h"

const int pingPin = 7;
int obsticle;
void setup() {
  motordriver.init();
  motordriver.setSpeed(200,MOTORB);
  motordriver.setSpeed(200,MOTORA);
  // initialize serial communication:
  Serial.begin(9600);
}

void loop()
{
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, inches, cm;

  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // 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();
  delay(100);
  obsticle = inches;
  if (obsticle < 15){
   motordriver.goLeft();
     }
  else{
   motordriver.goForward();
     }
}

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;
}

Problem is the ping reports the distance good til I make the code as above then it reports accurate distance twice then it goes to 0 distance. I can't figure out what makes it stop reading the distance right.

Thanks
« Last Edit: August 11, 2014, 03:20:57 am by Andakwa » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I didn't so much figure out why the sensor reading went to 0s but I did find that if I make the sensor reading its own function that returns the inches it works fine.


Thanks
Logged

the land of sun+snow
Offline Offline
Faraday Member
**
Karma: 159
Posts: 2916
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yeah, from the very beginning, you always want to modularize your code, writing specific functions for sensors and motor, on and on. IE, separate the "logic" of the program from the "details of execution" of the drivers, etc.

Then, it's much easier to test them in isolation as you develop the program, and also much easier to troubleshoot things when you integrate the modules together. Plus, it's much easier for the rest of us to decipher what you've written. Good luck.
Logged

Pages: [1]   Go Up
Jump to: