Zum Hauptinhalt springen

Die Näherungssensoren (nur Zumo 32u4)

Pololu Zumo 32u4 Library: Näherungssensoren

Mit der Klasse Zumo32U4ProximitySensors werden die Methoden für die Näherungssensoren bereitgestellt.

Einführung

Der Zumo32u4 hat drei IR-Näherungssensoren mit welchem nahe Objekte oder Hindernisse erkannt werden können.

Näherungssensoren des Zumo

Die Näherungssensoren geben an, ob (reflektiertes) IR-Licht detektiert wurde oder nicht. Im Gegensatz zu den Liniensensoren habe die drei Näherungssensoren keinen integrierten IR-Sender. Stattdessen erfassen sie reflektiertes IR-Licht, das von 4 IR-LEDs auf dem Zumo 32U4 Mainboard (auf der Oberseite des Roboters) ausgesendet wird.

Damit die Sensoren nicht irrtümlich IR-Licht detektieren, welches von fremden Quellen (z.B. dem Tageslicht oder einer Lampe) kommt, wird das IR-Licht mit einer Frequenz von ca. 38 kHz moduliert. Die drei an der Bodenplatine befindlichen IR-Empfänger (also die Näherungssensoren), können nur dieses modulierte Licht erkennen und sind damit relativ unempfindlich gegenüber anderen Störquellen.

Die Näherungssensoren sind nach den Richtungen benannt, in die sie zeigen: links, vorne oder rechts. Auf der Platine sind sie mit LFT, FRONT und RGT gekennzeichnet. Das für die Näherungssensoren verwendete Bauteil ist das Vishay TSSP77038 IR-Empfängermodul.

IR-Näherungssensoren können auch verwendet werden, um Befehle von herkömmlichen IR-Fernbedienungen zu empfangen.

IR-LEDs für die Objekterkennung

Auf dem Zumo32u4 Mainboard befinden sich auch 4 IR-LEDs, welche benötigt werden, um zusammen mit den 3 IR-Näherungssensoren nahe Objekte erkennen zu können:

  • Zwei IR-LEDs (FRONT_LEFT und FRONT_RIGHT) befinden sich an der Vorderseite und sind geeignet Objekte vor dem Roboter zu detektieren.
  • Zwei seitliche IR-LEDs sind links und rechts (MIDDLE_LEFT und MIDDLE_RIGHT) an der Hauptplatine angebracht und strahlen IR-Licht zur Seite ab.

Zum Detektieren möglicher Objekte werden in der Klasse Zumo32U4ProximitySensors verschiedene Methoden bereitgestellt, die für die einzelnen IR-Sensoren das reflektierte Licht der unterschiedlichen IR-LEDs bestimmen.

IR-LED Zumo

Das Messprinzip

Die drei IR-Näherungssensoren sind digitale Sensoren, welche nur zwei Zustände annehmen können: Entweder IR-Licht wurde detektiert oder kein IR-Licht wurde detektiert. Information über die Intensität des detektierten Lichtes können die Sensoren nicht liefern.

Um trotzdem zu ermitteln, wieviel IR-Licht ein Objekt reflektiert, kann die Helligkeit der IR-LEDs variiert werden und dadurch bestimmt werden, ab welcher Helligkeit der IR-Sensor reflektiertes IR-Licht detektiert. In der praktischen Anwendung werden zum Beispiel 10 Messungen mit 10 verschieden Helligkeiten der IR-LEDs durchgeführt, um dann zu bestimmen, bei welcher Helligkeit der IR-Sensor aktiviert wird. Die Helligkeit der IR-LEDs wird hierbei über ein PWM-Signal gesteuert.

Eigenschaften der Objekterkennung

Die verwendeten Sensoren sind nur bedingt für die Entfernungsbestimmung von Objekten geeignet. Wie stark das abgestrahlte Infrarotlicht von einem Objekt reflektiert wird, hängt von verschiedenen Faktoren wie Farbe, Oberflächenbeschaffenheit oder Ausrichtung des Objektes ab. Daher ist es nur schwer möglich, alleine aus der Information über die Intensität des reflektierten Lichtes die Entfernung eines beliebigen Objektes zu bestimmen. Hierfür wären anderen Sensoren besser geeignet.

Beschränkt man sich jedoch auf ein Objekt, dessen Reflexionseigenschaften bekannt sind (z.B. eine Box oder einen anderen Roboter), so ist es möglich aus der Intensität des reflektierten Lichtes die Entfernung des Objektes in starker Näherung zu bestimmen.

Linien- und Näherungssensoren

Leider hat der vom Zumo32u4 verwendete Mikrocontroller nicht genug freie Ein-/Ausgabe-Pins, damit alle 5 Bodensensoren und alle 3 Näherungssensoren zur selben Zeit betrieben werden können. Insgesamt können nie mehr als 6 Sensoren zur gleichen Zeit verwendet werden (3 Linien- und 3 Näherungssensoren, 4 Linien- und 2 Näherungssensoren, 5 Linien- und 1 Näherungssensor). Je nachdem welche Sensoren verwendet werden sollen, müssen an der Platine für die Bodensensoren Jumper-Stecker neu gesetzt werden.

caution

Wenn alle fünf Bodensensoren verwendet werden, kann nur der fordere Näherungssensor verwendet werden.

Messen

void read()

Die Hauptmethode der Klasse, welche die IR-LEDs ansteuert und die Intensität des reflektierten IR-Licht misst. Fast alle andern Methoden der Klasse dienen dazu, das Verhalten dieser Methode zu konfigurieren oder auf die Messergebnisse dieser Methode zugreifen zu können.

Die Methode void read() führt folgende Aktionen aus:

  1. Näherungssensoren aktivieren.
  2. Liniensensoren IR LEDs deaktivieren.
  3. Für jeden festgelegten Helligkeitswert der LEDs werden folgende Aktionen ausgeführt:
    1. Startet IR-Pulse mit den beiden IR-LEDs auf der linken Seite.
    2. Wertet jeden IR-Sensor aus.
    3. Schaltet die LED-Pulse aus.
    4. Startet IR-Pulse mit den beiden IR-LEDs auf der rechten Seite.
    5. Wertet jeden IR-Sensor aus.
    6. Schaltet die LED-Pulse aus.
caution

Die Methode read() hat keinen Rückgabewert. Zum Auslesen der Messwerte werden daher verschieden Methoden bereitgestellt (Abschnitt Auslesen).

Die Helligkeitswerte der IR-LEDs können mit der Methode setBrightnessLevels() festgelegt werden. Die Frequenz der IR Pulse, welche standardmäßig 38 kHz beträgt, kann mit void setPeriod() geändert werden (ändert auch die Empfindlichkeit des IR-Sensors).

Mit den Standardeinstellung benötigt die Methode etwa 2,15 Millisekunden pro Helligkeitswert plus 0,62 Millisekunden. Die Anzahl der verwendeten Sensoren hat nur einen geringen Einfluss auf die benötigte Zeit.

Nach der Methode read() sollte zum Auswerten der Ergebnisse eine der Auslesemethoden aufgerufen werden.

Konfigurieren

Zumo32U4ProximitySensors()

Konstruktor der Zumo32U4ProximitySensors Klasse.

void initFrontSensor()

Konfiguriert das vorher erzeugte Objekt für die Verwendung des Frontsensors.

#include <Zumo32U4.h>

Zumo32U4ProximitySensors proxSensor; // Objekt erzeugen
proxSensor.initFrontSensor(); // Initialisieren des Frontsensors

void initThreeSensors()

Konfiguriert das vorher erzeugte Objekt für die Verwendung von allen drei Näherungssensoren. Die korrekte Jumpereinstellungen an der Platine für die Liniensensoren ist zu beachten.

void setBrightnessLevels(...)

void setBrightnessLevels (uint16_t *levels, uint8_t levelCount)

Legt eine Reihe von Helligkeitswerten für die IR-LED fest, welche von der Methode read() verwendet wird. Wird die Methode setBrightnessLevels nicht genutzt, so werden für die IR-LEDs die Standardwerte 4, 15, 32, 55, 85 und 120 verwendet. Sinnvolle Werte liegen zwischen 1 und 128.

Parameter

  • levels Pointer zu einem Array mit Helligkeitswerten
  • levelCount Anzahl der Helligkeitswerte
#inlcude <Zumo32U4.h>

Zumo32U4ProximitySensors proxySensors; // Objekt erzeugen

uint16_t levels[] = {2, 4, 8, 16, 32, 64, 128}; // Array für Helligkeitswerte
proxySensors.setBrightnessLevels(levels, sizeof(levels)/sizeof(levels[0])); // Helligkeitswerte festlegen

void setPeriod()

void setPeriod (uint16_t period)

Auslesen

Für das Auswerten der mit read() durchgeführten Messung gibt es verschieden Methoden, welche sich in der Kombination von IR Sensor und IR LED unterscheiden.

Naeherungssensor des Zumo 32U4

Für jeden IR Sensor (Left, Front, Right) stehen zwei Methoden zur Verfügung. Die Methoden geben an, bei wie vielen Helligkeitswerten der linken (Left LEDs) oder rechten LED (Right LEDs) der IR Sensor Licht detektiert hat.

uint8_t countsLeftWithLeftLeds()

Gibt die Anzahl der Helligkeitswerte der linken LEDs zurück, bei denen der linke Näherungssensor aktiviert wurde.

uint8_t countsLeftWithRightLeds()

Gibt die Anzahl der Helligkeitswerte der rechten LEDs zurück, bei denen der linke Näherungssensor aktiviert wurde.

uint8_t countsRightWithLeftLeds()

Gibt die Anzahl der Helligkeitswerte der linken LEDs zurück, bei denen der rechte Näherungssensor aktiviert wurde.

uint8_t countsRightWithRightLeds()

Gibt die Anzahl der Helligkeitswerte der rechten LEDs zurück, bei denen der rechte Näherungssensor aktiviert wurde.

uint8_t countsFrontWithLeftLeds()

Gibt die Anzahl der Helligkeitswerte der linken LEDs zurück, bei denen der mittlere Näherungssensor aktiviert wurde.

uint8_t countsFrontWithRedLeds()

Gibt die Anzahl der Helligkeitswerte der rechten LEDs zurück, bei denen der mittlere Näherungssensor aktiviert wurde.

Beispielprogramm

/* Einfaches Beispielprogramm, bei dem die Messewerte des Front-IR-Sensors ausgegeben
werden. Wird ein Objekt erkannt, so wird dies auf dem LCD-Display angezeigt. */

#include <Zumo32U4.h>

Zumo32U4LCD lcd;
Zumo32U4ProximitySensors proxySensors;

int schwellwert = 4; // Schwellwert für die Objekterkennung

void setup()
{
// Initialisierung des vorderen IR Sensors. In dieser Konfiguration
// werden die beiden seitlichen IR Sensoren nicht verwendet.
proxySensors.initFrontSensor();

// Die Werte des level[] Arrays geben die Intensitäten der IR LEDs an. Je höher der Wert,
// desto wahrscheinlicher, dass ein Objekt das Licht reflektiert und der IR Sensor es detektiert.
int levels[] = { 2, 3, 4, 6, 9, 14, 25, 40, 70};
proxySensors.setBrightnessLevels(levels, sizeof(levels)/sizeof(levels[0]));

lcd.clear(); // Display löschen
}

void loop()
{
proxySensors.read(); // Wertet den vorderen IR Sensor mit den IR-LEDs links und rechts aus.

// Anzahl der Werte, bei denen der IR Sensor Licht detektiert hat.
int wertLinks = proxySensors.countsFrontWithLeftLeds();
int wertRechts = proxySensors.countsFrontWithRightLeds();

// Bestimmen, ob ein Objekt erkannt wurde (|| - ODER)
bool objektErkannt = wertLinks >= schwellwert || wertRechts >= schwellwert;

ledRed(objektErkannt); // Led wird angeschaltet, wenn ein Objekt wurde erkannt
lcd.gotoXY(0, 0); // Ausgabe auf dem LCD-Display
lcd.print(wertLinks);
lcd.print(' ');
lcd.print(wertRechts);
}