Pages: [1]   Go Down
Author Topic: Compare diffrent measurements.  (Read 526 times)
0 Members and 1 Guest are viewing this topic.
Netherlands
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I've got an HC-SR04 Ultrasonic range detector mounted on a servo. It rotate, scan and store 3 values (45, 90 and 135 degrees)

Now i want that it can compare the 3 values to choose the longest distance. I used an if..else loop to let is choose but is there any way that works better. Because now it compares 45 with 90 and 135 with 90 degrees. But if the first string (45>90) is true, it won't check (135>90).

Here's my sketch:
Code:
void loop()
{  
  myservo.write(45);
  delay(1000);
  int microsec45 = ultrasonic.timing();
  Serial.print("MS45: ");
  Serial.print(microsec45);
  
  myservo.write(90);
  delay(1000);
  int microsec90 = ultrasonic.timing();
  Serial.print("MS90: ");
  Serial.print(microsec90);
 
  myservo.write(135);
  delay(1000);
  int microsec135 = ultrasonic.timing();
  Serial.print("MS135: ");
  Serial.print(microsec135);
 
  for(pos = 135; pos>=45; pos-=1)     // goes from 180 degrees to 0 degrees
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  
  if (microsec45 > microsec90)
    {
      digitalWrite(ledpin43, HIGH);   // set the LED on
      delay(1000);              // wait for a second
      digitalWrite(ledpin43, LOW);    // set the LED off
    }
   else if (microsec135 > microsec90)
    {
     digitalWrite(ledpin13, HIGH);   // set the LED on
     delay(1000);              // wait for a second
     digitalWrite(ledpin13, LOW);    // set the LED off
    }
   else
    {
     digitalWrite(ledpin13, HIGH);   // set the LED on
     digitalWrite(ledpin43, HIGH);   // set the LED on
     delay(1000);              // wait for a second
     digitalWrite(ledpin13, LOW);    // set the LED off
     digitalWrite(ledpin43, LOW);    // set the LED off
    }

I used the 2 led pins on my Uno32 in stead of dc motors, to make it move visible what choices it makes.
« Last Edit: December 16, 2011, 04:59:07 am by Stealth0113 » Logged

Watch my stealth-bot @ let's make robots

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

Try changing
Code:
if (microsec45 > microsec90)
to
Code:
if (microsec45 > microsec90) && (microsec45 > microsec135)

Might be a better way to do it though, but can't come up one myself sorry.
Logged

Ft. Worth, Texas
Offline Offline
God Member
*****
Karma: 0
Posts: 591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm assuming you want to detect if vehicle needs to go left or right for obstacle avoidance?

easiest way I can come up with:

if 45<90 AND 90>135 (90 is greatest)

if 45>90 AND 90>135 (45 is greatest)

if 45<90 AND 90<135 (135 is greatest)

if 45>90 AND 90<135 (90 is least)
-> if 45<135 (135 is greatest/45 is least)


The reason for the last one:

Say there's an obstruction straight ahead. Do I go left or right? IE, is left blocked sooner, or is right blocked sooner?
Logged

KF5RVR

Netherlands
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks MagnetHead794 for the fast response. I'm gonna try it later today and post my results!
Logged

Watch my stealth-bot @ let's make robots

Erie, Pa.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Fair warning: I'm new, and I'll say stupid things.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

It might work better to determine the highest as you're reading them. Then you can just compare the current reading to the highest reading thus far. Something like this:

Code:
void loop()
{
    byte deg[] = { 45, 90, 135 };
    int readings[ 3 ] = { 0 };
    int highReading = 0;
    int furthest;
    boolean light45 = false;
    boolean light135 = false;

    for( int i = 0; i < 3; i++ )
    {
        myservo.write( degs[ i ] );
        delay( 1000 );
        readings[ i ] = ultrasonic.timing();
        if( readings[ i ] > highReading )
        {
            highReading = readings[ i ];
            furthest = i;
        }
    }

    if( furthest < 2 ) // either 45 or 90
    {
        digitalWrite( pinFor45, HIGH );
    }
    if( furthest > 0 ) // either 90 or 135
    {
        digitalWrite( pinFor135, HIGH );
    }
    delay( 1000 );
    digitalWrite( pinFor45, LOW ); // don't need to test to turn off, since there's no harm in turning off one that's already off
    digitalWrite( pinFor135, LOW );
}

(Note: untested code)
Logged

Netherlands
Offline Offline
Jr. Member
**
Karma: 0
Posts: 70
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ryschwith: i don't fully understand your code. The "for" loop is clear to me, but the "if" string looks like gibberish to me...

Can you explain to me why furthest < 2 stands for 45 or 90 degrees??

And why did you use the light45 = false and light135 = false? I don't see it back anywhere in the code
« Last Edit: December 17, 2011, 04:45:05 am by Stealth0113 » Logged

Watch my stealth-bot @ let's make robots

Ft. Worth, Texas
Offline Offline
God Member
*****
Karma: 0
Posts: 591
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ryschwith: i don't fully understand your code. The "for" loop is clear to me, but the "if" string looks like gibberish to me...

Can you explain to me why furthest < 2 stands for 45 or 90 degrees??

And why did you use the light45 = false and light135 = false? I don't see it back anywhere in the code

For loop iterates through an array of the 3 sensors

i is the sensor number- 0, 1, 2

It stores the highest reading, it's sensor number and value

if furthest < 2 means if furthest is 0 or 1

if furthest > 0 means if furthest is 1 or 2

0 is 45
1 is 90
2 is 135

if 45 or 90 are furthest, light the respective LED.

if 90 or 135 are furthest, light LED

one led is 45 degs, second led is 135 degrees, if neither lit, it's 90.
Logged

KF5RVR

Erie, Pa.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Fair warning: I'm new, and I'll say stupid things.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Actually, both light for 90 (which I believe is what the OP had in the original code). Otherwise, though, spot on.

And why did you use the light45 = false and light135 = false? I don't see it back anywhere in the code

Whoops! Ignore those. They were going to be used before I came up with a better idea, and I missed deleting them.
Logged

Pages: [1]   Go Up
Jump to: