Infrarotsensor mit Matlab/Simulink
Autor: Janis Ostermann
Sensor: High Precision Medium Range Infrared distance sensor for NXT or EV3
Software: Arduino Software, MATLAB R2018a
Lehrveranstaltung: Signalverarbeitende Systeme im Sommersemester 2018
Dozent und Betreuer: Prof. Dr.-Ing. Ulrich Schneider
Aufgabenstellung
Die Aufgabe in der Lehrveranstaltung Signalverarbeitende Systeme aus dem Master-Studiengang Business and Systems Engineering der Hochschule Hamm-Lippstadt war es, semesterbegleitend einen zugeteilten Sensor mit der Hilfe von MATLAB/Simulink auszulesen und dessen Signalverarbeitungskette zu beschreiben, zu untersuchen und zu verstehen.
Sensor
Bei dem in der Lehrveranstaltung genutzten Sensor mit dem Namen DIST-Nx-v3 handelt es sich um ein Sensormodul der Firma mindsensors.com welches es ermöglicht einen Infrarotsensor mit einem Lego Mindstorms NXT oder EV3 zu verbinden um eine Distanz zu messen. Bei dem dabei verwendeten Infrarotsensor handelt es sich um einen Sensor der Firma Sharp mit der Bezeichung 2Y0A21. Das DIST-Nx-v3 Modul ist kein Lego Produkt und wurde von mindsensors.com für die Verwendung mit Lego Mindstorms Produkten entwickelt. Dazu wurde die in Abbildung 1 zu sehende I²C Schnittstelle inklusive einer vorverarbeitenden Schaltung in dem Modul verbaut. Diese Schaltung ist nicht bekannt und geht auch nicht aus den Dokumentationen von mindsensors.com hervor. Es ist anzunehmen, dass ein Mikrocontroller verbaut wurde, da dieser zum Aufbau einer Verbindung über I²C benötigt wird. Über dies hinaus ist die sensorseitig vorhandene Schnittstelle des Sharp Sensors weiterhin nutzbar. Diese besteht aus einer JST (Japan Solderless Terminals) Buchse mit drei Pins.
Da es Inhalt der Aufgabenstellung war, sich möglichst nah mit einem Sensor auseinander zu setzen, wird im folgenden Artikel der Sensor ausschließlich über die sensorseitige Schnittstelle ausgelesen. Somit wird die modulseitige Nachverarbeitung der Sensorwerte umgangen um einen genaueren Blick auf die Funktionswiese und das Verhalten des Sharp Sensors zu erhalten.
Sharp 2Y0A21:
Bei dem verwendeten Infrarotsensor handelt es sich um einen Infrarot Abstandssensor der Firma Sharp mit der Bezeichnung 2Y0A21.
Der Sensor besitzt folgende Technische Daten:
- Arbeitsbereich von 10 bis 80 Zentimetern
- Präzisionsbereich zwischen 10 und 40 Zentimetern (laut Hersteller)
- Stromaufnahme 30 Milliampere
- Betriebsspannung zwischen 4,5 und 5,5 Volt
- analoge Ausgangsspannung zwischen 0 und 5 Volt
- Abmessungen 13 x 44,5 x 13,5 mm (Höhe x Breite x Tiefe).
Wie in Abbildung 2 zu erkennen ist, besteht der Infrarotsensor aus einem optischen Positionssensor (Position Sensitive Device), einer Infrarot Diode und einer signalverarbeitenden Schaltung. Die Reflektivität des gemessenen Objekts, die Umgebungstemperatur und die Betriebsdauer des Sensors werden nicht in die Abstandsmessung eingerechnet. Bei der Triangulation wird, wie in Abbildung 3 dargestellt, der Winkel des Infrarotlichts welches vom zu messenden Gegenstand reflektiert wird gemessen. In Abhängigkeit vom Winkel verändert sich die Ausgangsspannung des Sensors zwischen 0 und 5 Volt. Mithilfe der im Datenblatt angegebenen Kennlinie (Abbildung 4) kann die Ausgangsspannung in den Abstand umgerechnet werden. Der Mindestabstand des Sensors, 10 Zentimeter, entspricht somit 2,3 Volt Ausgangsspannung. Bei dem maximalen Abstand von 80 Centimetern beträgt die Ausgangsspannung 0,4 Volt. Der Sensor wird wie in Abbildung 5 dargestellt mit einem Mikrocontroller verbunden.
Signalverarbeitung
Um die analogen Sensordaten des Sharp 2Y0A21 Infrarotsensors in MATLAB oder für eine andere Anwendung nutzen zu können, ist es nötig diese zu verarbeiten und an einer digitalen Schnittstelle zur Weitergabe zur Verfügung zu stellen. Die Werte sollen wie in der Aufgabenstellung beschrieben in MATLAB verarbeitet, möglicherweise gefiltert und grafisch dargestellt werden. Im Folgenden sollen die Schritte beschrieben werden, die benötigt wurden um dies zu realisieren.
Hardwareaufbau
Herzstück des Hardwareaufbaus ist das Sensormodul, welches den Sharp 2Y0A21 beinhaltet. Dieses ist, wie die Abbildung 6 zeigt, mit der Hilfe von Jumper-Kabeln über den sensorseitigen Anschluss mit dem Arduino UNO verbunden. Der Vo Pin des Sensors ist mit der Ausgangsspannung belegt und wird an den analogen Input Port A0 des Arduino UNO angeschlossen. Der GND des Sensors wird mit dem Ground des Arduino UNO verbunden. Der Vcc Pin des Sensors ist mit der Versorgungsspannung des Sensors belegt und wird an die 5V Spannung des Arduino UNO angeschlossen. Da die Sensorsignale analog an den Arduino UNO übertragen werden ist kein Bussystem zur Übertragung der Sensordaten nötig. Der Arduino UNO ist über die vorhandene USB Schnittstelle mit einem PC verbunden. Über diese Verbindung bezieht er 5 Volt Versorgungsspannung für sich und den Sensor. Der PC führt MATLAB aus, welches das Programm zur weiteren Verarbeitung der Daten beinhaltet. Dieses bekommt über den COM-Port des PCs Zugriff auf die digitalen Sensordaten.
Mikrocontroller
Der DIST-Nx-v3 Sensor verfügt über zusätzliche vorverarbeitende Elektronik, welche es ermöglicht die rohen Sensorsignale des Sharp 2Y0A21 zu Filtern und eine Kommunikation mit einem Mikrocontroller über I²C herzustellen. Im Fall der Aufgabenstellung ist es nötig einen Mikrocontroller hinzuzuziehen, welcher die Umwandlung der analogen in digitalen Signale durchführt und diese zur Weiterverarbeitung an einen MATLAB ausführenden PC überträgt. Hierzu wurde, wie in Abbildung 6 zu sehen ist, ein Arduino UNO gewählt. Dieser verfügt über AD-Wandler, welche in der Lage sind das analoge Signal zu digitalisieren. Das gewandelte Signal wir daraufhin über die vorhandene USB-Schnittstelle einem PC zur Weiterverarbeitung zur Verfügung gestellt. Der Arduino UNO arbeitet mit 5 Volt Versorgungsspannung, welche er gleichzeitig zur Datenübertragung über die USB-Schnittstelle des PCs bezieht.
Analog-Digital-Umsetzter
Um die analogen Sensorsignale des Infrarotsensors verarbeiten zu können, müssen diese zunächst digitalisiert werden. Zu diesem Zweck können die Analog-Digital-Umsetzer (ADU) des auf dem Arduino UNO operierenden ATmega328p Mikrocontrollers genutzt werden. Der Mikrocontroller verfügt über 10 Bit aufgelöste ADUs welche nach dem Prinzip der sukzessiven Approximation agieren. Bei diesem Vorgehen wird ein ständiger Vergleich zwischen der analogen Eingangsspannung des ADUs mit einer Referenzspannung durchgeführt. Bei jedem Durchlauf wird die Referenzspannung so geändert, dass sie sich der Eingangsspannung annähert. Die Auflösung des ADUs beschreibt gleichzeitig die Anzahl an Taktzyklen die erforderlich sind um ein analoges Signal zu digitalisieren.
Der Analog-Digital-Umsetzter besitzt folgende Technische Daten:
- Auflösung von 10 Bit
- Wandlungszeit 13 bis 260 Mikrosekunden
- Genauigkeit +- 2 LSB (least significant bit)
- Eingangsspannung 0 Volt (Ground) bis Eingangsspannung des Mikrocontrollers abzüglich eines LSB
Die Vorgehensweise des ADUs lässt sich anhand von Abbildung 7 erläutern. Im ersten Schritt wird das höchstwertige Bit (most significat bit) mit der Eingangsspannung des ADU verglichen. Wenn die Eingangsspannung größer als das MSB ist, wird das Bit gesetzt. Wenn die Eingangsspannung jedoch kleiner als das MSB ist wird das Bit auf Null zurückgesetzt. Dieser Schritt dauert einen Taktzyklus. Im zweiten Schritt wird das nächst niedrigere Bit gesetzt. Bei jedem Schritt halbiert sich die Wertigkeit des Bits. Bei dem erneuten Vergleich der Spannungen werden die Wertigkeiten aller vorherigen Bits addiert. Wenn diese Summe kleiner als die Eingangsspannung ist, wir das zweite Bit gesetzt. Wenn die Eingangsspannung jedoch niedriger ist als die Summe, wird das Bit wiederum zurückgesetzt. Dieser Ablauf wird für jedes Bit der Auflösung durchgeführt. Sind alle Bits überprüft worden, resultiert die entstandene Bitfolge als digitales Abbild der Eingangsspannung.
Bei der vorliegenden Anwendung wird die maximale Ausgangsspannung des Sensors von 5 Volt durch die 10 Bit Auflösung des ADUs die Spannung als Wert zwischen 0 und 1024 (210) darstellt.
Das LSB hat eine Wertigkeit und der Sensor somit eine Auflösung von:
Der erste Vergleich des ADU startet mit dem MSB, welches folgende Wertigkeit Aufweist:
Digitale Signalverarbeitung
Die digitale Signalverarbeitung beginnt, sobald die analogen Sensorwerte von dem Analog-Digital-Umsetzter vom Mikrocontroller des Arduino UNO in digitale Signale umgewandelt wurden. Dem Datenblatt des Sensors ist zu entnehmen, dass für eine Messung 38.3ms ± 9.6ms benötigt. Daher wird ein Code für den Arduino geschrieben, welcher die Sensorsignale mit einem Takt von 50 Millisekunden abgetastet. Als Sensorwert wird ein Wert vom analogen Eingangs-Pin A0 eingelesen. Der Sensorwert wird daraufhin an die serielle Schnittstelle des Arduino UNOs gesendet.
Der Code des Arduino lautet wie folgt:
int sensorPin = 0;
int sensorDelay = 50;
int sensorAdValue;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorAdValue = analogRead(sensorPin);
Serial.println(sensorAdValue);
delay(sensorDelay);
}
Die Daten welche an der seriellen Schnittstelle anliegen werden daraufhin von MATLAB ausgelesen. Das MATLAB Programm nutzt dazu die funktionen fopen, fgetl und fclose um mit der seriellen Schnittstelle zu Kommunizieren. Dazu muss ein Objekt erzeugt werden welches die Informationen
- Nummer des COM-Ports
- Baud Rate des Arduino UNOs
- Bit Breite
enthält. Mit diesen Informationen kann eine Verbindung zur seriellen Schnittstelle hergestellt werden. Die Rückgabewerte der fgetl-Funktion sind jedoch in ASCII Format und müssen daher zunächst auf einen Zahlenwert gecastet werden. Erst nach diesen Schritten kann mit dem Sensorwert gerechnet werden. Um aus dem übertragenen Zahlenwert den Spannungswert des Infrarotsensors zu errechnen wir eine Umrechnung benötigt
Diese Vorgehensweise wir in MATLAB folgendermaßen umgesetzt:
port = 'COM4';
baudRate = 9600;
serialArduino = serial(port,'BaudRate',baudRate,'DataBits',8);
fopen(serialArduino) % Verbindung mit serieller Schnittstelle aufbauen
ASCII = fgetl(serialArduino); % Sensorwert von serieller Schnittstelle auslesen
ArdV = str2num(ASCII); % Sensorwert von ASCII in Zahlenwert umwandeln
V = ArdV*(5/1023); % Umrechnungsfaktor auf Volt
fclose(serialArduino); % Verbindung mit serieller Schnittstelle beenden
Um die richtigen Distanzen zu den gemessenen Spannungen zu erhalten wurde eine Lookup-Tabelle implementiert. Diese ist eine Nachbildung der Infrarotsensor Kennlinie aus Abbildung 4 für die Distanzen zwischen 10 um 80 Zentimetern. Dies wurde auf Grund dessen, dass die Kennlinie aus Geraden zusammengesetzt wurde, ebenfalls als zusammengesetzte Funktion aus Geradengleichungen realisiert:
function [ CM ] = LUT( V )
if V < 0.44
CM = (-1)*(500)*V+290;
elseif V < 0.51
CM = (-1)*(1000/7)*V+(930/7);
elseif V < 0.6
CM = (-1)*(1000/9)*V+(350/3);
elseif V < 0.74
CM = (-1)*(500/7)*V+(650/7);
elseif V < 0.93
CM = (-1)*(1000/19)*V+(1500/19);
elseif V < 1.01
CM = (-1)*(469/8)*V+(67617/800);
elseif V < 1.31
CM = (-1)*(177/10)*V+43.187;
elseif V < 1.65
CM = (-1)*(487/34)*V+38.76382353;
else
CM = (-1)*(171/22)*V+27.955;
end
end
Mit Hilfe dieser Lookup-Tabelle werden die Sensorsignale in MATLAB in Distanzen umgerechnet.
Ergebnis
Die Lookup-Tabelle ermöglicht es erste Messungen durchzuführen. Die Ergebnisse der Messung sollen zeigen wie hoch ein möglicher Fehler der Messungen ist. Dazu werden im Folgenden die Messwerte analysiert, bewertet und möglicherweise gefiltert werden.
Messunsicherheit:
Mit Hilfe der Lookup-Tabelle konnten Erste Messungen durchgeführt werden. Es zeigte sich dabei schnell, dass die gemessenen Werte stark rauschten. Um dies darzustellen wurde eine Messreihe durchgeführt.
Dabei wurde auch die Messunsicherheit berechnet. Sie berechnet sich wie folgt:
Die Berechnungen lieferten folgende Ergebnisse:
Wahrer Wert (in cm) | Messungen in cm | Standardabweichung | Messunsicherheit | Vertrauensbereich | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ||||
10 | 9,738 | 9,092 | 9,282 | 9,472 | 9,737 | 9,624 | 8,941 | 9,206 | 9,738 | 9,548 | 0,291 | 0,208 | 10 ± 0,208 |
15 | 15,474 | 15,684 | 15,013 | 15,127 | 15,264 | 15,684 | 14,709 | 14,937 | 15,089 | 15,684 | 0,350 | 0,250 | 15 ± 0,250 |
20 | 19,950 | 20,241 | 20,332 | 20,650 | 20,559 | 19,740 | 20,104 | 20,650 | 20,422 | 20,559 | 0,311 | 0,222 | 20 ± 0,222 |
25 | 22,742 | 22,697 | 21,969 | 22,242 | 22,742 | 22,515 | 22,560 | 21,969 | 22,742 | 22,378 | 0,306 | 0,219 | 25 ± 0,219 |
30 | 34,231 | 33,460 | 29,847 | 30,633 | 33,974 | 32,432 | 33,203 | 33,717 | 34,231 | 31,661 | 1,554 | 1,110 | 30 ± 1,110 |
35 | 9,114 | 34,488 | 37,058 | 38,086 | 38,086 | 38,857 | 37,829 | 35,516 | 36,544 | 38,343 | 1,489 | 1,064 | 35 ± 1,064 |
40 | 40,193 | 42,285 | 43,331 | 43,680 | 44,727 | 39,628 | 41,588 | 42,634 | 43,331 | 44,029 | 1,651 | 1,180 | 40 ± 1,180 |
45 | 46,819 | 47,866 | 48,214 | 42,634 | 44,727 | 46,470 | 47,168 | 47,866 | 47,168 | 44,029 | 1,869 | 1,336 | 45 ± 1,336 |
50 | 53,733 | 54,818 | 49,261 | 51,020 | 52,105 | 55,360 | 49,958 | 48,214 | 49,958 | 55,360 | 2,680 | 1,916 | 50 ± 1,916 |
55 | 55,903 | 58,073 | 59,158 | 52,648 | 54,818 | 56,445 | 59,158 | 52,105 | 51,563 | 54,818 | 2,799 | 2,001 | 55 ± 2,001 |
60 | 61,010 | 58,073 | 55,360 | 56,988 | 59,158 | 61,010 | 63,103 | 53,190 | 56,445 | 59,158 | 2,966 | 2,120 | 60 ± 2,120 |
65 | 66,590 | 64,498 | 54,818 | 67,288 | 62,405 | 63,800 | 67,288 | 67,985 | 61,010 | 63,103 | 3,958 | 2,828 | 65 ± 2,828 |
70 | 61,010 | 65,195 | 67,985 | 77,598 | 59,158 | 62,405 | 65,893 | 80,039 | 75,156 | 60,313 | 7,566 | 5,408 | 70 ± 5,408 |
75 | 69,381 | 89,805 | 59,701 | 65,195 | 67,288 | 70,273 | 60,313 | 65,195 | 69,381 | 80,039 | 9,105 | 6,507 | 75 ± 6,507 |
80 | 75,156 | 89,805 | 65,195 | 68,683 | 75,156 | 87,363 | 62,405 | 67,288 | 70,273 | 89,805 | 10,369 | 7,410 | 80 ± 7,410 |
Die Messung ergab, dass eine extrem hohe Messunsicherheit bei den Messwerten vorliegt. Bis 25 cm scheint die Messung sehr genau zu sein. Wenn die Distanz über 50 Zentimeter erreicht steigt auch die Messunsicherheit auf über +- 2 Zentimeter an. Das scheint die aussage des Herstellers zu unterstreichen, dass der Präzisionsbereich des Sensors bei 10 bis 40 Zentimetern liegt.
Um das Rauschen zu verringern wurde ein "Gleitender Mittelwert"-Filter auf die Sensorsignale des Infrarotsensors angewendet. Dieser soll den Mittelwert über den letzten 10 Messwerten bilden und so ein Rauschen dämpfen. Es besteht jedoch die Gefahr, das kleinere Werteänderungen durch diesen Filter ebenfalls abgeschwächt werden.
Im Folgenden ist die Messung nach der Filterung durch den "Gleitender Mittelwert"-Filter dargestellt:
Wahrer Wert (in cm) | Messungen in cm | Standardabweichung | Messunsicherheit | Vertrauensbereich | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ||||
10 | 10,007 | 9,988 | 9,958 | 9,920 | 9,935 | 9,931 | 9,916 | 9,867 | 9,829 | 9,852 | 0,058 | 0,041 | 10 ± 0,041 |
15 | 15,414 | 15,493 | 15,552 | 15,531 | 15,552 | 15,552 | 15,642 | 15,621 | 15,663 | 15,684 | 0,083 | 0,059 | 15 ± 0,059 |
20 | 20,511 | 20,450 | 20,380 | 20,296 | 20,207 | 20,114 | 20,058 | 19,987 | 19,908 | 19,810 | 0,237 | 0,169 | 20 ± 0,169 |
25 | 23,937 | 24,312 | 24,340 | 24,683 | 25,021 | 25,050 | 25,079 | 25,440 | 25,787 | 26,125 | 0,685 | 0,490 | 25 ± 0,490 |
30 | 32,124 | 31,995 | 31,790 | 31,558 | 31,661 | 31,635 | 31,533 | 31,353 | 31,122 | 31,147 | 0,329 | 0,235 | 30 ± 0,235 |
35 | 38,420 | 38,317 | 37,983 | 37,726 | 37,418 | 37,521 | 37,186 | 37,007 | 36,775 | 36,544 | 0,631 | 0,451 | 35 ± 0,451 |
40 | 43,122 | 42,913 | 42,669 | 42,320 | 41,902 | 41,867 | 41,727 | 41,518 | 41,134 | 41,239 | 0,690 | 0,493 | 40 ± 0,493 |
45 | 48,547 | 48,303 | 47,989 | 47,640 | 47,115 | 47,080 | 46,871 | 46,592 | 46,122 | 45,773 | 0,916 | 0,654 | 45 ± 0,654 |
50 | 48,688 | 49,054 | 49,315 | 49,471 | 49,417 | 49,678 | 50,114 | 50,410 | 50,356 | 50,477 | 0,618 | 0,441 | 50 ± 0,441 |
55 | 56,391 | 56,174 | 55,903 | 55,577 | 55,414 | 55,469 | 55,143 | 54,655 | 54,329 | 53,733 | 0,835 | 0,597 | 55 ± 0,597 |
60 | 60,751 | 60,696 | 60,093 | 59,559 | 59,993 | 60,101 | 59,567 | 59,312 | 58,778 | 59,158 | 0,644 | 0,460 | 60 ± 0,460 |
65 | 65,533 | 64,955 | 65,095 | 64,955 | 64,955 | 64,378 | 64,796 | 64,936 | 65,075 | 64,498 | 0,320 | 0,229 | 65 ± 0,229 |
70 | 73,707 | 72,397 | 72,064 | 70,754 | 71,312 | 70,246 | 70,246 | 69,668 | 70,691 | 69,381 | 1,341 | 0,958 | 70 ±0,958 |
75 | 72,148 | 72,935 | 73,583 | 74,071 | 74,997 | 74,753 | 75,400 | 75,645 | 75,645 | 75,156 | 1,208 | 0,863 | 75 ± 0,863 |
80 | 79,178 | 78,202 | 76,737 | 78,640 | 78,884 | 78,152 | 76,931 | 78,345 | 79,551 | 80,039 | 1,048 | 0,749 | 80 ± 0,749 |
Das Ergebnis der Messung zeigt ein klar besseres Ergebnis. Die Messunsicherheiten überschreiten bei keiner Distanz einen Zentimeter. Damit ist eine enorme Verbesserung des Wahrheitsgehaltes der Messung mit dem Sharp Infrarotsensor möglich.
Abbildung 8 zeigt eine Beispielhaft aufgezeichnete Messkurve. Der Zeitpunkt 0 beschreibt dabei den aktuellen Zeitpunkt, die weiteren Zeitangaben beschreiben wie weit die Messugen in der Vergangenheit liegen.
Bei der Darstellung der Messwerte im Graphen zeigt sich, dass sich der gleitende Mittelwert träger verhält als die unverarbeiteten Sensorsignale und er so dem rauschenden Wert hinterher läuft.
Ausblick:
- Es besteht die Möglichkeit die Lookup-Tabelle durch eigene Referenzmessungen noch genauer an die Wahren werte anzupassen um so die Umrechnung der Signale schon möglichst genau durchführen zu können
- Des weiteren besteht Verbesserungs Potential in der Auswahl eines anderen Filters, welche möglicherweise weniger träge ist und eine gleiche oder sogar bessere glättungs Wirkung hat
YouTube Video
Das YouTube Video als visueller Beleg findet sich unter folgendem Link:
Infrarotsensor DIST-Nx-v3 Sensorwerte mit Arduino UNO an MATLAB übertragen
Quellenverweise
- ↑ http://www.mindsensors.com/92-thickbox_default/high-precision-medium-range-infrared-distance-sensor-for-nxt-or-ev3.jpg] Abgerufen am 02.07.2018
- ↑ http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf] Seite 2, Abgerufen am 25.05.2018
- ↑ http://www.breadboarding.de/wp-content/gallery/sharp-2y0a21/triangulation.jpg] Abgerufen am 03.07.2018
- ↑ http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf] Seite 5, Abgerufen am 25.05.2018
- ↑ http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf] Seite 2, Abgerufen am 25.05.2018
- ↑ http://extras.springer.com/2005/978-3-540-20942-3/MRT/mrt-html/pict/B70404.gif] Abgerufen am 02.07.2018
→ zurück zum Hauptartikel: Signalverarbeitende Systeme