IR Näherungssensor selber bauen

Über den Beitrag

Eigentlich hatte ich meine Reihe über Licht- und Näherungssensoren mit meinem letzten, zusammenfassenden Beitrag abgeschlossen. Allerdings kam in mir noch die Frage auf, ob man einen IR Näherungssensor nicht auch selber bauen kann (IR = Infrarot). Davon handelt nun dieser Beitrag. 

Konzepte

Zunächst hatte ich mir die Frage noch allgemeiner gestellt: Kann man generell Näherungssensoren oder Bewegungssensoren mit einfachen Mitteln auch selber bauen? Zunächst einmal braucht man dazu eine physikalische Messgröße, mit der eine Annäherung detektiert werden kann. Dabei wollte ich eine Lösung, bei der Signal und Sensor auf nur einer Seite kontrolliert werden. Also nicht etwas wie beispielsweise Lichtschranken oder Magnet / Hallsensor Kombinationen.

Beim Durchgehen durch die verschiedenen physikalischen Methoden wie Radar, Licht (Time of Flight), Ultraschall, usw. fiel meine Wahl ziemlich schnell auf Infrarotlicht als einfachste Lösung. Der Sensor soll also Infrarotlicht aussenden und das reflektierte Signal detektieren. Grundsätzlich gibt es dabei zwei Möglichkeiten, nämlich gepulste und nicht gepulste Infrarotstrahlung. Ich beginne mit Letzterem.

IR Näherungssensor selber bauen: ungepulst

LED Auswahl

Als infrarote Strahlungsquelle eignet sich am besten eine LED. Diese gibt es vorwiegend mit den Wellenlängen 850 oder 940 nm. Als Empfänger dient eine Infrarot Fotodiode. Beides bekommt ihr, auch häufig im Doppelpack, für wenig Geld zum Beispiel bei Amazon. Wenn ihr dem Link folgt, dann findet ihr dort sowohl dreibeinige Empfänger wie auch die zweibeinigen. In diesem Abschnitt reden wir über die Zweibeiner, im nächsten Abschnitt (gepulstes IR) über die Dreibeiner.

IR LED (oben) und IR Fotodiode (unten)

Bei der Auswahl der IR LED solltet ihr auf die Leistung schauen und diese nicht zu gering wählen. Meine LEDs für diesen Beitrag vertragen bis zu 100 Milliampere bei 1,2 bis 1,5 Volt und damit komme ich gut aus.

Die Schaltung

IR LED

An den Daten oben seht ihr schon, dass die IR LEDs vom Stromverbrauch her in einer anderen Liga spielen als herkömmliche LEDs. Keinesfalls solltet ihr sie wie gewohnt direkt an einen I/O Pin eures Arduinos oder anderen Microcontrollers anschließen. Ich habe mich dafür entschieden, eine externe 5V Spannungsversorgung zu verwenden. Ein Arduino I/O Pin schaltet die IR LED über einen NPN Transistor (547B). Dieser kommt mit 100 Milliampere noch klar, mehr darf es aber auch nicht sein. 

Fallen 1,2 bis 1,5 Volt über der IR LED ab, dann sind es 3,5 bis 3,8 über dem Vorwiderstand (wenn VCC = 5 V). Bei 100 mA Strom müsste man entsprechend einen Widerstand von 35 bis 38 Ohm einsetzen. Soweit die Theorie. Letzten Endes habe ich einen 27 Ohm Widerstand gewählt und dabei einen Strom von 92 Milliampere gemessen.

IR Näherungssensor selber bauen: Schaltung für ungepulste Methode
IR Näherungssensor selber bauen – Schaltung für ungepulste Methode
...und hier das ganze noch einmal schematisch
… und hier das ganze noch einmal schematisch

Die Fotodiodenseite

Die Fotodiode wird in Sperrrichtung (!) angeschlossen. Tut irgendwie weh, nicht wahr? Gehört aber so, denn durch die Infrarotstrahlung wird sie durchlässig und das proportional zur Strahlungsintensität. Mit steigendem Strom erhöht sich der Spannungsabfall über dem 10 kOhm Widerstand. Und damit haben wir unsere Messgröße zur Abstandsmessung.

Und was soll der Anschluss an ARef?

Bei Spannungsmessungen mittels analogRead() und Verwendung einer externen Spannungsquelle für seinen Sensor sollte man die externe Spannungsquelle als Bezugsgröße nehmen. Das kommt hier nicht so sehr darauf an, ist aber sauberer.

Aufbau auf dem Breadboard

IR Näherungssensor selber bauen: Foto des Breadboards
Anordnung von IR LED und IR Fotodiode auf dem Breadboard

Der eine oder andere mag sich fragen, ob die IR LED bei dem Aufbau oben nicht zu sehr direkt auf die Fotozelle strahlt. Der Einfluss hält sich aber in Grenzen, da die IR LED vorwiegend nach oben abstrahlt.

Die externe Spannungsversorgung

Ein kleiner Tipp noch: als externe Spannungsversorgung für Breadboardversuche empfehle ich folgendes Modul, dass ihr direkt in das Breadboard stecken könnt:

Stromversorgung für das Breadboard
Stromversorgung für das Breadboard

Sowas gibt’s – wo wohl? – ja genau, bei Amazon zum Beispiel.

Der Sketch (ungepulst)

Zunächst liest der Arduino das Signal bei ausgeschalteter IR LED. Dadurch messen wir den Einfluss der IR Umgebungsstrahlung (baseSignal), verursacht z. B. durch Lampen- oder Tageslicht. Einzelmessungen können recht stark schwanken. Deswegen liest der Arduino fünfzig Werte aus und mittelt sie. Ich konnte die Werte noch erheblich stabilisieren, indem ich eine Pause von 500 Mikrosekunden zwischen den Einzelmessungen eingefügt habe. Dann schaltet der Arduino die IR LED ein, misst erneut fünfzig Werte und mittelt sie (rawSignal). Die Differenz (proximity) ist der dimensionslose Abstandswert.

Bei fünfzig Messwerten würde für baseSignal und rawSignal ein „unsigned int“ ausreichen. Ich habe zwischendurch auch mit mehr Messwerten gespielt. Deswegen sind diese Variablen als „unsigned long“ definiert. 

Ein Arduino benötigt für einen analogRead() ungefähr 100 Mikrosekunden. Damit brauchen fünfzig Messungen 50 x (500 + 100) Mikrosekunden, also ca. 3 Millisekunden. Nur für diese Zeit ist die IR LED angeschaltet. Da nur ein Messzyklus pro Sekunde stattfindet, hält sich der Stromverbrauch damit, trotz der stromfressenden IR LED, in Grenzen.

const int irLEDPin =  5;  
const int irReceiverPin = A0;
unsigned long baseSignal, rawSignal; 
unsigned int proximity;

void setup()   {
  Serial.begin(9600);
  analogReference(EXTERNAL);
  pinMode(irLEDPin, OUTPUT);
}

void loop(){
  baseSignal = 0;
  rawSignal = 0;
  delay(1000);
  
  for(int i=0; i<50; i++){
    baseSignal += analogRead(irReceiverPin);
    delayMicroseconds(500);
  }
  baseSignal /= 50;
  Serial.print("Ambient IR Light: "); Serial.print(baseSignal);
  
  digitalWrite(irLEDPin, HIGH);
  for(int i=0; i<50; i++){
    rawSignal += analogRead(irReceiverPin);
    delayMicroseconds(500);
  }
  rawSignal /= 50;
  Serial.print("   Raw Signal: "); Serial.print(rawSignal);
  proximity = baseSignal - rawSignal;
  Serial.print("   Proximity: "); Serial.println(proximity);
  digitalWrite(irLEDPin,LOW);
}

 

Das Ergebnis

Mit den von mir gewählten Parametern, also vor allem dem IR Strom, hat der Selbstbausensor eine Reichweite von ca. fünfzig bis sechzig Zentimetern. Die Reichweite hängt natürlich von der Größe des Objekts, seiner Oberflächenstruktur und dem Material ab. Einige Materialien reflektieren IR Strahlung sehr gut, andere absorbieren einen großen Teil. Ein weißes DIN-A4-Blatt wurde bis über siebzig Zentimeter detektiert.

Die Screenshots weiter unten zeigen die Ausgabe auf dem seriellen Monitor bei Annäherung meiner Hand bis kurz vor die Fotodiode.

Der erste Screenshot zeigt das Ergebnis bei wenig Umgebungslicht, nämlich abends und bei schwachem Deckenlicht. Der Messwert bei nicht eingeschalteter IR LED (Ambient IR Light) liegt bei 1022 bis 1023, d.h. die Fotozelle ist fast undurchlässig. Bei eingeschalteter IR LED (Raw Signal) und keinem Objekt in Reichweite liegt der Messwert bei ca. 1008. Es fließt also ein geringer Strom durch die Fotodiode. Dieser ist bedingt durch die Querstrahlung der IR LED auf die Fotodiode und durch diffuse Reflexion an Wänden und Gegenständen. Mit fortschreitender Annäherung sinkt dann der Widerstand der Fotodiode. Entsprechend groß wird die Differenz zwischen dem Raw Signal und dem Ambient IR Light.

Annäherung bei wenig Umgebungslicht
Annäherung bei wenig Umgebungslicht

Der zweite Screenshot zeigt das Ergebnis unter dem Einfluss meiner 40 Watt Halogen Schreibtischlampe, Licht von schräg oben (damit sie nicht das IR Signal reflektiert) und in ca. fünfzig Zentimeter Entfernung. Der Ambient IR Light Wert ist entsprechend niedrig (also viel Umgebungslicht), trotzdem erhält man ein eindeutiges Signal des sich nähernden Objekts. Interessant ist noch, dass der Ambient IR Light Wert bei Annäherung erst leicht sinkt und dann ansteigt. Erklärung: zuerst reflektiert meine Hand das Licht der Schreibtischlampe und sorgt für mehr Licht, dann verdeckt sie es zunehmend.

Annäherung bei viel Umgebungslicht
Annäherung bei viel Umgebungslicht

IR Näherungssensor selber bauen: gepulst

Gepulste IR Signale

Ich werde in einem meiner nächsten Beiträge etwas über Infrarotsender (Fernbedienungen) schreiben. Deswegen möchte ich an dieser Stelle nicht allzu sehr ins Detail gehen. Nur so viel: in der Übertragungstechnik wird gepulstes Infrarotlicht eingesetzt. Die Pulsfrequenz liegt dabei meistens bei 38 Kilohertz. Auf der Sendeseite kann man dieselben IR LEDs einsetzen, nur eben mit gepulstem Signal. Der Clou befindet sich auf der Empfängerseite. Diese „versteht“ nur die gepulsten Signale. Das hat den Vorteil, dass die Übertragung nicht durch das Umgebungslicht beeinflusst wird. Die Empfänger sind die oben erwähnten „Dreibeiner“:

IR Näherungssensor selber bauen -
Empfängermodule für gepulste IR Signale
Empfängermodule für gepulste IR Signale

Ihr findet diese Empfänger unter der Bezeichnung VS1838B oder TSOPxx38 mit xx = 18, 22, 24, 48. Enden die Bezeichnungen nicht auf 38, z.B. TSOP2256, dann liegt die Pulsfrequenz nicht bei 38 kHz, sondern in diesem Beispiel bei 56 kHz.

Hier ein Funktionsschema eines IR Empfängers:

Schematischer Aufbau eines Empfängermoduls für gepulste IR Signale
Schematischer Aufbau eines Empfängermoduls für gepulste IR Signale

Der Empfänger verstärkt und demoduliert das eingehende Signal, d.h. er macht aus einem Puls Signal ein Dauersignal. Wird ein Signal detektiert, schaltet der Transistor (oder Schmitt-Trigger) zwischen 1 und 2 durch. An Pin 1 gibt es entsprechend einen Spannungsabfall.

Die Schaltung

IR LED

Zunächst einmal muss ein gepulstes Signal gesendet werden. Das lässt sich an einem PWM-fähigen (Pulsweitenmodulation) Arduino Pin leicht bewerkstelligen. Ein IR Empfänger für gepulste Signale ist allerdings wesentlich empfindlicher als die zuvor verwendete Fotodiode. Verwendet man denselben IR LED Strom wie oben, dann gibt es durch die seitliche Abstrahlung und durch Reflexion weiter entfernter Wände und Gegenstände ein Dauersignal. Beim Herumprobieren bin ich letztlich mit einem 330 Ohm Widerstand vor der IR LED glücklich geworden. Probiert es einfach mal aus. Und vielleicht nehmt ihr ein Poti statt des Festwiderstandes.

IR Näherungssensor selber bauen - Schaltung für gepulste Methode
IR Näherungssensor selber bauen – Schaltung für gepulste Methode

Hinweis: Die Belegung der Pins des Empfängermoduls kann variieren. Schaut in das Datenblatt eures Moduls!

… und auch hier noch einmal die schematische Darstellung

Die Empfängerseite

Ein IR Empfänger für gepulste Signale zieht ca. 0.6 Milliampere Strom. Das ist nicht viel. Aber eins kommt zum anderen und gerade bei batteriebetriebenen Projekten möchtet ihr den Stromverbrauch wahrscheinlich gering halten. Deshalb schalte ich den Empfänger auch hier über einen Transistor nur dann ein, wenn er benötigt wird.

Aufbau auf dem Breadboard

Aufbau für Pulsmethode
Aufbau für Pulsmethode

Auch mit dem reduzierten IR LED Strom musste ich die Empfängerdiode noch gegen die IR LED abschirmen. Das habe ich hier provisorisch-pragmatisch mit ein paar Legosteinen gelöst, die ich mir von meinem Sohn geborgt habe. Außerdem habe ich die Beinchen des Empfängermoduls um 90 Grad geknickt.

Der Sketch

Der Sketch ist noch einfacher als bei der Nicht-Puls-Methode, da man sich die Messung des Umgebungslichtes sparen kann. Das 38 Kilohertz Signal wird über die tone() Funktion erzeugt und über noTone() wieder abgeschaltet. Auch hier habe ich eine Pause zwischen den Einzelmessungen eingefügt, bin aber mit 50 Mikrosekunden hingekommen. Allerdings musste ich vorab ein 10 Millisekunden langes Signal einfügen (Zeile 20) um vernünftige Werte zu bekommen. Das hängt mit der AGC (automatic gain control) Einheit im Empfänger zusammen (siehe Schema oben). Diese sorgt für eine automatische Verstärkung des Signals, sie braucht aber ein bisschen Zeit um sich einzustellen.

const int irLEDPin =  5;   
const int irReceiverDataPin = A0;
const int irReceiverEnablePin = 10;
unsigned long proximity;


void setup()   {
  Serial.begin(9600);
  analogReference(EXTERNAL);
  pinMode(irReceiverEnablePin, OUTPUT);
  pinMode(irLEDPin, OUTPUT);
}

void loop(){
  proximity = 0;
  delay(1000);
  
  tone(irLEDPin, 38000);
  digitalWrite(irReceiverEnablePin, HIGH);
  delay(10);
  for(int i=0; i<50; i++){
    proximity += analogRead(irReceiverDataPin);
    delayMicroseconds(50);
  }
  proximity /= 50;
  Serial.print("Proximity: "); Serial.println(proximity);
  noTone(irLEDPin);
  digitalWrite(irReceiverEnablePin, LOW);
}

 

Das Ergebnis

Ergebnis der Pulsmethode
Ergebnis der Pulsmethode

Ich habe versucht, mich dem Sensor mit einer ähnlichen Geschwindigkeit zu nähern wie oben. Ihr seht einen hohen Wert, wenn kein Objekt in Reichweite ist, da der im Empfänger integrierte Transistor gesperrt ist. Kommt ein Objekt in Reichweite, dann geht der Wert sehr schnell auf ein Minimum und bleibt konstant. Durch den internen Aufbau reagiert das Empfängermodul quasi digital. In dem kurzen Übergangsbereich mit mittleren Werten kommen einige Signale an und andere nicht.

Die Reichweite dieser Variante ist bei den gewählten Parametern ähnlich wie bei der Nicht-Puls-Methode. Allerdings hat man schon nach ca. zwanzig bis dreißig Prozent des Weges im Erfassungsbereich das Messwerteminimum erreicht. Damit ist dieser Aufbau eher ein Bewegungsmelder als ein Näherungssensor.

Da der Empfänger nur ein HIGH / LOW Signal liefert, kann man die analogRead() Funktion auch durch die schnellere digitalRead() Funktion ersetzen. Dann sollte man allerdings nicht mehr durch die Anzahl der Messungen teilen, um den Übergangsbereich zu erfassen. Das könnt ihr dann ja einmal ausprobieren.

Danksagungen

Das Bild mit Hammer und Nägeln, in die ich die IR LEDs, Empfänger und das Lineal für mein Beitragsbild hineingepixelt habe, stammt von analogicus auf Pixabay. Das Lineal stammt von mbnachhilfe_de, auch Pixabay.

Schreibe einen Kommentar

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