Der Versuch „Zweipunktregler mit Ultraschall“ ähnelt sehr dem Versuch „Niveauregler mit Lichtschranke“.
Das Experiment ist unter folgendem Link beschrieben:
Die folgende Schaltung gestalten wir ein wenig komplizierter. Mit dem Ultraschall HC-S04 kann man ähnlich
wie mit einer Lichtschranke das gewünschte Ziel der Regelung problemlos einstellen. Zusätzlich, da Auswertung des
Ultraschalls mit Arduino realisiert wird, führen wir ein Potenziometer, mit dem das Ziel während der Regelung
variabel verstellt werden kann, ein. Darüber hinaus wird der aktuelle Wasserstand kontinuierlich gemessen. Anschließend kann
man sich die Ergebnisse anschauen und die Stärken und Schwächen eines Zweipunktreglers feststellen.
Ultraschallsensoren eignen sich sehr gut für Positionserfassung, Hinderniserkennung und Abstandsmessung.
Sie arbeiten mit Schallwellen im Ultraschallbereich, der ab 20 kHz beginnt. Sie liegen außerhalb des Hörfrequenzbereichs
des Menschen. Die Sensoren können im Zusammenhang mit festen, pulverförmiger oder flüssigen Stoffen verwendet werden. Sie
senden und empfangen die Schallwellen, die von den untersuchten Objekten reflektiert werden. Auf Basis der Laufzeitmessung wird dann
die aktuelle Distanz zum Objekt errechnet. Die Sensoren sind günstig, zuverlässig und werden u.a. breit in der Industrie
angewendet.
HC-SR04 Rückseite
Bei dem Ultraschallsensor HC-SR04 handelt es sich um ein fertiges Modul, das den Sender, Empfänger und
notwendige Steuer-Elektronik beinhaltet. Er arbeitet im Bereich von 40 kHz. Es können Abstände im Bereich von 2 bis
400 cm erfasst werden. Die Messgenauigkeit liegt bei 3 mm.
Die Spannungsversorgung beträgt 5 VDC, Stromaufnahme übersteigt nicht 2mA.
4-Relais-Modul HW-316. Die Relais können lasten bis zu 10A schalten.
Die Wasser-Behälter
Die Wasser-Behälter (Wasservorratsbehälter unten, Versuchsbehälter mit Ultraschallsensor oben)
Der Versuch wird mit zwei Wasserbehältern durchgeführt. Der oben angebrachte Versuchsbehälter wurde aus
einer Kunststoffflasche herausgeschnitten. Im unteren Bereich des Behälters befindet sich ein Loch, durch das Wasser
kontinuierlich abfließt. Zwei Wasser-Tauchpumpen fördern, wenn das Wasserniveau in dem Behälter zu stark absinkt, neues
Wasser aus einem Vorratsbehälter nach. Der Vorratsbehälter ist unten positioniert. Über den oberen Versuchsbehälter ist
der Ultraschallsensor angebracht, der das aktuelle Wasserniveau überwacht. Den Wasserspiegel in dem Versuchsbehälter auf
einem möglichst konstanten Niveau zu halten, ist es, worauf es in diesem Versuch ankommt.
Der Schaltplan
Schaltplan
Zwei Leuchtdioden (Rot und Grün) berichten, ob das SD Card Shield im Betrieb ist. Sobald die grüne
Leuchtdiode aufleuchtet, kann der eigentliche Versuch gestartet werden. Wenn die rote Leuchtdiode aufleuchtet, muss
geprüft werden, ob das Shield richtig aufgesteckt ist und die Speicherkarte eingesetzt wurde. Mit dem Taster S1 wird
das Programm gestartet. Das gewünschte Zielniveau wird mit dem Potenziometer P1 eingestellt. Die gelbe Leuchtdiode
leuchtet dann auf, wenn sich der aktuelle Wasserstand im Zielbereich befindet.
Die Testschaltung
Die Testschaltung
Komplette Versuchsanordnung
Komplette Versuchsanordnung
Das Programm (Sketch)
// *****************************************************************************
// Zweipunktregler mit dem Ultraschall HC-SR04
// Verlauf-Aufzeichnung mit SD Card Shield
// Arduino Uno, IDE 1.8.16
// *****************************************************************************
// Bibliotheken
#include<SPI.h>#include<SD.h>#include<HCSR04.h>int chipSelect = 4; // SD-Karte Pins
int SD_Karte_OK = 7; // LED grün, Karte OK
int SD_Karte_Fehler = 6; // LED rot, Karte Fehler
int SR04_Trig_Pin = 8; // Ultraschall Trigger Pin
int SR04_Echo_Pin = 9; // Ultraschall Echo Pin
int Programm_Start = 4; // Schalter Programm Start
int Ziel_erreicht = 5; // LED gelb, Regelungsziel erreicht
int Pumpe_1 = 2; // Ausgang Pumpe 1
int Pumpe_2 = 3; // Ausgang Pumpe 2
int Analogeingang = A0; // Potenziometer
int Messung_Nummer = 0;
int Hysterese = 10;
int Pumpen_ea;
UltraSonicDistanceSensor distanceSensor(SR04_Trig_Pin, SR04_Echo_Pin); // Initialisierung des Sensors
void setup() {
pinMode(Programm_Start, INPUT_PULLUP);
pinMode(SD_Karte_Fehler, OUTPUT); // LED rot
pinMode(SD_Karte_OK, OUTPUT); // LED grün
pinMode(Pumpe_1, OUTPUT); // Pin 2 als Ausgang
pinMode(Pumpe_2, OUTPUT); // Pin 3 als Ausgang
pinMode(Ziel_erreicht, OUTPUT); // gelbe LED
if (!SD.begin(chipSelect)) { // SD-Karte initialisieren
digitalWrite (SD_Karte_Fehler, HIGH); // Karte-Fehler oder nicht
digitalWrite (SD_Karte_OK, LOW); // vorhanden, rote LED an
while (1);
}
digitalWrite (SD_Karte_Fehler, LOW); // Karte OK, grüne LED an
digitalWrite (SD_Karte_OK, HIGH);
digitalWrite(Pumpe_1, HIGH); // Pumpe AUS
digitalWrite(Pumpe_2, HIGH); // Pumpe AUS
}
void loop() {
// Ist-Niveau ablesen
int Ist_Niveau = distanceSensor.measureDistanceCm()*10;
// Ziel-Niveau bestimmen
// Min = 150 mm
// Max = 40 mm
float Multiplikator = 150.0 / 1023.0;
int Poti_Wert = analogRead(Analogeingang);
int Ziel_Niveau = Multiplikator * Poti_Wert;
if (Ziel_Niveau < 40) {
Ziel_Niveau = 40;
}
if (digitalRead(Programm_Start) == LOW) { // Programm start
// Regelung
int Schaltpunkt_Unten = Ziel_Niveau + (Hysterese/2);
int Schaltpunkt_Oben = Ziel_Niveau - (Hysterese/2);
if (Ist_Niveau > Schaltpunkt_Unten) { // Pumpen EIN
digitalWrite(Pumpe_1, LOW);
digitalWrite(Pumpe_2, LOW);
Pumpen_ea = 1;
}
if (Ist_Niveau < Schaltpunkt_Oben) { // Pumpen AUS
digitalWrite(Pumpe_1, HIGH);
digitalWrite(Pumpe_2, HIGH);
Pumpen_ea = 0;
}
if ((Ist_Niveau > Schaltpunkt_Oben) && (Ist_Niveau < Schaltpunkt_Unten)) {
digitalWrite(Ziel_erreicht, HIGH); // gelbe LED ein
} else {
digitalWrite(Ziel_erreicht, LOW);
}
// Daten aufzeichnen
String Meine_Daten = "";
Messung_Nummer ++; // Messung Nummer
Meine_Daten += String(Messung_Nummer);
Meine_Daten += ",";
Meine_Daten += String(Ziel_Niveau); // Sollwert
Meine_Daten += ",";
Meine_Daten += String(Ist_Niveau); // Istwert
Meine_Daten += ",";
Meine_Daten += String(Pumpen_ea); // Pumpen Status
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(Meine_Daten); // Daten schreiben
dataFile.close();
}
}
delay (1000); // Wartezeit
}
// *****************************************************************************
Ein Beispiel für die Aufzeichnung der Daten auf einer Speicherkarte
findest du hier:
Die Bibliothek "HCSR04.h", die hier für den Ultraschall HC-SR04 zum Einsatz kommt, ist unter diesem Link zu finden:
https://github.com/Martinsos/arduino-lib-hc-sr04
Wie oben bereits erwähnt, die Schaltung wird mit dem Schalter S1 aktiviert. Der Ultraschall misst die
aktuelle Entfernung zum Wasserspiegel, die im Programm in der Variable „Ist_Niveau“ festgehalten wird. Der Wert von
"Ist_Niveau" wird mit dem Wert der Variable „Ziel_Niveau“ verglichen. Befindet sich der aktuelle Wasserstand unterhalb
des Zieles, werden die Pumpen eingeschaltet. Sie liefern mehr Wasser, als es durch das Störungsloch abfließt. Dank
dessen steigt der Wasserspiegel wieder an. Sobald er sich oberhalb des Zieles einpendelt, werden die Pumpen abgeschaltet.
Das ist das Prinzip eines Zweipunktreglers. Es wird ständig zwischen zwei Schaltzuständen gewechselt.
Es gilt: Entweder EIN oder AUS.
Damit die Schaltvorgänge nicht allzu oft stattfinden, wird zusätzlich eine Hysterese eingeführt. Mit dem Hysteresewert
kann die Anzahl der Schaltvorgänge minimiert werden. Wenn der Hysteresewert z.B. 20 mm beträgt und das Zielwert bei 100
mm liegt, werden die Pumpen bei 110 mm ein- und erst bei 90 mm abgeschaltet. Eine hohe Hysterese verschlechtert
allerdings das Regelergebnis.
Die während des Versuches (Kurzvideo) auf der Speicherkarte gesammelten Daten bestätigen (trotz Ungenauigkeiten) das
Prinzip eines Zweipunktreglers. Grafische Auswertung sieht wie folgt aus:
Versuchsverlauf
Die blaue Linie stellt den Sollwert, der mit dem Potenziometer eingestellt wurde, dar. Bei der roten Linie
handelt es sich um die Istwerte. Die grüne
Linie zeigt, wann die Pumpen ein- oder ausgeschaltet wurden. Bei der Betrachtung ist darauf zu achten, dass bei niedrigem
Wasserspiegel die Entfernung zum Sensor groß ist. Ein hohes Niveau ist mit kleiner Entfernung zum Sensor verbunden.
Ein großer Vorteil eines Zweipunktreglers ist seine Einfachheit, Zuverlässigkeit und geringe Kosten. Die Qualität
der Regelung ist nur bedingt zufriedenstellend. Zur beachten ist u.a. die Schalthäufigkeit, die zum schnellen Verschleiß
der Schaltelemente führen kann. Bevor man sich für eine Lösung mit Zweipunktregler entscheidet, soll die Regelstrecke und
die Anforderungen an die Regelung genau untersucht werden. Erst dann kann entschieden werden, ob der Regler die optimale
Lösung für die gestellte Aufgabe darstellt.