Anschließen und programmieren des DC- Motors mittels der H- Brücke
Zum Schluss des Projektes folgt nun das Arbeiten mit dem Gleichstrommotor (DC- Motor) und der dazugehörigen H- Brücke.
Bevor man aber die beiden Bauteile verbaut, musst du dich damit befassen was ein DC- Motor und eine H- Brücke sind und wie sie generell funktionieren.
DC-Motor
Ein DC- Motor ist nichts anderes als ein elektromechanischer Wandler, der aus einer elektrischen Leistung mechanische Leistung erzeugt.
Die allgemeine Funktionsweise eines DC-Motors beschreibt sich wie folgt:
Der DC- Motor besitzt einen Dauermagneten und ein drehbares Eisenteil, dass zwischen dem Dauermagneten gelagert und von einer isolierten Spule aus Kupferdraht umwickelt ist.
Sobald Gleichstrom durch die Spule fließt, baut die Spule ein Magnetfeld auf und der Eisenkern wird zum Elektromagneten.
Aufgrund dessen, dass der Elektromagnet drehbar gelagert ist, richtet er sich so aus, dass immer die ungleichen Pole (vom Dauermagneten und Elektromagneten) gegenüberstehen. Wichtig zu wissen ist, dass der Elektromagnet solange in der Stellung bleibt, bis der Strom ausgeschaltet wird (aufgrund der magnetischen Kräfte).
Aber damit sich der Elektromagnet dreht, muss die magnetische Ausrichtung umgepolt werden. Dies kann man ganz einfach erreichen, indem man die Stromrichtung in der Spule ändert. Das Ändern der Stromrichtung übernimmt ein sog. Kollektor, der mit der Spule verbunden ist und die Spule mit Spannung versorgt.
Wenn der Elektromagnet sich dreht und kurz davor ist mit dem Dauermagneten die optimale Ausrichtung einzunehmen, wird der Strom über den Kollektor abgeschaltet und darauf mit umgekehrter Polung wieder eingeschaltet. Dadurch nimmt der Elektromagnet die umgekehrte Polung ein, wodurch sich die gleichen Magnetpole vom Dauer- u. Elektromagneten gegenüberstehen und sich abstoßen.
Im folgenden findest du noch ein hilfreiches Video, das erklärt, wie DC- Motoren funktionieren:
Abbildung: DC-Motor
Quelle: BBS2 Wolfsburg
H-Brücke
Eine H- Brücke besteht aus aus 4 Schaltern (meistens Transistoren) die in einer H- förmigen Anordnung verbunden sind. Die vier Schalter bzw. Transistoren können so gestellt werden, dass ein Motor in den zwei unterschiedlichen Polaritäten angesteuert werden
kann. Man kann also den Motor in 2 Richtungen ansteuern. Viele der H-Brücken bzw. Motorsteuerungen besitzen die Möglichkeit mittels PWM die Geschwindigkeit des DC- Motors zu regeln.
Abbildung: H-Brücke
Quelle: BBS2 Wolfsburg
Da wir uns nun ausführlich damit beschäftigt haben, wie ein DC- Motor funktioniert und wofür man eine H- Brücke verwendet, können wir nun mit dem Aufbau beginnen. Die folgenden Bilder zeigen wie der DC- Motor mit der H- Brücke und die H- Brücke mit dem ESP32 angeschlossen ist (Bitte beachtet die Notizen beim Schaltplan (Bild 2)).
Die H- Brücke ist mit folgenden PINs belegt:
A1 - PIN 18
A2 - PIN 17
OUTPUT1 - DC- Motor
OUTPUT2 - DC- Motor
GND - GND
+5 V - 5 V
Abbildung: Fritzing-Anordnung Ultraschallsensor mit 7-Segemnt Display, passivem Summer, H-Brücke und DC-Motor
Quelle: BBS2 Wolfsburg
Diese Abbildung zeigt den Schaltplan für den Aufbau des DC- Motor mittels der H- Brücke:
Abbildung: Fritzing-Schaltplan Ultraschallsensor mit 7-Segemnt Display, passivem Summer, H-Brücke und DC-Motor
Quelle: BBS2 Wolfsburg
Wenn man die H- Brücke und den DC-Motor richtig angeschlossen folgt nun der Schritt des Programmierens:
Source Code:
#include <TM1637Display.h> // Bibliothek für die 7- Segment Anzeige
#define echo 25 //Anschluss ECHO vom HC-SR04 wurde für PIN 25 festgelegt
#define trig 33 //Anschluss TRIG vom HC-SR04 wurde für PIN 33 festgelegt
#define display_clk 16 //Anschluss CLK von der 7- Segment Anzeige wurde für PIN 16 festgelegt
#define display_dio 13 //Anschluss DIO von der 7- Segment Anzeige wurde für PIN 13 festgelegt
#define passiver_buzzer 27 //Der PIN für den passiven Summer wurde auf 27 festgelegt
//Pinbelegung für die H-Brücke
int inc1 = 18;
int inc2 = 19;
int motor = 17;
//Entfernung als globale Variable anlegen
int entfernung = 0;
//Pulsweitenmodulation
const int freq = 30000;
const int resolution = 8;
//Funktion zur Messung der Entfernung über den Ultraschallsensor HC-SR04 (mit Echo und Trigger), Einheit: cm
int getEntfernung()
{
long entfernung = 1;
long zeitx = 0;
digitalWrite (trig, LOW); //setzt den Zustand von trig auf LOW
delayMicroseconds(3); //setzt eine Pause/Unterbrechung von 3 Mikrosekunden
noInterrupts();
digitalWrite(trig, HIGH); //setzt den Zustand von trig auf HIGH
delayMicroseconds(10); //setzt eine Pause/Unterbrechung von 10 Mikrosekunden
digitalWrite(trig, LOW);
zeitx = pulseIn(echo, HIGH);
interrupts(); //unterbricht den Vorgang
zeitx = (zeitx / 2); //teilt die Zeit durch 2
entfernung = zeitx / 29.1; //teilt die Restzeit durch die Geschwindigkeit des Schalls
return (entfernung); //gibt die berechnete Entfernung zurück
}
// Funktion zur Antriebssteuerung ---> mit geringer werdendem Abstand soll der Motor langsamer laufen
void antrieb(int entfernung)
{
if ((entfernung <= 50) && (entfernung >= 25))
{
digitalWrite(inc1, LOW); //Laufrichtung einstellen
digitalWrite(inc2, HIGH);
ledcWrite(2, 230);
}
else if ((entfernung <= 24) && (entfernung >= 5))
{
digitalWrite(inc1, LOW); //Laufrichtung einstellen
digitalWrite(inc2, HIGH);
ledcWrite(2, 200); //Sendet ein Signal an den Channel 2 mit einem Duty Cyle(Auslastungsgrad) von 230
}
else if (entfernung < 5)
{
digitalWrite(inc1, LOW); //Laufrichtung einstellen
digitalWrite(inc2, HIGH);
ledcWrite(2, 0); // Motor steht
}
else
{
digitalWrite(inc1, LOW); //Laufrichtung einstellen
digitalWrite(inc2, HIGH);
ledcWrite(2, 255);
}
}
// Funktion zur Tonsteuerung ---> mit geringer werdendem Abstand soll sich die Tonfrequenz höher werden
void sound(int entfernung)
{
// die Entfernungsabstände können beliebig angepasst werden
if ((entfernung <= 50) && (entfernung >= 25))
{
ledcWriteTone(1, 300);
delay(10);
}
else if ((entfernung <= 24) && (entfernung >= 15))
{
ledcWriteTone(1, 800);
delay(5);
}
else if ((entfernung <= 14) && (entfernung >= 6))
{
ledcWriteTone(1, 1300);
delay(2);
}
else if (entfernung <= 5)
{
ledcWriteTone(1, 1700);
delay(1);
}
else
{
ledcWriteTone(1, 0);
delay(1);
}
}
TM1637Display display(display_clk, display_dio);
void setup()
{
pinMode(trig, OUTPUT); //
pinMode(echo, INPUT); //
pinMode(passiver_buzzer, OUTPUT); //Legt den Eingangstyp des angegebenen PINs fest
pinMode(motor, OUTPUT); //
pinMode(inc1, OUTPUT); //
pinMode(inc2, OUTPUT); //
ledcSetup(1, freq, resolution); // Konfigurieren der Pulsweitenmodulation für Channel 0 --> Sound
ledcAttachPin(passiver_buzzer, 1); //passiver Buzzer mit PWM-Channel verbinden
ledcSetup(2, freq, resolution); //Konfigurieren der Pulsweitenmodulation für Channel 1 --> Antrieb
ledcAttachPin(motor, 2); //Motor mit dem PWM-Channel verbinden
}
void loop()
{
entfernung = getEntfernung();
sound(entfernung); //Aufruf der Funktion zum Ansteuern des passiven Buzzers
antrieb(entfernung); //Aufruf der Funktion zum Antrieb des Motors
//Einstellungen für die 7 Segment Anzeige
display.setBrightness(7);
display.showNumberDec(entfernung);
delay(20);
}