- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Ultraschallsensor gibt falsche Werte zurück

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.07.2018
    Beiträge
    30

    Ultraschallsensor gibt falsche Werte zurück

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Ich habe in einem alten Beitrag darüber geklagt, dass der Ultraschallsensor (HC-SR04), möglicherweise aufgrund mangelnder
    Stromversorgung, falsche Werte zurückgibt. Dieses Problem tritt auf, wenn ich einen weiteren Sensor
    anbringe. Halte ich den Roboter in der Luft so arbeitet der Ultraschallsensor normal. Sobald ich den Roboter abstelle bzw. auf
    die Räder Druck ausübe, reagiert der Roboter/Sensor so, als ob ein Hindernis vor ihm steht. Daher die Annahme
    der mangelnden Stromversorgung.

    Zum Beitrag: https://www.roboternetz.de/community...reren-Sensoren

    Zum Roboter:

    Ich habe mir ein Roboterbauset gekauft:
    https://www.banggood.com/DIY-L298N-2...html?rmmds=buy

    Mithilfe dieses Videos habe ich den Roboter zusammengebaut:
    https://www.youtube.com/watch?v=BH33F-Hi_2M
    Bei 6:14 ist ein Plan mit den Verbindungen zu sehen.

    Der zusätzliche Sensor ist ein Infrarotsensor mit dem ich Signale einer Fernbedienung
    empfange, um den Roboter fernzusteuern. Dieser Sensor ist auf dem Sensorshield lediglich an den
    Pins an der Nummer 3 angeschlossen. Das ist der einzige Unterschied zu dem Plan im Video.

    Der Grund für diesen Beitrag ist, dass mir in dem alten Beitrag dazu geraten wurde 6x 1.2V Akkus mit 2600mAh an den
    Roboter anzuschließen. Dies habe ich nun gemacht. Nun gibt der Sensor immer noch eigenartige Werte aus und die Gleichstrommotoren
    drehen sich sehr schnell. An Strom scheint es nun wahrscheinlich nicht mehr zu mangeln^^.
    Das Problem wurde allerdings dadurch nicht gelöst. Der Sensor gibt Werte nicht unter 100 und manchmal bis über 2000 zurück.
    Mein Vorschlag wäre nun an die Stromversorgung "einfach" einen Potentiometer anzuschließen und die Stromversorgung so
    zu regulieren, bis die Sensoren normal arbeiten. Übrigens, bin ich in dem Bereich Elektrotechnik ein totaler Anfänger.

    Ich weiss nicht ob es weiterhilft den Code zu posten, da der Roboter normal funktioniert, wenn ich mit den 4x 1.5V Batterien
    die im Bausatz vorhandenen Bauteile betreibe. Das Problem tritt auf, wenn ich den zusätzlichen Infrarotsensor anschließe.
    Der Infrarotsensor scheint normal zu arbeiten, nur der Ultraschallsensor spielt verrückt.

    Ich versuche die für dieses Problem relevanten Codezeilen herauszupicken.

    Ultrasonic Methode sendSignal:
    Code:
    long UltraSonic::sendSignal()
    {
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
     
    while ( digitalRead(ECHO_PIN) == 0 );
    
    t1 = micros();
    while ( digitalRead(ECHO_PIN) == 1);
    t2 = micros();
    pulse_width = t2 - t1;
    
    cm = pulse_width / 58.0;
    inches = pulse_width / 148.0;
     
    return cm;
    }
    Code in dem sich die Kollisionserkennung abspielt:
    Code:
    void setup() {
    
      leftMotor = new Motor(enA, in1, in2);
      rightMotor = new Motor(enB, in3, in4);
    
      servo = new ServoEng();
    
      servo->moveServo(servo->mitte);
    
      irrecv.enableIRIn();
    
      delay(3000);
    
      if (!irC.mode)
      {
        leftMotor->drive(250);
        rightMotor->drive(250);
      }
    
      servo->servoPos = 0;
    
    
    }
    
    void loop() {
      if (irrecv.decode(&results)) {
        String irResult = String(results.value);
    
        if (irC.mode)
        {
          //2
          if (irResult == "1033561079" || irResult == "16718055" || irResult == "2506190260")
            irC.moveForward(rightMotor, leftMotor);
          //6
          if (irResult == "71952287")
            irC.turnRight(rightMotor, leftMotor);
          //8
          if (irResult == "16730805" || irResult == "465573243")
            irC.stopEngines(rightMotor, leftMotor);
          //4
          if (irResult == "16716015" || irResult == "2351064443")
            irC.turnLeft(rightMotor, leftMotor);
        }
        //5
        if (irResult == "16726215")
        {
          irC.changeMode(rightMotor, leftMotor);
          servo->moveServo(servo->mitte);
        }
    
        irrecv.resume();
      }
    
    
      if (!irC.mode)
        if (findeHinderniss())
        {
          //Suche Ausweg
          findeAusweg();
          leftMotor->drive(250);
          rightMotor->drive(250);
        }
    }
    
    bool findeHinderniss()
    {
      schauDichUm();
    
      int distanceUltraSonic = ultraSonic.sendSignal();
    
      if (distanceUltraSonic < 20)
      {
        //Stop!
        leftMotor->drive(0);
        rightMotor->drive(0);
        return true;
      }
      return false;
    
    }
    
    void schauDichUm()
    {
    
      if (dreheRechts)
      {
        if (servo->servoPos <= servo->mitte + 50)
          servo->servoPos++;
        else
          dreheRechts = false;
      }
      else
      {
        if (servo->servoPos >= servo->mitte - 50)
          servo->servoPos--;
        else
          dreheRechts = true;
      }
    
      servo->moveServo(servo->servoPos);
    
      delay(5);
    }
    
    
    void findeAusweg()
    {
    
      int distanceRight = 0;
      int distanceLeft = 0;
    
      leftMotor->drive(0);
      rightMotor->drive(0);
    
      servo->moveServo(180);
      delay(500);
      distanceRight = ultraSonic.sendSignal();
      delay(50);
    
      servo->moveServo(0);
      delay(500);
      distanceLeft = ultraSonic.sendSignal();
      delay(50);
    
      servo->moveServo(servo->mitte);
      delay(200);
    
      if (distanceRight < 20 && distanceLeft < 20)
      {
        //Fahre rückwärts
        leftMotor->drive(-250);
        rightMotor->drive(-250);
        delay(750);
      }
      else if (distanceRight > distanceLeft)
      {
        //Fahre rechts
        leftMotor->drive(-250);
        rightMotor->drive(250);
        delay(500);
      }
      else
      {
        //Fahre links
        leftMotor->drive(250);
        rightMotor->drive(-250);
        delay(500);
      }
    
      servo->servoPos = servo->mitte;
      dreheRechts = true;
      dreheLinks = false;
    
    
    }
    Am Code sollte es nicht liegen. Der Code kompiliert und der Roboter
    funktioniert solange ich keinen weiteren Sensor als den Ultraschallsensor
    anschließe.
    Ich würde mich über Hilfe sehr freuen! Danke an alle die sich die Mühe machen!

  2. #2
    HaWe
    Gast
    hi,
    zuallererst:
    die SR04 werden am Arduino angeschlossen, nicht an der Batterie, das gleiche gilt für IR Sensoren, und daher haben sie immer 5V, egal wie die Batteriespannng ist.

    Poste mal bitte deinen Schaltplan, als Zeichnung!

    Und dann bitte einen kompletten (!) aber vereinfachten Sketch, OHNE MOTOREN, wo einfach nur die Sensoren ausgelesen und die Werte angezeigt werden!
    Geändert von HaWe (08.09.2018 um 20:14 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Hallo eniddelemaj!

    Du schreibst: "Dieser Sensor ist auf dem Sensorshield lediglich an den
    Pins an der Nummer 3 angeschlossen."

    In dem Film sieht man zwar das Sensor Shield, allerdings kann ich nichts von Nummer 3 lesen oder etwas, was darauf hindeutet. Ich kenne mich aber auch mit dem Sensor Shield nicht aus.
    Allerdings denke ich, muss man wissen, wie und wo Du den zusätzlich Sensor ganz genau angeschlossen hast. Ich kann mir zwei Dinge vorstellen:
    1. der Infrarotsensor stört den Ultraschallsensor, so, wie der angeschlossen ist (was nicht ersichtlich ist)
    2. Es ist irgendwie ein Fehler in der Programmierung

    Entweder sehe ich den Infrarotsensor einfach nicht und den Anschluss 3 oder es ist nicht zu erkennen. Vielleicht machst Du mal ein Foto von Deinem Sensor Shield, wenn alles angeschlossen ist, dass man das genau sehen kann. Wer sich damit auskennt, sieht vielleicht, wo das genau angeschlossen ist und wie man das programmtechnisch dann umsetzt, mit dem Infrarot.

    Nachtrag:

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

Name:	sensor-shield-v5-bluetooth-digital-analog-servo-fuer-arduino-uno.jpg
Hits:	1
Größe:	96,4 KB
ID:	33618
    Infrarot: https://www.mymakerstuff.de/2017/03/...nfrarotsensor/
    Ultraschall: https://funduino.de/nr-10-entfernung-messen

    Der Ultraschallsensor wird getriggert, dann wird gewartet, bis der Sensor den Logikpegel eines Pin verändert. Jetzt wird das erste Mal die Zeit erfasst, danach wird gewartet, bis am Pin wieder der Logikzustand geändert wurde. Nun wird das zweite Mal die Zeit erfasst und daraus die Lauflänge des Signals berechnet. Das alles findet im Arduino statt. Hierbei kommt infrage, dass diese Routine gestört/unterbrochen wird. Zum Beispiel durch einen externen Auslöser ein Interrupt ausgelöst und das Programm unterbrochen wird, während es misst. Dauert die Unterbrechung mal länger, mal kürzer, kann das infolge zu falsch berechneten Werten kommen, weil man genau den Punkt abpassen muss, an dem der Logikzustand des Pin wechselt.

    Es könnte sein, dass der Infrarotsensor falsch auf dem Board angeschlossen ist. Es könnte sein, dass dieser Sensor defekt ist und die Boardelektronik beeinflusst. Es könnte sein, dass das Sensor Shield nicht richtig aufgesteckt ist oder dass Kontakte nicht richtig zustande kommen oder gar nicht (umgebogene Pin-Stifte).
    Geändert von Moppi (09.09.2018 um 10:02 Uhr)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    174
    Code:
    while ( digitalRead(ECHO_PIN) == 0 );
    
    t1 = micros();
    while ( digitalRead(ECHO_PIN) == 1);
    t2 = micros();
    pulse_width = t2 - t1;
    Warum wird die Zeit gesmessen wo der Sender sendet ??
    Absolut unnötig, du fragst den Echopin auf 0 ab und machst gar nix in dieser Zeit. Sind nun die 8x40kHz durch,
    wird der Echopin auf 1 gesetzt dieser bleibt solange 1 bis ein Echo empfangen wird.

    Interrupts GLOBAL deaktivieren
    Trigger = 1
    warte 50µs
    Trigger = 0

    EchoPin = 0
    warte bis Echopin = 1
    starte Timer wenn Echopin = 1
    warte bis Echopin = 0
    Interrupts GLOBAL aktivieren

    Auslesen des Zeitwertes.

    Nun kommt der zweite Kasusknacksus

    Entweder wird jetzt die gemessene Zeit (in µs) mal Schallgeschwindigkeit(343 m/s) genommen = Weg (in µm)
    welcher nur noch halbiert werden muss. SKALIERUNG beachten m/cm/mm/µm
    Ebenso kann auch erst die Zeit halbiert werden so das der Weg gleich ein absolutes Endergebnis ist

    ODER

    man setzt den Timer so das ein Timerbit 58µs entspricht damit kann man die Rechnung umgehen. Auflösung beträgt dann nur 1cm/bit.
    Wird der Timer auf 5,8µs / Bit gesetzt beträgt die Auflösung 1mm/bit.

    Hier ist auf eine Wiederholrate zu achten vom Messungsabstand von mindestens 20ms

    Solltest du den hc-sr04 direkt an eine Versorgungspannung angeschloßen haben die mehr als 5V lieferte besteht die Möglichkeit das dieser defekt ist

  5. #5
    HaWe
    Gast
    ich warte ja immer noch aufs Schaltbild, welche Sensoren an welche Pins angeschlossen sind.
    Und vor allem, ob US und IR an verschiedenen Pins hängen, denn aus dem Code werde ich nicht schlau

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Wie es ausschaut, stimmt was mit der Ultraschallmessung in UltraSonic::sendSignal() nicht. Laut der Seite, die ich schon rausgesucht hatte, soll das eigentlich so funktionieren:

    Code:
    digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
    delay(5); //Dauer: 5 Millisekunden
    digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
    delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
    digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
    dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
    entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.

  7. #7
    HaWe
    Gast
    er schrieb doch, dass angeblich alles funktioniert (also auch der USS), wenn kein IR Sensor angeschlossen ist, erst dann gäbe es Probleme.
    Abgesehen davon, dass ich weder seinen USS Code verstehe noch seine UltraSonic:: Klasse noch seinen IR Code irgendwo.
    Also würde ich vorschlagen, wir warten jetzt erst mal auf einen vereinfachten lauffähigen Code und Schaltbild, bevor wir weiter mit unseren Kristallkugeln spekulieren

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    27.07.2018
    Beiträge
    30
    er schrieb doch, dass angeblich alles funktioniert (also auch der USS), wenn kein IR Sensor angeschlossen ist, erst dann gäbe es Probleme.
    Abgesehen davon, dass ich weder seinen USS Code verstehe noch seine UltraSonic:: Klasse noch seinen IR Code irgendwo.
    Also würde ich vorschlagen, wir warten jetzt erst mal auf einen vereinfachten lauffähigen Code und Schaltbild, bevor wir weiter mit unseren Kristallkugeln spekulieren
    Ja es funktioniert alles, wenn der infrarot Sensor Nicht angeschlossen ist UND die alte Stromversorgung von 4x 1.5 V angeschlossen ist.
    Als ich dann die 6x 1.2V 2600mAh Akkus angeschlossen habe, hat der Sensor angefangen verrückt zu spielen und die Motoren drehten sich schneller.

    Womit zeichne ich einen Schaltplan? Gibt es dafür ein Programm, das ich nutzen könnte? Hab mir TinyCad runtergeladen, bin
    mir aber nicht sicher ob ich das damit richtig darstellen kann. Hatte schon Probleme ne normale Stromquelle zu zeichnen. Ansonsten habe ich den
    Schaltplan aus dem Video eins zu eins übernommen.

    Und bei dem Code funktioniert alles. Es kann einfach nicht daran liegen, da der Roboter bzw. der Code
    normal funktioniert wenn ich die 1.5V Stromversorgung angeschlossen habe. Es hat also nur was mit der
    neuen Stromversorgung zu tun, also vielleicht zu viel Strom oder wenn ich bei der alten Stromversorgung einen weiteren
    Sensor anschließe, also zu wenig Strom. Und die neue Stromversorgung sieht dabei ehere aus wie ein Overkill

  9. #9
    HaWe
    Gast
    Schaltskizze einfach auf ein Blatt Papier mit Bleistift und Lineal

    Und bitte einen kompletten, lauffähigen, möglichst weit heruntergekürzten Sketch Testcode.

    Solange wir deinen Code nicht haben und keine Schaltskizze, kannst du keine brauchbare Hilfe erwarten,
    denn unsere Kristallkugeln haben eine geringe Treffsicherheit

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    Der Arduino kann mit 7 bis 9V versorgt werden. Der Infrarotsensor wird mit 5V vom Arduino gespeist. Der Ultraschallsensor ebenfalls. So weit sehe ich das bis jetzt, durch meine Kristallkugel. Da ist irgendwo ein Verdrahtungsfehler oder was kaputt. Oder umgebogene Pins (dann ohne Kontakt) und keiner hat's gemerkt. Für nicht bemerkte Fehler muss jeder seine eigene Kristallkugel haben. Aber wenn wir mehrere Kugeldeutungen zusammenschmeißen, dann kommt doch auch was raus?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. SRF02 gibt 0 zurück
    Von substrateffekt im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 28.08.2012, 08:08
  2. Ultraschallsensor SRFo5 gibt immer 0 zurück
    Von xrtm4e im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 22.06.2012, 22:25
  3. Ultraschallsensor SRF 10 liefert immer 28784cm zurück!?
    Von mintekinder im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 17.03.2008, 22:19
  4. SRF02 gibt seltsame Werte zurück
    Von U.H.M. im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 09.01.2008, 08:37
  5. Display gibt falsche WErte aus
    Von axors im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 31.12.2005, 10:36

Berechtigungen

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

Solar Speicher und Akkus Tests