- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 14

Thema: 3 Ultraschallsensoren HC-SR04 einbinden-> finde den Fehler nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.648
    Das wird wohl nicht richtig sein.
    Behandle beide Ultraschallsensoren getrennt!
    Beispiel:
    Code:
    duration=pulseIn(echoPinF,HIGH);  duration=pulseIn(echoPinR,HIGH);

    Code:
    durationF=pulseIn(echoPinF,HIGH);  durationR=pulseIn(echoPinR,HIGH);

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.205
    Beide gleichzeitig klappt wirklich nicht.
    Die _müssen_ einzeln abgefragt werden.
    Und: pulseIn() ist blockierend!
    Das Standard-Timeout beträgt eine volle Sekunde, in der Zeit kannst du _gar nix_ anderes machen.
    Abhilfe: ein kürzeres Timeout bei pulseIn() definieren.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Die _müssen_ einzeln abgefragt werden.
    Naja, wenn man NUR den nähesten Gegenstand sucht, kann man auch auf allen Sensoren gleichzeitig pingen. Dieser wäre dann in Richtung des Sensors mit der ersten Antwort zu finden.
    Dann allerdings nicht mit pulseIn(), da auf mehreren Echopins gleichzeitig abgehört werden müsste.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.02.2013
    Ort
    nähe Hamburg
    Beiträge
    33
    Danke für die Antworten.
    Ich habe den Sketch noch komplett überarbeitet.

    Der Ablauf stimmt auch fast, leider nur fast.

    Als erstes mal der grobe Aufbau. Ist erst mal nur für das programmieren.
    Die Kabel bleiben natürlich nicht so

    Klicke auf die Grafik für eine größere Ansicht

Name:	WIN_20190805_22_34_04_Pro.jpg
Hits:	8
Größe:	60,9 KB
ID:	34332

    Und hier der Sketch:

    Code:
    int frontEchoPin = 12;
    int frontTriggerPin = 11;
    int leftEchoPin = 30;
    int leftTriggerPin = 31;
    int rightEchoPin = 33;
    int rightTriggerPin = 32;
    int enA = 2;
    int motorL1 = 5;
    int motorL2 = 6;
    int motorR1 = 3;
    int motorR2 = 4;
    int enB = 7;
    volatile float maxFrontDistance = 30.00;
    volatile float frontDuration, frontDistanceCm, leftDuration, leftDistanceCm, rightDuration, rightDistanceCm;
    volatile float maxLeftDistance, maxRightDistance = 30.00;
    void setup() {
      // serial
      Serial.begin(9600);
      // ultrasonic
      pinMode(frontTriggerPin, OUTPUT);
      pinMode(frontEchoPin, INPUT);
      pinMode(leftTriggerPin, OUTPUT);
      pinMode(leftEchoPin, INPUT);
      pinMode(rightTriggerPin, OUTPUT);
      pinMode(rightEchoPin, INPUT);
      // motors
      pinMode(motorL1, OUTPUT);
      pinMode(motorL2, OUTPUT);
      pinMode(motorR1, OUTPUT);
      pinMode(motorR2, OUTPUT);
    }
    void loop() {
      // front distance check
      checkFrontDistance();
      if (frontDistanceCm < maxFrontDistance) {
        Serial.println("Too close");
        checkLeftDistance();
        delay(100);
        checkRightDistance();
        delay(100);
        if (leftDistanceCm < rightDistanceCm)
        {
          moveBackward;
          delay(100);
          moveRight();
        }
        else if (leftDistanceCm > rightDistanceCm) 
        {
          moveBackward;
          delay(100);
          moveLeft();
        }
      }
      else {
        Serial.println("OK");
        moveForward();
      }
      // left distance check
      checkLeftDistance();
      if (leftDistanceCm < maxLeftDistance) {
        Serial.println("Left too close");
        delay(100);
        checkFrontDistance();
        delay(100);
        checkRightDistance();
        delay(100);
        if (frontDistanceCm > rightDistanceCm)
        {
          moveForward();
         
        }
        else if (frontDistanceCm < rightDistanceCm) 
        {
          moveBackward;
          delay(100);
          moveRight();
          
        }
      }
      // right distance check
      checkRightDistance();
      if (rightDistanceCm < maxRightDistance) {
        Serial.println("Right too close");
        delay(100);
        checkFrontDistance();
        delay(100);
        checkLeftDistance();
        delay(100);
        if (frontDistanceCm > leftDistanceCm)
          moveForward();
        else if (frontDistanceCm < leftDistanceCm) 
        {
          moveBackward;
          delay(100);
          moveLeft();
       
        }
      }
    }
    void checkFrontDistance() {
      digitalWrite(frontTriggerPin, LOW);  //para generar un pulso limpio ponemos a LOW 4us
      delayMicroseconds(4);
      digitalWrite(frontTriggerPin, HIGH);  //generamos Trigger (disparo) de 10us
      delayMicroseconds(10);
      digitalWrite(frontTriggerPin, LOW);
      frontDuration = pulseIn(frontEchoPin, HIGH);  //medimos el tiempo entre pulsos, en microsegundos
      frontDistanceCm = frontDuration * 10 / 292 / 2;  //convertimos a distancia, en cm
      Serial.print("Distance: ");
      Serial.print(frontDistanceCm);
      Serial.println(" cm");
    }
    void checkLeftDistance() {
      digitalWrite(leftTriggerPin, LOW);  //para generar un pulso limpio ponemos a LOW 4us
      delayMicroseconds(4);
      digitalWrite(leftTriggerPin, HIGH);  //generamos Trigger (disparo) de 10us
      delayMicroseconds(10);
      digitalWrite(leftTriggerPin, LOW);
      leftDuration = pulseIn(leftEchoPin, HIGH);  //medimos el tiempo entre pulsos, en microsegundos
      leftDistanceCm = leftDuration * 10 / 292 / 2;  //convertimos a distancia, en cm
      Serial.print("Left distance: ");
      Serial.print(leftDistanceCm);
      Serial.println(" cm");
    }
    void checkRightDistance() {
      digitalWrite(rightTriggerPin, LOW);  //para generar un pulso limpio ponemos a LOW 4us
      delayMicroseconds(4);
      digitalWrite(rightTriggerPin, HIGH);  //generamos Trigger (disparo) de 10us
      delayMicroseconds(10);
      digitalWrite(rightTriggerPin, LOW);
      rightDuration = pulseIn(rightEchoPin, HIGH);  //medimos el tiempo entre pulsos, en microsegundos
      rightDistanceCm = rightDuration * 10 / 292 / 2;  //convertimos a distancia, en cm
      Serial.print("Right distance: ");
      Serial.print(rightDistanceCm);
      Serial.println(" cm");
    }
    void moveBackward() {
      Serial.println("Backward.");
      digitalWrite(motorL1, LOW);
      digitalWrite(motorL2, HIGH);
      digitalWrite(motorR1, LOW);
      digitalWrite(motorR2, HIGH);
        analogWrite(enA, 100);
        analogWrite(enB, 100);
    }
    void moveForward() {
      Serial.println("Forward.");
      digitalWrite(motorL1, HIGH);
      digitalWrite(motorL2, LOW);
      digitalWrite(motorR1, HIGH);
      digitalWrite(motorR2, LOW);
       analogWrite(enA, 130);
       analogWrite(enB, 130);
    }
    void moveLeft() {
      Serial.println("Left.");
      digitalWrite(motorL1, HIGH);
      digitalWrite(motorL2, LOW);
      digitalWrite(motorR1, LOW);
      digitalWrite(motorR2, HIGH);
       analogWrite(enA, 90);
       analogWrite(enB, 100);
    }
    void moveRight() {
      Serial.println("Right.");
      digitalWrite(motorL1, LOW);
      digitalWrite(motorL2, HIGH);
      digitalWrite(motorR1, HIGH);
      digitalWrite(motorR2, LOW);
       analogWrite(enA, 90);
       analogWrite(enB, 100); 
    }
    void moveStop()
    {
      digitalWrite(4,LOW);
       digitalWrite(3,LOW);
       digitalWrite(6,LOW);                                  
       digitalWrite(5,LOW);
       analogWrite(enA, 0);
       analogWrite(enB, 0); 
    }
    Mein Problem ist jetzt das der "leftDistance" rum Zickt.
    Ich finde der Fehler leider nicht, den Ultra habe ich schon getauscht.
    Aber es ist keine Veränderung zu sehen.

    Klicke auf die Grafik für eine größere Ansicht

Name:	Unbenannt.jpg
Hits:	5
Größe:	35,1 KB
ID:	34333

    Woran könnte es liegen?
    An der Verkabelung?
    Könnten die Ultras durch die Motoren gestört werden?

    Vielleicht kann mir jemand auf die Sprünge helfen.


    Gruß

    Danilo

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Nur mal so als Randnotiz:
    Ich besitze einige hc-sr04 aus zwei verschiedenen Quellen. Sie unterscheiden sich bei ausbleibendem Echo in ihrer Funktion.
    >> Die eine Sorte liefert den *) spezifizierten maximal langen Empfangspuls, der nur knapp länger als derjenige bei maximaler Reichweite ist.
    >> Die anderen 'hängen' scheinbar in der Messung fest und der verfälschte Empfangspuls endet erst mit dem nachfolgenden Triggerimpuls (also eine Art Abbruch oder Reset der Messung)

    *) 'spezifiziert' meint hier: irgendwo in den Weiten des WWW unter dem Namen 'SR-HC04' gefundene Anleitung; bei Dumpingpreisen darf man realistischerweise nicht allzu viel erwarten.

Ähnliche Themen

  1. Finde RS485 fehler nicht
    Von demmy im Forum Elektronik
    Antworten: 18
    Letzter Beitrag: 03.07.2015, 05:49
  2. Finde Fehler nicht
    Von hunikuni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 20
    Letzter Beitrag: 03.06.2012, 13:54
  3. Antworten: 4
    Letzter Beitrag: 08.01.2008, 19:03
  4. ADC - Ich finde den/die Fehler nicht
    Von Christoph2 im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 07.08.2007, 18:34
  5. AVR 90S2313 Problem, und finde nicht den Fehler!
    Von Alex20q90 im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 01.05.2005, 13:20

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress