Go Down

Topic: Ultraschallsensoren mittels NewPing auslesen (Read 321 times) previous topic - next topic

jalu4601

May 03, 2018, 02:50 pm Last Edit: May 03, 2018, 02:55 pm by jalu4601
Guten Tag,

ich habe mal eine kurze Frage zu dem nachfolgenden Beispielsketch der "newping timer median" Library:

Code: [Select]

// ---------------------------------------------------------------------------
// Calculate a ping median using the ping_timer() method.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define ITERATIONS     3 // Number of iterations.
#define TRIGGER_PIN   7 // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PIN      6 // Arduino pin tied to echo pin on ping sensor.
#define MAX_DISTANCE 103 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).


unsigned long pingTimer[ITERATIONS]; // Holds the times when the next ping should happen for each iteration.
unsigned int cm[ITERATIONS];         // Where the ping distances are stored.
uint8_t currentIteration = 0;        // Keeps track of iteration step.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  Serial.begin(115200);
  pingTimer[0] = millis() + 75;            // First ping starts at 75ms, gives time for the Arduino to chill before starting.
  for (uint8_t i = 1; i < ITERATIONS; i++) // Set the starting time for each iteration.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}

void loop() {
  for (uint8_t i = 0; i < ITERATIONS; i++) { // Loop through all the iterations.
    if (millis() >= pingTimer[i]) {          // Is it this iteration's time to ping?
      pingTimer[i] += PING_INTERVAL * ITERATIONS; // Set next time this sensor will be pinged.
      if (i == 0 && currentIteration == ITERATIONS - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
      sonar.timer_stop();          // Make sure previous timer is canceled before starting a new ping (insurance).
      currentIteration = i;        // Sensor being accessed.
      cm[currentIteration] = 0;    // Make distance zero in case there's no ping echo for this iteration.
      sonar.ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
    }
  }
  // Other code that *DOESN'T* analyze ping results can go here.
}

void echoCheck() { // If ping received, set the sensor distance to array.
  if (sonar.check_timer())
    cm[currentIteration] = sonar.ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() { // All iterations complete, calculate the median.
  unsigned int uS[ITERATIONS];
  uint8_t j, it = ITERATIONS;
  uS[0] = NO_ECHO;
  for (uint8_t i = 0; i < it; i++) { // Loop through iteration results.
    if (cm[i] != NO_ECHO) { // Ping in range, include as part of median.
      if (i > 0) {          // Don't start sort till second ping.
        for (j = i; j > 0 && uS[j - 1] < cm[i]; j--) // Insertion sort loop.
          uS[j] = uS[j - 1];                         // Shift ping array to correct position for sort insertion.
      } else j = 0;         // First ping is sort starting point.
      uS[j] = cm[i];        // Add last ping to array in sorted position.
    } else it--;            // Ping out of range, skip and don't include as part of median.
  }
// Serial.println(uS[it >> 1]);
  //Serial.println("cm");
 
}


Der Code funktioniert breites bestens für einen Ultraschall-Sensor. Ich möchte jedoch noch einen zweiten Ultraschallsensor gleichzeitig auslesen und auch hier wieder den Median bilden.

Ohne die Berechnung des Medians habe ich bereits zwei Sensoren gleichzeitig ans laufen gebracht.
Doch hier habe ich leider keine Idee wie ich anfangen sollte. Teilweise überschreitet dies meine Kenntnisse.

Vielleicht könnt ihr mir ja helfen...

Johannes81

Vielleicht habe ich dich jetzt nur falsch verstanden, aber es sollte eigentlich relativ einfach sein. Du musst den Sketch im Prinzip eigentlich nur kopieren und wieder einfügen. Selbstverständlich musst du in Loop und Setup entsprechend hinein kopieren und dann natürlich noch ganz wichtig die Variablen anpassen, so dass es nicht s doppelt gibt!
Ist jetzt zwar etwas laienhaft ausgedrückt, sollte aber zum Ziel führen.

HotSystems

.....
Ich möchte jedoch noch einen zweiten Ultraschallsensor gleichzeitig auslesen und auch hier wieder den Median bilden.
.....
Vielleicht könnt ihr mir ja helfen...
Gleichzeitig geht sicher nicht, aber sehr schnell hintereinander. Jedoch musst zwischen den US-Sensoren eine Pause eingelegt werden, damit diese sich nicht gegenseitig beeinflussen.

Wenn du uns deinen "Sketch-Versuch" postest, können wir sehen, was du falsch machst.

Du solltest die Berechnungen z.B. in einer eigenen Funktion machen und diese erst nach dem Auslesen beider Sensoren durchführen.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up