Ich hab mehrere Sharp IR-Sensoren, u.a. die für 80 cm Entfernung.
Die liefern ja leider nur ein analoges Signal das nicht linear verläuft. Wie rechnet ihr mit dem Microcontroller die Entfernung aus?
Hat jemand ein paar Zeilen Quellcode für mich?
nb
Druckbare Version
Ich hab mehrere Sharp IR-Sensoren, u.a. die für 80 cm Entfernung.
Die liefern ja leider nur ein analoges Signal das nicht linear verläuft. Wie rechnet ihr mit dem Microcontroller die Entfernung aus?
Hat jemand ein paar Zeilen Quellcode für mich?
nb
Ich verwende die auch und werde mich bis Ende dieser, Anfang nächster Woche damit befassen, wenn du noch so lange Zeit hast, kann ich dir eine Lösung als Code schicken.
Bei den Sensoren ist ja eine Tabelle dabei (Datenblatt). Ich werde wahrscheinlich die Kennlinie zwischen den Werten als linear annehmen und dann mittels Fallunterscheidung die Entfernung interpolieren.
Was schreibst Du für Code? C-Control Code oder halt Algorithmus würde mich auch interessieren. Kannst Du deinen Weg dann im Forum posten. Wird sicher vielen helfen.
Wo ist denn die Tabelle, ich meine ich hätte nur Kurve gesehn?
Ja, wäre toll wenn Du da was posten könntest. Brauche es auch erst in den nächsten Wochen
Die Tabelle ist im Datenblatt (z.B.: GP2D12) auf der 2ten Seite unter "Calibration". Man muss halt noch von der "Average Voltage" mittels der Auflösung der A/D Wandlung auf den Wert umrechnen, der dann im Controller zur Verfügung steht.
Ich schreibe einen C Code, kein Basic.
Ach ja, will man es genauer, sollte man selber Messungen machen und diese verwenden.
Beim Sensor GP2D120 hat schon jemand gemessen:
http://www.electronicsplanet.ch/Mess...C/SHA120CC.htm
Aber der hat ja nur ca. 30 cm Reichweite
Hi,
bei meinem GP2D02 (der mit Digitalausgang) benutze ich die folgende Methode:
Formel zur Entfernungsberechnung:
D = A/(X-B)
D ist die Entfernung
X ist der Ausgabewert des Sensors
A ist die Steigung der Kurve A/X
B ist der Offset der Kurve
Zum Ermitteln der Konstanten A und B:
D und X sind die Entfernung und der Ausgabewert der ersten Messung (z.B. bei 20 cm)
D' und X' sind die Entfernung und der Ausgabewert der zweiten Messung (z.B. bei 60 cm)
A = (X'-X) D'D/(D-D')
B = (D'X' - DX)/(D' - D)
Gruß
-=jens=-
Diese Methode funktioniert aber nur, wenn der Kennlinienverlauf eine Gerade ist. Oder irre ich mich da?
@Judgeman: jep, du irrst.
Durch die obige Formel wird die Entfernungskurve ziemlich exakt Abgebildet.
Die Genauigkeit liegt im Bereich ~20-60 cm unter 1 cm.
Gruß
-=jens=-
Hat jemand X und B für die verschiedenen Sensoren schon ermittelt, dies würde die Formel gleich noch etwas vereinfachen ;-) Sind ja eh meist nur 3 oder 4 Typen die immer wieder eingesetzt werden
Ich würde die Konstanten A und B für jeden Sensor einzeln bestimmen.
Bei meinen 4 GP2D02 ist die Streuung so groß, das ich bei den "falschen" Werten schnell auf Abweichungen von bis zu 4 cm gekommen bin.
Gruß
-=jens=-
Danke für die Formel! Erleichtert einiges, wenn sie funktioniert.
Das es so große Abweichungen gibt hätte ich garnicht gedacht. So genau hab ich die Entfernung bislang noch nie berechnet. Ich werde auch mal deine Formel austesten, danke für Tip!
Habe die Formel überprüft, sie ist erstaunlich genau! :lol:
Das macht das Leben viel einfacher.
@ DerInder: Vielen Dank!
Kannst Du die Konstanten A und B und deinen Sensortyp mal posten. Wäre doch interessant mal die Ergebnisse der einzelnen zu erfahren um die übliche Toleranz zu ermitteln.
Gruß
Frank
Sensor: GP2D12
Ich habe nur die im Datenblatt angegebenen Durchschnittswerte verwendet:
A = 24,93 Vcm
B = 0,0695 V
Berechnete Distanz:
D10 = 10,6 cm
D30 = 29,6 cm
D70 = 71,1 cm
Ich kann mir vorstellen, dass die Toleranz noch erheblich gesenkt werden kann, wenn man jeweils den Sensor extra vermessen würde, um A und B zu berechnen.
Hi,
ich hab mal nach den Werten von meinen GP2D02 gekramt.
Errechnet hab ich die Werte aus Messungen bei 20 und 60 cm.
A B
Sensor 1: 1480 67
Sensor 2: 1400 50
Sensor 3: 1440 56
Die Konstanten sind für eine 16Bit Integer Berechnung des Abstandes in cm.
UPS,
da ist mein Login doch irgendwie eben rausgeflogen :-(
Also da will ich mich mit ein paar Werten anschließen.
Wenn ich mich nicht verrechnet habe, dann müßte sich theoretisch beim neueren Sharp GP2Y0A21Yk (bis 80cm analog) folgende Werte ergeben:
A=24 Vcm
B=0,1
Leider habe ich keine Tabelle sondern nur ein kleineres Diagramm im Datenblatt. Von daher ist eine gewisse Ungenauigkeit noch vorhanden. Vielleicht findet noch jemand eine Tabelle.
Jch hab' mal nachgemessen und verschiedene Entfernungen gemessen um die Annäherung zu ermitteln.
Mit den Werten von 20 und 60cm kommt's noch am ehesten hin. Hat jemand 'ne Ahnung, wo man die beste Näherung über einen möglichst großen Entfernungsbereich kriegt?
Wie man sieht, ergeben sich je nachdem, mit welchen werten ich rechne sehr unterschiedliche Näherungen
Werte Steigung (A/X) Offset
20 60 26,1 0,0815
10 70 21,46 0,013
30 50 33,7 -0,175
s(x)=A/x-b
hab mir das hier mal durchgelesen, da ich selbst heute meine sensoren anschließen werde :) und ich würde mal sagen man sollte noch genauere ergebnisse bekommen, wenn man eine ganze entfernungstabelle aufstellt und dann die formel mit der methode der kleinsten quadrate (least squares fit) o.ä. optimiert. diverse matheprogramme können das, gnuplot auch. ich werd mal für gnuplot ein entsprechendes script schreiben und es dann online stellen. habt ihr eigentlich noch irgendwelche tips was man an den sensor noch dranschalten sollte um störsignale zu vermindern (kondensatoren etc...)?
Hallo,
wenn ihr möglichst genaue Werte haben wollt, dann könnt ihr eine Meßreihe machen, die Werte in Excel eintragen. Wenn ihr dann die Entfernung gegen die Spannung in einem Diagramm darstellt, kann Excel die entsprechende Ausgleichsfunktion berechnen. Als Formel kammt etwas in der Art Entfernung=A*Spannung^B raus.
Grüße
Markus
Zu den Störsignalen: Meine C-Control an der gleichen Stromversorgung ist(trotz eigener Abblockkondensatoren) mit dem Ding dauernd abgeschmiert. Ich hab' 'nen 470µ-Elko in die Versorgungsleitung(direkt am Sensor) gemacht und dann ging's.
Welche Art von Belastung da 'rauskommt, weis ich aber nicht. Da der Sensor mit moduliertem Licht arbeitet, ist die Frequenz wahrscheinlich im kHZ-Bereich. Vielleicht reicht auch ein kleiner Folienkondensator mit 100N oder so(oder ist der sogar besser). Den Elko hab' ich nur zum Probieren genommen, weil der gerade da(und über) war.
Ja, machen kann man viel, genauer kann es dadurch gegenüber einer Tabelle nicht werden, aber es kann ein Weg zur Vereinfachung der Berechnung sein.Zitat:
Zitat von Markus
Ist es den erfolgreich, hast Du es ausprobiert?
Welche Werte für A und B hast Du denn bestimmt?
Für welchen Entfernungsbereich ist das Verfahren denn sinnvoll?
Manfred
Hallo
Hab nachgemessen, die Modulationsfrequenz beträgt ca 1kHz. Der Strom-Spitzenwert liegt bei ca 220mA. Um das zu glätten reicht so ein 100nF Kondensator ganz sicher nicht, aber ev. um allfällige HF-Störungen wegzubringenZitat:
Welche Art von Belastung da 'rauskommt, weis ich aber nicht. Da der Sensor mit moduliertem Licht arbeitet, ist die Frequenz wahrscheinlich im kHZ-Bereich. Vielleicht reicht auch ein kleiner Folienkondensator mit 100N oder so(oder ist der sogar besser). Den Elko hab' ich nur zum Probieren genommen, weil der gerade da(und über) war
Gruess
Felix
Hallo, ich hab auch mal ne frage. Ihr redet hier immer nur davon wie man die spannung die man am pin des entfernungsmessers in die tatsächliche entfernung umrechnet. Ich hab schon probleme von der Zahl die mir der Atmega ausspuckt auf die Voltzahl zu kommen. Ich dachte immer das wäre die Versorgungsspannung des Atmegas (5,1V) durch 1024 und mit der zahl die da rauskommt dann den Wert des ADC-Ports malnehmen. Wenn ich aber nichts vor den GP2D12 halte, kommt ne spannung von 0,6V raus und der Atmega sagt 1023?! Da müsste doch irgendwas knapp über 0 rauskommen oder nicht? Außerdem bewegt sich dieser 1024-Wert erst nach unten wenn aus dem GP2D12 schon längst 1,3V rauskommen, also ab 20cm. Wo fängt denn der messbereich eines Atmega8 an? Erst bei 1,3V? Mach ich da irgendwas falsch?
Hallo,
Nein, genauer als eine Tabelle ist es wohl nicht, aber viel genauer, als eine lineare Funktion zu benutzen. Wie es mit der Berechnungszeit auf einem µC aussieht kann ich nicht sagen, da ich die Auswertung bisher noch auf einem PC mache. Vermutlich muß man bei einem µC die Werte etwas runden, so daß die Genauigkeit wieder etwas abnimmt.Zitat:
Ja, machen kann man viel, genauer kann es dadurch gegenüber einer Tabelle nicht werden, aber es kann ein Weg zur Vereinfachung der Berechnung sein.
Ist es den erfolgreich, hast Du es ausprobiert?
Welche Werte für A und B hast Du denn bestimmt?
Für welchen Entfernungsbereich ist das Verfahren denn sinnvoll?
Meine Werte für A und B und Angaben zur Genauigkeit kann ich heute Abend oder Morgen mal posten. Leider habe ich nur einen Sensor, ich kann also nicht sagen ob man für verschiedene Sensoren die gleiche Formel benutzen kann.
Markus
Irgendwas musst du in der Tat falschmachen. Das sollte eigentlich genauso funktionieren, wie du erwartest hattest. Wenn du nur die zum Auslesen nötigen Register am ADC gesetzt hast und dein ADC nicht kaput ist(den kriegt man eigentlich nur mit hohen Spannungen kaput.), muss eigentlich in deiner Schaltung was nicht in Ordnung sein.
Ist das Ergebnis zuverlässig reproduzierbar?
Ich habe schon gemerkt, dass zwei Themen parallel laufen eines mit Markus und eines mit MarkusH.
@MarkusH:
Es wäre sicher gut, die Systeme IR-Sensor und ADC getrennt zu testen, oder auch nur erst mal eines. Für den Sharp Sensor braucht man nur ein Voltmeter und für den ADC ein Poti und besser auch noch ein Voltmeter. Dann lassen sich die Probleme gut trennen.
@Markus
Ich bin an den Werten interessiert. In den Datenblättern habe ich auch schon einmal eine abschnittsweise analytische Beschreibung der Kurve gesehen. Ich möchte das Theme noch einmal durchgehen, weil der Wandler doch häufig eingesetzt, aber offensichtlich auf unterschiedliche Art ausgewertet wird.
Manfred
Hallo Leute,
(jetzt habe ich mich erst mal angemeldet, um Namensproblemen vorzubeugen)
Ich habe mal die Excel-Datei angehängt. In der Tabelle sind die Entfernungen, die entsprechenden Spannungen und die Werte, die mir der A/D-Wandler geliefert hat, eingetragen. Die Ausgleichsfunktion und die entsprechende Formel werden in den Diagrammen angezeigt.
In Diagramm1 habe ich die Entfernung gegen den Wert des A/D-Wandlers aufgetragen, in Diagramm2 gegen die Spannung.
Zum Vergleich ist wahrscheinlich die Spannung interessanter, da ja nicht jeder den gleichen A/D-Wandler benutzt.
Grüße
Markus
Ja, ok, dann weiß ich wie es gemeint war, vielen Dank für die Tabelle, die Kurve ist ja sehr schön dicht in den Werten und sehr glatt mit geringer Abweichung zur Trendkurve.
Sind die Werte automatisch aufgenommen?
Mit Fahrzeug?, (Schrittmotor?) und gleichmäßiger (weißer?) Wand?
Manfred
Hallo,
die Werte hatte ich von Hand aufgenommen, mit Maßband und einem Stück weißer Pappe. Die Meßgenauigkeit dürfte etwa bei +/- 1 mm gelegen haben. Die Spannung hatte ich mit einem Multimeter gemessen, den A/D-Wert habe ich mir auf einem LCD ausgeben lassen.
Markus
ja, mein problem lässt sich immer reproduzieren. Ich hab das STK500 Board von Atmel. Damit kann man bestimmte Refrenzspannungen, die man vorher mit dem AVRstudio einstellen kann, produzieren. Auch wenn ich diese Referenzspannung anliegen hab ist das ergebniss genau umgekehrt. Also je niedriger die Spannung desto höher der ADC-Wert. und ab 1,8V ist 1023 schon erreicht. Ich hab inzwischen auch 2 Atmega8's ausprobiert, bei beiden der gleiche effekt. Welche register muss man denn da setzen?
Gruß, Markus
Hi an alle!
Ich habs inzwischen hinbekommen mit den sensoren aber hat vielleicht noch jemand ne idee wie man den GP2D12 daran hindern kann so stark zu schwanken. +/- 0,1V ist irgendwie immer drin, oder ist das normal? Den ausgangs-pin des sensors kann man ja direkt mit dem eingang des AVRs verbinden oder nicht. Habe schon einen Elko in die Versorgung der Sensoren eingebaut und einen von AREF nach GND, allerdings ohne erfolg. Achja ich verwende die interne referenz des mega8.
Gruß, Markus
Hallo
Wann hast Du denn diese Schwankungen? Immer oder nur wenn das Objekt weiter entfernt ist?
Falls das Problem vermehrt bei grösseren Entfernungen auftritt, hilft es ev. das Gehäuse des Sensors mit Masse zu verbinden (das Gehäuse besteht aus leitfähigem Plastik)
Ne andere Methode wäre, mehrere Messungen nacheinander zu machen und per Software den Mittelwert zu berechnen. So kriegt man das Rauschen (wenigstens teilweise) raus.
Gruess
Felix
Ja, im bereich von 10-30cm sind die schwankungen eigentlich akzeptabel, wenn gar nichts im erfassungsbereich ist, sind die schwankungen wesentlich höher.
Also ist das normal das die dinger nicht all zu genau sind ja?
wenn euer robby irgendwo langläuft, ändert sich die spannung und dadurch arbeiten die sensoren wieder anders. ihr sollt diese klo-spül-warneinrichtungen nicht so pingelig genau ansehen, dafür sind sie zu billig.
man kann nicht besseres erwarten, aber für unseren robby reicht das.
mfg pebisoft
Hallo
Das würde für den Versuch sprechen, das Gehäuse zu grounden. Andere Variante wäre, den Sensorwert ab einer bestimmten Entfernung als ungültig bzw. "kein Objekt" zu definieren.Zitat:
Ja, im bereich von 10-30cm sind die schwankungen eigentlich akzeptabel, wenn gar nichts im erfassungsbereich ist, sind die schwankungen wesentlich höher.
Aber wie pebisoft sagte, irgendwann ist Schluss. Die Dinger sollen eigentlich Klospülungen/Händetrockner, etc steuern und keine Umgebung vermessen :-)
Ausserdem nimmt der Fehler prinzipbedingt mit der Entfernung zu.
Gruess
Felix
Ungefiltert erzeugt der Sensor am Analogausgang Pulse von etwa 10µs Breite, 200mV Höhe und einer Frequenz von 1KHz. Es gibt zwei Maßnahmen, die zumindest bei meinen Sensoren geholfen haben:
1. Abblocken der Versorgungsspannung direkt am Sensor mit mindestens 100 µF
2. Tiefpaßfilter in die Analogausgangsleitung. Z. B. mit R*C = 3,3ms entsprechend fg = 48 Hz.
Da der Sensor ohnehin nur alle 50 ms einen aktuellen Meßwert generiert, schadet das Tiefpaßfilter nicht.