Sensor um Länge berührungslos "über einen Winkel" zu messen

Ich bastle momentan an meiner Wetterstation mit Arduino und würde gerne auch die Schneehöhe automatisch erfassen. Ich habe mir überlegt dies mit dem HC-04 (Ultraschallsensor) umzusetzen. Jedoch möchte ich den Sensor nicht senkrecht über dem Boden anbringen, um die Schneehöhenmessung nicht zu verfälschen (ausserdem soll die Messeinheit später an der Aussenwand meines Gartenhauses befestigt werden und messen möchte ich natürlich in einigem Abstand zur Wand).

Die einzige Möglichkeit wie man dies umsetzen kann, die mir bisher eingefallen ist, ist den Sensor in einem Winkel (45° rel. zum Boden) an der Aussenwand zu befestigen.

Natürlich wird dann der Schall nicht mehr auf direktem Wege reflektiert, weshalb ich wissen wollte ob es noch andere relativ günstige berührlose Alternativen gibt, mit denen ich auch “um die Ecke” messen kann?

Auflösung muss nicht so hoch sein (ca. 1cm).

Im Anhang hab ich noch ein Bild, welche Länge ich genau vermessen will. Die Schneehöhe würde ich dann aus einer trigonometrischen Beziehung berechnen.

Mit Ultraschall geht das def. nicht.
Du könntest es mit Infrarot-Sensor probieren.

Wenn Du einen schmalen Stab so ca 2 Meter in die Wiese hineinragen läßt dann verfälscht dieser wohl kaum die Schneehöhe und Du kannst (fast) senkrecht nach unten messen. Einige Grade zur Seite schafft der Sensor schon. Damit der Stab horizontal bleibt kannst Du ihn mit einem Seil geradehalten.

Grüße Uwe

uwefed:
..... Damit der Stab horizontal bleibt kannst Du ihn mit einem Seil geradehalten...

Hier meinst du sicher "vertikal".

Nein horizontal bzw waagerecht.
|
|
|
|
|
|_____
W

\ Seil
_ Stab
W US-Sensor

Du musst die Keulencharakteristik des US berücksichtigen, wenn du nicht rechtwinklig misst

uwefed:
Nein horizontal bzw waagerecht.
|
|
|
|
|
|_____
W

\ Seil
_ Stab
W US-Sensor

Ok, das verstehe ich jetzt.
Das könnte so auch funktionieren.
Ob mit einem US-Sensor muss man testen.

uwefed:
Wenn Du einen schmalen Stab so ca 2 Meter in die Wiese hineinragen läßt dann verfälscht dieser wohl kaum die Schneehöhe und Du kannst (fast) senkrecht nach unten messen. Einige Grade zur Seite schafft der Sensor schon. Damit der Stab horizontal bleibt kannst Du ihn mit einem Seil geradehalten.

Grüße Uwe

Vielen Dank, so sollte es einfach möglich sein.
Dass ich da nicht selbst draufgekommen bin...

Du könntest es mit Infrarot-Sensor probieren.

-->Infrarot? In solch einer Umgebung? Angeblich kommt es schon bei einem abweichenden Reflektionsuntergrund (Farbe, Beschaffenheit etc) zu starken Abweichungen...

Kommt auf den Sensor an. :slight_smile:
Die Sharp GP2xyz kommen damit schon klar...die Dinger sind erstaunlich gut.
Allerdings würden die wohl auch fallende Schneeflocken schon erkennen (mit so einem hab ich meinen NiboBee seinerzeit durch nen "Wald" aus aufgestellten Bleistiften geschickt, die erkennt er mühelos).
Dabei sind die Lichtverhältnisse nahezu egal (selbst in der prallen Sonne funktionieren die).

Die Sharp GP2xyz kommen damit schon klar...die Dinger sind erstaunlich gut.

-->Das kann ich so nicht bestätigen, für mein letztes Projekt schwanken die Werte ziemlich, trotz Pufferelko. Zudem begrenze ich die Werte auf maximal 25cm und teste diesen 2x, bevor er angenommen wird (so scheint es momentan einigermaßen zu funktionieren)
Spielt die Leitungslänge hier eventuell eine Rolle?

Hm- weiss ich nicht.
Mit längerem Kabel hab ich die Dinger noch nie benutzt. Könnts mir aber vorstellen, denn die liefern ja analoge Spannungen zurück.
Da sie aber moduliert arbeiten (wie das eigentlich jeder gescheite IR-Sensor tut) sollten Störungen durch Umgebungslicht nahezu ausgeschlossen sein.

Mal gucken, ich such gerade Kram für ne neue Bastelei zusammen, da kommt wahrscheinlich wieder einer mit dran. Evtl. kann ich da mal bisschen herumprobieren.

Aber etwas kniffelig ist es immer, die genaue Entfernung zu ermitteln, da die analoge Spannung nicht proportional zur Entfernung ist, sondern ne Kurve.

Generell finde ich diese Sensoren so richtig Klasse- weil sie wirklich aufn Punkt arbeiten. Nen Bleistift mit Ultraschall zu suchen, dürfte ziemlich aussichtslos sein, während man dagegen mit dem Sharp sogar vermessen kann, ob man da durch die Lücke kommt.

Kabellänge liegt wohl bei 1-2m. Am Umgebungslicht liegt es nicht, der Raum ist komplett abgedunkelt.
Und wegen der Arbeitsweise des Sensors habe ich direkt am Sensor noch einen Elko angelötet.

Aber etwas kniffelig ist es immer, die genaue Entfernung zu ermitteln, da die analoge Spannung nicht proportional zur Entfernung ist, sondern ne Kurve.

-->Dafür gibts doch fertige Libs? oO

Was sein könnte: der Sensor befindet sich ca. 3-4 cm über dem Boden, bestehend aus grau-silbrigem Teppichboden. Bei rauhen/ unebenen Flächen wird ja die Lichtintensität gedämpft, was zu Fehlmessungen führt. Vielleicht ist das ja das Problem...

Fertige Bibliothek für sowas simples wie einen analogen Wert einlesen? :o
Nie benutzt, nicht mal geschaut obs da eine gibt, hehe.

Liegt wahrscheinlich daran, dass ich so einen Sensor wirklich zuerst auf dem NiboBee montiert hatte, lange bevor ich mit Arduinos gespielt hab.
Aber gut-wenn sie die Umrechnung wirklich erledigen kann, wärs keine schlechte Sache.

Und ja: dein Teppich wäre ne mögliche Erklärung, denn: die Sensoren senden nen ziemlich kleinen Punkt aus. Aber auch wieder nicht soo klein. Heisst, der könnte durch die Teppich"höcker" durchaus etwas zerstreut werden, und da der Sensor trigonometrisch arbeitet, ist eine genaue Messung evtl. nicht drin.
Zumal, wenn du in recht spitzem Winkel misst (wonach das klingt).
Wie gesagt: Farbe oder Umgebungslicht interessieren den Sensor fast nicht.

Leg einfach mal ein Stück Pappe hin....

Aber gut-wenn sie die Umrechnung wirklich erledigen kann, wärs keine schlechte Sache.

-->Ja natürlich, sonst wäre das ja kompletter Unfug^^
Lib ist SharpIR, lässt sich direkt vom Verwalter finden. Man bekommt den Abstand in cm raus.

Zumal, wenn du in recht spitzem Winkel misst (wonach das klingt).

-->parallel zum Boden

Leg einfach mal ein Stück Pappe hin....

-->Könnte ich mal versuchen...

Hm- parallel zum Boden dürfte der Teppich den Sensor aber nicht beeinflussen, wird ja kaum so hohe Fusseln haben?
So ne grosse Streuung haben die eigentlich nicht (stell ihn mal vor eine Wand, möglichst nahe, und guck mit irgendeiner Digitalkamera, ob du den Lichtpunkt erkennst, dann weiter weg rücken.....).
Pass aber auf bei Wänden: es gibt ne weisse Wandfarbe, die IR-Licht annähernd vollkommen schluckt (hatten wir vor ner Weile im Roboternetz mal). Vermutlich zerstreut sie es einfach enorm (Alpinaweiss??).

Ich selbst hab damals festgestellt, dass, mit nem Edding geschwärzte Wellpappe wesentlich besser IR-mässig zu detektieren ist als ungeschwärzte braune-> ging da aber um was anderes, nicht um den Sharp.
Der macht, lauf Datenblatt, zwischen weissem Papier und grauem (enormer Unterschied in den Reflexionseigenschaften!) nahezu keinen Unterschied.

Ich muss noch ein, zwei Tage warten, ehe ich meinen aufsetzen kann- brauch erst mal wieder nen paar Streifenraster-Platinen, die sind irgendwie immer alle, wenn man mal ein Stück braucht, egal wieviele man vorrätig hatte... :confused:

Fällt mir eben ein, einfacher Test: was macht das Ding denn ohne die Bibliothek?
Umrechnen musst du nicht mal, reicht ja, den ADC auszulesen- dann sollten ziemlich reproduzierbare Ergebnisse da sein.
Inzwischen hab ich längst gemerkt, dass es zwar schier für jeden Krempel ne Lib gibt, aber viele davon auch genau das sind: ziemlicher Murks.

Hm- parallel zum Boden dürfte der Teppich den Sensor aber nicht beeinflussen, wird ja kaum so hohe Fusseln haben?

–>Wohl eher kaum^^

So ne grosse Streuung haben die eigentlich nicht (stell ihn mal vor eine Wand, möglichst nahe, und guck mit irgendeiner Digitalkamera, ob du den Lichtpunkt erkennst, dann weiter weg rücken…).

–>Da sucht man ja die Nadel im Heuhaufen oO Habe stattdessen die Kamera genau vor die Linse platziert und auf das Hellste ausgerichtet, dann weiter entfernt. Bleibt eigentlich parallel über dem Boden, wie es sein soll…

Fällt mir eben ein, einfacher Test: was macht das Ding denn ohne die Bibliothek?

–>Müsste ich mal testen… ist aber recht schwer, im verbauten Zustand da ranzukommen

Inzwischen hab ich längst gemerkt, dass es zwar schier für jeden Krempel ne Lib gibt, aber viele davon auch genau das sind: ziemlicher Murks.

–>Ich glaube, die verwendete Lib fällt darunter, hier ein Ausschnitt aus der .cpp:

uint8_t SharpIR::getDistance(bool avoidBurstRead)
{
	if( !avoidBurstRead ) while(millis() <= lastTime + 20) {} //wait for sensor's sampling time
	
	lastTime = millis();
	
	switch(sensorType)
	{
		case GP2YA41SK0F:
			
			distance = 2076/(analogRead(pin)-11);
			
			if(distance > 30) return 31;
			else if(distance < 4) return 3;
			else return distance;
			
			break;
			
		case GP2Y0A21YK0F:
			
			distance = 4800/(analogRead(pin)-20);
			
			if(distance > 80) return 81;
			else if(distance < 10) return 9;
			else return distance;
			
			break;
			
		case GP2Y0A02YK0F:
			
			distance = 9462/(analogRead(pin)-16.92);
			
			if(distance > 150) return 151;
			else if(distance < 20) return 19;
			else return distance;
	}
}

a) avoidBurstRead soll ja falsche Abfragen verhindern, aber hier wartet er ja nur bis zur nächsten Auslesezeit, wenn !avoidBurstRead oO und dann blockiert der auch noch solange mit der while()…
b) Wie sieht es mit der Berechnungsformel aus, kommt die so hin? Nach ner Kurve sieht das so eigentlich nicht aus…
Aber selbst wenn diese Punkte zutreffen, sehe ich hier keinen Grund für derart schwankende Werte, die Lib ist dahingehend recht simpel gehalten

Ich werd sie nicht benutzen.
Liest sich, als würd es da jemand unnötig kompliziert machen wollen.
Immer diese Theoretiker.... :frowning:
Als Praktiker (mit eher rudimentären theoretischen Grundlagen 8) ) halt ich mich da eher an sowas:

http://rn-wissen.de/wiki/index.php?title=Sensorarten
Runterscrollen, bis Sharp-IR-Sensoren, da ist schön beschrieben, wie man zu einer brauchbaren Formel kommt.
So werd ich das dann auch angehen.
Vielleicht wirds bis zum Wochenende- vorher brauch ich noch Einzelteile- vor allem die Streifenraster-Platinen.

Übrigens siehst du anhand der Diagramme in dem Link sehr schön, wie unsensibel die Dinger auf verschieden reflektierende Untergründe reagieren- das sind Auszüge aus den Datenblättern. So leicht bringt man die nicht ausm Tritt....

Falls es interessiert: ich konnte den Fehler beheben, jedoch nicht finden.
Ich hab mir die Messung im Programm ausgeben lassen, ständig stand da die fehlerhafte Anzeige von 10cm (Abfrageintervall von 50ms, jede Sekunde ca. eine Fehlmessung-->1 Fehlschlag auf 20 Messungen, da hilft selbst eine 3fache Plausibilitätskontrolle nicht viel). Und warum 10, das verstehe ich auch nicht... die Lib rechnet ganz simpel um, wenn mehr als 80 rauskommt, gibt sie 81 zurück, wenn weniger als 10, dann 9. Die Werte dazwischen werden berechnet, die 10 müsste jedes mal ganz genau berechnet werden.
-->Werte roh ausgelesen, ganz selten eine Abweichung. Dann die Berechnungsformel der Lib genommen, ebenfalls ganz selten ein Fehlschlag (und dann auch nicht die 10)
-->Beispiel-Sketch der Lib genommen, nur ganz selten ein Wert unter 11, und dann meist 9.
-->Lib aus meinem Programm entfernt, eine Funktion mit der Berechnungsformel aus der .cpp der Lib erstellt, funktioniert anstandslos, nur ganz selten eine Fehlmessung mit 9.
Vermutung: irgendwo im (alten) Programm hat der Controller in das Objekt reingepfuscht, was die Lib erstellt. Wäre dies möglich?

Hi

Eventuell, wenn Du z.B. über ein Array hinaus schreibst.
Aka:
byte bereich={0,1,2,3};
bereich[4]=17;
würde Dir die Speicherstelle HINTER dem Array mit den vier Byte zerstören und dort eine 17 hinschreiben.
Was Da in diesem Moment für eine Variable gespeichert ist (oder ob überhaupt - Das würdest Du aber nicht mitbekommen, da der Speicher ja gerade 'frei' ist), ist unbekannt.
So kann dabei Alles oder eben gar Nichts passieren - mit allen denkbaren Zwischenpositionen.

MfG

Schön, daß Es jetzt klappt!
Ähnliches kenne ich aber auch - habe die Lese/Schreib-Routienen für einen I2C Speicher händisch nachgebildet, da ich keine Schreib/Lese-Kommunikation hin bekam.
Mit Tommy's Code verglichen, Beides identisch, Tommy's Code wieder benutzt -> funktionierte.