ich übe mir meinem Junior für die Schule in Ardublock.
Viele ihrer Aufgaben verwenden den Ultraschallsensor HC-SR04 zur Entfernungsmessung.
Aber sowohl im Unterricht wie auch bei uns zuhause funktioniert dieser so gut wie nie.
Er liefert im Regelfall ein plausibles Entfernungssignal auf jedem zweiten Messpunkt. Der jeweilig andere Messpunkt ist immer 0. Somit bekommt man kein verwertbares Signal um damit Aktuatoren anzusteuern.
Hat Jemand eine Idee wo das Problem liegt bzw. wie man es in Ardublock behoben bekommt?
Codeänderungen sind nicht wirklich eine Option, da die Schüler in der Schule auch nur die fertigen Funktionsblöcke aus der Bibliothek von Ardublock verwenden dürfen.
In den Bildern sieht man meinen stark vereinfachten Versuchsaufbau von Sensor Breadboard und Arduino Uno, in dem lediglich der Sensorwert auf dem seriellen Monitor angezeigt werden soll.
Auf dem Anderen Bild sieht man das Ergebnis der Sensorwerte im seriellen Monitor.
Zum Hinweis "nach einer Messung-Ausgabe noch ein Delay":
Das Habe ich auch schon mal versucht. Das sogt dafür, dass das Signal im Monitor zunächst gut aussieht so lange ich nur den Wert im Monitor anzeige.
Sobald ich die Logik erweitere und z.B abhängig vom Entfernungssignal eine LED ansteuere, verhält sich alles fuzzy. Dann wird mir mal ein Wert im Monitor angezeigt und mal kommt wieder nur 0.
Die Funktion der LED ist auch nicht reproduzierbar gegeben. Sensoren habe ich inzwischen 6 Stück. die verhalten sich alle identisch.
Das erste Bild ist nur der Sensor im Monitor mit Delay. Da passt das Signal.
Das zweite Bild ist dann mir Ergänzung um eine LED, mit dem beschriebenen Verhalten.
Nachtrag: Wenn ich das wie in der 2. Abbildung aufbaue funktioniert es momentan reproduzierbar (LED geht an oder aus, abhängig von Entfernung des Objekts). Jedoch erscheint im Monitor weiterhin permanent der Wert 0, egal wie weit das Objekt vom Sensor entfernt ist.
Ardublock ist noch genauso kaputt, wie ich das mal getestet habe.
Mittlerweile habe ich auch zwei unterschiedliche Versionen von zwei unterschiedlichen Quellen.
MIt einer bekomme ich auch Dein Modul - aber kaputt ist sie trotzdem.
Ich bin ganz bestimmt in der Lage Logikfragen zu lösen - aber hier zeigt sich eindeutig wie klickibunti alles kaputt machen kann.
Wenn mir irgendwas einfällt, gebe ich Bescheid, aber das wird wohl eher nichts.
Ich habs probiert und bin kläglich gescheitert.
In der Zeit, wo ich die Blöcke geschubst habe (und erstmal gefunden, was gebraucht wird), habe ich Parkinson, Demenz und bin inkontinent...
Aber:
Es gibt keine Möglichkeit dem Ultraschallmodul beizubringen, dass die triggerzeit länger sein muss.
Das muss man manuell im dann erstellen Code machen.
Ich habe verwendet:
Die ist offensichtlich gepflegt, wenngleich noch immer mit Problemen.
Wenn man die Ansicht auf FULL stellt, bekommt man ne Menge zusammen.
Die Version macht das übrigens richtig mit den Pins und schreibt die Initialisierung ins setup()
Allerdings macht es die Pin-Initialisierung falsch. Der Triggerpin wird als INPUT definiert. Damit ist das kaputt.
Dir bleibt nichts weiter übrig, als den Code aus dem Ardublock zu übersetzen und dann im Arduino-Editor sowohl das delaymicrosecond manuell von 2 auf 5 zu setzen und den Pinmode richtig zu setzen.
Mein Ardublockfile: ardublocktest.zip (2,0 KB)
Das sollte auch unter anderen Versionen lesbar sein, nur eben mit den entsprechenden Problemen, die sich in den alten Versionen ergeben.
Und damit endet der Versuch.
Zwischen der zweiten Messung und der darauf wieder folgenden ersten Messung vergeht zu wenig Zeit.
Ein weiteres einfügen einer Pause von 100 Millisekunden am Ende des Arduinoblocks sollte dein Problem lösen.
Das liegt daran, das der Code sich endlos immer wiederholt.
Eleganter ist es, wie @noiasca schon schrieb, den Wert nur einmal pro Loop zu lesen, ihn in einer Variable zu halten, und dann im Loop mit dem Inhalt der Variable zu arbeiten. Dann müsstes du den Loop nur einmal bremsen, damit die Messungen nicht zu schnell nacheinander gemacht werden.
Oder noch besser, nur nach Ablauf eine gewissen Zeit eine neue Messung und den Loop gar nicht bremsen.
Vielen lieben Dank für eure vielen Hilfestellungen!
Wenn ich heute Abend zuhause bin und mein Junior aus der Schule da ist werden wir die Varianten mal ausprobieren.
Ich dachte mir das schon, dass die Logik in dem in Ardublock vorhandnenen "Sensor-Block" für diesen Ultraschallsensor nicht korrekt bzw. tolerant genug ist um stabil zu funktionieren.
Hatte auch schon mal kurz gegoogelt, ob man diese Blöke editieren oder sich selber Funktionsblöcke erstellen kann in denen dann ein vernünftiger Code enthalten ist. Aber mit für Schüler vertretbarem Aufwand ist das wohl eher nicht realistisch. Wir kämpfen hier nicht um eine Eins mit Sternchen sondern versuchen den Bengel ohne größeren Kollateralschaden durch die Prüfungen zu bekommen
Ein weiteres Delay am Ende der Funktion hat das Problem gelöst. Die zusätzlichen 5ms Delay führen dazu, das sowohl die Funktion gegeben ist aber auch die Werte im Monitor plausibel angezeigt werden.
Für den Anspruch der Schule ist das völlig ausreichend.
Schade finde ich, dass ich mich als Elternteil in Foren schlau machen muss, warum der Krempel im Unterricht nicht funktioniert. Das könnte ja eigentlich auch der Anspruch eines Lehrers sein seinen Schülern etwas bereitzustellen das funktioniert...
Toll finde ich es immer wieder wie Foren, wie auch dieses hier, einfachen und unkomplizierten Support von Spezialisten und Nerds bieten und das Leben einfach nur bereichern!
Darum hier nochmal vielen Dank an Alle die geholfen haben - Ihr seid super!!!
eine Frage dazu: Weshalb den Triggerpin erst LOW setzen, er ist doch schon LOW ?
Ich hab' eine ganze Reihe von US Sensoren im Einsatz, lass das weg und hab bisher keine Probleme bemerkt. OK, ich bin aber auch sicher dass der Rest des Programms länger als 5 us dauert...
Dafür habe ich mit ein paar meiner USS Probleme wenn ich den Triggerpin weniger als 15 us HIGH halte.
Als Lehrer muss man nicht unbedingt Ahnung von dem haben was man unterrichten soll...
Beispiel: Dem Sportlehrer fehlen noch ein paar Stunden um auf seine wöchentlichen Sollstunden zu kommen, er kann "Computer" richtig schreiben und hat auch schon mal eine schöne Präsentation gebastelt.
Dummerweise hat die Schule keinen Fachlehrer für EDV oder dieser hat schon zu viele Stunden. Planstelle für einen weiteren Lehrer gibt es nicht, - dann rate mal wen der Schulleiter einsetzt...
Es ergibt sich aus dem Datenblatt, dass für 5µsek gesichert sein muss, den Pegel auf LOW zu ziehen.
Hier steht es direkt im Code. In Libs siehst Du sowas nicht.
Z.B. bei den LCD.Libs und wenn mich nicht alles täuscht auch bei der wireLib sind solche Zwangspegel ebenfalls enthalten.
Das ist richtig.
Ich habe dazu mal was vor einigen Jahren verfasst, was hier dokumentiert ist