- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

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

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.02.2013
    Ort
    nähe Hamburg
    Beiträge
    33

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

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    nach langer Zeit habe ich mal wieder ein Projekt geplant.
    Es soll ein Auto Mower werden, vorerst aber erst über Ultras steuerbar.

    Jetzt komme ich zu meinem Prob.
    Ich kann jeden Ultra für sich alleine ansteuern, aber wenn ich versuche den zweiten einzubinden, passiert nichts mehr oder er fährt nur rückwärts.

    ich stehe echt auf dem Schlauch.

    Code:
    #include <NewPing.h>
    
    int trigPinF = 11;
    int echoPinF = 12;
    int trigPinR = 32;
    int echoPinR = 33;
    int enA = 2;
    int revright = 3;      
    int fwdright= 4;       
    int revleft= 5;
    int fwdleft = 6;
    int enB = 7;     
           
    int c = 0;
    
    void setup() {
      //Serial.begin(9600);
       pinMode(enA, OUTPUT);  
       pinMode(3, OUTPUT);
       pinMode(4, OUTPUT);
       pinMode(5, OUTPUT);
       pinMode(6, OUTPUT);
       pinMode(enB, OUTPUT);
       
       pinMode(trigPinF, OUTPUT);
       pinMode(echoPinF, INPUT);
       pinMode(trigPinR, OUTPUT);
       pinMode(echoPinR, INPUT);
    
    }
    
    void loop() {
     
      long duration,distanceF,distanceR;
      digitalWrite(trigPinF,HIGH);
      digitalWrite(trigPinR,HIGH);
      
      delayMicroseconds(1000);
      
      digitalWrite(trigPinF,LOW);
      digitalWrite(trigPinR,LOW);
      
      duration=pulseIn(echoPinF,HIGH);
      duration=pulseIn(echoPinR,HIGH);
      distanceF,distanceR=(duration/2)/29.1;
      //Serial.print(distance);
      //Serial.println("CM");
      delay(10);
    
    
      
      if((distanceF>=20&distanceR>=20))
     {
       moveforward();
     }
      if(distanceF<20&distanceR>=20)
     {
      movestop();
      delay(400);
      movereverse();
      delay(3000);
      movestop();
     }
      else if(distanceF>=20&distanceR<20)
     {
      movestop();
      delay(400);
      movereverse();
      delay(3000);
      movestop();
      delay(400);
      moveleft();
     }
    }
    void moveforward()
    {
      digitalWrite(4,LOW);                               
       digitalWrite(3,HIGH);                               
       digitalWrite(6,LOW);                               
       digitalWrite(5,HIGH);  
       analogWrite(enA, 160);
       analogWrite(enB, 160);//
    }
    void moveleft()
    {
      digitalWrite(4,HIGH);
       digitalWrite(3,LOW);
       digitalWrite(6,LOW);                                  
       digitalWrite(5,HIGH);
       analogWrite(enA, 140);
       analogWrite(enB, 180); 
    }
    void moveright()
    {
      digitalWrite(4,LOW);
       digitalWrite(3,HIGH);
       digitalWrite(6,HIGH);                                  
       digitalWrite(5,LOW);
       analogWrite(enA, 180);
       analogWrite(enB, 140); 
    }
    void movereverse()
    {
      digitalWrite(4,HIGH);
       digitalWrite(3,LOW);
       digitalWrite(6,HIGH);                                  
       digitalWrite(5,LOW);
       analogWrite(enA, 120);
       analogWrite(enB, 120); 
    }
    void movestop()
    {
      digitalWrite(4,LOW);
       digitalWrite(3,LOW);
       digitalWrite(6,LOW);                                  
       digitalWrite(5,LOW);
       analogWrite(enA, 0);
       analogWrite(enB, 0); 
    }
    Vielleicht kann jemand mal drüber schauen und mir sagen wo der Fehler liegt.
    Das wäre mir eine große Hilfe.

    Danke schön im voraus.

    Gruß Danilo

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    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);

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.208
    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..

  4. #4
    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.

  5. #5
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.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.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    03.02.2013
    Ort
    nähe Hamburg
    Beiträge
    33
    Danke für die Info.
    Ich habe zum Glück noch einige von unterschiedlichen Anbietern liegen.
    Ich werde sie heute Abend mal einbauen und testen.

    Ne ordentliche Verkabelung soll heute auch noch folgen.
    Mich nervt das Kauderwelsch.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Warum nutzt du nicht NewPing? Im OP hast du's im Code inkludiert. Das würde den Code wartbarer machen und das Timeout-Problem mittels MAX_DISTANCE_CM lösen:
    Code:
    #include <NewPing.h>
    
    //...
    
    #define MAX_DISTANCE_CM 200
    NewPing sonarFront = NewPing(frontTriggerPin, frontEchoPin, MAX_DISTANCE_CM); 
    
    //...
    
    loop() {
    
    //..
    
      auto front_cm = sonarFront.ping_cm();
      Serial.println(front_cm);
    
    //..
    
    }

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.208
    Bei mir hatte die NewPing mehr Ärger gemacht, als sie Vorteile haben sollte.
    Daher würde _ich_ von abraten. Ist allerdings ne Weile her, möglicherweise wurde da auch einiges gefixt inzwischen.
    Man kann auch bei PulseIn ein Timeout angeben: pulseIn(pin, value, timeout)
    Siehe: https://www.arduino.cc/reference/en/...ed-io/pulsein/
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Bei mir hatte die NewPing mehr Ärger gemacht, als sie Vorteile haben sollte.
    Daher würde _ich_ von abraten. Ist allerdings ne Weile her, möglicherweise wurde da auch einiges gefixt inzwischen.
    Man kann auch bei PulseIn ein Timeout angeben: pulseIn(pin, value, timeout)
    Siehe: https://www.arduino.cc/reference/en/...ed-io/pulsein/
    Welche Art Ärger gab's denn?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Finde RS485 fehler nicht
    Von demmy im Forum Elektronik
    Antworten: 18
    Letzter Beitrag: 03.07.2015, 06:49
  2. Finde Fehler nicht
    Von hunikuni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 20
    Letzter Beitrag: 03.06.2012, 14:54
  3. Antworten: 4
    Letzter Beitrag: 08.01.2008, 20: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, 19:34
  5. AVR 90S2313 Problem, und finde nicht den Fehler!
    Von Alex20q90 im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 01.05.2005, 14:20

Stichworte

Berechtigungen

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

Labornetzteil AliExpress