Ultraschallsensor HC SR04

  • Hallo zusammen,

    bin gerade neu in diesem Forum und habe schon direkt eine Frage.

    Schon einmal danke für die vielen Tipps und Tricks, die dieses Forum bietet. Dennoch habe ich noch eine offene Frage.

    Und zwar habe ich einen Ultraschallsensor (HC SR04) an meinen Raspberry Pi B angeschlossen und kann ihn problemlos mit Python auslesen.

    Dafür nutze ich folgendes Script:

    Wenn ich jedoch nun versuche, die Distanz mit Java auszulesen, dann springt das Programm nicht in die erste while-Schleife, bei der ich prüfe, ob gpioecho low ist und auch nicht in die, in der ich prüfe, ob gpioecho auf high steht.

    Scheinbar wird der Trigger nicht richtig ausgeführt, jedoch finde ich nicht die Ursache. Hier einmal der Code (Java mit pi4j und wiringpi ist installiert):

    Ich würde mich freuen, wenn mir jemand von euch mit ein paar Tipps oder sogar Code-Korrektur helfen kann.


    Viele Grüße
    Alex

    • Offizieller Beitrag

    Hi Alex,

    bei deinem Code kommen mir viele Fragen auf:
    1. ich nehme mal an, du hast irgendwo anders eine Main Methode?
    2. Was willst du mit diesem Code Stück bewirken?

    Code
    Runtime.getRuntime().addShutdownHook(new Thread() {
                   public void run() {
                       System.out.println("Oops!");
                       gpio.shutdown();
                       System.out.println("Exiting nicely.");
                   }
               });


    3. Ich kenne deinen Ultraschallsensor nicht - bist du dir sicher das dieser ein digiales Signal gibt? Ich würde viel mehr behaupten das so ein Sensor ein analoges Signal liefert, daher wäre diese Anweisung falsch:

    Code
    final GpioPinDigitalInput gpioecho = gpio.provisionDigitalInputPin(RaspiPin.GPIO_05, "Echo");

    4. Irgendwie verstehe ich die beiden Schleifen + deine Berechnung nicht. Wie bekommst du damit die Entfernung raus?

    5. Wurde zwar von dir nicht genannt, aber gab es Fehlermeldung/Exceptions?

    Ich bin ein gefallener Engel namens Turael.

    Einst vor langer Zeit rebelierte ich im Himmel bis Gott mich auf die Erde verbannte.

    Doch meine taten werden kein ende finden....

  • Hallo,
    angenommen, Du führst die Klasse >
    Distance < irgend wo mit:
    Distance distance = new Distance();
    wird nicht viel passieren.
    Die Instanz -> und ganz genau der Rumpf ist in den while_n Schleifen GEFANGEN!

    [code=php]...
    while (gpioecho.isLow()) {
    start = System.currentTimeMillis();
    System.out.println("habe in start geschrieben");
    System.out.println("damit lesbar ist bitte sleep(1000) auskommentieren");
    // Thread.sleep(1000);
    }
              
    while (gpioecho.isHigh()) {
    stop = System.currentTimeMillis();
    System.out.println("und jetzt schriebe in stop");
    System.out.println("damit lesbar ist bitte sleep(1000) auskommentieren");
    // Thread.sleep(1000);
    }
    ...[/php]


    Du "Togelst" also in den Schleifen.
    Schau Dir ein Beispiel / Tut an. Das Code ist sorry NIX.


    Gruß
    Georg

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

  • Hey zusammen,

    danke für das Feedback. Ist mir klar, dass der da gefangen ist. Ist aber absicht, um es zu testen.

    Turael :

    1. Jip, "Distanz" wird aus einer anderen main-Methode aufgerufen.

    2. Das habe ich aus einem Tutorial übernommen - und das bewirkt: wenn das Programm abrupt abgebrochen wird, werden die gpio-Pins auf Standard zurückgestellt und die Pins bleiben nicht auf 1 stehen.

    3. Soweit ich weiß gibt er ein digitales Output zurück.

    4. Ich kann damit messen, wie lange das "Echo" des Ultraschallsensors ist und somit auf die Entfernung kommen. Denn ich muss ja den frühsten Anfangszeitpunkt und den spätesten Endzeitpunkt des "Echos" abfangen. Die Doku zeigt das schön: http://www.mikrocontroller.net/attachment/218…chreibung_3.pdf

    5. Nein, leider keine einzige Fehlermeldung.


    georg:
    Sorry ich versteh deine Kommentare in dem Code nicht wirklich. Wieso gibst du Kommentare als Output aus?
    Ja, natürlich wird die Klasse wo anders aufgerufen :) und aktuell ist es Absicht, dass er dort festhängt. Sonst könnte ich ja nicht richtig testen.

    Aber da sowieso nichts am "Echo" ankommt, muss ich den Fehler wo anders finden.


    Viele Grüße
    Alex

    • Offizieller Beitrag

    Schön dadurch konnte ich selbst auch wieder was dazu lernen ;) (Punkt 2).
    Du hast da ein sehr schwieriges Problem... Bist du schon mit dem Debugger durch gegangen? Damit sieht man ja wo er hängen bleibt und auch wieso. Was ich mir auch vorstellen kann, ist das deine Schaltung nicht richtig funktioniert oder der Sensor kaputt ist? Hast du da einmal nachgemessen?

    • Offizieller Beitrag

    Er sagt ja mit Python klappt es. Poste doch mal deinen kompletten Code und nicht nur das was du denkst was wichtig ist. Ich lehne Java zwar in jeder erdenklichen Weise ab, da ich das gleiche aber auch in nem Python Thread fragen würde, denke ich, dass das den Javas (Nennen die sich wirklich so? Nach Figuren die in Star Wars erschossen wurden :fies: ) helfen wird.

  • Hehe, ging mir genauso :)

    Da ich die Java-Applikation auf meinem Windows Rechner erstellt und kompiliert habe, konnte ich auf dem Pi leider nicht debuggen, habe jedoch mit Outputs gearbeitet, sodass ich sehen konnte, dass er nicht in die while-Schleifen reinspringt.

    Der Sensor ist nicht kaputt und auch die Schaltung funktioniert tadellos, denn mit dem Python-Script funktioniert es ja zu 100% und ist auch wirklich extrem genau. Habe den Abstand mit einem Lineals nachgemessen und es weicht nur minimal ab.

    War jedoch auch mein erster Gedanke. :D

    Fällt mir irgendein Unterschied zwischen dem Python-Script und dem Java-Script nicht auf?

    Danke für deine Hilfe!


    Er sagt ja mit Python klappt es. Poste doch mal deinen kompletten Code und nicht nur das was du denkst was wichtig ist. Ich lehne Java zwar in jeder erdenklichen Weise ab, da ich das gleiche aber auch in nem Python Thread fragen würde, denke ich, dass das den Javas (Nennen die sich wirklich so? Nach Figuren die in Star Wars erschossen wurden :fies: ) helfen wird.

    Hups, hab dich beinahe übersehen - sorry.

    Der Java-Code oben ist komplett. Hinzu kommt in der main-Methode lediglich:

    Code
    Distance neuesDistance = new Distance();
    System.out.println("Distanz: " + neuesDistance.getDistance());
  • Hallo,
    so auf die schnelle:
    1)
    Distance neuesDistance = new Distance(); -> wird ne Instanze erzeugt- ok
    [font="Courier New"]
    2) [/font]
    System.out.println("Distanz: " + neuesDistance.getDistance()); ->
    auf der Konsole soll Wert (return) der
    getDistance() Methoden angezeigt werden (die getDistance() Methode wird hier aufgerufen) - ok.
    3) Nach initialisieren bla.. bla .. wird pin 6 auf H - dann sleep 10 dann wieder auf L gesetzt.
    Jetzt ist Pin 6 auf L!
    4) die While while (gpioecho.isLow()) ist 1 - und wird NIE! verlasen werden können!
    So funzt Dein Code jetzt.
    Was hat es mit Messung zu tun? - irgendwo machst Du logischen Fehler - oder hapert es an den Grundlagen. Oder habe ich etwas verlernt? :s

    Gruß
    Georg

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

  • Servus, nach fast über einem Jahr. :D
    Falls du das Problem immer noch hast, kann es eventuell daran liegen dass du den Trigger für 10mS auf High setzt anstatt für 10μS


    Code
    gpiotrigger.high();
              Thread.sleep(0, 10000);
              gpiotrigger.low();

    Einmal editiert, zuletzt von Kaplar93 (8. März 2016 um 14:08)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!