kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Laborversuch #4 -- Montag 11.10.2021 -- Temperatur messen

(EN google-translate)

(PL google-translate)

Zur Temperaturmessung wird ein Breakout-Board (MPU6050) an den Arduino angeschlossen, das neben einem dreiachsigen Beschleunigungssensor und einem Gyriskop auch einen Temperaturfühler besitzt, der sich so kalibrieren läßt, dass die Werde gleich in Grad Celsius zur Verfügung stehen.

Die Abfrage dieser Temperaturwerte ist nicht ganz einfach, da sie über ein Bussystem (SPI-Bus) erfolgt. Es gibt bestimmte Befehlsfolgen, die den Baustein konfigurieren und in setup() stehen und andere, die die Daten abfragen. Nehmen Sie im Moment einfach hin, dass diese Daten zyklisch aktualisiert werden und dann in der Variable "TEMPERATUR" gespeichert werden. Diese ist dann der Ist-Wert und bildet später bei Versuch #5 die Grundlage zum Aufbau eines Regelkreises.

Hier im Versuch #4 soll nun das Breakout-Board richtig an den Mikrocontroller angeschlossen werden. Es wird außerdem ein Testprogramm bereit gestellt, das steig die Temperaturwerte liest und an den PC/Laptop schickt, wo sie über den seriellen Monitor innerhalb der Arduino-IDE einsehbar sind.

Bilden Sie auch diesen Aufbau sorgfältig nach und verwenden Sie dann zur Kontrolle das Testprogramm.


Die LED-Schaltung vom vorangehenden Versuch #3 lassen wir einfach auf dem Board. Beide Teilschaltungen werden später benötigt.


Schaltplan zur Verbindung des MPU6050 mit dem Arduino Micro (LED-Teil wurde hier weggelassen).

Bild 0-1: Schaltplan zur Verbindung des MPU6050 mit dem Arduino Micro (LED-Teil wurde hier weggelassen).

Darstellung des Aufbaus auf dem Steckboard.

Bild 0-2: Darstellung des Aufbaus auf dem Steckboard.

#include<math.h>
#include<Wire.h>
const int MPU=0x68;  // I2C address of the MPU-6050
int16_t AcX=0,AcY=0,AcZ=0,Tmp=0,GyX=0,GyY=0,GyZ=0;
double TEMPERATUR = 0.0;
void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  delay(500);
}

void loop() 
{
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

  TEMPERATUR = Tmp/340.00+36.53;
  
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(TEMPERATUR);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.print(GyZ);
  
  delay(500);
}

Code 0-1: Testprogramm, um alle Sensordaten, die der MPU6050 liefert im Serial Monitor ansehen zu können.

TemperaturAbfrage.zip -- Sketch mit obigem Testprogramm als .zip-File -- Sie können das .zip-File herunterladen und in Ihren Sketch-Ordner legen (Name Arduino). Nach einem Neustart der IDE erscheint auch dieser Sketch im Sketchbook.
Aufgaben
  • Bemühen Sie sich um ein grundsätzliches Verständnis des Testprogramms. Dieses wird im gemeinsamen Gespräch während der LV noch vertieft werden. Fragen Sie bitte proaktiv nach.

Hinweise: Befehle wie Serial.begin(9600); oder Wire.begin(); sind Beispiele für obejektorientierte Programmierung und können vorläufig so verstanden werden:

  • Es gibt ein Ding "Serial", das besitzt mehrere innere Funktionen (Methoden).
  • Diese Methoden können über den "Punktoperator" für dieses Ding aufgerufen werden.
  • Serial.begin(9600); bedeutet beispielsweise: Die serielle Schnittstelle soll ihre Arbeit beginnen, bei einer Übertragungsrate von 9600 Bits pro Sekunden, also 9600 Baud.