Um die Leistungsaufnahme des DC-Motors zu bestimmen, benötigen wir die über dem Motor abfallende Spannung und den durch den Motor fließenden Strom.

Die Spannung lässt sich leicht mit Hilfe des ESP32 messen. Die Strommessung gestaltet sich etwas schwieriger. Wir werden zunächst die Spannung über einem Shunt Widerstand messen und daraus den Strom berechnen.

Ein Shunt, auch Nebenwiderstand oder Nebenschlusswiderstand, ist ein meist niederohmiger Widerstand, über dem die abfallende Spannung gemessen wird. Aus der gemessenen Spannung und dem bekannten Widerstand lässt sich über die Formel \( I = \frac{U}{R} \) der Strom errechnen.

Der Motor wird an den Motortreiber L298N angeschlossen.

Zum Anschluss des Motors, des Motortreibers und des IR-Sensors können sie sich in Projekt 6 T1-Remote -> "Schritt 1" und "Schritt 3" Hilfestellung holen.

Den IR-Sensor und die IR-Fernbedienung verwenden wir, um den Motor zu steuern. Dabei reichen die Grundsteuerungen "Vor", "Zurück" und "Stopp" aus.

Als Shunt Widerstand sollte ein möglichst kleiner Widerstand verwendet werden, damit die Verlustleistung an diesem Widerstand möglichst gering ist. Optimal hat ein Shunt Widerstand einen Wert im Milliohm-Bereich. Das ist in unserer Schaltung jedoch nicht realisierbar. Damit wir über einen analogen Eingang Spannungen mit dem ESP32 messen können, müssen wir mindestens 0,1 V an diesem Eingang anlegen. Bei niedrigeren Spannungswerten gibt der ADC einen Wert von 0 aus. Der Shunt Widerstand darf jedoch auch nicht zu groß werden, da sonst die Verlustleistung zu groß wird. 

Als Shunt Widerstand wird, ein 3 Ω Widerstand verwendet da hier bei Strömen ab 50 mA der Spannungsabfall groß genug ist, damit dieser mit dem ESP32 gemessen werden kann.

Mit nachfolgendem Programmcode wird die Spannung über dem Widerstand gemessen und mit diesem Wert der Strom berechnet. Schließlich wird über die Formel \( P = U\cdot I \) die Leistung berechnet und über den Seriellen Monitor ausgegeben.

Falls noch nicht geschehen, muss für den Empfang der IR-Tastencodes die Bibliothek "IRremote by shirriff" installiert werden.

Hinweis: Die IR-Tastencodes können je nach IR-Fernbedienung variieren. Gegebenenfalls befolgen Sie die Anweisungen im Projekt 6 T1-Remote -> "Schritt 1" -> "Programm zum Auslesen der IR-Fernbedienung schreiben"

Material:

  • Breadboard
  • ESP32
  • USB-Kabel
  • Jumper Kabel (11x)
  • Motortreiber L298N
  • DC Motor
  • IR-Sensor/ IR-Fernbedienung
  • Widerstand (3 Ω)

Motortreiber

Abbildung 1: Motortreiber (schematisch)
Quelle: BBS 2 Wolfsburg

Motortreiber

Abbildung 2: Motortreiber
Quelle: BBS 2 Wolfsburg

Die Schaltung sieht wie folgt aus:

Steckplatine:

Steckplatine

Abbildung 3: Steckplatine
Quelle: BBS 2 Wolfsburg

Schaltplan:

Schaltplan

Abbildung 4: Schaltplan
Quelle: BBS 2 Wolfsburg

Wir erhalten Werte für den Strom im Bereich zwischen 80 mA und 140 mA. Es lassen sich große Schwankungen bei den Werten feststellen. Ein Grund für diese Ungenauigkeiten ist der große Shunt Widerstand. Ein Shunt Widerstand mit 3 Ω ist weit weg vom optimalen Milliohm-Bereich.

Source Code:

//Bibliotheken zum auslesen einer IR-Fernbedienung
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.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

IRrecv irrecv(RECV_PIN);  //Objekt der Klasse IRrecv erstellen
decode_results results;   

int IRcode=0;             //variable für den Empfangen Tastencode

float voltage = 0;
float leistung = 0;
float strom = 0;
float R = 3;

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);
}

void loop() 
{
  voltage = analogRead(35);

  strom = (voltage/4096 * 3.3)/R;

  leistung = 3 * strom;
  
  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);
      
      //Serial.println(voltage);
      Serial.print("P = ");
      Serial.print(leistung);
      Serial.println("W");
    }
    else if(IRcode==0xFF817E)         //Wenn die Taste <-(runter) betätigt wird
    {
      digitalWrite(M1_PIN, LOW);        //Fahre Rückwärts
      digitalWrite(M2_PIN, HIGH);

      //Serial.println(voltage);
      Serial.print("P = ");
      Serial.print(leistung);
      Serial.println("W");
    }
    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);
  }
}
Zuletzt geändert: Montag, 28. Juni 2021, 19:56