Ich bin noch ganz am Anfang, einen Roboter zu bauen, der umherwandert und eine Karte seiner Umgebung erstellt. Ich verwende ein Arduino und habe derzeit einen Sharp 2Y0A21 IR-Entfernungsdetektor, der auf einem Servo sitzt, sodass er einen 180-Grad-Sweep in 10-Grad-Schritten ausführen kann.
Das Problem ist, dass die Spannungswerte vom Sharp IR-Sensor nicht konsistent sind. Wenn ich eine App schreibe, die einfach den vom Sensor gelesenen Wert über die serielle Schnittstelle sendet und auf meinem Laptop anzeigt, wobei der Sensor auf ein Objekt zeigt, springen die Werte herum.
Wenn ich mir die Werte ansehe, kann ich sehen, dass es dazu neigt, einen Wert mehr als die anderen zu melden, also habe ich eine SharpReader-Klasse geschrieben, die 20 Samples nimmt und dann den Modus dieser Werte zurückgibt. Das bedeutet jetzt, dass ich konsistentere Werte erhalte, aber nicht so gut, wie ich es gerne hätte.
Ich habe einen Code, der den 180-Grad-Scan durchführt und den Winkel und die Entfernung über die Serie sendet. Ich habe dann ein Python-Skript, das diese Werte empfängt und zeichnet, was es auf dem Bildschirm sieht, wobei alle Werte an beiden Enden des Sensorbereichs ignoriert werden. Wenn Sie es also vor eine Kiste stellen, sollte es eine gerade Linie auf dem Bildschirm zeichnen, aber das tut es nicht - die Linie ist schief und nicht durchgehend schief, was mir bestätigt, dass die Messwerte falsch sind, nicht mein Code.
Ich habe im Datenblatt gelesen, dass es ratsam ist, einen Kondensator (ich kann mich nicht ohne weiteres an den Wert erinnern) zwischen die GND- und PWR-Leitungen des Sharp IR zu stecken - ich habe versucht, die Beine des Kondensators in den JST-Anschluss des Sharp zu zwingen IR, aber es machte keinen Unterschied. Ich werde versuchen, es an den Sensor zu löten und sehen, ob das einen Unterschied macht.
Kann jemand etwas anderes zum Ausprobieren empfehlen, oder erwarte ich einfach zu viel von der Sharp IR?
Ich denke auch darüber nach, ein zweites Servo und Sharp IR zu kaufen und zwei gleichzeitig wie ein Paar Augen laufen zu lassen und dann zu versuchen, einen Durchschnitt der beiden Werte zu nehmen, um zu sehen, ob dies die Genauigkeit erhöht.
Übrigens, ich bin ein Neuling in der Elektronik, mein Hintergrund liegt in der Programmierung.
Der Sensor ist nicht perfekt, wenn Sie sogar einen wirklich, wirklich guten Sensor (besser als die, ähm, 'klassischen' Sharp IR-Sensoren) auf dieselbe Stelle an der Wand richten und ein paar Messungen vornehmen, wird es einige Abweichungen geben. Wenn Sie eine Anzahl niedrigstwertiger Bits verwerfen, ist es möglich, jedes Mal denselben Messwert zu erhalten, aber Ihre Messwerte werden granularer. Sie sollten wahrscheinlich die maximale Genauigkeit beibehalten und dann versuchen, Fehler in der Software zu beheben (dh Ihre Daten so ändern, dass eine fast gerade Linie wirklich gerade ist).
Welchen Sensor verwenden Sie und welchen Messbereich erwarten Sie? Die Ausgabe des Sensors ist sehr stark nichtlinear. Dieses Diagramm (aus dem Datenblatt) vergleicht die Ausgangsspannung auf einer linearen Skala mit der Entfernung:
Sie werden feststellen, dass es dem Diagramm von y=1/x sehr ähnlich sieht, dh Volt=k(1/Entfernung). Dies kann verwendet werden, um eine anständige erste Annäherung zu erhalten, aber die Aufteilung auf einem Arduino ist teuer. Sie haben mehr Glück, wenn Sie den Sensor kalibrieren und die Spannungs-/Abstandspaare in einer Nachschlagetabelle (natürlich im Programmspeicher) speichern. Dieser wird ab Werk so kalibriert, dass eine Messung bei genau 24 cm auf 24 cm +/- 3 cm misst. Leider geben sie Ihnen keine Möglichkeit zu wissen, wie hoch die Spannung bei 24 cm sein sollte, außer indem Sie auf diese Grafik schielen.
Der Sensor hat in bestimmten Bereichen eine höhere Präzision. Stellen Sie sich vor, dass Ihre Messwerte eine zufällige Variation von beispielsweise +/- 250 mV aufweisen (Gauß, wenn Sie möchten, aber zufällig ist einfacher). Es ist hoffentlich viel kleiner als das, aber es macht es einfach zu visualisieren. Die Variation bedeutet, dass Ihre Messwerte mit diesem Sensor bei beispielsweise 50 cm oder 70 cm über 20 oder 30 cm variieren, aber Messungen bei 15 cm sollten innerhalb weniger cm liegen. Dieser Sensor ist für 10-80 cm ausgelegt, aber Sie erhalten genauere Messwerte, wenn Sie ihm nur für etwa 10-25 cm vertrauen. Wenn Sie den Roboter steuern, sollten Sie in der Lage sein, sich auf diese Entfernungen zu bewegen und die besten Messwerte zu erhalten.
Der Sensor zieht Strom in großen Stößen und ist wahrscheinlich an einem ziemlich langen Kabel montiert. Ein Kondensator hilft, die Messwerte zu stabilisieren. Stecken Sie es nicht in das JST; Löten Sie es auf die Platine auf der Rückseite. Es zieht viel Strom und ist ziemlich langsam, sodass kleine Kapazitäten, die traditionell zur Entkopplung verwendet werden (0,1 uF), wahrscheinlich nicht funktionieren. Ich würde eine 10-uF-1206- oder 1210-Keramik-SMD-Kappe parallel zu einem 100-uF-Elektrolyt verwenden. Wenn Sie feststellen, dass immer noch hochfrequentes Rauschen vorhanden ist, fügen Sie 0,1 uF 1206 zusätzlich zu den 10 uF hinzu. Hier ist ein Bild der Stellen zum Löten (Originalbild von Sparkfun):
Sie können auch versuchen, der Vo-Leitung eine kleine Kapazität hinzuzufügen, um den Ausgang zu glätten. Sie sollten ausprobieren, ob das hilft oder nicht. Ich würde es unter 100 pF halten und bei etwa 10 pF beginnen. Dadurch wird ein gleitender Durchschnitt der Messwerte in der Hardware erstellt. Mehr Schaltung (ein Vorwiderstand) würde den Effekt verstärken, posten Sie einen Kommentar oder eine andere Frage, wenn Sie zu diesem Zweck ein komplexeres Tiefpassfiltersystem bauen möchten. Hinweis: Der Sharp-Sensor kommt möglicherweise nicht gut mit dem Treiben in eine große Kapazität zurecht und kann blockieren oder brechen, wenn er aufgefordert wird, die Spannung schnell zu ändern. Es ist auch möglich, dass es sich um einen einseitigen Ausgang handelt und möglicherweise einen Widerstand gegen Masse benötigt, um den Kondensator zu entladen, wenn Sie mehr Kapazität hinzufügen, als derzeit in den Parasiten vorhanden ist.
Das Verdrillen der Kabel trägt dazu bei, Rauschen zu reduzieren, das von externen Quellen wie 60-Hz-Netzen eingekoppelt wird. Sie kurz zu halten, wird auch dazu beitragen, Lärm zu mindern.
Gute Dinge, die Sie in dieser Phase tun können:
Bestimmen Sie, woher das Rauschen kommt: Dies kann mit der FFT-Funktion auf einem DSO erfolgen, während Sie das Signal von einem anderen IR-Sensor messen (IR-LED würde funktionieren), oder mit einem PC, um die gesammelten Daten umzuwandeln. In unseren Haushalten gibt es viele IR-Quellen, die oft in der Nähe von 38 kHz moduliert werden. Ein Antialiasing-Filter für den analogen Eingang, der auf weniger als die Hälfte Ihrer Abtastrate (max. ~7 kHz) eingestellt ist, ist möglicherweise alles, was erforderlich ist, obwohl der Sensor möglicherweise bereits über einen verfügt. Beachten Sie, dass die Mikros in der Arduino-Serie nicht mit mehr als etwa 15 kHz abtasten können, aber 38-kHz-Signale können immer noch durch Aliasing durchschleichen, sodass digitale Filter nicht bei 38 kHz, sondern etwas unter 15 kHz liegen würden.
Stellen Sie sicher, dass Sie innerhalb der Reichweite des Geräts (maximal und min) testen. Der 0A700 hat eine Reichweite von 5,5 Metern.
Kalibrieren und linearisieren Sie den Sensor. Identische Modelle lesen sich unterschiedlich und ihre Ausgabe ist nicht linear. Diese Seite beschreibt eine Möglichkeit, die Daten zu linearisieren und so etwas wie zu erhalten R = (6787 / (V - 3)) - 4
. Eine andere Methode besteht darin, eine 8- bis 10-Bit-Nachschlagetabelle zu verwenden. Die Linearisierung hilft nicht beim Rauschproblem, gibt aber eine bessere Vorstellung davon, wie sich das auswirkt und wie viel Minderung tatsächlich erforderlich ist.
Essen Sie Oreos, drehen Sie sie in zwei Hälften und lecken Sie zuerst das Weiße heraus. Sorgt für viel erfolgreichere Debugging-Sitzungen.
Diese Sensoren benötigen wirklich eine anständige Entkopplungskappe über der Versorgung und eine saubere 5-V-Versorgung, dh nicht die gleiche Versorgung wie ein Servo.
Überprüfen Sie Ihre Eingangsspannungsversorgung zum Sensor. Ich habe den Sensor von meinem Mega 2560 (5 V) mit Strom versorgt und konnte kein sauberes Signal erhalten. Ich verwende immer noch die 5 V vom Mega 2560, lasse sie aber stattdessen durch einen einfachen (1,99 $) Spannungsregler von Radio Shack laufen (schnell zu einem örtlichen Geschäft laufen). Dadurch wurde das Signal stark aufgeräumt. Um es weiter zu bereinigen, ließ ich das Rücksignal durch einen Tiefpassfilter laufen. Ich habe die Frequenz bei 1/10 gewählt und den Widerstand und die Kappe entsprechend dimensioniert.
jsolarski
BarsMonster
Kevin Vermeer
wenigcharva
Rick_2047