infrarot abstandsmesser

GPIO, Projekte

Infrarot Abstandsmessung mit dem Raspberry Pi (Sharp GP2Y0A02YK0F)

Vom Hersteller Sharp gibt es einige Infrarot Abstandssensoren, welche sehr einfach mit dem Raspberry Pi betrieben werden können. Hierbei gibt es verschiedene Abstandsmesser, welche unterschiedliche Distanz Bereiche abdecken. Diese Module funktionieren ähnlich zu Laser Distanzmessgeräten, allerdings mit Infrarot Licht. Dabei wird gebündeltes Licht mit einem Sender ausgestrahlt und durch einem Empfänger anhand des Einstrahlwinkels eine (analoge) Spannung durchgeleitet, womit die Distanz berechnet werden kann.

In diesem Tutorial wird anhand des Distanzsensors GP2Y0A02YK0F gezeigt, wie ein Abstand bestimmt werden kann. Nützlich kann dies z.B. im Auto als Car PC (Rückfahrkamera – Abstand), als Roboter Auto oder auch im Rahmen der Hausautomation.



 

Zubehör – Abstandssensoren

Der IR Sender befindet sich auf der "eingedrückten" Seite (rechts).

Der IR Sender befindet sich auf der „eingedrückten“ Seite (rechts).

Insgesamt hat Sharp einige Distanzmesser im Angebot, wobei individuell geschaut werden sollte, welche für die Aufgabe passend ist. Dieses Tutorial ist auf den Sharp GP2Y0A02YK0F ausgelegt, welcher für Bereiche von 20cm bis 150cm geeignet ist. Entfernungen außerhalb dieses Bereichs werden nicht korrekt gemessen.
Folgende Module stehen zur Auswahl:

Solltest du einen anderen Sensor als den GP2Y0A02YK0F verwenden, so musst du die einzelnen Schritte ggf. anpassen. Die Datenblätter sind auf der Sharp Homepage verfügbar.

Weiterhin brauchst du noch folgendes:

 

 

Funktionsweise des Infrarot Abstandssensors

Dieser IR Sensor braucht eine Eingangsspannung zwischen 4.5V und 5.5V, kann also perfekt mit den 5V des Raspberry Pi’s betrieben werden. Dabei liegt laut Datenblatt eine unterschiedliche Spannung am Daten Pin an, je nach dem, wie weit das vom Sensor gemessene Objekt ist. Dies ist in folgendem Graphen sichtbar:

gp2y0a02yk

Anhand der Spannung kann die Distanz zwischen ca. 15cm und 150cm relativ exakt hergeleitet werden.

 

 

Anschluss des MCP3008

mcp3008-e1397762478714

Da die ausgehende Spannung analog ist, müssen wir sie erst mit einem Analog-Digital Wandler „übersetzen“, sodass wir sie mir dem Raspberry Pi auswerten können. Dies geht am besten mit einem MCP3008 ADC.

Dieser Baustein wird über den SPI Bus des Pi’s angesteuert und hat acht Kanäle, an denen analoge Spannungen übersetzt werden können. Diese werden in 2^20 also 1024 Bereiche (0-1023) aufgeteilt. Wird der MCP3008 an 3.3V angeschlossen, entspricht ein Signal von 1 also 0.00322V (3.22mV). Da der SPI Bus des Raspberry Pi’s auf 3.3V arbeitet, sollte auch nicht mehr Spannung angelegt werden, da sonst die GPIOs beschädigt werden können.

Die ganze Schaltung sieht schematisch folgendermaßen aus:

 

sharp_GP2Y0A02YK0F_Steckplatine

RaspberryPiMCP3008
Pin 1 (3.3V)Pin 16 (VDD)
Pin 1 (3.3V)Pin 15 (VREF)
Pin 6 (GND)Pin 14 (AGND)
Pin 23 (SCLK)Pin 13 (CLK)
Pin 21 (MISO)Pin 12 (DOUT)
Pin 19 (MOSI)Pin 11 (DIN)
Pin 24 (CE0)Pin 10 (CS/SHDN)
Pin 6 (GND)Pin 9 (DGND)

 

Der Abstandssensor hat dabei lediglich drei Anschlüsse: Rot (5V), Schwarz (GND) und Gelb, was der Datenpin ist und an den MCP3008 ADC angeschlossen wird. Bei manchen werden dabei eventuell die Alarmglocken läuten und sagen, warum ein 5V Modul direkt angeschlossen wird, obwohl der SPI Bus des Pi’s nicht mehr als 3.3V Input bekommen darf. Im Datenblatt ist angegeben, dass die Ausgangsspannung des Sensors nie über 3V kommt (siehe Graph aus dem Datenblatt). Wer dennoch Angst hat, dass dem Pi etwas zustoßen könnte, der kann davor einen Spannungsteiler mit 2 Widerständen setzen, allerdings nimmt dadurch die Genauigkeit ab und auch meine verwendete Formel müsste neu berechnet werden. In meinen Tests kamen aber nie Spannungen über 2.7V an (GP2Y0A02YK0F). Bei den anderen Sharp Sensoren kann dies evtl. abweichen.

 

 

Software zum Auslesen der Distanz

Um den MCP3008 steuern zu können, muss der SPI-Bus aktiviert werden. Dies geht folgendermaßen:

sudo raspi-config

„8 Advanced Options“ -> „A6 SPI“ -> „Yes“.
Danach musst du den Neustart bestätigen.

In manchen Fällen muss das Modul (spi-bcm2708) auch noch in die /etc/modules Datei eingetragen werden. Dazu einfach

sudo nano /etc/modules

aufrufen und folgende Zeile am Ende hinzufügen (falls Sie nicht vorhanden ist):

Nun kann die spidev Bibliothek installiert werden, falls das noch nicht geschehen ist:

sudo apt-get install git python-dev
git clone git://github.com/doceme/py-spidev
cd py-spidev/
sudo python setup.py install

 

Nachdem nun alle benötigten Pakete installiert sind, können wir das Skript zum messen der Distanz erstellen.

sudo nano ir_distance.py

Das Skript hat folgenden Inhalt:

Führen wir es nun aus (sudo python ir_distance.py), nachdem wir auf ein Objekt zielen, wird der Abstand ausgegeben.

Was passiert hier genau? Zu erst einmal wird der analoge Wert (zwischen 0 und 1023) ausgelesen (Zeile 15). Da wir allerdings die Spannung wissen möchten, wird der Wert durch 1023 dividiert und mit 3.3 (Volt) multipliziert.

Achtung: In diesem Fall wissen wir (laut Datenblatt), dass die Ausgangsspannung nie über ca. 2.8V geht, obwohl wir den Sensor mit 5V versorgen. Andere Module (analog als auch digital) geben oft Signale mit Spannungen zurück, die so hoch wie die angelegte Spannung ist. Sollte man das nicht beachten, kann dies zu Schäden am Raspberry Pi führen.

 

In Zeile 16 des Skripts rechne ich die Spannung in Zentimeter um. Die Formel dazu habe ich hier gefunden und ein wenig angepasst. Dazu habe ich verschiedene Abstände getestet und die Faktoren etwas verändert, sodass die errechnete Distanz möglichst genau zutrifft. Wie ich anfangs erwähnt habe, ist diese Formel nur für den Sharp GP2Y0A02YK0F Sensor. Da die anderen Sensoren analoge Signale im ähnlichen Bereich liefern, muss diese Formel für die entsprechenden Sensoren angepasst werden (falls das jemand macht, würde ich mich freuen, falls er sie hierunter postet).
Alternativ kann man auch zwischen den Bereichen (Datenblatt) interpoliert werden, indem man alle Anhaltspunkte (Volt, Abstand) speichert und den bestimmten Wert ausliest und mittels linearer Interpolation den Abstand zu der gemessenen Spannung errechnet.

Ich habe früher oder später vor ein solches Modul an die Innenseite der Heckscheibe meines Autos zu befestigen und damit einen Distanzmesser beim rückwärts einparken zu haben – falls jemand noch nicht weiß, was er damit anstellen kann 😉



, , , , , , , , ,


13 Kommentare

  1. Harry S. sagt:

    Hallo, und guten Tag,
    meine Frage zum GP2Y0A02YK0F:
    würde sich dieser Sensor auch als „Lichtschranke“ im Außenbereich eignen ?
    D.h. wenn sich ein Objekt in einem Abstand von ca. 0,5 m an dem Sensor vorbei bewegt, sollte ein Signal ausgelöst werden.
    Eine originale Lichtschranke möchte ich nicht verwenden.

    b.r. Harry

    • Felix sagt:

      Ja das sollte funktionieren. Allerdings müsstest du dann dauerhaft die Distanz abfragen oder den analogen Wert zu einem „Trigger“ umbauen (sodass ab einer bestimmten Spannung bspw. ein Transisotr/Relais öffnet und Strom an einen GPIO Pin gelegt wird, welchem du ein Event zuweist).

  2. Harry Schröder sagt:

    Vielen Dank für die freundliche Info.
    In diesem Zusammenhang stellt sich mir die Frage, wie man die Auslösung des Sensors zeitlich erfassen und auslesen könnte (Python). Wäre es vielleicht möglich für dieses Vorhaben ein kleines Tutorial einzurichten?

    br. Harry.S

    • Felix sagt:

      Die einfachere Methode wäre alle X ms die Spannung zu messen und damit die Entfernung berechnen (wie hier im Tutorial mit einer zusätzlichen Schleife). Die andere Methode wäre u.U. etwas komplizierter, da weniger Programmierung dazu nötig ist, dafür mehr Messungen. Wenn auch noch andere daran Interesse haben, könnte ich in Zukunft dazu auch ein Tutorial machen.

  3. Harry S. sagt:

    Hallo Felix,
    vielen Dank für Deine Nachricht.
    Vielleicht habe ich mich etwas missverständlich ausgedrückt.
    Ich möchte lediglich den Zeitpunkt dokumentieren, an dem der Sensor ausgelöst hat –
    die Zeitangabe in eine Datei schreiben und diese bei Bedarf auslesen.
    b.r. Harry

    • Felix sagt:

      Naja den Zeitpunkt kannst du einfach mit time.time() feststellen und in eine Datei schreiben ist auch nicht so schwer. Oder wo liegt das Problem genau?
      LG, Felix

  4. Professor Futura sagt:

    Hallo Zusammen!
    Ich würde gerne einen zweiten und am liebesten noch einen dritten Infrarot Sensor dieser Art an meinen Pi betreiben. Hab aber leider keine Ahnung wie ich das am besten mache … gibt es iwo möglichkeiten sich drüber zu informieren oder ist eventuell mal ein weiteres How-To dieser Art geplant?

    • Felix sagt:

      Nunja, der MCP3008 hat 8 analoge Channels, d.h. du kannst mit einem Modul bis zu 8 analoge Sensoren auslesen. Ist im Prinzip das gleiche wie in diesem Tutorial, nur dass eben ein anderer Channel (statt CH0) ausgelesen ausgelesen werden muss (woran der zweite Sensor hängt).

  5. Harry S. sagt:

    Hallo Felix,
    vielleicht magst Du mir einen Hinweis zu folgendem Problem geben:
    Der Abstand zwischen dem Sensor und dem MCP3008 beträgt 18 Meter!
    Aufgrund des Spannungsverlustes (Verbindungskabel = 3 X 1) ist die Sensor- Ausgangsspannung am MCP3008 zu gering.
    Wie könnte ich die Spannung auf einen brauchbaren Wert erhöhen?
    b.r. Harry

    • Felix sagt:

      Hallo Harry,
      also ich würde wenn dann den MCP3008 möglichst nahe zum Sensor stellen, da der Sapnnungsabfall bei analogen Werten zu falschen Messungen führt. Kannst du dickere Leitungen verwenden oder ggf. eine externe Stromversorgung für den MCP3008? Du müsstest mal den Widerstand des Kabels messen um festzustellen, wie hoch der Verlust sein wird (bis zu einem gewissen Wert ist das digitale Signal weiterhin auslesbar).

  6. Harry.S sagt:

    Hallo Felix,
    da die Leitung bereits verlegt ist und auch die anderen Gegebenheiten kaum zu verändern sind, werde ich wohl auf den PIR – Bewegungsmelder zurückgreifen müssen.
    Ist Dir vielleicht bekannt, ob dieser Sensor auch Bewegungen unter 3 Meter erfassen kann?

    b.r. Harry

    • Felix sagt:

      Hey Harry,
      der PIR kann definitiv Bewegungen, die in weniger als 3m Abstand stattfinden wahrnehmen. Das Problem des Sensors werden eher weite Entfernungen sein.
      LG, Felix

  7. Harry S. sagt:

    Hallo Felix,
    Danke für Deine Info.

    b.r.Harry

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!