HiTechnics EOPD mit Matlab/Simulink
!!Diese Seite befindet sich im Aufbau!!
Signalverarbeitungskette eines HiTechnic EOPD Sensors und auslesen in MATLAB/Simulink
Autor: Tim Kempe
Einleitung
Dieser Artikel befasst sich im Rahmen der Lehrveranstalltung mit dem HiTechnic EOPD Sensor. Dazu wird der Sensor an sich und die Signalverarbeitungskette beschrieben. Am Anschluss wird gezeigt, wie die Sensordaten ausgelesen und in Matlab Simulink bereit gestellt werden können.
Sensor und Signalverarbeitungskette
In diesem Abschnitt wird der elektro optische Nährungssensor (engl. Electro Optical Proximity Detector)(kurz EOPD) beschrieben und die Signalverarbeitungskette erläutert.
Wie funktioniert der Sensor
Der EOPD emittiert über eine integrierte LED infrarote Strahlung. Durch die auf den photoelektrischen Sensor einfallende Lichtmenge kann indirekt auf die Distanz zwischen Objekt und Sensor geschlossen werden. Der EOPD schickt infrarote Strahlung mit einer Frequenz raus. Dies hat zur Folge, dass externe infrarote Quellen keinen Einfluss auf die Messung haben. Des Weiteren haben die EOPD unterschiedliche interne Frequenzen und können sich somit nicht gegenseitig stören. Zu beachten ist, dass ein EOPD je nach Beschaffenheit der Oberfläche des reflektierenden Objektes, eine andere Lichtmenge misst. So misst der Sensor bei einer glatten Oberfläche mehr Licht als bei einer rauen. Dies führt zu einen Fehler bei der Abstandsmessung. Außerdem ist bei einer weißen Oberfläche der gemessene Abstand niedriger als bei einer schwarzen. Dies muss bei der Messung mit EOPD berücksichtigt werden. Der HiTechnics EOPD kann mit dieser Messmethode Objekte in einer Distanz von bis zu 20 cm detektieren. Aus der Beschreibung des Sensorherstellers geht außerdem hervor, dass der EOPD in zwei Betriebsmodi betrieben werden kann. Zum einem im Modus zum messen von kurzen Distanzen und zum andern im Modus zum messen von weiten Distanzen.[2]
Welche Rohsignale liefert der Sensor?
Das auf den photoelektrischen Sensor einfallende Licht führt ja nach Lichtmenge zu einer elektrischen Spannung. Über die genauen internen Komponenten des HiTechnic EOPD sind keine Informationen vorhanden. Eine Recherche zeigt, dass eine photoelektischer Sensor ohnen Verstärkerschaltung eine Spannung von bis zu 6 V erzeugen kann. Daher wird davon ausgegangen, dass der photoelektische Sensor des EOPD als Rohwert direkt eine Spannung von 0 V bis 5 V erzeugt. Der Zusammenhang zwischen elektrischer Spannung um Abstand wird im folgenden beschrieben. Diese Zusammenhänge stammen aus der Beschreibung der .
Nun ist bekannt, dass der photoelektische Sensor des EOPD eine elektische Spannung liefert, welche mit dem Abstand in Abhängigkeit steht. Der EOPD hat außerdem die Möglichkeit die elektische Spannung digitalisiert als Rohwert zu übertragen.
Daraus geht hervor, dass die Rohwerte quadratisch zum Abstand abnehmen:
(1)
Außerdem ist dies noch mit einen Saklierungsfaktor versehen.
Stellt man die Gleichung (1) nach dem Abstand um, so ergibt sich:
(2)
Aus der Sensorbeschreibung ergibt sich für den Skalierungsfaktor:
(3)
XXX
Signalvorverarbeitung
XX
Analog-Digital-Umsetzer
Ziel von diesem Projekt soll sein, die analoge Spannung des EOPD mit einem analogen Eingang des Arduino zu messen und zu digitalisieren. Daher wird in folgeden die Funktion des Analog-Digital-Umsetzers (ADC) beschrieben.
Auf dem Arduino Uno ist ein ATMEGA328P-PU verbaut. Aus dem Datenblatt des Microcontrollers geht hervor, dass 10-Bit ADC´s verbaut sind. Diese ADC´s arbeiten mit dem Prinzip der sukzessiven Approximation. Dabei wird das zu messende Signal, hier die Spannung des EOPD, schrittweise durch Vergleich digitalisiert. Vergleicht wird mit einer Referenzspannung, welche genauso viele Bit hat wie der verbaute ADC. Im rechten Bild ist die Vorgehensweise über die Zeit dargestellt. Im ersten Schritt wird das höherwertigste Bit (repräsentiert 2,5 V) der Referenzspannung eingestellt. Stellt ein Vergleicher fest, dass die Referenzspannung höher ist als das zu messende Signal, so wird dieses Bit wieder deaktiviert. Danach folgt das zweite Bit (repräsentiert 1,25 V). Ist auch dann die Referenzspannung höher als die Spannung am analogen Eingang, so wird dieses Bit auch wieder deaktiviert. Danach folgt das dritte Bit (repräsentiert 1,25 V). Ist die Referenzspannung niedriger, so bleiben das Bit und somit auch die Spannung eingeschaltet und es wird das nächste Bit und somit auch dessen Spannung eingeschaltet und auf die vorherige Referenzspannung addiert. Dies wird so lange wiederholt, bis alle 10 Bit durchlaufen sind. Die eingeschalteten und ausgeschalteten Referenzspannungen repräsentieren dann den digitalisierten Wert des analogen Eingangs.[4]
Vorteile von diesem ADC sind, dass eine Umsetzung in einen digitalen Wert relative schnell erfolgt. Laut Datenblatt in 13 - 260 μs. Es gibt natürlich auch schnellere ADC´s wie z.B. ein paralleler ADC, welche die Digitalisierung im einen Schritt durchführen. Allerdings benötigen diese auch deutlich mehr Chipfläche und sind komplexer. Parallele ADC´s sind für Abtastraten im GHZ Bereich gedacht. Allerdings ist der verwendetet ADC schneller als ein Single-Slope-Umsetzer. Dieser Umsetzer arbeitet mit einem Rampenverfahren und vergleicht dem Eingang mit dem Rampenwert. Nachteil ist, dass ein Umsetzung in einen digitalen Wert relative langsam ist und von der Höhe des zu messenden Wertes abhängig ist. [5]
Auf dem Markt gibt es noch eine Vielzahl weiterer ADC. Auf diese wird im Rahmen dieses Projektes nicht weiter eingegangen.
Bussystem
Da sich im Rahmen dieser Arbeit dazu entschieden wurde, den analogen Wert vom Sensor mit dem analogen Eingang des Arduino Uno zu verbinden, werden so keine Informationen über einen Bus übertragen. Zwischen ADC des Arduino Uno und der CPU ist zwar ein 8 Bit Datenbus, allerdings sind im Datenblatt für den ATMEGA328P-PU keine Infomationen zu dem verwendeten Bus vorhanden.
Digitale Signalverarbeitung
Eine Erfassung der Messdaten des EOPD erfolgt mit dem analogen Eingang des Arduino Uno. Der EOPD misst die einfallende Lichtmenge und wandelt diese mit einem photoelektrischen Sensor in eine Spannung um. Diese Spannung steht in Abhängigkeit zur Distanz zwischen EOPD und Objekt. Gemessen wird diese Spannung mit dem 10 Bit ADC von Arduino Uno. Wird ein Signal, welches in einem Bereich von 0 V bis 5 V digitalisiert, so hat das Signal eine maximale Auflösung von
(4)
Die folgende Tabelle zeigt zum einen die Spannungen des EOPD zu unterschiedlichen Distanzen, welche mit dem Arduino Uno gemessen wurden und zum anderen den Mittelwert sowie die Standardabweichung zu der gemessenden Distanz.
Distanz / cm | Messwert / V | Mittelwert / V | Standardabweichung / mV | ||||
---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | |||
2 | 1,915934 | 1,915934 | 1,915934 | 1,915934 | 1,915934 | 1,915934 | 0,0 |
3 | 2,737048 | 2,737048 | 2,732160 | 2,732160 | 2,737048 | 2,735093 | 2,68 |
4 | 3,396872 | 3,396872 | 3,401760 | 3,391984 | 3,401760 | 3,397850 | 4,09 |
5 | 3,768328 | 3,768328 | 3,768328 | 3,753666 | 3,763441 | 3,764418 | 6,37 |
6 | 4,017595 | 4,017595 | 4,017595 | 4,012708 | 4,022483 | 4,017595 | 3,46 |
8 | 4,345064 | 4,345064 | 4,349951 | 4,345064 | 4,349951 | 4,347019 | 2,68 |
10 | 4,501466 | 4,506354 | 4,506354 | 4,506354 | 4,506354 | 4,505376 | 2,19 |
12 | 4,613881 | 4,608993 | 4,613881 | 4,608993 | 4,608993 | 4,610948 | 2,68 |
14 | 4,696970 | 4,687195 | 4,696970 | 4,696970 | 4,696970 | 4,695015 | 4,37 |
16 | 4,750733 | 4,745846 | 4,750733 | 4,750733 | 4,755621 | 4,750733 | 3,46 |
18 | 4,789834 | 4,794721 | 4,789834 | 4,789834 | 4,794721 | 4,791789 | 2,68 |
20 | 4,824047 | 4,828935 | 4,819159 | 4,824047 | 4,824047 | 4,824047 | 3,46 |
Darstellung der Ergebnisse
xx
Messdaten nach MATLAB/Simulink
Um die Messdaten nach MATLAB/Simulink zu übertragen und dort zu verwenden gibt es unterschiedlichste möglichkeiten. Zu Beginn wird versucht die Messdaten über den analogen Port des Sensors mittels Arduino auszulesen und an MATLAB/Simulink zu übertragen. Dazu wird in der folgenden Tabelle der Belegungsplan des Sensorsteckers gezeigt. Diese Information wurde aus dem Lego Mindstorms EV3 Hardware Developer Kit entnommen.
Pin | Farbe | Eigenschaft |
---|---|---|
1 | weiß | ADC@5 V ref, 9V mit Vorwiderstand |
2 | schwarz | GPIO, Auto ID |
3 | rot | Masse |
4 | grün | Versorgung 5 V |
5 | gelb | Digital I/O, SCL (I2C), UART RX |
6 | blau | Digital I/O, SDA (I2C), ADC@5 V ref, UART RX |
Über Arduino
Die Idee ist es, den analogen Port des EOPD Sensors mit einem der analogen Eingänge von Arduino Unoauszulesen. Um dies zu realisieren wurde eine Schaltung nach dem im rechten Bild gezeigt Schema aufgebaut. Dabei ist der analoge Ausgang des EOPD Sensors am Analogen Eingang A0 des Arduinos angeschlossen. Mit dem folgenden Programmcode kann sich der Wert des EOPD Sensors am seriellen Monitor angezeigt werden.
int sensorPin = A0; // Analogen Port 0
int value=0; // Wert auf 0 setzen
void setup() {
Serial.begin(115200); // Serielle Kommunikation aktivieren
Serial.println(Serielle Kommunikation gestartet);
}
void loop() {
value = analogRead(A0); // Spannung an analogen Eingang messen
Serial.println(value); // Rohwert über seriellen Monitor ausgaben
delay(500); // 500 ms Warten
}
Im seriellen Monitor ist zu sehen, dass die gemessenen Rohwerte, beim testen von Abständen zwischen 0 cm und 20 cm, im Bereich von 6 bis 8 pendeln. (Bild folgt) Diese Messwerte erscheinen unplausibel. Nach Recherche kommt die Erkenntnis, das der Sensor zuerst in einen geeigneten Modus gesetzt werden muss um einen analogen Wert zu erhalten. Daher ist dieser Ansatz nicht so realisierbar wie gedacht. Daher wird im folgenden versucht den Sensorwert über den EV3 auszulesen.
Über EV3
Im Folgenden wird die Möglichkeit beschrieben, den EOPD Sensor über einen Lego Mindstorms EV3 auszulesen.
Zum Anzeigen der Sensorwerte wird ein MATLAB/Simulink Demo Modell aus dem SVN Ordner der Veranstalltung Signalverarbeitende Systeme genommen [7]. Vorgegangen werden kann wie im Artikel EV3 mit Simulink beschrieben. Ergebniss ist, dass der EV3 die Rohwerte und den Abstand in cm zum Objekt anzeigt. Wie in der Abbildung rechts zu sehen. Allerdings kann das Programm, zum Auslesen des Sensors mit dem EV3, nur von Simulink übertragen werden. Im Matlab/Simulink stehen die Informationen nicht zur Verfügung. Vorteil ist, dass der Modus des Sensors geändert wurde. Daher ist die Überlegung, den Sensor über den EV3 in den richtigen Modus zu setzen um über dem Arduino mit Matlab auszulesen. Dies wird im folgenden beschrieben.
EV3 und Arduino
Die Idee ist, den Sensor mit dem EV3 in dem richtigen Betriebsmodus zu setzen und dann mit dem Arduino und dem Matlab Support Pckage für Arduino Hardware die Verbindung zu Matlab herzustellen. Die Vorgehensweise dabei wird im weiteren beschrieben.
Der Sensor wirde wie im Abschnitt Über EV3 angeschlossen und konfiguriert. Der Arduino wird wie im Anschlussplan auf der rechten Seite zu sehen an den Sensor bzw. dem Sensorkabel abgeschlossen. So sind sowohl der EV3 als auch der Arduino mit dem Sensor verbunden. Über den Pin 1, die weiße Ader des Sensorkabels, kann nun mit dem Arduino und Matlab der analoge Wert ausgelesen werden. Durch den ADC des Arduino wird die gemessene Distanz in eine Spannung von 0 bis 5 V digitalisiert. Dieser Wert wird mit Matlab ausgelesen und weiterverarbeitet. Dazu muss das Matlab Support Pckage für Arduino Hardware installiert sein. Zum Auslesen, Filtern und Darstellen des Sensorwertes in Echtzeit wurde das im folgenden abgebildete Matlab Programm geschrieben. Als Filter wird ein gleitender Mittelwertsfilter verwendet. Der Code dazu kommt aus dem SVN Ordner der Veranstalltung Moderne Tracking Systeme [8].
MATLAB CODE EINFÜGEN
Literaturverzeichnis
- ↑ HiTechnic EOPD Sensor Generation Robots
- ↑ HiTechnic EOPD Sensor HiTechnic NXT EOPD
- ↑ Angewandte Mikroelektronik vias.org
- ↑ ATMEGA328P-PU
- ↑ Wikipedia ADC
- ↑ Fritzing Foto
- ↑ EOPD_Demo von Prof. Schneider https://svn.hshl.de/svn/BSE_SigSys/trunk/SRC/Demos/EV3_HiTechnic_EOPD/
- ↑ Filter gleitender Mittelwert von Prof. Schneider https://svn.hshl.de/svn/BSE_Moderne_Trackingsysteme/trunk/Demos/GleitenderMittelwert/
→ zurück zum Hauptartikel: SigSys SoSe2018