Infrarotsensor mit Matlab/Simulink

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen


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

Abb. 1: High Precision Medium Range Infrarotsensor für NXT und EV3[1]

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.

Abb. 2: Blockschaltbild des Infrarotsensors [2]
Abb. 3: Darstellung der Triangulation [3]
Abb. 4: Kennlinie des Infrarotsensors [4]
Abb. 5: Pin Belegung [5]

















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

Abb. 6: 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:

Abb. 7: Sukzessive Approximation [6]
  • 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


Abb. 8: Vergleich von ungefilterten und gefilterten Sensorsignalen

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


→ zurück zum Hauptartikel: Signalverarbeitende Systeme