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.
Bild 0-1: Schaltplan zur Verbindung des MPU6050 mit dem Arduino Micro (LED-Teil wurde hier weggelassen).
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.
Aufgaben
|
Hinweise: Befehle wie Serial.begin(9600); oder Wire.begin(); sind Beispiele für obejektorientierte Programmierung und können vorläufig so verstanden werden:
|