Leistungsmessung mit Stromsensor
Im vorherigen Abschnitt haben wir den Strom mittels eines Shunt Widerstands gemessen bzw. errechnet. Nun nutzen wir den Adafruit INA219 Stromsensor um den Strom des DC-Motors bzw. die Leistungsaufnahme zu bestimmen.
Auch der INA219 Stromsensor ermittelt den Strom mittels eines Shunt Widerstand. Dieser ist 0,1 Ω klein. Neben dem Strom kann der INA219 auch Gleichspannungen bis zu 26 V messen. Der Strommessbereich geht bis 3,2 A bei einer Fehlergenauigkeit von 1 %.
Material:
- Breadboard
- ESP32
- USB-Kabel
- Jumper Kabel (14x)
- Motortreiber L298N
- DC Motor
- IR-Sensor/ IR-Fernbedienung
- Adafruit INA219
- Arduino IDE
Abbildung 1: Stromsensor INA219
Quelle: BBS 2 Wolfsburg
Der Stromsensor wird zwischen den Motortreiber und den Motor geschaltet. Die Schaltung aus dem vorherigen Projektschritt wird folgendermaßen erweitert:
Steckplatine:
Abbildung 2: Stromsensor Steckplatine
Quelle: BBS 2 Wolfsburg
Schaltplan:
Abbildung 3: Stromsensor Schaltplan
Quelle: BBS 2 Wolfsburg
Anschließend schließen wir den Stromsensor zwischen dem 5 V GPIO des ESP32 und dem Motortreiber an und messen neben dem Stromfluss auch die aufgenommene Leistung von Motortreiber mit angeschlossenem Motor.
Steckplatine:
Abbildung 4: Stromsensor Zuleitung Steckplatine
Quelle: BBS 2 Wolfsburg
Schaltplan:

Abbildung 5: Stromsensor Zuleitung Schaltplan
Quelle: BBS 2 Wolfsburg
Damit das Programm funktioniert, muss noch die Bibliothek "Adafruit INA 219 by adafruit" installiert werden. Falls Sie Probleme bei der Installation von Bibliotheken haben, schauen Sie unter Schritt 3 "Abwendung des Spannungsteilers" -> "LED an- bzw. ausdimmen" nach, wie Sie eine Bibliothek installieren.
Neben dem Strom und der Leistung wird Ihnen im seriellen Monitor auch die Busspannung, Ladespannung und Spannung über dem Shunt Widerstand angezeigt.
Über den seriellen Monitor erhalten wir folgende Ausgaben bei laufendem Motor:
Abbildung 6: Ausgabe bei Schaltung aus Abbildung 2/3
Quelle: BBS 2 Wolfsburg
Abbildung 7: Ausgabe bei Schaltung aus Abbildung 4/5
Quelle: BBS 2 Wolfsburg
Aus Abbildung 6 ist ersichtlich, dass der Motor mit ca. 4 V versorgt wird. Die Stromaufnahme schwankt zwischen 60 mA und 80 mA. Daraus ergibt sich eine Leistungsaufnahme von etwas über 300 mW.
Source Code:
//Bibliotheken zum auslesen einer IR-Fernbedienung
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <Wire.h>
#include <Adafruit_INA219.h>
#define RECV_PIN 34 //Pin an dem der IR-Empfänger angeschlossen ist
#define M1_PIN 26 //Pin 1 zur steuerung des Motors
#define M2_PIN 27 //Pin 2 zur steuerung des Motors
Adafruit_INA219 ina219;
IRrecv irrecv(RECV_PIN); //Objekt der Klasse IRrecv erstellen
decode_results results;
int IRcode=0; //variable für den Empfangen Tastencode
void setup()
{
irrecv.enableIRIn(); // Starte den receiver
Serial.begin(115200); //Serielle Kommunikation starten
pinMode(M1_PIN, OUTPUT);
pinMode(M2_PIN, OUTPUT);
digitalWrite(M1_PIN, LOW); //Fahre nicht
digitalWrite(M2_PIN, LOW);
while (!Serial) {
// Pause bis der serielle Monitor geöffnet wird
delay(1);
}
uint32_t currentFrequency;
Serial.println("Hello!");
if (! ina219.begin()) {
Serial.println("Failed to find INA219 chip");
while (1) { delay(10); }
}
Serial.println("Measuring voltage and current with INA219 ...");
}
void loop()
{
if (irrecv.decode(&results)) //Wenn ein IR-Signal empfangen wurde
{
IRcode=(results.value); //Das Empfangsignal in der Variable speichern
Serial.print(IRcode,HEX); //Gebe es hexadezimal im SM aus
Serial.println("");
if(IRcode==0xFF01FE) //Wenn die Taste ->(hoch) betätigt wird
{
digitalWrite(M1_PIN, HIGH); //Fahre Vorwärts
digitalWrite(M2_PIN, LOW);
}
else if(IRcode==0xFF41BE) //Wenn die Taste OFF betätigt wird
{
digitalWrite(M1_PIN, LOW); //Fahre nicht
digitalWrite(M2_PIN, LOW);
}
irrecv.resume(); //IR-Empfänger für den nächsten Wert bereit machen.
delay(30);
}
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
power_mW = ina219.getPower_mW();
loadvoltage = busvoltage + (shuntvoltage / 1000);
Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V");
Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V");
Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA");
Serial.print("Power: "); Serial.print(power_mW); Serial.println(" mW");
Serial.println("");
delay(2000);
}