IMU mit Matlab/Simulink: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Sensor: [https://www.dexterindustries.com/manual/imu-sensor/ dIMU]“)
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
--------
→ zurück zum Hauptartikel: [[SigSys SoSe2018]]
----
'''Autoren:'''  [[Benutzer:Sebastian_Dany| Sebastian Dany]]<br/>
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Dr. Ulrich Schneider]]
Sensor: [https://www.dexterindustries.com/manual/imu-sensor/ dIMU]
Sensor: [https://www.dexterindustries.com/manual/imu-sensor/ dIMU]
== Einleitung ==
Für die Semesterbegleitende Prüfung der Studierenden des Masterstudienganges "Business and Systems Engineering" im Teilmodul "Signalverarbeitende Systeme" im Modul "Systementwurf" wurden verschiedene Sensoren mit verschiedenen Komplexitätsgraden ausgegeben. Die Aufgabe bestand darin, diese Sensoren zu verstehen, zu beschreiben, auszulesen und zu kalibrieren.
== Primärsensor ==
Als Primärsensor dient der dIMU-Sensor der Firma Dexter Industries, welcher mittels den zwei eingebauten Sensoren die Rotationsbeschleunigung und die Beschleunigung in jede Raumrichtung ausgeben soll. Die verbauten Sensoren werden mit unterschiedlichen Adressen angesprochen und könn en mittels einem für LEGO modifizierten RJ11-Verbindungskabel mit einem NXT Baustein, oder einem EV3 Baustein verbunden und ausgelesen werden. Alternativ ist es auch mit einem Arduino möglich, den Sensor auszulesen. Dazu muss der Baustein oder der Arduino (Master) Daten über I2C oder SPI vom Sensor (Slave) anfordern. Dieser liefert dann nach Abschluss der Anfrage des Masters die Daten.
Beide Sensoren bauen auf demselben physikalischen Prinzip auf, nämlich der Massenträgheit und der Veränderung der Kapazität bei Abstandsänderung der Kondensatoroberflächen. Der Temperatursensor, der in beiden Sensormodulen verbaut ist, ist ein Silizium-Messwiderstand, welcher im Bereich von -40 °C bis +85 °C einsetzbar ist.
Das Accelerometer (Adresse: 0x1D) sollte laut Datenblatt nicht mit über 3,6 Volt versorgt werden. Die auf der Platine gesetzten Widerstände schützen den Sensor vor den normalerweise bei dem Kabel anliegenden 4,3 V mit 20 mA.
Der Gyrosensor und das Accelerometer geben je nach Typ, unterschiedliche Bitlängen an Daten aus:
Beim Gyrosensor (Adresse: 0x69) liegen die Beschleunigungsausgaben als Rotationsbeschleunigung um die drei Raumachsen bei 16-Bit-Werten und bei dem eingebauten Temperatursensor bei maximal 8-Bit-Werten. Alle Werte werden in das Register geschrieben. Das Gerät kann in der Sensitivität auf +-250/+-500/+-2000 dps (degres per second) gesetzt werden, die Auflösung wird damit feiner. Bei der Initialisierung kalibriert der Gyrosensor Offset und Gain nach Datenblatt selbstständig und ist in der Lage die Daten mit verschiedenen Filtern zu verarbeiten. Eine Kalibrierung des Gyrosensors wurde dennoch nicht festgestellt.
[[Bild:Accelerometer-Register-Summ.gif]]
[[Bild:Gyroscope-Register-Summary.gif]]
Das Accelerometer misst die Beschleunigung entlang der drei Raumachsen und speichert diese als 16-Bit Wert im Register ab. Dabei wird angegeben, dass die Ausgabewerte in der Einheit mG (ein tausendstel der Erdbeschleunigung) abgespeichert werden. Der Temperatursensor beschreibt das Register ebenfalls mit 8-Bit.
Beide Temperatursensoren arbeiten mit einer Frequenz von 1 Hz und sind mit einem Offset behaftet. Die Daten entsprechen dem Temperaturunterschied zwischen Messzeitpunkt und initialisierung in °C. Beide Sensoren lesen die Messwerte nacheinander aus, damit sind sie minimal Zeitversetzt. Der Gyrosensor meldet eine Wertänderung durch Änderung des Registereintrages (Status_REG, Bit 7) an, sodass nicht immer alle Register ausgelesen werden müssen.
Auf dem Arduino werden die Daten durch einen rekursiven Mittelwertfilter geglättet und an die Ausgabe übergeben!
== Analog-Digital-Umsetzer (DAU) ==
Der in den Sensoren verwendete DAU lässt sich im Datenblatt nicht ermitteln. Aufgrund von hohen Aktualisierungsraten und geringer Bitlänge der Daten (maximal 16-Bit beim Accelerometer) ist die Realisierung eines Parallelumsetzers wahrscheinlich. Die Kosten für diesen Umsetzer halten sich im Rahmen, da maximal 8 Bitstufen in zwei Stufen, nacheinander ausgelesen werden. Der Sensor benötigt daher 30 Komparatoren für einen zweistufigen Acht-Bit-Umsetzer, wohingegen der Flash-Umsetzer 255 benötigt. Dabei werden die Daten nacheinander in den Umsetzer geladen und nacheinander in die Register geschrieben. Der Pipeline-Umsetzer bietet eine günstige Alternative zu Flash-Umsetzern. Eine Realisierung mit einem Flash-Umsetzer hätte dagegen den Vorteil, dass die Daten mit einer schnelleren Taktung gewandelt werden könnten.
[[Bild:einordnung-von-a-d-wandlern-nach-der-abtastrate-und-der-aufloesung.png
[[https://www.itwissen.info/lex-images/einordnung-von-a-d-wandlern-nach-der-abtastrate-und-der-aufloesung.png'']. Abgerufen am 05. Juli 2018.</ref>]]
== Bussystem ==
Zwischen dem Sensor und dem Mikrokontroller wird per I2C (Inter-Integrated Circuit) kommuniziert. Es handelt sich um einen seriellen Datenbus, bei dem nur 2 Datenleitungen benötigt werden und bei dem nur ein Gerät im Netz die Position des Masters übernimmt. Die zwei Datenleitungen sind SCL und SDA. SCL wird vom Master ausgegeben und gibt die Taktung der Bits vor.  SDA dient der reinen Datenübertragung. Beim Arduino Uno werden SDA und A4 für die Datenübertragung, sowie SCL und A5 für die Taktung genutzt. Diese sind standardmäßig in der ‚Wire.h‘-Bibliothek reserviert. Aus einer Information werden drei Pakete geschnürt und die Kommunikation läuft wie folgt ab:
# Start-byte wird gesendet.
# Adresse des Angesprochenen Slaves wird vom Master gesendet (Paket).
# Empfangsbestätigung (1Bit). Bei Nein, geht es weiter bei Punkt 8.
# Schreiben/Lesen (1Bit).
# Registeradresse zum Auslesen/Beschreiben wird beim Slave angemeldet (Paket).
# Soll mehr angefragt werden? Bei Nein, geht es weiter bei Punkt 8.
# Daten zum Auslesen/Beschreiben werden vom Slave/Master gesendet (Paket). Wenn mehr angefragt werden soll, geht es weiter bei Punkt 3
# Empfangsbestätigung (1Bit). Bei Nein, geht es weiter bei Punkt 8.
# Beende die Kommunikation mit dem End-byte.
<ref name = 'I²C Kommunikation Datenblatt'>Phillips Semiconducters:[https://www.mikrocontroller.net/attachment/7032/Spezifikation.pdf]
== Herstellen der Kommunikation mit dem Arduino UNO ==
<div style="width:950px; height:300px; overflow:auto; border: 2px solid #088">
<source lang=c>
    ////////////////////////////////////////////Gyrosensor
        Wire.beginTransmission(Adresse_Gyr);
        WriteRegister(CTRL_REG1,    0x0F);//0x0F
        WriteRegister(CTRL_REG2,    0x00);
        WriteRegister(CTRL_REG3,    0x80);//0x80
        WriteRegister(CTRL_REG4,    0x00);
        WriteRegister(CTRL_REG5,    0x00);//0x05
        WriteRegister(REFERENCE,    0x00);//127
        WriteRegister(INT1_TSH_XH,  0x2C);//2C
        WriteRegister(INT1_TSH_XL,  0xA4);//A4
        WriteRegister(INT1_TSH_YH,  0x2C);//0x2C
        WriteRegister(INT1_TSH_YL,  0xA4);//0xA4
        WriteRegister(INT1_TSH_ZH,  0x2C);//0x2C
        WriteRegister(INT1_TSH_ZL,  0xA4);//0xA4
        WriteRegister(INT1_DURATION,0x00);//0x01
        WriteRegister(INT1_CFG,    0x02);//0x65
        //Wire.endTransmission(Adresse_Gyr);
        GyrAbgeschlossen=Wire.endTransmission(Adresse_Gyr);
       
    ////////////////////////////////////////////Accelerometer
        Wire.beginTransmission(Adresse_Acc);
        WriteRegister(MCTL, For_MCTL);
        WriteRegister(CONTROL1, For_CONTROL1);
        WriteRegister(LDTH, For_LDTH);
        //Wire.endTransmission(Adresse_Acc);
        Serial.print("    ");
        AccAbgeschlossen=Wire.endTransmission(Adresse_Acc);
        Abgeschlossen=GyrAbgeschlossen+AccAbgeschlossen;
</source>
</div>
<br/>
Leider war es nicht möglich, aus dem Gyrosensor plausible Daten herauszubekommen. Sie blieben vom Beginn der Ausleseversuche unverändert bei einem recht hohen Wert, obwohl durchgehend mit 3,3 V Versorgungsspannung gearbeitet wurde.
[[Datei:GyroscopeRegisterauslesung.png]]

Version vom 5. Juli 2018, 21:52 Uhr


→ zurück zum Hauptartikel: SigSys SoSe2018


Autoren: Sebastian Dany
Betreuer: Prof. Dr. Ulrich Schneider Sensor: dIMU

Einleitung

Für die Semesterbegleitende Prüfung der Studierenden des Masterstudienganges "Business and Systems Engineering" im Teilmodul "Signalverarbeitende Systeme" im Modul "Systementwurf" wurden verschiedene Sensoren mit verschiedenen Komplexitätsgraden ausgegeben. Die Aufgabe bestand darin, diese Sensoren zu verstehen, zu beschreiben, auszulesen und zu kalibrieren.

Primärsensor

Als Primärsensor dient der dIMU-Sensor der Firma Dexter Industries, welcher mittels den zwei eingebauten Sensoren die Rotationsbeschleunigung und die Beschleunigung in jede Raumrichtung ausgeben soll. Die verbauten Sensoren werden mit unterschiedlichen Adressen angesprochen und könn en mittels einem für LEGO modifizierten RJ11-Verbindungskabel mit einem NXT Baustein, oder einem EV3 Baustein verbunden und ausgelesen werden. Alternativ ist es auch mit einem Arduino möglich, den Sensor auszulesen. Dazu muss der Baustein oder der Arduino (Master) Daten über I2C oder SPI vom Sensor (Slave) anfordern. Dieser liefert dann nach Abschluss der Anfrage des Masters die Daten. Beide Sensoren bauen auf demselben physikalischen Prinzip auf, nämlich der Massenträgheit und der Veränderung der Kapazität bei Abstandsänderung der Kondensatoroberflächen. Der Temperatursensor, der in beiden Sensormodulen verbaut ist, ist ein Silizium-Messwiderstand, welcher im Bereich von -40 °C bis +85 °C einsetzbar ist. Das Accelerometer (Adresse: 0x1D) sollte laut Datenblatt nicht mit über 3,6 Volt versorgt werden. Die auf der Platine gesetzten Widerstände schützen den Sensor vor den normalerweise bei dem Kabel anliegenden 4,3 V mit 20 mA. Der Gyrosensor und das Accelerometer geben je nach Typ, unterschiedliche Bitlängen an Daten aus: Beim Gyrosensor (Adresse: 0x69) liegen die Beschleunigungsausgaben als Rotationsbeschleunigung um die drei Raumachsen bei 16-Bit-Werten und bei dem eingebauten Temperatursensor bei maximal 8-Bit-Werten. Alle Werte werden in das Register geschrieben. Das Gerät kann in der Sensitivität auf +-250/+-500/+-2000 dps (degres per second) gesetzt werden, die Auflösung wird damit feiner. Bei der Initialisierung kalibriert der Gyrosensor Offset und Gain nach Datenblatt selbstständig und ist in der Lage die Daten mit verschiedenen Filtern zu verarbeiten. Eine Kalibrierung des Gyrosensors wurde dennoch nicht festgestellt. Das Accelerometer misst die Beschleunigung entlang der drei Raumachsen und speichert diese als 16-Bit Wert im Register ab. Dabei wird angegeben, dass die Ausgabewerte in der Einheit mG (ein tausendstel der Erdbeschleunigung) abgespeichert werden. Der Temperatursensor beschreibt das Register ebenfalls mit 8-Bit. Beide Temperatursensoren arbeiten mit einer Frequenz von 1 Hz und sind mit einem Offset behaftet. Die Daten entsprechen dem Temperaturunterschied zwischen Messzeitpunkt und initialisierung in °C. Beide Sensoren lesen die Messwerte nacheinander aus, damit sind sie minimal Zeitversetzt. Der Gyrosensor meldet eine Wertänderung durch Änderung des Registereintrages (Status_REG, Bit 7) an, sodass nicht immer alle Register ausgelesen werden müssen.

Auf dem Arduino werden die Daten durch einen rekursiven Mittelwertfilter geglättet und an die Ausgabe übergeben!

Analog-Digital-Umsetzer (DAU)

Der in den Sensoren verwendete DAU lässt sich im Datenblatt nicht ermitteln. Aufgrund von hohen Aktualisierungsraten und geringer Bitlänge der Daten (maximal 16-Bit beim Accelerometer) ist die Realisierung eines Parallelumsetzers wahrscheinlich. Die Kosten für diesen Umsetzer halten sich im Rahmen, da maximal 8 Bitstufen in zwei Stufen, nacheinander ausgelesen werden. Der Sensor benötigt daher 30 Komparatoren für einen zweistufigen Acht-Bit-Umsetzer, wohingegen der Flash-Umsetzer 255 benötigt. Dabei werden die Daten nacheinander in den Umsetzer geladen und nacheinander in die Register geschrieben. Der Pipeline-Umsetzer bietet eine günstige Alternative zu Flash-Umsetzern. Eine Realisierung mit einem Flash-Umsetzer hätte dagegen den Vorteil, dass die Daten mit einer schnelleren Taktung gewandelt werden könnten.

[[Bild:einordnung-von-a-d-wandlern-nach-der-abtastrate-und-der-aufloesung.png [. Abgerufen am 05. Juli 2018.</ref>]]

Bussystem

Zwischen dem Sensor und dem Mikrokontroller wird per I2C (Inter-Integrated Circuit) kommuniziert. Es handelt sich um einen seriellen Datenbus, bei dem nur 2 Datenleitungen benötigt werden und bei dem nur ein Gerät im Netz die Position des Masters übernimmt. Die zwei Datenleitungen sind SCL und SDA. SCL wird vom Master ausgegeben und gibt die Taktung der Bits vor. SDA dient der reinen Datenübertragung. Beim Arduino Uno werden SDA und A4 für die Datenübertragung, sowie SCL und A5 für die Taktung genutzt. Diese sind standardmäßig in der ‚Wire.h‘-Bibliothek reserviert. Aus einer Information werden drei Pakete geschnürt und die Kommunikation läuft wie folgt ab:

  1. Start-byte wird gesendet.
  2. Adresse des Angesprochenen Slaves wird vom Master gesendet (Paket).
  3. Empfangsbestätigung (1Bit). Bei Nein, geht es weiter bei Punkt 8.
  4. Schreiben/Lesen (1Bit).
  5. Registeradresse zum Auslesen/Beschreiben wird beim Slave angemeldet (Paket).
  6. Soll mehr angefragt werden? Bei Nein, geht es weiter bei Punkt 8.
  7. Daten zum Auslesen/Beschreiben werden vom Slave/Master gesendet (Paket). Wenn mehr angefragt werden soll, geht es weiter bei Punkt 3
  8. Empfangsbestätigung (1Bit). Bei Nein, geht es weiter bei Punkt 8.
  9. Beende die Kommunikation mit dem End-byte.

<ref name = 'I²C Kommunikation Datenblatt'>Phillips Semiconducters:[1]

Herstellen der Kommunikation mit dem Arduino UNO

    ////////////////////////////////////////////Gyrosensor
        Wire.beginTransmission(Adresse_Gyr);
        WriteRegister(CTRL_REG1,    0x0F);//0x0F
        WriteRegister(CTRL_REG2,    0x00);
        WriteRegister(CTRL_REG3,    0x80);//0x80
        WriteRegister(CTRL_REG4,    0x00);
        WriteRegister(CTRL_REG5,    0x00);//0x05
        WriteRegister(REFERENCE,    0x00);//127
        WriteRegister(INT1_TSH_XH,  0x2C);//2C
        WriteRegister(INT1_TSH_XL,  0xA4);//A4
        WriteRegister(INT1_TSH_YH,  0x2C);//0x2C
        WriteRegister(INT1_TSH_YL,  0xA4);//0xA4
        WriteRegister(INT1_TSH_ZH,  0x2C);//0x2C
        WriteRegister(INT1_TSH_ZL,  0xA4);//0xA4
        WriteRegister(INT1_DURATION,0x00);//0x01
        WriteRegister(INT1_CFG,     0x02);//0x65
        //Wire.endTransmission(Adresse_Gyr);

        GyrAbgeschlossen=Wire.endTransmission(Adresse_Gyr);
        
    ////////////////////////////////////////////Accelerometer
        Wire.beginTransmission(Adresse_Acc);
        WriteRegister(MCTL, For_MCTL);
        WriteRegister(CONTROL1, For_CONTROL1);
        WriteRegister(LDTH, For_LDTH);
        //Wire.endTransmission(Adresse_Acc);
        Serial.print("    ");
        AccAbgeschlossen=Wire.endTransmission(Adresse_Acc);
        Abgeschlossen=GyrAbgeschlossen+AccAbgeschlossen;



Leider war es nicht möglich, aus dem Gyrosensor plausible Daten herauszubekommen. Sie blieben vom Beginn der Ausleseversuche unverändert bei einem recht hohen Wert, obwohl durchgehend mit 3,3 V Versorgungsspannung gearbeitet wurde.