A09|01 Infrarot-Hindernisvermeidungssensor
Infrared Obstacle Avoidance Sensor


Sensorwerte / Distanzen messen

Der Name Infrarot-Hindernisvermeidungssensor ist etwas klobig – ein treffender Begriff ist Infrarot-Objekterkennung. Wir können mit diesem Modul keine unterschiedlichen Distanzen messen, sondern nur ob sich ein Objekt innerhalb des Messbereichs befindet. Mit seinem effektiven Lese-Winkel von 35° wurde er speziell für mobile Roboter entwickelt. Der kleine Winkel ermöglicht eine präzisere Ansteuerung des Roboters. Mit einem zu großen Winkel wird die Navigation erschwert. Der Sensor hat eine sehr gute und stabile Reaktion auch bei Umgebungslicht oder völliger Dunkelheit. Der Erfassungsabstand kann von 2cm bis 40cm mithilfe der Trimmpotentiometer eingestellt werden.

 

Spezifikationen
- Signalart: digital
- Spannung: 3,3V – 5V
- Pinabstand: 2,54mm
- Arbeitsstrom: ≥20mA
- Arbeitstemperatur: -10℃ to+50℃
- Erfassungsabstand: 2-40cm
- Effektiver Winkel: 35°

Der Sensor verfügt über ein Infrarot-Sende- und Empfangsmodul. Wenn der vom Sender ausgesandte Infrarotstrahl auf ein Hindernis (=Reflektor) trifft, wird der Infrarotstrahl zum Empfänger reflektiert und ein digitales Signal erzeugt. Im Grunde könnten wir diesen Sensor wie einen PIR Bewegungssensor (Winkel 100°, bis 4m Abstand) in Miniformat nutzen.

Beachte eine Besonderheit dieses Sensors: Wenn die Oberfläche infrarot-absorbierend, also schwarz und/oder rau ist, wird das IR-Signal nicht reflektiert und das Objekt kann vom Sensor nicht erkannt werden.

Das Board verfügt über eine Standby-LED, die aufleuchtet, sobald sie mit Strom versorgt wird. Der Sensor kann auch ohne ein Arduino in Betrieb genommen werden: Eine zweite LED leuchtet, wenn der Hindernissensor aktiviert wird.

Der Infrarot-Sensor besitzt eine integrierte Schaltung, die uns viel Arbeit abnimmt. Das Herzstück der Schaltung ist ein NE555-Chip, der eine 38kHz Rechteckwelle erzeugt. Das Rechteck-Signal wird verwendet, um eine Infrarot-LED (IR) zum Leuchten zu bringen - das Licht ist für das menschliche Auge unsichtbar. Das von der LED ausgestrahlte kodierte Licht wird von einem IR-Empfängermodul erfasst. Das Empfängermodul enthält einen optischen 950nm Infrarot-Filter und einen internen, elektronischen 38kHz Bandpassfilter. Diese beiden Filter ermöglichen, dass das Modul nur auf IR-Licht reagiert, dass bei 38kHz pulsiert. Dies ist nötig, um eine Verwechslung mit IR-Signalen von anderen Geräten in der Umgebung zu vermeiden. Kurz gesagt wird das analoge Signal der gesendeten IR-LED empfangen und durch den Chip in ein digitales Signal umwandelt, das vom Arduino erkannt werden kann.

Der Trimmpotentiometer B (siehe untere Abb.) dient zur Einstellung der Empfindlichkeit des Sensors. Mit ihm kannst du den Messabstand zum Objekt einstellen. Durch Drehen des Potentiometers gegen den Uhrzeigersinn wird der Bereich vergrößert, durch Drehen im Uhrzeigersinn verkleinert sich der Bereich. Der Trimmpotentiometer A sollte normalerweise nicht verändert werden. Es steuert die Frequenz des Infrarotsignals und ist bereits voreingestellt. In manchen Umgebungen mit Infrarot-Interferenzen (erzeugt durch andere Infrarot-Quellen) ist der Potentiometer A dafür gedacht, die Frequenz zu ändern, um sich von den anderen Signalen abzugrenzen.

 
 

Der Aufbau

Verbinde dein Arduino mithilfe der Jumper Wire mit dem Modul:

 
 

Der minimal Sketch

Der Test-Sketch für den Hindernisvermeidungssensors ist denkbar einfach. Folgender Sketch liest den Zustand des Sensors und lässt entsprechend eine LED ein- oder ausschalten. Dieser Sketch ist in seinem Aufbau fast identisch mit dem Code aus dem Kapitel für den digitalen Momentanschalter - bis auf die Variablennamen und den Einsatz der seriellen Nachricht. Siehe für nähere Erläuterungen des Sketches in A07|01 Der digitale Momentanschalter nach. Kopiere den unteren Sketch, füge ihn in die Arduino IDE ein und lade ihn auf das Arduino-Board rauf.

/********************************************************
A09|01 Der Infrarot-Hindernisvermeidungssensor A
Der Minimal-Sketch
Mr Robot UXSD / www.mrrobotuxsd.com
*********************************************************/

int infraPin = 3; //Pin für den Hindernis-Sensor
int ledPin = 13;  //Pin für die LED


void setup()
{ 
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);  //LED-Pin als Ausgang deklarieren
  pinMode(infraPin, INPUT); //Hindernis-Sensor als Eingang deklarieren
}


void loop()
{
  //Variable um den Hindernis-Sensor abzufragen
  int infraState = digitalRead(infraPin); 
                                            
  if (infraState == HIGH) //Prüfen, ob Hindernis-Sensor gedrückt wurde
  {
    //Dieser Teil wird ausgeführt, wenn infraState HIGH ist
    digitalWrite(ledPin, HIGH); //LED einschalten 

    //Wenn Objekt detektiert wird, sende Nachricht an seriellen Monitor
    Serial.println("Hindernis!");  
  }

  else
  {
    //Dieser Teil wird ausgeführt, wenn infraState LOW ist
    digitalWrite(ledPin, LOW); //LED ausschalten
    
    //Wenn kein Objekt detektiert wird, sende Nachricht an seriellen Monitor
    Serial.println("Nada!");    
  }
}
 

Die Enable-Funktion oder wie man den Akku schont

Du hast sicherlich schon den vierten Pin namens EN entdeckt. EN ist die Kurzform für enable (aktivieren). Mit diesem Pin hast du die Möglichkeit den Sensor ein- und auszuschalten. Wenn du den “Jumper“ (Steckbrücke) abziehst, wird der Sensor in den Enable-Zustand gehen und funktioniert nicht mehr. Ab jetzt benötigt es ein HIGH-Signal am EN-Pin, der vom Arduino geliefert werden kann. Im Enable-Modus musst du den EN-Pin mit dem Arduino verbinden. Welchen Sinn kann das haben? Falls dein Projekt Batterie-betrieben eingesetzt wird, kannst du so Energie einsparen. Schließlich verbraucht das Infrarot Sende- und Empfangsmodul fortlaufend Strom. Folgendes Szenario kann von einer Abschaltung profitieren: Du hast einen mobilen Roboter, dessen Akku sich dem Ende neigt. Um es noch zur Homebase zu schaffen, werden alle nicht benötigten Subsysteme abgeschaltet, um mehr Energie für den Antrieb zu erhalten.

 
 

Eine sehr gute Methode, die Akkulaufzeit zu verlängern, besteht darin, den Sensor nur dann mit Strom zu versorgen, wenn Messungen durchgeführt werden. Dadurch wird der Entladeprozess signifikant verlangsamt. In einigen Projekten wird es nicht notwendig sein, jede Sekunde eine Messung durchzuführen.

Aus diesem Grund benutzen wir den EN-Pin. Dies hat den Vorteil, dass wir den Sensor mit einem HIGH-LOW-Signal nur bei Bedarf mit Strom versorgen können. Folgender Code schaltet den Sensor nur dann ein, wenn der Taster gedrückt wird. Beim Loslassen wird der Sensor deaktiviert und es werden keine Messungen vorgenommen. Folgende Abbildung zeigt die Verkabelung:

 

Zur Veranschaulichung verwenden wir einen Taster, um den Sensor ein- und auszuschalten. Wird er gedrückt gehalten, sendet das Arduino ein HIGH-Signal an den EN-Pin und der Sensor nimmt die Messungen auf. Trift der IR-Sensor auf ein Objekt, schickt er an den seriellen Monitor die Nachricht “Hindernis!“, ansonsten erscheint “Nada.“.

/********************************************************
A09|01 Der Infrarot-Hindernisvermeidungssensor B
Die Enable-Funktion
Mr Robot UXSD / www.mrrobotuxsd.com
*********************************************************/

int infraPin = 3;  //Pin für den Hindernis-Sensor
int powerPin = 2;  //Pin für EN = Enable
int buttonPin = 7; //Pin für den Taster


void setup()
{ 
  Serial.begin(9600);
    
  pinMode(infraPin, INPUT);  //Hindernis-Sensor als Eingang deklarieren
  pinMode(powerPin, OUTPUT); //den powerPin als OUTPUT deklarieren
  pinMode(buttonPin, INPUT); //den powerPin als OUTPUT deklarieren
}


void loop()
{    
  int buttonState = digitalRead(buttonPin);

  //Variable um den Hindernis-Sensor abzufragen
  int infraState = digitalRead(infraPin); 
                                         
  if (infraState == HIGH) //Prüfen, ob der Hindernis-Sensor aktiviert wurde
  {
    //Dieser Teil wird ausgeführt, wenn infraState HIGH ist
    Serial.println("Nada.");  
  }

  else
  {    
    //Dieser Teil wird ausgeführt, wenn infraState LOW ist
    Serial.println("Hindernis!");  
  }
  
  if(buttonState==HIGH)
  {
    digitalWrite(powerPin,LOW); //schalte den Sensor wieder aus
  } 
  else
  {
    digitalWrite(powerPin,HIGH); //versorge den Sensor mit Strom
  }
}
 

Schalte den seriellen Monitor ein, indem du in der Arduino IDE in der Menüleiste auf Werkzeuge > Serieller Monitor gehst.

Du solltest nun die folgende Anzeige sehen:

 
 

Falls du die hier beschriebenen Elektronik-Module nicht hast, kannst du sie in meiner Einkaufsliste finden. Warum ich selber hauptsächlich mit Modulen der Marke Keyestudio arbeite, erläutere ich unter diesem Blog-Artikel.

In dieser Übersicht äußere ich Empfehlungen aller Art.

Hier kommst du wieder zur Übersicht aller Module.