TI Sensortag mit Matlab/Simulink: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 110: Zeile 110:
| R/N
| R/N
| 4
| 4
| Object[0:7], Object[8:15], Ambience[0:7], Ambience[8:15]
| Objekt [0:7], Objekt [8:15], Ambiente [0:7], Ambiente [8:15]
|-
|-
| Benachrichtigung
| Benachrichtigung
Zeile 116: Zeile 116:
| R/W
| R/W
| 2
| 2
| Write 0x0001 to enable notifications, 0x0000 to disable.
| 0x0001, um Benachrichtigungen zu aktivieren, 0x0000, um zu deaktivieren.
|-
|-
| Konfiguration
| Konfiguration
Zeile 122: Zeile 122:
| R/W
| R/W
| 1
| 1
| Write 0x01 to enable data collection, 0x00 to disable.
| Sie 0x01, um die Datenerfassung zu aktivieren, 0x00, um sie zu deaktivieren.
|-
|-
| Zeitraum
| Zeitraum
Zeile 176: Zeile 176:
| R/N
| R/N
| 18
| 18
| GyroX[0:7], GyroX[8:15], GyroY[0:7], GyroY[8:15], GyroZ[0:7], GyroZ[8:15], AccX[0:7], AccX[8:15], AccY[0:7], AccY[8:15], AccZ[0:7], AccZ[8:15], MagX[0:7], MagX[8:15], MagY[0:7], MagY[8:15], MagZ[0:7], MagZ[8:15]
| Gyroskop X[0:7], Gyroskop X[8:15], Gyroskop Y[0:7], Gyroskop Y[8:15], Gyroskop Z[0:7], Gyroskop Z[8:15], Beschleunigung X[0:7], Beschleunigung X[8:15], Beschleunigung Y[0:7], Beschleunigung Y[8:15], Beschleunigung Z[0:7], Beschleunigung Z[8:15], Magnetometer X[0:7], Magnetometer X[8:15], Magnetometer Y[0:7], Magnetometer Y[8:15], Magnetometer Z[0:7], Magnetometer Z[8:15]
|-
|-
| Benachrichtigung
| Benachrichtigung
Zeile 317: Zeile 317:
| R/W
| R/W
| 2
| 2
| Write 0x0001 to enable notifications, 0x0000 to disable.
| 0x0001, um Benachrichtigungen zu aktivieren, 0x0000, um zu deaktivieren.
|-
|-
| Konfiguration
| Konfiguration
Zeile 323: Zeile 323:
| R/W
| R/W
| 1
| 1
| Write 0x01 to enable data collection, 0x00 to disable.
| 0x01, um die Datenerfassung zu aktivieren, 0x00, um sie zu deaktivieren.
|-
|-
| Zeitraum
| Zeitraum
Zeile 347: Zeile 347:


   //-- calculate relative humidity [%RH]
   //-- calculate relative humidity [%RH]
   rawHum &= ~0x0003; // remove status bits
   rawHum &= ~0x0003; // entferne status bits
   *hum = ((double)rawHum / 65536)*100;
   *hum = ((double)rawHum / 65536)*100;
}
}
Zeile 435: Zeile 435:
| R/W
| R/W
| 2
| 2
| 0x0001 zum Aktivieren von Benachrichtigungen, 0x0000 zum Deaktivieren
| 0x0001, zum Aktivieren von Benachrichtigungen, 0x0000 zum Deaktivieren
|-
|-
| Konfiguration
| Konfiguration

Version vom 3. Juli 2018, 10:46 Uhr

Sensor: SensorTag

Autor: Dominik Kai Meyer

Betreuer: Prof. Dr. Ulrich Schneider

Einleitung

  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

Projektplanung

Primärsensor

Abb. 1: TI Sensortag </ref>

In diesem Kapitel soll der TI Sensortag von Texas Instruments.






Sensoren

Der SensorTag hat IoT Schnittstellen für die folgenden Sensoren:

  • IR Temperatur, sowohl Objekt- als auch Umgebungstemperatur
  • Bewegung, 9 Achsen (Beschleunigungssensor, Gyroskop, Magnetometer)
  • Luftfeuchtigkeit, sowohl relative Luftfeuchtigkeit und Temperatur
  • Barometer, sowohl Druck als auch Temperatur
  • Optisch, Lichtintensität
Sensor Überblick
Sensor Name Datengröße Hersteller
IR Temperatur TMP007 2 x 16bit Texas Instruments
Bewegung MPU9250 9 x 16 bit InvenSense
Feuchtigkeit HDC1000 2 x 16bit Texas Instruments
Druck BMP280 2 x 24bit Bosch
Optisch OPT3001 1 x 16bit Texas Instruments

Der SensorTag kann so konfiguriert werden, dass er Benachrichtigungen für jeden Sensor sendet, indem er 0x0001 in die charakteristische Konfiguration & lt; GATT_CLIENT_CHAR_CFG_UUID & gt; Für die entsprechenden Sensordaten werden die Daten dann gesendet, sobald die Daten aktualisiert wurden. Die Sensoren werden aktiviert, indem 0x01 (NB: Der Bewegungssensor verwendet eine Bitmap zur Steuerung einzelner Achsen) in das entsprechende Merkmal 'configuration' geschrieben und dann durch Schreiben von 0x00 deaktiviert wird. Zur regelmäßigen Datenerfassung verwendet der SensorTag keine von den Sensoren bereitgestellten Interrupt-Funktionen, sondern der Bewegungssensor (MPU9250) verwendet Interrupt für die Wake-on-Bewegung (Shake-Erkennung).

Der SensorTag verwendet I2C als Schnittstelle zu den Sensoren. Dem MPU9250 ist ein eigener I2C-Bus (Bus # 1) zugeordnet, der auch separat versorgt wird. Beachten Sie auch, dass der MPU9250 aus zwei separaten Geräten im selben Paket besteht. Das Magnetometer hat eine eigene I2C-Adresse. Der Bewegungssensor verfügt über eine WOM-Funktion (Wake-On-Motion), die optional verwendet werden kann, sodass Bewegungsdaten nur gemeldet werden, wenn das Gerät berührt wird. Wenn WOM aktiviert ist, meldet der SensorTag Bewegungsdaten für 10 Sekunden, nachdem das Gerät eine Bewegung erkannt hat.

IR Temperatur Sensor

Der am SensorTag verwendete Temperatursensor ist von Texas Instruments. Der IR-Temperatursensor ist mit der folgenden Quellcodedatei implementiert:
Applikation: sensortag_tmp.c
Driver: SensorTmp007.c
Profile: irtempservice.c

IR Temperature Sensor
Type UUID Access Size (bytes) Beschreibung
Daten AA01* R/N 4 Objekt [0:7], Objekt [8:15], Ambiente [0:7], Ambiente [8:15]
Benachrichtigung 2902 R/W 2 0x0001, um Benachrichtigungen zu aktivieren, 0x0000, um zu deaktivieren.
Konfiguration AA02* R/W 1 Sie 0x01, um die Datenerfassung zu aktivieren, 0x00, um sie zu deaktivieren.
Zeitraum AA03* R/W 1 Auflösung 10 ms. Bereich 300 ms (0x1E) to 2.55 sec (0xFF). Standard 1 Sekunde (0x64)

Konfiguration

Wenn ein Freigabebefehl (0x01) in die Eigenschaft 'configuration' geschrieben wird, beginnt der Sensor jede Sekunde Messungen durchzuführen (Mittelwert über vier Messungen) und die Daten werden in der Eigenschaft 'data' gespeichert. Wenn der Deaktivierungsbefehl (0x00) ausgegeben wird, wird der Sensor in den Stand-by-Modus versetzt und die fehlenden Daten werden gelöscht und nicht mehr gemeldet.

Daten

Um Daten zu erhalten, verwenden Sie entweder Benachrichtigungen oder lesen Sie die Daten direkt aus. Der Rohdatenwert, der von diesem Sensor gelesen wird, sind zwei vorzeichenlose 16-Bit-Werte, einer für die (Umgebungs-) Temperatur und einer für die Objekttemperatur. Um die Temperatur in Grad (Celsius) zu konvertieren, wird folgenden Algorithmus verwendet:

void sensorTmp007Convert(uint16_t rawAmbTemp, uint16_t rawObjTemp, float *tAmb, float *tObj)
{
  const float SCALE_LSB = 0.03125;
  float t;
  int it;

  it = (int)((rawObjTemp) >> 2);
  t = ((float)(it)) * SCALE_LSB;
  *tObj = t;

  it = (int)((rawAmbTemp) >> 2);
  t = (float)it;
  *tAmb = t * SCALE_LSB;
}


Bewegungssensor

Der Bewegungssensor auf dem SensorTag ist MPU9250 von InvenSense. Der Bewegungssensor ist mit den folgenden Quellcodedateien implementiert:
Applikation: sensortag_mov.c
Treiber: SensorMpu9250.c
Profil: movementservice.c

Bewegung
Type UUID Access Size (bytes) Beschreibung
Daten AA81* R/N 18 Gyroskop X[0:7], Gyroskop X[8:15], Gyroskop Y[0:7], Gyroskop Y[8:15], Gyroskop Z[0:7], Gyroskop Z[8:15], Beschleunigung X[0:7], Beschleunigung X[8:15], Beschleunigung Y[0:7], Beschleunigung Y[8:15], Beschleunigung Z[0:7], Beschleunigung Z[8:15], Magnetometer X[0:7], Magnetometer X[8:15], Magnetometer Y[0:7], Magnetometer Y[8:15], Magnetometer Z[0:7], Magnetometer Z[8:15]
Benachrichtigung 2902 R/W 2 0x0001, um Benachrichtigungen zu aktivieren, 0x0000, um zu deaktivieren.
Konfiguration AA82* R/W 2 Ein Bit für jede Gyro- und Beschleunigungsmesserachse (6), Magnetometer (1), Nachlauffreigabe (1), Beschleunigungsmesserbereich (2). Beliebige Bitkombination, um die gewünschten Funktionen zu aktivieren. Mit 0x0000 wird das Gerät ausgeschaltet.
Zeitraum AA83* R/W 1 Auflösung 10 ms. Bereich 100 ms (0x0A) to 2.55 sec (0xFF). Standard 1 Sekunde (0x64).

Konfiguration

Die configuration wird genutzt, um festzustellen, welche Daten (Achse) aktiviert werden sollen, wenn der Wake-on-Motion aktiviert werden soll und der Bereich des Beschleunigungsmessers (2, 4, 8 und 16 G).

Bits Usage
0 Gyroskop z axis enable
1 Gyroskop y axis enable
2 Gyroskop x axis enable
3 Beschleunigungsmesser z-Achse an
4 Beschleunigungsmesser y-Achse an
5 Beschleunigungsmesser x-Achse an
6 Magnetometer an (Alle Achsen)
7 Wake-On-Motion an
8:9 Beschleunigungsmesser Bereich (0=2G, 1=4G, 2=8G, 3=16G)
10:15 Wird nicht benutzt

Die Wake-On-Motion (WOM)-Funktion ermöglicht es, dass der MPU nur mit aktiviertem Beschleunigungsmesser arbeitet, unterbricht den SensorTag CC2650 jedoch, wenn eine Bewegung erkannt wird. Nachdem ein Wackeln festgestellt wurde, stellt der SensorTag Bewegungsdaten für 10 Sekunden bereit, bevor er in den MPU-WOM-Zustand mit niedriger Leistung eintritt.

Daten

Die Rohdaten bestehen aus neun 16-Bit-Werten. Die Daten werden in folgender Reihenfolge ausgegeben: Gyroskop, Beschleunigungsmesser und Magnetometer.

Die Daten vom Gyroskop befinden sich an den Stellen 0-5 im Array. Jede Achse, X, Y, und Z bestehen aus jeweils zwei Bytes, die als ganze Zahl codiert sind.

float sensorMpu9250GyroConvert(int16_t data)
{
  //-- calculate rotation, unit deg/s, range -250, +250
  return (data * 1.0) / (65536 / 500);
}

Beschleunigungsmesser-Rohdaten bilden die Bytes 6-11 der Daten des Bewegungsdienstes in der Reihenfolge X-, Y-, Z-Achse. Daten von jeder Achse bestehen aus zwei Bytes, die als eine ganze Zahl mit Vorzeichen codiert sind.

// Beschleunigungsmesser Bereiche
#define ACC_RANGE_2G      0
#define ACC_RANGE_4G      1
#define ACC_RANGE_8G      2
#define ACC_RANGE_16G     3

float sensorMpu9250AccConvert(int16_t rawData)
{
  float v;

  switch (accRange)
  {
  case ACC_RANGE_2G:
    //-- calculate acceleration, unit G, range -2, +2
    v = (rawData * 1.0) / (32768/2);
    break;

  case ACC_RANGE_4G:
    //-- calculate acceleration, unit G, range -4, +4
    v = (rawData * 1.0) / (32768/4);
    break;

  case ACC_RANGE_8G:
    //-- calculate acceleration, unit G, range -8, +8
    v = (rawData * 1.0) / (32768/8);
    break;

  case ACC_RANGE_16G:
    //-- calculate acceleration, unit G, range -16, +16
    v = (rawData * 1.0) / (32768/16);
    break;
  }

  return v;
}

Magnetometer-Rohdaten bilden Bytes 12-17 der Daten vom Bewegungsdienst auch in der Reihenfolge X-, Y- und Z-Achse. Daten von jeder Achse bestehen aus zwei Bytes, die als eine ganze Zahl mit Vorzeichen codiert sind. Die Maßeinheit ist uT (Mikro-Tesla).

float sensorMpu9250MagConvert(int16_t data)
{
  //-- calculate magnetism, unit uT, range +-4900
  return 1.0 * data;
}


Feuchtigkeitssensor

Der auf dem SensorTag verwendete Feuchtigkeitssensor ist von Texas Instruments. Der Feuchtesensor wird mit folgenden Quellcodedateien implementiert:
Anwendung: sensortag_hum.c
Treiber: SensorHdc1000.c
Profil: humidityservice.c


Feuchtigkeitssensor
Type UUID Access Size (bytes) Beschreibung
Daten AA21* R/N 4 Temperatur [0:7], Temperatur [8:15], Feuchtigkeit [0:7], Feuchtigkeit [8:15]
Benachrichtigung 2902 R/W 2 0x0001, um Benachrichtigungen zu aktivieren, 0x0000, um zu deaktivieren.
Konfiguration AA22* R/W 1 0x01, um die Datenerfassung zu aktivieren, 0x00, um sie zu deaktivieren.
Zeitraum AA23* R/W 1 Auflösung 10 ms. Bereich 100 ms (0x0A) bis 2.55 Sekunden (0xFF). Standard 1 Sekunde (0x64).

Konfiguration

Wenn ein Freigabebefehl (0x01) in die Eigenschaft 'configuration' geschrieben wird, beginnt der Sensor jede Sekunde Messungen durchzuführen und die Daten werden in der Eigenschaft 'Daten' gespeichert. Wenn der Deaktivierungsbefehl (0x00) ausgegeben wird, wird der Messzyklus des Sensors gestoppt, die Daten werden gelöscht und nicht mehr gemeldet.

Daten

Die Daten vom Feuchtesensor bestehen aus zwei 16-Bit-Ganzzahlen ohne Vorzeichen: die Temperatur in den Bytes 0 und 1 und der Druck in den Bytes 2 und 3. Die Umrechnung auf Temperatur und relative Feuchte erfolgt wie unten gezeigt. Die Temperatureinheit ist Grad Celsius (° C), die Luftfeuchtigkeit ist relative Luftfeuchtigkeit (% RH).

void sensorHdc1000Convert(uint16_t rawTemp, uint16_t rawHum,
                        float *temp, float *hum)
{
  //-- calculate temperature [°C]
  *temp = ((double)(int16_t)rawTemp / 65536)*165 - 40;

  //-- calculate relative humidity [%RH]
  rawHum &= ~0x0003; // entferne status bits
  *hum = ((double)rawHum / 65536)*100;
}


Luftdrucksensor

Der am SensorTag verwendete Drucksensor ist von Bosch Sensortec. Der Luftdrucksensor ist mit den folgenden Quellcodedateien implementiert:
Anwendung: sensortag_bar.c
Treiber: SensorBmp280.c
Profil: barometerservice.c

Luftdrucksensor
Type UUID Access Size (bytes) Description
Data AA41* R/N 6 Temperatur [0:7], Temperatur [8:15], Temperatur [16:23], Druck [0:7], Druck [8:15], Druck [16:23]
Benachrichtigung 2902 R/W 2 0x0001, um Benachrichtigungen zu aktivieren, 0x0000, um zu deaktivieren.
Konfiguration AA42* R/W 1 0x01 zum Aktivieren der Datenerfassung, 0x00 zum Deaktivieren.
Zeitraum AA44* R/W 1 Auflösung 10 ms. Bereich 100 ms (0x0A) bis 2.55 Sekunden (0xFF). Standard 1 Sekunde (0x64).

Konfiguration

Wenn ein Freigabebefehl (0x01) in die Eigenschaft 'configuration' geschrieben wird, beginnt der Sensor jede Sekunde Messungen durchzuführen und die Daten werden in der Eigenschaft 'Daten' gespeichert. Wenn der Deaktivierungsbefehl (0x00) ausgegeben wird, wird der Messzyklus des Sensors gestoppt, die Daten werden gelöscht und nicht mehr gemeldet.

Daten

Die Daten vom Drucksensor bestehen aus zwei vorzeichenlosen 24-Bit-Ganzzahlen: die Temperatur in Bytes 0-2, der Druck in den Bytes 3-5. Die Umwandlungs- und Einstellungsberechnungen werden in der Firmware durchgeführt, so dass die Anwendung nur die eingehenden Werte durch 100 teilen muss. Die Umrechnung auf Temperatur und Druck erfolgt wie unten gezeigt. Die Temperatureinheit ist Grad Celsius, der Druck in Hektopascal (hPa).

float sensorBmp280Convert(uint32_t rawValue)
{
  return rawValue / 100.0f;
}

Optischer Sensor

Der auf dem SensorTag verwendete optische Sensor ist von Texas Instruments. Der optische Sensor ist mit den folgenden Quellcodedateien implementiert:
Anwendung: sensortag_opt.c
Treiber: SensorOpt3001.c
Profil: opticservice.c

Optischer Sensor
Type UUID Access Size (bytes) Beschreibung
Daten AA71* R/N 2 LightLSB:LightMSB
Benachrichtigung 2902 R/W 2 0x0001, zum Aktivieren von Benachrichtigungen, 0x0000 zum Deaktivieren
Konfiguration AA72* R/W 1 0x01, um die Datenerfassung zu aktivieren, 0x00, um sie zu deaktivieren.
Zeitraum AA73* R/W 1 Auflösung 10 ms. Bereich 100 ms (0x0A) bis 2.55 Sekunden (0xFF). Standard ist 800 Millisekunden (0x50).

Konfiguration

Wenn ein Freigabebefehl (0x01) 'Konfiguration' 'geschrieben wird, beginnt der Sensor alle 800 Millisekunden Messungen durchzuführen und die Daten werden in der Eigenschaft' Daten 'gespeichert. Wenn der Deaktivierungsbefehl (0x00) ausgegeben wird, wird der Messzyklus des Sensors gestoppt, die Daten werden gelöscht und nicht mehr gemeldet.

Daten

Die Daten vom optischen Sensor bestehen aus einer einzelnen 16-Bit-Ganzzahl ohne Vorzeichen. Die Umwandlung in Lichtintensität (LUX) wird unten gezeigt.

float sensorOpt3001Convert(uint16_t rawData)
{
    uint16_t e, m;

    m = rawData & 0x0FFF;
    e = (rawData & 0xF000) >> 12;

    /** e on 4 bits stored in a 16 bit unsigned => it can store 2 << (e - 1) with e < 16 */
    e = (e == 0) ? 1 : 2 << (e - 1);

    return m * (0.01 * e);
}


IO-Service

Der IO-Service ist eine Schnittstelle zu digitalen IO-Leitungen am SensorTag und zu den Power-On-Self-Testergebnissen. Die IOs, die von diesem Dienst gesteuert werden können, sind die zwei LEDs und der Buzzer. Das Einschalt-Selbsttest-Ergebnis ist eine Bitmap von 7 Bits, wobei jedes Bit den Bestanden/ Fehlgeschlagen-Status eines Sensors darstellt. Der IO-Service wird mit den folgenden Quellcodedateien implementiert:
Anwendung: sensortag_io.c
Treiber: PIN TI Treiber
Profil: ioservice.c


IO Service
Type UUID Access Size (bytes) Description
Data AA65 * R/W 1 Abhängig von dem im Konfigurationsmerkmal eingestellten Modus.
Konfiguration AA66 * R/W 1 0: Lokaler Modus, 1: Remote-Modus, 2: Testmodus

Konfiguration

Dieser Dienst wird in drei Modi betrieben, die durch die Einstellung der Eigenschaft configuration definiert werden.

IO Service
Mode Name Description
0 Lokal Im lokalen Modus steuert die Anwendung selbst die Verwendung der LEDs. Standardmäßig blinkt die grüne LED bei der Werbung und wird auch beim Start verwendet, um einen erfolgreichen Selbsttest anzuzeigen.

Die rote LED wird verwendet, um einen Fehler beim Selbsttest beim Einschalten anzuzeigen. Im normalen Betrieb wird sie nicht verwendet. Der Buzzer wird von keiner eingebauten Funktionalität der Firmware verwendet.

1 Fernbedienung Im Remote-Modus überschreibt der BLE-Host die IO-Nutzung und kann die LEDs und den Buzzer direkt aktivieren. - 2 Prüfung Im Testmodus können die Werte des Power-On-Self-Tests gelesen werden.

Das Lesen des Merkmals liefert immer den Wert, der zuvor darauf geschrieben wurde. Nach dem erstmaligen Anschluss enthält es das Selbsttest-Ergebnis.


Daten

Funktionsweise des Sensors

Gründe für ein ADU/Alternativen

Bussystem

Digitale Signalverarbeitung

Filteranwendung

Auflösung,Empfindlichkeit und Messunsicherheit

Darstellung der Ergebnisse

Zusammenfassung

Video

Ablage

Literatur



→ zurück zum Hauptartikel: Signalverarbeitende Systeme