HiTechnics Kompass mit Matlab/Simulink

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Sensor: HiTechnic NXT Compass Sensor

Autor: Andre Adämmer

Dozent: Prof. Dr.-Ing. Ulrich Schneider


Einleitung

Dieser Wiki-Eintrag stellt die semesterbegleitende Prüfung des Faches Signalverarbeitende Systeme SS 18 dar. Es gilt den oben genannten Sensor über Matlab/Simulink auszulesen, und die Signalverarbeitungskette dabei zu untersuchen, zu beschreiben und zu verstehen. Dazu werden folgende Fragestellungen über den oben genannten Sensor beantwortet:

  1. Auswahl eines Primärsensors
    1. Wie funktioniert der Sensor?
    2. Welche Rohsignale liefert der Sensor?
  2. Signalvorverarbeitung
    1. Sollen Messwerte oder vorverarbeitete Daten übertragen werden?
    2. Wie lässt sich eine Vorverarbeitung umsetzen?
    3. Wird eine Kennlinie eingesetzt? Wenn ja, wie wird diese kalibriert?
  3. Analog-Digital-Umsetzer
    1. Wie werden die analogen Signale umgesetzt?
    2. Welcher ADU kommt zum Einsatz?
    3. Welche Gründe sprechen für diesen ADU? Alternativen?
  4. Bussystem
    1. Wird ein Bussystem zwischen Sensor und Mikrocontroller eingesetzt?
    2. Wenn ja, wie funktioniert dieses Bussystem?
  5. Digitale Signalverarbeitung
    1. Welche Verarbeitungsschritte sind notwendig?
    2. Welche Filter werden angewendet?
    3. Bestimmen Sie Auflösung, Empfindlichkeit und Messunsicherheit des Sensors.
  6. Darstellung der Ergebnisse
    1. Welche Fehler treten in welchem Verarbeitungsschritt auf?
    2. Stellen Sie die Messunsicherheit bzw. das Vertrauensintervall dar.

Lernziele und Projektplanung

Lernziele und Motivation

Lernziele und Motivation sind dementsprechend die Signalverarbeitungskette zu verstehen und Fehleranalysen betreiben zu können. Außerdem wird die Hardware-Komponente, das heißt, wie kann ich einen Sensor anschließen ersichtlich. Des weiteren soll deutlich werden, wann und aus welchen Gründen Filter für die Bearbeitung der Signale, ob analog oder digital, zum Einsatz kommen, beziehungsweise zum Einsatz kommen müssen, da möglicherweise die Signale ohne Filter für eine entsprechende Anwendung nicht brauchbar sind.

Projektplanung

Die Projektplanung habe ich mit Hilfe einer fortlaufend geführten Exceltabelle realisiert, welche ich bereits für ein anderes Projekt im Fach Systems Design Engieering genutzt habe. Prof. Dr. Göbel hat dabei den Umgang mit so einer Art der Projektführung erläutert. Zunächst einmal werden dabei bestimmte Tage festgelegt, an welchen man was machen will. Wenn ein Arbeitsschritt vollzogen worden ist, wird das sogenannte Protokolldatum eingestellt und gleichzeitig werden Maßnahmen, Lösungswege und Kommentare in die entsprechenden Zellen geschrieben. Unter Umständen werden dann neue Arbeitsschritte, beziehungsweise Arbeitspakete erstellt, und mit einem Einstelldatum versehen. Da keine spezielle Software, wie zum Beispiel MS Project verwendet werden muss, kann das "Project-Tracking" von nahezu jedem PC aus geschehen. Es ist somit ein einfacher und zugleich sehr effektiver Weg, um den Ablauf des Projekts für sich selber und für andere verfolgen zu können.

Kompass

Allgemein

Ein Kompass dient gemeinhin zur Orientierung bezüglich der Himmelsrichtung und damit zur Navigation. Der am häufigsten verwendte Kompass ist der Magentkompass, welcher mit Hilfe des Erdmagnetfelds die Festlegung der Nordrichtung vollzieht, durch welches hindurch die Ermittlung der anderen Himmelsrichtungen erfolgt. Die geographischen Pole und die Magentpole sind in etwa in einer ähnlichen Lage, weshalb die Ausrichtung der Magnetnadel genutzt werden kann. Elektrische Kompasse nutzen ebenfalls diesen terristischen Effekt, jedoch erfolgt die Bestimmung, also die Messung des Magnetfeldes über den sogenannten Hall-Effekt. Die elektrische Messung ist um eingies genauer als die des Magnetkompass, ist dafür aber auch Störanfällig in der Umgebung von Erzeugen von elektromagnetischen Strahlungen.[1]

HiTechnics Compass

Abb. 1: HiTechnic NXT Compass Sensor[2]

Der Sensor: HiTechnic NXT Compass Sensor ist für die verbesserte Navigation eines Mindstroms NXT Projektes gedacht. Dabei misst der Sensor magnetische Signale, um festzustellen, in welcher Richtung sich Norden befindet. Dabei sind im NXT-Brick Monitor bereits Werte von 0-359 zu lesen. Beispielsweise wird er beim "NXT-robotsoocer" dafür genutzt, um das gegnerische Tor ausfindig zu machen.[2] Wie das genau funktioniert, das heißt wie aus der Detektierung ein Wertebereich von 1-360 Grad entsteht, wird in den nächsten Abschnitten beschrieben, so, auf ebendiese Weise, dass die oben aufgelisteten Fragen beantwortet werden.

Auswahl eines Primärsensors

Funktionsweise des Sensors

Über den HiTechnis NXT Compass sind leider keine akademisch hochwertigen Datenblätter zu finden. Wie oben bereits beschrieben liefert der Sensor Werte von 0-359. Da es sich um einen digitalen Sensor handelt, wird mittels I2C Protokoll eine Verbindung zum Microcontroller hergestellt. Das kann über EV3, NXT oder wie hier später vorgestellt über ein Arduino-Microcontrollerboard realisiert werden. Der Sensor führt 100 Messungen in der Sekunde durch und sendet somit immer eine bestimmte Ausrichtung in der er sich befindet. Im Lesemodus übermittelt der Sensor Werte als I2C Protokoll. Ein weiterer Modus ermöglicht die Kalibrierung des Sensors. Laut HiTechnis ist dieser Modus nur dann wichtig, wenn der Aufbau des Roboters nicht verhindert, dass permanent störende Magnetfelder anderer Roboterbausteine den Sensor irritieren. Durch den Modus der Kalibrierung ist es möglich die Abweichungen des Sensor zu nullen, das heißt diese mit einem Offset beaufschlagen, so dass diese nicht mehr bei der Ermittlung des Erdmagnetfelds stören.[2]


Rohsignale des Sensors

Da der Sensor laut Hersteller über eine I2C Verbindung mit dem Microcontroller kommuniziert, heißt das, dass bereits eine Umwandlung von analogen Rohwerten und deren Digitalisierung im Sensor, also im Sensorgehäuse entsprechende Komponenten vorhanden sein müssen. Leider ist es mir nicht möglich gewesen diesbezüglich akademisch verwendbare Informationen, trotz mehrmaligen Anschreiben des Technischen Supports des Herstellers, herauszufinden. Über den oben genannten Sensor bleibt der innere Aufbau und die interne ADU Umwandlung unbekannt und wird an dieser Stelle mittels Rückschlüsse auf ähnlich funktioniernder Sensoren erläutert.

Abb. 2: Prinzip Fluxgate Kompass:Durch Veränderung eines angelegten Stroms an der Triebspule wird die Sättigung in der Sensorspule verändert.[3]

In der mobilen Robotik werden weitesgehend zwei Kompassprinzipien verwendet. Zum einen der sogenannte Halbleiterkompass (Fluxgate Compass) welcher die magnetische Feldstärke misst, indem die Stärke eines Elektromagneten gezielt geändert wird. Er besteht aus zwei Spulen. Einer Feld und einer Sensorspule, welche beide gemeinsam um einen Kern gewickelt werden. Dabei werden sich die Sättigungseigenschaften des Spulenkerns zunutze gemacht. Ein durchläassiger ungesättigter Spulenkern zieht magnetische Feldlinien hinsich hinein. Ein gesättigter Spulenkern hat keine Auswirkung auf die magnetischen Feldlinien. Andersherum kann man durch Abwechselung zwischen Sättigung und Entsättigung des Spulenkerns der Triebspule, also durch Wechseln der Stärke des angelegten Stroms einen unterschiedlichen magnetischen Fluss erzeugen, welcher dann unterschiedliche Spannungen in der Sensorspule induziert. Diese Spannung hängt dann vom magnetischen Feld ab, in welchem die Spulen gedreht werden. Um nun die Richtung für magnetisch Nord zu bestimmen, werden zwei Spulen orthogonal zueinander angeordnet. Der Winkel, der den jeweiligen Spulenstrom bestimmt, ergibt sich aus den beiden Spannungen (V1,V2), die in den beiden Sensorspulen gemessen werden. Der sich ändernde Winkel ist bei orthogonaler Anordunung über den Tangens beschreibbar.[3]


[3]


Ähnlich funktioniert der Hall-Effekt-Kompass. Dieser nutzt zwei zueinander angeordnete Hall-Sensoren, welche den Änderungswinkels zu den magnetischen Erdfeldlinien über die Änderung der magnetischen Flussdichte(B)der beiden Sensoren beschrieben. Das Prinzip beruht auf den Hall-Effekt,also das Auftreten einer elektrischen Spannung durch ein stromdurchflossenden Leiter, welcher sich in einem stationären Magnetfeld befindet.[3] An dieser Stelle wird lediglich noch der mathematische Zusammenhang beschrieben. Analog für die Winkeländerung des Fluxgate Kompasses gilt hier:


[3]

Signalvorverarbeitung

Um für den Roboter nützliche Werte bezüglich der Ausrichtung zu bekommen, müssen Signale eventuell aufbereitet werden, bevor sie digitalisiert werden. Durch äußere magnetische Felder verändert sich der Spannungsverlauf in der Spule des Fluxgate Kompasses. Dieser Spannungsverlauf muss nun aufbereitet werden, damit er schließlich digitalisiert werden kann. Wie genau das im HiTechnis NXT Compass Sensor vollzogen wird, ist nicht klar, da keine passende Literatur verfügbar ist.

Analog-Digital-Umsetzer

Ein Analog-Digital-Umwandler, kurz ADU oder ADC (engl. Analog-Digital-Converter)ist eine wesentliche Komponente, die in nahezu allen Messketten vorzufinden ist. Die Spannung, hier durch Hall-Sensoren oder Fluxgate Kompass, wird nach wahrscheinlicher Signalaufarbeitung in ein digitales Signal umgewandlet. Das alles, so viel steht fest, geschieht durch eingebaute Komponenten im Sensor.Der ADU liest Spannung zeit-und wertekontinuierlich ein, und wandelt dieses Signal in ein wertediskretes um. Die Umwandlung der Zeitdiskretisierung erfolgt über die Taktung des ADU und ist kein Vorgang als solches. Ein analoger Wertebereich wird somit digital. Die Auflösung bewegt sich von einem Bit im Falle des einfachen Komparators hinzu 24 Bit. Je kleiner die Auflösung desto größer der Quantisierungsfehler. Der Quantisirungsfehler ist Teil der binären Umwandlung und entsteht durch Rundungen der Werte. Dadurch kann die digitale Auflösung unter keinen Umständen, die der Analogen erreichen. Durch bestimmte Filter kann jedoch ein Art Informationsgewinn durch Prädiktion erlangt werden.[3] Bei iterativen Wandlern muss die Eingangsgröße über den Wandlungsvorgang konstant gehalten werden. Dafür werden 'Track and Hold' Schaltungen oder 'Sample and Hold' Schaltungen benötigt. Diese können das Eingangssignal einfrieren, solange der AD-Wandler läuft. Im Wesentlichen werden ein ADU- Wandler über Genauigkeit, Schnelligekeit, das heißt Frequenz der Abtastrate und Preis kategorisiert.[4]

Abb. 3: Blockschaltbild eines analogen Delta-Sigma-Modulators[5]


ADU im Kompass Sensor

Da nur sehr spärlich Informationen über den ADU, der sich im Sensor befindet vorhanden sind, wird an dieser Stelle eine Annahme getätigt. Digitale Sensoren, welche über I2C- oder SPI-Bus zu Microprozessoren kommunizieren, verwenden häufig eine interne Anlog-Digital-Umwandlung. Dieses wird in vielen Fällen über eine sogenannte Delta-Sigma-ADC Schaltung realisiert.Delta-Sigma-Wandler sind neben Flash-Wanlder, Rampen-Wandler und Sukzessiver-Approximations-Wanlder die meist eingesetzten Wandler. Ein Delta-Sigma-Modulator erzuegt ein bitserielles Signal, also einen Bitstrom und enthält einen Tiefpassfilter. Der Bitstrom stellt dabei immer den Mittelwert des Eingagnssignales dar. In Abbildung 3 ist zu erkennen, dass der Komparator letztlich entscheidet ob das integrierte Eingangssignal größer oder kleiner als ein vorgebener Schwellenwert ist, und dann ein passendes 1-Bit Signal ausgibt. Der Integrator ermöglicht eine beliebeige Auswahl des Schwellenwertes, integriert also Abweichung zwischen dem analogen Eingangssignal und dem wieder umgewandelten Signal aus dem Bitstrom. Der Bitstrom wird bereits im Sensor digital gefiltert. Mehr dazu im Kapitel Filteranwendung. Die Anzahl der Rückkopplung bestimmt die Ordunung eines Delta-Sigma-Wandlers, das heißt ein Wandler zweiter Ordunung besitzt anstelle einer Rückkopplung und eines Integrators, wie in Abbildung 3 zu sehen, zwei Rückkopplungen mit jeweils zwei Integraotren.Durch die Erhöhung der Ordung wird im wesentlichen die Frequenz des Rauschens höher. Diese Dynamikerhöhung verbessert unter Umständen genauere Ergebnisse des analogen Signals.Das Prinzip als solches liefert immer eine monotone Quantisierungskennlinie. [4][5] Für die Auflösung allgemein gilt:


Die Spannung, mit welcher der Arduino Uno angeschlossen worden ist, liegt zwischen 0 und 5 Volt. Die Spannung ist wie Eingangs beschrieben ein Zusammenhang zwischen den horizontalen Komponenten der magnetischen Erdfeldlininen und der induzierten Spannungen in der Sensorspule, so zumindest beim Funktionsprinzip eines Fluxgate-Kompasses. Wenn also ein 10 Bit ADC eingesetzt wird, bei Aufbau erster Ordunung der Delta-Sigma-Schaltung erhält man eine Auflösung von:

Für den Kompass, der lediglich Werte von 0-360 ausgeben kann, wäre eine Auflösung von 0,01389 V ausreichend.

Gründe für ein ADU/Alternativen

Wie oben bereits beschrieben ist bei hoher Auflösung der Quantisierungsfehler klein. Für den Einsatz in einem Kompass wird der Quantisierungsfehler bei mindestnotwendiger Auflösung keine große Verfälschung anrichten. Dadurch das der Mittelwert des Signals über den Integrator gebildet wird, ist die Messung hier störunanfällig. Die interne Filterung, und damit die Zeitverzögerung sind von Nachteil. Auch der Fakt, dass Bauteile, welche immer auch eine elektromagnetische Strahlung aufweisen, kann es sein, dass die eigentliche Sensorapparatur (Fluxgate- oder Hall-Effekt-Aufbau) beeinflusst wird. Alternativ eines Delta-Sigma-Wandlers können auch Sukzessive-Approximationswanlder in HiTechnis NXT Compass Sensoren eingesetzt werden. Die geringe Implementationsaufwand wäre vorteilhaft, genau so wie die Wandlungszeiten im µ-Sekunden Bereich. Auch die mittlere Genauigkeit würde der Navigationsgenauigkeit nur bedingt schaden. Ein Dual-Slope Verfahren ist auch denkbar. Bei diesem Verfahren wird ein Kondensator über die Eingangsspannung aufgeladen. Die Ladung des Kondensators ist genauso groß, wie die der Eingangsspannung. Bei Ablauf der Integrationszeit wird eine Gegenspannung an einen Integrator gelegt. Durch einen direkten zeitlichen Zusammenhang zwischen Spannung und Entladezeit. Durch eine Zähllogik, der sogenannten GLUE-Logik, bei der Taktimpulse während der Entladezeit an diese gesendet werden, kann dann die Zeit ermittelt werden, und somit schließlich auf den analogen Wert geschlossen werden. Hohe Wandlungszeiten, die daraus resultieren, sind nicht sachdienlich, dafür kann man aber hohe Genauigkeiten erreichen. [4][5]

Bussystem

Abb. 4: Verwendte Busverbindungen bei anschließen des Sensor über Arduino (Sensor-Arduino-PC)

Ein Bussystem ist Teil der Hardware und dient zur Kommunikation unterschiedlicher Komponentern, sowohl für rechnerinterne Komponenten als auch für Peripheriegeräte. Durch diese Verbindungen werden Informationen, in Form von Daten oder auch Datenmengen ausgetauscht. Der Datenaustausch erfolgt dabei nicht willkürlich sondern setzt eine spezielle Kommunikation voraus. Im Laufe der Zeit haben sich viele unterschiedliche Kommunikationsformen entwickelt. Für die Verbindung des Sensors entscheidend ist das I2C-Protokoll, und die serielle Schnittstelle USB. Genau genommen beschreibt I2C eine Komponentenkommunikation, USB eine Peripheriegerätekommunikation. Bedeutsame andere Systeme als Option zu I2C sind SPI (engl.Serial Peripheral Interface) und der One Wire Bus. Gleichwertigen Ersatz für USB Systeme sind beispielsweise der CAN(engl. Controller Area Network) oder der bereits seit den Neunzigern existierende PCI(engl.Peripheral Component Interconnect) Bus. Entscheidend für die Auswahl ist neben der Leistungsfähigkeit, die Funktionssicherheit und Erweiterbarkeit.[6][7] An dieser Stelle werden jetzt nur die im Projekt verwendeten Bussysteme beschrieben.



Abb. 5: Struktur der I2C Verbindung für Sensors und Arduino mit Pinbelegung über RJ12-Stecker

I2C (Sensor-Arduino)

Ein Bussystem dient wie bereits erwähnt zur Verbindung der Komponenten. In Abbidlung 4 ist die Verbindung des HiTechnic NXT Compass Sensores mit dem Arduino dargestellt, in Abbildung 5 ist die Verbindung als Prinzip über die I2C Schnittstelle des Arduino UNOs dargestellt. Bei dieser Art der Verbindung spricht man auch von einem Zweidrahtbussystem, da, wie der Name bereits verrät, die Komponenten über zwei Drähte miteinander verbunden sind. Die anderen beiden Drähte dienen lediglich der Spannungsversorgung und sind somit nicht Teil der Kommunikation. I2C ist eine von Philips entwickelte Erfindung und steht für Inter-Integrated Circuit, was zu Deutsch nichts anderes heißt als Interne integrierte Schaltung. Der I2C Bus besteht aus zwei Drähten, der SDA-Draht (engl. serial data) und des SCL-Drahtes (engl. serial clock). Der SDA sendet die eigentlichen Daten seriell,i.e in Serie, also nacheinander. Der SCL sendet die Taktimpulse. Der I2C-Bus arbeitet nach dem Master-Slave-Prinzip. Der Master, wie vermuten lässt, bestimmt den Takt auf der SCL-Leitung und erzeugt das Signal. Der Slave reagiert lediglich auf die Kommunikation des Masters. Beide Geräte können sowohl Master als auch Slave sein, jedoch verständlicherweise nicht zur gleichen Zeit. Die Pull-up Widerstände liegen hier bei 100 kOhm. Der Pull-up Widerstand zieht die Signale nur dann auf logisch LOW, wenn dies gewünscht ist. Ohne Pull-up Widerstände wären die I2C-Leitungen ständig auf falschen Niveaus, sodass die Teilnehmer der Kommunikation davon ausgehen, dass der Bus aktiv ist. Das System ist intakt, und kann nicht ordungsgemäß kommunizieren.[4][6][7] Der Bus überträgt also Daten und Takt über die beiden Leitungen, die "open-drain", das heißt, dass die Leitung nur low-aktiv betrieben werden kann, wenn die Leitung so weit runtergezogen wird, dass diese eine logische wird, betrieben werden. Alternativ kann sie auch offen gelassen werden. Andersherum gesagt, sind die I2C-Geräte nur dann in der Lage Daten zu transferieren, wenn die Pull-up Widerstände diese wieder in den logisch "High" Zustand versetzen. Dieses Prinzip gilt für andere digitale Kommunikationswege auch. Der Widerstand zieht die Leitung auf die Versorgungsspannung hoch, wenn kein anderes Gerät diese herunterzieht (Idee des geschlossenen Tasters/Schalters) und zusammen mit einer Kapazität, welche hier nicht ersichtlich ist, steuert er das zeitliche Verhalten der Signale. Durch das beschriebende Verhalten mit den jeweiligen Komponenten kommt es zur charakteristischen Zägezahnspannung.[8] Diese wurde mittels Ozilloskop für die SDA und SCL ermittelt (siehe Abbildung 6).

Abb. 6: I2C Spannungs-(Signal-)Verlauf mittels Oszilloskopes des I2C Busses mit SCL (gelb) und SDA (blau)

Die maximale Datenrate wird durch Endwiderstände und Leistungskapazitäten bestimmt (Geräte interne Komponenten). Standardmäßif ist die Leistungskapazität bei I2C bei etwa 400 pF (pico-Farad).[8]


Taktrate

Obig erwähnt bestimmt der Master bei der I2C-Kommunikation die Taktrate und damit auch die Geschwindigkeit der Datenübertragung. In der nachfolgenden Tabelle sind maximalen Taktraten für unterschiedliche Modifikationen im I2C-Bus angegeben.


Tabelle 1: Taktrate der jeweiligen Modi der I2C-Verbindung

Name des Modus Taktrate/-geschwindigkeit
Standard Mode 100 kbit/s
Fast Mode 400 kbit/s
Fast Mode Plus 1 Mbit/s
High Speed Mode 3,4 Mbit/s

[9]

Die Übertragungsrate wurde im Laufe der Jahre erhöht, weil sich die Anforderungen, beziehungsweise die Art der Daten, welche über den I2C-Bus transportiert werden, geändert hat. Von reinen Zustandsmeldungen eines Gerätes, hinzu Text und Bilder.[6][9] Für die Übertragung der Ausrichtung des Kompasses genügt der Standardmmode, welcher auch deshalb auch verwendet wird.

Taktstreckung

Wenn der Takt für den Slave zu kurz, das heißt, dass er die Daten nicht in der vorgegebenen Zeit senden kann, so muss der Takt verlängert werden (engl. Clock-Stretching), damit es zu keinem Datenverlust kommt. Das kann erreicht werden, wenn der Slave die SCL von sich aus auf logisch 0 hält. Somit kann er eine zu schnelle Adressierung, also ansprechen des Slaves durch den Master, entgehen. Eingie Master igonrieren diese Aktion und deshalb kann es zur fehlerhaften Übertragung von Daten kommen, oder zu gar keiner Übertragung. In den meisten Fällen ist das Verfahren jedoch so konfiguriert, dass der Slave die benötigt Zeit bekommt, folglich die SCL-Leitung unten halten darf.[7][8][9]

Taktsynchronisation

Damit der Takt nicht fortlaufend gestreckt werden muss, ist es sinnvoll der Takt vor Beginn des Datenaustausches zu synchronisieren, somit zu vereinheitlichen. Dafür wird eine "Wired-AND"-Verknüpfung genutzt. Diese logische UND-Schaltung der digitalen Einheiten benötigt meist keine externe Hardware. Durch eine fallende Flanke in der SCL-Leitung starten alle Slave-Geräte einen internen Zähler und setzen ihre SCL-Leitung auf LOW. Wenn der Zähler abgelaufen ist, wird die Leitung durch den Slave wieder auf HIGH gesetzt. Das macht jeder Slave. Erst wenn der Zähler des letzten Slaves die Leitung auf HIGH setzt schaltet das logische UND-Gatter durch. Bei der nächsten steigenden Taktflanke besteht kein Unterschied mehr zwischen den einzelnen Geräten und des Taktes des I2C-Busses. Dadurch wird ein synchroner Takt erstellt, welcher mit der LOW-Phase des Gerätes der längsten LOW-Phase und des Gerätes mit der kürzesten HIGH-Phase begrenzt wird.[8][9]

I2C-Protokoll

Nachdem grundlegende Eigenschaften, Einstellungen und Konfigurationen (Hardware und Software) des I2C-Busses dargestellt worden sind, wird an dieser Stelle ein einfacher bit-weiser Austausch erlätuert. Allgmein gibt es im I2C-Protokoll sieben Befehle: Init (von Initialisieren), Start, Stop, Senden, Empfangen, Acknowledge (hier ) Bestätigung) und No Acknowlege (hier: keine Bestätigung). Wenn Master und Slave festgelegt habe, wer Daten sendet und wer sie empfängt kann in der Regel ein serieller Datenaustausch stattfinden. Als Beispiel wird hier das Aktivieren eines Slaves, durch einen Master beschrieben. Angenommen der Slave hat eine Adresse von 00010111. Die ersten vier Bits sind herstellerseitig festgelegt. Die nächsten drei Bits sind Adresse nur für den einen Baustein und das letzte Bit beschreibt den Empfangs- oder Sendestatus des Bausteins, auch LSB (engl. Least Significant Bit) genannt. Damit der Master den Slave aktivieren kann muss er die Adresse hier die Beispieladresse 00010111 über den I2C-Bus senden. Wie oben gesagt befinden sich die Slaves im Ruhezustand mit SCL und SDA jeweils auf logisch 1. Durch Setzen der Leitung auf 0, erst SDA dann SDL werden die Slaves "aufgeweckt". Nun warten Sie, besser gesagt der eine Slave auf die Adresse. Gestartet wird mit dem höchstwertigen Bit, hier 0. Dazu muss die SDA Leitung nicht geöffnet werden, weil sie für "aufwecken" bereits auf 0 gelegt worden ist. Die SCL-Leitung wird dann auf 1 gelegt. Dadurch weiss der Slave jetzt, dass das erste Bit auf Leitung SDA gesendet wird und speichert dieses zwischen. Danach setzt der Master die Seriell Clock Leitung (SCL) wieder auf logisch 0. Der Master legt nun das zweit-höchstwertige Bit an die SDA. Dazu muss er den Schalter wieder nicht schließen, da die Leitung wie anfangs noch auf 0 liegt. Genau wie davor legt er die SCL von 0 auf 1, so dass der Slave mitbekommt, dass er das zweite Bit der Adresse empfängt. So wird auf für die restlichen Bits fortgefahren, bis die Adresse vollständig über den Bus übertragen worden ist. Nach Überprüfen der Adresse, um sicherzustellen, dass der Master auch den richtigen Slave angesprochen hat, kann der Slave bei Bestätigung (Acknowledge) eine 0 auf die SDA-Leitung legen. Der Master hatte derweil beide Leitungen wie der auf 1 gelegt. Wenn der Master dann die 0 erfährt, setzt er SCL auf 0, um so zu zeigen, dass er das Signal erhalten hat. Darauf hin zieht der Slave die Datenleitung SDA wieder auf 1. Dadurch kann der Master die Leitung für die eigentliche Datenübertragung nutzen. Nach der Datenübertragung kann der Master wieder den Stop-oder Init-Zustand(i.e beide Leitungen auf 1) hergestellen. Somit kann eine neuer Aktion, ansprechen weiterer Slaves, stattfinden.[7][8]

Hier wird lediglich ein Slave, der HiTechnic Sensor verwendet. Der Master ist die Arduino-Komponente. Wenn jetzt über EV3- oder NXT- Bricks mehrer Slaves verwendet werden, ist der I2C-Bus ein Möglichkeit, die Daten ordungsgemäß zu senden. Timing Diagramme stellen diese Kommunikation sehr anschaulich dar. In Abbildung 6 kann man nicht die Aktivierung eines Slaves, jedoch den Datenaustausch von Master und Slave, über die Spannungswerte der SCL- und SDA-Leitungen verfolgen.

Implementierung und Aufbau

Physikalischer Aufbau

Abb.7: Versuchsaufbau für die Verbindung des HiTechnic NXT Compass Sensor über Arduino mit Matlab/Simulink

Da es sich um einen digitalen Sensor handelt, der mittels I2C-Bus betrieben wird, ergibt sich der Aufbau wie im nebenstehenden Bild zu sehen ist. Da Arduino über die Möglichkeit verfügt mittels I2C-Protokoll zu kommunizieren, ergibt sich ein Aufbau, wie in Abbildung 4 und Abbildung 5 dargestellt ist. Der RJ-12-Stecker (Telekommunikationskabel), welches für den Gebrauch von Sensor zu NXT-Brick geeignet ist, musste lediglich abisoliert werden, damit man an die einzelnen Drähte an die SDA und SCL Pins, beziehungsweise an die Spannungsversorgung des Arduino Microcontrollerboards anschließen kann. Dabei gilt, wie in Abbildung 5 zu sehen ist, die entsprechende Pinbelegung.

Arduino

Zunächst ist der Sensor mittels der Arduino I2C-Scanner -Funktion auf die Möglichkeit eines Anschlusses geprüft worden. Der Standard-Code aus der Arduino-Bibliothek ist unten einmal aufgeführt. Nach Bestätigung der Möglichkeit einer I2C-Kommunikation ist eine I2C-Kommunikation hergestellt worden.

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}


[10]

Mit Hilfe der fertigen Wire-Bibliotheken kann ohne größeren Aufwand eine I2C-Verbindung zwischen HiTechnic NXT Compass Sensor und Arduino hergestellt werden. Zunächt werden im void setup die Wire-Bibliotheken aufgerufen und eine Testverbindung hergestellt. Die serielle Kommunikation wird bei einmaligen Durchlaufen initialisiert. Da durch die entsprechende Wire-Funktion bereits klar ist, dass eine I2C-Verbindung vorliegt, muss die Pinbelegung nicht händisch eingetragen werden, da das Arduinoboard nur eine I2C-Schnittstelle (1xSDA und 1xSCL) besitzt. In der void loop wird die wire-Funktion in einer unendlichen Schleife ausgeführt, also die I2C-Kommunikation durch ReadCompassSensor. Diese wird in der seriellen Monitor gespeichert, und kann dort in Echtzeit abgelesen werden, und über die Tastenkombination Strg+Shift+L wird das Signal im Arduino Serial Plotter über die Zeit dargestellt.

Editor: Andre Adämmer
Ersteller/Quelle:https://robosoccerbot.wordpress.com/3-add-sensors/hitechnic-compass-sensor/
Letzte Änderung:03.07.2018

int compassAddress = 0x01; //Information von I2C Scanner
int TestValue;  //Anlegen der Variable

void setup() {
  Serial.begin(9600); //Aufstellen des Seriellen Monitors

  // Hier wird eine I2C mit Hilfe einer Wire Bibliothek hergestellt
  //und eine Testverbindung hergestellt
  
  Wire.begin();  //I2C einschalten
  Wire.beginTransmission(compassAddress); //Kommunikation zwischen Sensor
  Wire.write(0x00); //leere Daten
  Wire.endTransmission(); //Kommunikation geschlossen
  while(Wire.available() > 0)
     Wire.read();
}

void loop() {   
  ReadCompassSensor();  //Aufruf der untenstehenden Funktion
  Serial.println(TestValue); //Ausgabe der Kompassrichtung
  delay(100); //Warte für bessere Übersicht im seriellen Monitor
}
  // Der untere Code benötigt 2 Byte für die Kommunikation speichert diese
  // in einen Wert von 0-359 unter TestValue 
void ReadCompassSensor(){
  //Arduino befehle wie es den Sensor anzusteuern gilt
  Wire.beginTransmission(compassAddress);
  Wire.write(0x44);
  Wire.endTransmission();
   Wire.requestFrom(compassAddress, 2); 
   while(Wire.available() < 2);
   byte lowbyte = Wire.read();  
   byte highbyte = Wire.read();
   TestValue = word(highbyte, lowbyte); 

}


Simulink/Matlab

Für die Simulinkverarbeitung ist nun lediglich das MATLAB Support Package for Arduino Hardware notwendig. Eine weitere Möglichkeit besteht mit Simulink und einer S-Funktion die Sensorwerte auszulesen. (Ansätze dazu im SVN Ordner). Die nachfolgende Fotogalerie zeigt die Ausführung, und die Einstellung der Blöcke mittels Support Package. Zunächst muss der I2C-Block aus der Bibliothek hinzugefügt werden, und die Adresse, sowie Registeradresse des Slaves muss angegeben werden. Zuvor muss in der Simulationkonfiguration des Simulinkmodells der COM (engl. Component Object Model), also der Anschluss, an welcher der Arduino zum PC verbunden ist, ausgewählt werden, genau so wie die Art des Microcontrollerboardes; hier ArduinoUNO. Die Laufzeit muss auf inf und external statt normal gestellt werden, damit die Verbindung auf das Board steht. Danach kann der Pfeil bereits auf den Scope, also auf die Ausgabe der Ergebnisse,nämlich der Richtung in welche der Sensor zeigt, über die Zeit ausgegeben werden. Die Einstellungen des Filters werden als solches im Kapitel der Digitalen Singalverarbeitung erklärt. Die Memory-Blöcke dienen zur Ausgabe des Sensorwertes auf den Floating Scope, sowie auf den Dashboard Scope.

Digitale Signalverarbeitung

Die Funktionsweise des Sensors ist unter bestimmten Annahmen bereits im Kapitel ADU beschrieben worden. Der Sensor, welcher einen integrierten ADU besitzt, in Form einer Delta Sigma-Simulation, besitzt gleichzeitig auch einen integrierten digitalen Filter. Die Filteranwendung im Simulink ist daher nicht mehr notwendig, wird aus Demonstrationgründen an nachfolgender Stelle aber erklärt.

Filteranwendung im Simulink

Obwohl der Filter eine interne Filterung besitzt, und es nicht zwangsläufig notwendig wäre, eine Filterung der erhaltenden Messwerte zu durchlaufen, wird hier aus prüfungstechnisch-bedingten Gründen die Filterung mittels Medianfilter erklärt. Bevor die Filterung der Messwerte, beziehungsweise der Filterblock im Simulink vor das Signal gezogen werden kann, muss ein Dataconversion-Block zwischengebaut werden. Die Integerwerte des I2C-Arduino-Blocks ermöglichen keine Filterung über den Filterblock. Daher werden diese mittels Konvertierung in double umgewandelt. Diese können dann e.g mittels Medianfilter verarbeitet werden (Siehe Abbildung 8 bis 12) Ein Medianfilter ist ein Rangordungsfilter und zählt zur Klasse der nichtlinearen Filtern. Hier wird der aktuelle Funktionswert durch den Mittelwert der Funktionswerte eines bestimmten Filters ersetzt. Die hier verwendete Fenstergröße beträgt 5. Der Medianfilter ordnet die Werte in der Fenstergröße und ersetzt den aktuellen Wert durch den Median der Fenstergröße, also der Wert der in der Mitte steht. Bei Beispielsweise sein die Werte im Fenster 1,1,3,4,4. Der Median ist 3, das heißt das der aktuelle Wert für den Wert 3 substituiert wird.[11] Die Anwendung des Medianfilter macht bei HiTechnisSensor nur wenig Auswirkung, da die Werte völlig Noise-frei, also ohne Rauschen übertragen werden.

Auflösung, Empfindlichkeit, Messunsicherheit und Vertrauensintervall

Abb.13:PAP der Übertragung der Werte des HiTechnic NXT Compass Sensors aus Arduino ins Simulinkmodell und Auslesen der Werte mittels Matlab mit gleichzeitiger Bestimmung von Mittelwert, Standardabweichung, Vertrauensfaktor der Student-t-Verteilung, Messunsicherheit und Vertrauensintervall

Die Auflösung, welche bereits innerhalb des Sensor Bedeutung erlangt, ist einige Kapitel zuvor beschrieben worden. Nun sollen mittels Matlab, die Messergebnisse, welche in Simulink gespeichert werden, beziehungsweise im Block Display oder Scope abzulesen sind, bewertet werden. Die Abbildung 13 zeigt den Programmablaufplan dazu. An dieser Stelle werden die entsprechenden Gesetzmäßigkeiten einmal aufgelistet, die verwendet worden sind.

Für die Berechnung des Mittelwertes des Messwerte gilt:


Die Standardabweichung der Messwerte, also der Stichprobe, als Wurzel der Varianz:


Der Vertrauensfaktor t(n) der Student-t-Verteilung wird hier für p=0,95 angenommen. Das heißt 95% der Werte liegen in diesem Bereich, wenn davon ausgegangen wird, dass die Schätzfunktion t-verteilt ist, beziehungsweise die Stichprobe normalverteilt. Es gilt:

Anstelle t(n) ist t(n-1) verwendet worden, weil die Anzahl der Freiheitsgerade bei der Art der Berechnung des Mittelwertes, durch den Referenzwert reduziert worden ist.

Darstellung der Ergebnisse

Der Referenzwert wurde mittels Magnetkompass bestimmt, welcher im YouTube Video zu sehen ist. Der digitale Kompass wurde auf ein DIN A4 Blatt, welches Einteilung in jeweils 1° Schritte enthält und durch den Magnetkompass pro Messung korrekt ausgelegt wurde, aufgestellt. Der Wert wurde im Simulink-Display für jede Messung abgelesen, da die "to Workspace"-Funktion immer einige Werte zu spät, beziehungsweise zu früh miteinbezogen hat. Wichtig zu wissen ist, dass jeweils immer ausreichend gewartet wurde, und möglich elektromagnetische Störquellen, wie Handy und Computer, so weit wie möglich beiseite geschafft wurden.


Tabelle 2: Ergebnisse der durchführten Messung für den HiTechnic NXT Compass Sensor

Messreihe mit n=12 Referenzwert Mittelwert der Messwerte Standardabweichung Messunischerheit Vertrauensintervall
1. 359° (Nord-1°) 359,3330° 0,6513° 0,3377° 359,3330° ±0,3377°
2. 180° (Süd) 180,2580° 0,7538° 0,3908° 180,2580° ±0,3908°
3. 90° (Ost) 90,1667° 0,9349° 0,4328° 359,3846° ±0,4328°
4. 45° (Nordost) 44,8333° 0,7177° 0,3712° 44,8333° ±0,3712°

Die Messung des Kompasses funktioniert sehr gut, solange man lange genug wartet und Störquellen, welche die horizontalen Linien des Erdmagnetfelds, die der Kompass für seine Messung benötigt, beeinflussen, fernhält. Deshalb liegt der Mittelwert der Messungen so genau am Referenzwert und ist die Standardabweichung so gering, genau wie die Messunsicherheit. Dadurch liegen die Werte im Vertrauensintervall nahe beisammen. Die Messeinrichtung ist leider sehr ungenau gewesen und zusätzlich war schwer den Kompass wegen seiner große Verschalung genau auszurichten.

Für eine statische Messung eignet sich dieser Kompass gut, bei Bewegung dauert es jedoch bis der Kompass die exakte Position erkennt, das heißt bis die interne Messeinrichtung mit Fluxgate-Prinzip oder Hall-Sensore den Einfluss der Erdmagnetfeldlinien korrekt weiterverarbeiten. Deshalb eignet sich der Kompass für Roboter nur zu groben Orientierung.

YouTube Video

HiTechnic NXT Compass Sensor mit Matlab/Simulink

Zusammenfassung

Diese semesterbegleitende Prüfung zum Fach Signalverarbeitende Systeme stellt dar, wie ein HiTechnic NXT Compass Sensor über Matlab/Simulink ausgelesen werden kann. Durch den ADU im Sensor und die intergrierte Filterung werden bereits unverauschte Signale übertragen. Die Messwerte, die über den I2C-Bus mittels Arduino und von Arduino über USB an Matlab/Simulink übertragen werden, eignen sich um eine Messwertanlyse durchzuführen. Durch die Messwertanlayse wird klar, dass die Beurteilung nur mittels hochwertiger Referenzmesseinrichtungen zur Bestimmung der Richtungswinkel wortwörtlich stichhaltig ist. Das Projekt, hinsichtlich Beantwortung der anfangs aufgelisteten Fragen, und damit verbundende Beantwortung auf physischer Stufe durch Anschließen des Sensors, sowie die Erklärung der verwendeten Komponenten und die systematische Vorgehensweise für die Verbindung mit Matlab/Simulink und das spätere Auswerten der Daten, liefert eine umfassende, wie in den Lernzielen zuvor formuliert, Möglichkeit die Stufen der Digitaltechnik, beziehungsweise vielmehr die der Signalverarbeitung kennenzulernen und anzuwenden.

Ausblick

Interessant wäre nun eine Verbindung des Sensors mit EV3 oder NXT der Verbindung mit Arduino gegenüberzustellen. Was geht vielleicht einfacher, was ist besser für die Qualität des Sensor, was macht der EV3 oder der NXT Mikroprozessor mit den Signalen. Interessant wäre auch den Sensor in Einzelteile zu zerlegen, um so den genauen Aufbau analysieren zu können, bezogen auf interne ADU und Filterung.

Ablage

Dokumentierung im SVN_Ordner mit allen verwendeten Unterlagen.

Literatur

  1. Funktionsweise von Kompassen. Abgerufen am 30. Juni 2018.
  2. 2,0 2,1 2,2 HiTechnic NXT Compass SensorAbgerufen am 30. Juni 2018. Referenzfehler: Ungültiges <ref>-Tag. Der Name „HiTechnic NXT Compass Sensor“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „HiTechnic NXT Compass Sensor“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert.
  3. 3,0 3,1 3,2 3,3 3,4 3,5 NEHMZOW,UlRICH:Digitale Robotik. Abgerufen am 1. Juli2018. Referenzfehler: Ungültiges <ref>-Tag. Der Name „NEHMZOW,UlRICH:Digitale Robotik“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert. Referenzfehler: Ungültiges <ref>-Tag. Der Name „NEHMZOW,UlRICH:Digitale Robotik“ wurde mehrere Male mit einem unterschiedlichen Inhalt definiert.
  4. 4,0 4,1 4,2 4,3 Prof. Dr. Schneider,Ulrich: Signalverarbeitende Systeme SoSe 2018 Analog-Digital-Umsetzer. Hochschule Hamm-Lippstadt.
  5. 5,0 5,1 5,2 Prinzip Delta-Sigma-ModulationAbgerufen am 02. Juli 2018.
  6. 6,0 6,1 6,2 Mikrorechner Technik: Busse, Speicher, Peripherie und MikrocontrollerAbgerufen am 03. Juli 2018.
  7. 7,0 7,1 7,2 7,3 Prof. Dr. Thümmler,Axel:Embedded Software Engineering SoSe 2018- Bussysteme. Hochschule Hamm-Lippstadt.
  8. 8,0 8,1 8,2 8,3 8,4 Funktionsweise I2CAbgerufen am 04. Juli 2018.
  9. 9,0 9,1 9,2 9,3 Schwerpunktseminar Systemtechnik :Die Zweidrahtbussysteme I²C-Bus und SPI-Bus:Eigenschaften, Protokolle, Anwendungen im Vergleich der beiden Systeme.September 2008.
  10. Arduino-Libraries. Abgerufen am 30.Mai 2018.
  11. Prof. Dr. Schneider,Ulrich: Signalverarbeitende Systeme SoSe 2018 Median Filter. Hochschule Hamm-Lippstadt.



→ zurück zum Hauptartikel: Signalverarbeitende Systeme