Gewichtsgeregelte Flüssigkeitsdosierung

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor: Asmaa Kachout Aarourou & Daniel Gosedopp & Florian Pichmann
Betreuer: Marc Ebmeyer


Einleitung

Im Studiengang Business and Systems Engineering wird im Rahmen des Fachpraktikums "Angewandte Elektrotechnik" ein Gruppenprojekt entwickelt.

Dieses Projekt befasst sich mit einer gewichtsgeregelten Flüssigkeitsdosierung, die für Anwendungen mit grammgenauen Gewichtsanforderungen verwendet werden kann. Als Beispiel kann hier die Chemieindustrie bei der Abfüllung von Reinigungs-/Pflegeprodukten oder das Mixen von Nährstofflösungen für Pflanzen genannt werden. Auch der Einsatz in Schulen zur Durchführung von Experimenten mit Flüssigkeiten ist möglich.

Der Automat soll eine gewünschte Flüssigkeitsmenge mittels einer Pumpe und Schlauchverbindungen aus einem Tank in ein bereitstehendes Gefäß einfüllen. Die Sollmengenvorgabe wird mit einem Touchscreen realisiert. Hier kann entweder direkt das Gewicht oder die bekannte Dichte der Flüssigkeit zusammen mit dem gewünschten Volumen in z.B. Milliliter vorgegeben werden. Der Regelkreis wird mithilfe einer Wägezelle als Sensor, auf der das Zielbehältnis platziert wird, und einer Peristaltikpumpe (Schlauchpumpe) als Aktuator realisiert. Die Software (Signalverarbeitung, Regler) läuft auf einem Mikrocontroller. Die Vorgehensweise bei der Bearbeitung des Projekts orientiert sich am V-Modell, weshalb auch dieser Wiki-Artikel in die Phasen des V-Modells bis zum Komponententest gegliedert ist.

Insgesamt besteht das Projekt aus den drei Hauptteilen Hardwareaufbau, Software für Signalverarbeitung und Regler sowie Software für das Touchdisplay. Die Arbeitsaufteilung innerhalb der Gruppe erfolgt an diesen Teilen.

Anforderungen

Tabelle 1: Anforderungsliste
ID Typ (I = Info, A = Anforderung) Kapitel Inhalt Ersteller Datum Geprüft von Datum
001 I 1 Hardware
002 A Es muss eine Wägezelle verbaut werden, welche in der Lage ist, die Flüssigkeitsmenge mit einer Genauigkeit von +/- 1g zu messen. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
003 A Es wird eine regelbare Peristaltikpumpe (Schlauchpumpe) verbaut. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
004 A Zur Sollwertvorgabe wird ein Touchdisplay verwendet (HMI). Hier kann entweder ein gewünschtes Gewicht oder die Dichte der Flüssigkeit zusammen mit dem gewünschten Volumen angegeben werden. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
005 A Für die Daten- und Signalverarbeitung, die Regelung und die Anbindung des Touchdisplays wird ein Arduino Mikrocontroller genutzt. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
006 A Es müssen zwei Behälter (z.B. Becherglas) vorhanden sein. Einer dient als Vorrat, der Andere als Zielgefäß. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
007 A Der Transport der Flüssigkeit zwischen den Behältern erfolgt durch Kunststoffschlauchverbindungen. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
008 A Die Energieversorgung wird von einem externen Netzteil übernommen. Dieses muss genug Leistung haben, um die gesamte Elektronik zu betreiben. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
009 I 2 Software
010 A Für die Erstellung der Software wird Matlab/Simulink verwendet. Ggf. wird aus dem Modell C-Code generiert, welcher auf den Arduino geflasht wird. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
011 A Die Software muss die Eingabe auf dem Touchdisplay zu einem Sollwert für die Regelung verarbeiten. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
012 A Es muss ein Kalibriermodus für die Wägezelle vorhanden sein. Die Kalibrierung wird ebenfalls mit Hilfe des Touchscreens vorgenommen. Hierzu ist ein Kalibriergewicht notwendig. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
013 A Das gemessene Ist-Gewicht wird mit dem Sollwert zu einer Regeldifferenz verrechnet, sodass der Regler eine Stellgröße zur Ansteuerung der Pumpe berechnen kann. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
014 A Es wird ein stetiger Regler verwendet. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
015 I 3 Dokumentation
016 A Alle Projektdateien werden in SVN hinterlegt. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023
017 A Das gesamte Projekt wird im Wiki dokumentiert. Pichmann 05.10.2023 Kachout, Gosedopp 06.10.2023



Tabelle 2: Bill of Materials (BOM)
Anzahl Komponente Preis
1 Kamoer KCM Peristaltikpumpe 50,38€
1 Arduino Mega 2560 15,95€
1 Wägezelle RBS15855 1,95€
1 HX711 24 Bit ADU 0,89€
1 Touchdisplay
1m Kunststoffschlauch 6mm 9,49€


Funktionaler Systementwurf/Technischer Systementwurf


  • Abbildung 1: Skizze funktionaler Systementwurf


  • Abbildung 2: Skizze technischer Systementwurf


Komponentenspezifikation

Die erforderlichen Komponenten und ihre spezifischen Anforderungen sind in diesem Abschnitt detailliert beschrieben.

Wägezelle- & Messtechnik

Primärsensor & Signalanpassung

Als Primärsensor kommt ein Dehnungsmessstreifen (kurz: DMS) zum Einsatz. Dieser beruht auf dem dehnungsresistiven Effekt. Hierbei kommt es in Folge mechanischer Ausdehnung zu einer Änderung des elektrischen Widerstands eines Leiters durch Einwirken der zu messenden mechanischen Größe. Letztere ist in unserem Fall eine Gewichtskraft. Im Hook’schen Bereich des Leitermaterials gilt für die Steigung k der Hook’schen Geraden:



Für die Widerstandsänderung in Folge einer Dehnung ergibt sich demnach:



Hierbei ist ein Dehnfaktor, der materialabhängig und einem Datenblatt zu entnehmen ist. ist der Basiswiderstand des DMS im ungedehnten Zustand. ist die Gesamtlänge des Leiters und die Änderung der Leiterlänge in Folge der Dehnung . Die Widerstandsänderungen sind im Verhältnis zum Basiswiderstand des DMS sehr gering, weshalb auch die Spannungsänderungen an den DMS gering sind. Daher ist die Verschaltung eines/mehrere DMS in Brückenschaltung notwendig. Die Schaltung an der in diesem Projekt verwendeten Wägezelle besteht aus vier DMS, die zu einer Vollbrücke aufgebaut sind. Die DMS sind paarweise so angeordnet, dass sich ihre Empfindlichkeitsrichtungen gegenüberstehen. Auf der Wägezelle sieht das wie in Abbildung XY dargestellt aus.

  • Abbildung 3: Vier DMS in Brückenschaltung an der Wägezelle (links)[1] und das Schaltbild (rechts)

Gemessen wird die Potentialdifferenz zwischen Knoten 2 und 3 aus Abbildung XY, welche sich mit der Formel



berechnet, Wobei die Brückenspeisespannung konstant ist. Wie bereits beschrieben, sollen sich die Empfindlichkeitsausrichtungen gegenüberstehen, was im Falle der Vollbrücke bedeutet

und

Werden diese Zusammenhänge in die obige Gleichung eingesetzt, so vereinfacht sich diese zu



Es handelt sich also um einen linearen Zusammenhang zwischen der Ausgangsspannung und der Widerstandsänderung. Laut Datenblatt des Sensors beträgt die Ausgangsempfindlichkeit bei maximaler Belastung der Wägezelle. Die genutzt Versorgungsspannung beträgt in unserem Fall , was für die maximale Ausgangsspannungsänderung einen Bereich von



ergibt. Die Vollbrückenschaltung liefert also immernoch sehr kleine Ausgangsspannungswerte, weshalb eine Verstärkerschaltung benötigt wird. Ein HX711 Breakout-Board ist speziell für Wägezellen entwickelt worden und beinhaltet einen programmierbaren Verstärker, einen 24-Bit Analog-Digital-Wandler, eine Digitalschnittstelle und weitere Komponenten (siehe Abbildung XY).

  • Abbildung 3: Blockschaltbild und äußere Beschaltung des HX711 Chips

Mit dem Verstärker lassen sich Verstärkungen von 128 (für Eingangsspannungsdifferenzen von ) oder 64 (für Eingangsspannungsdifferenzen von ) einstellen. Für die eben berechneten maximalen Ausgangsspannungsdifferenzen unserer Wägezelle () wird eine Verstärkung von 128 gewählt, sodass bei maximaler Belastung eine verstärkte Spannung von max. erzielt wird. Diese Spannung wird vom 24-Bit A/D-Wandler digitalisiert. Als Referenzspannung für den A/D-Wandler dient die Versorgungsspannung, wodurch sich für eine Quantisierungsstufe eine Auflösung von



ergibt. Bezogen auf unseren Messbereich können also



Werte unterschieden werden. Das bedeutet, dass die theoretisch kleinste messbare Gewichtsänderung



beträgt, was aufgrund von Messrauschen, Vibration (z.B. in Folge der Schrittmotorbewegung), Temperatur- oder sonstigen Umwelteinflüssen in der Praxis nicht erreicht werden kann. Allerdings wird unsere Genauigkeitsanforderung von deutlich erfüllt.

Serielle Schnittstelle

Die dem A/D-Wandler nachgeschaltete Digitalschnittstelle übernimmt die Kommunikation nach außen zu unserem Mikrocontroller. Wenn am Daten-Pin „DOUT“ ein HIGH-Pegel anliegt, so ist die A/D-Wandlung noch nicht abgeschlossen. In dieser Zeit muss der Clock-Pin „PD_SCK“ auf LOW gesetzt sein. Wenn DOUT seinen Pegel von HIGH auf LOW wechselt, ist eine A/D-Wandlung abgeschlossen und es kann der Messwert ausgelesen werden. Dazu müssen 25 Pulse vom Arduino an PD_SCK geschickt werden. Ein Puls ist dabei ein HIGH-Pegel, gefolgt von einem LOW-Pegel, welche beide ca. 1µs gehalten werden sollen. Mit jedem Puls wird ein Bit an den Daten-Pin DOUT weiter geshiftet, welches vom Arduino eingelesen wird. Nach dem 25. Puls wird DOUT wieder auf HIGH gezogen, bis die nächste Wandlung abgeschlossen ist. Das 24-Bit Datum wird als Zweierkomplementzahl, angefangen beim höchstwertigsten Bit, übertragen. Softwareseitig muss der Wert also in einem 32-Bit Integer gespeichert werden. Die Timing-Tabelle zeigt Abbildung XY.

  • Abbildung 3: Timing-Tabelle der seriellen Datenübertragung

Der Sensor liefert also einen 24-Bit Wert. Da es sich wie beschrieben um lineare Zusammenhänge handelt, kann eine Sensorkalibrierung mit zwei Messpunkten erfolgen. Die erste Messung stellt das „Nullen“ der Rohwerte (Offsetkompensation) dar, sodass sich eine Ursprungsgerade ergibt. Alle Rohdatenmessungen müssen nachfolgend offsetkompensiert genutzt werden. Mit der zweiten Messung lässt sich die Steigung der Geraden berechnen. Eingangswerte sind die offsetkompensierten Rohdaten (x-Achse), Funktionswerte sind die Gewichte in Gramm (y-Achse). Gegeben sind also die Punkte

und

: Offsetkompensierter Rohwert bei Auflegen eines bekannten Kalibriergewichts
: Aufgelegtes, bekanntes Kalibriergewicht in Gramm

Die Steigung (hier mit gekennzeichnet) berechnet sich dann zu

,

sodass die Geradengleichung folgendermaßen aussieht:

Messkette

Auf Basis der erläuterten Zusammenhänge ergibt sich die Messkette in Abbildung XY.

  • Abbildung 3: Messkette des Sensors

Die Dehnung wird von den Dehnungsmessstreifen in Widerstände proportional übersetzt. Als Messschaltung liegt die Vollbrückenschaltung vor, dessen Ausgangsspannung von der Verstärkereinheit mit dem Faktor 128 verstärkt wird. Diese Spannung wird dann analog-digital-gewandelt. Die analoge Spannung liegt also jetzt in digitaler Form als 32-Bit Ganzzahl im Speicher des Mikrocontrollers vor. Die Signalverarbeitung zieht von dem Wert den Kalibrieroffset ab und multipliziert ihn mit der Steigung . Das Ergebnis, welches zunächst digital vorliegt, ist die Masse des vermessenden Objekts, also das Gewicht. Zum Schluss erfolgt die Ausgabe des Ergebnisses z.B. auf dem verwendeten Touchdisplay.

Kamoer Peristaltikpumpe

Diese Peristaltikpumpe nutzt einen Schrittmotor als Aktuator, welcher mit dem Arduino über einen A4988-Treiberchip angesteuert werden kann. Vom Arduino lassen sich über Digitalpins die Drehrichtung sowie die Geschwindigkeit in gewissen Grenzen einstellen. Außerdem kann die Motorbewegung über einen Enable-Pin ganz abgeschaltet bzw. eingeschaltet werden. Der Schrittmotor wird um einen Schritt weiterbewegt, wenn der Arduino einen Puls auf den Step-Pin des Treiberchips liefert. Über die Pulsfrequenz kann also die Geschwindigkeit der Drehung des Motors eingestellt werden. Die Pumpe besitzt eine maximale Fördergeschwindigkeit von und wird mit einer Spannung von versorgt. Die zugehörige Softwarekomponente bzw. der Simulink-Block hat folgende Spezifikationen:

Eingänge

  • Geschwindigkeit [Steps/s]
ID Kapitel Inhalt Ersteller Datum
1 1 Zum Betrieb des Schrittmotors wird die AccelStepper Bibliothek verwendet. Damit lässt sich die vom Regler berechnete Sollgeschwindigkeit direkt einstellen. Gosedopp 12.01.2023
2 1 Sobald die Regeldifferenz hinreichend gering ist, wird keine Motorbewegung mehr zugelassen, d.h. die Geschwindigkeit wird auf 0 gesetzt. Kachout, Gosedopp 13.11.2023
3 1 Am Dir-Pin (Richtungspin) liegt immer der Pegel für die korrekte Pumprichtung an. Da nur in eine Richtung gepumpt wird, ist dieser Pegel konstant und hängt von der Einbaurichtung des Motors ab. Kachout, Gosedopp 13.11.2023

Touchdisplay

Ein Touchdisplay dient der einfachen Sollwertvorgabe. Hier kann der Benutzer nicht nur das gewünschte Gewicht, sondern auch die Dichte und das Volumen der Flüssigkeit einstellen vorgeben. Um eine einfache Interaktion zu ermöglichen, bietet diese interaktive Mensch-Maschine-Schnittstelle (Human-Machine-Interface, kurz: HMI) eine angemessene Displaygröße, eine ansprechende Oberfläche und die Kompatibilität mit dem Arduino. Die Softwarekomponente ist wie folgt spezifiziert:

Eingänge

  • Clock (erzeugt in jedem Sample eine Flanke, ohne funktioniert Simulinkmodell nicht)

Ausgänge

  • Sollgewicht [g]
  • Istgewicht [g]
ID Kapitel Inhalt Ersteller Datum
1 2 Das Sollgewicht (Sollwert der Regelung) wird über das Touchdisplay entweder direkt eingegeben oder über die Formel Sollgewicht = Dichte * Volumen berechnet. Kachout 10.11.2023
2 2 Es gibt einen "Löschen" Button, um falsche Eingaben zu korrigieren. Kachout 10.11.2023
3 2 Im Kalibriermodus wird mit einem bekannten Gewicht kalibriert. Gosedopp 10.11.2023
4 2 Mit den Kalibrierwerten berechnet sich das gemessene Gewicht wie in Abschnitt 4.2 beschrieben über eine lineare Gleichung. Gosedopp 10.11.2023
5 2 Es wird bei Eingaben auf dem Touchdisplay jeweils vorher angezeigt, in welchen Einheiten die Eingaben zu tätigen sind. Gosedopp 10.11.2023
6 2 Das Gewicht wird in , die Dichte in und das Volumen in eingegeben. Gosedopp 10.11.2023
7 2 Läuft die Messung, dann wird das Sollgewicht sowie das Istgewicht auf dem Display angezeigt. Gosedopp 10.11.2023
8 2 Eine laufende Messung kann abgebrochen werden ("Abbruch"-Button). Gosedopp 10.11.2023
9 2 Ist die Messung abgeschlossen, kann durch einen "Fertig"-Button auf die Startseite zurückgekehrt werden. Gosedopp 10.11.2023

Regler

Eingänge

  • Regeldifferenz (Sollgewicht - Istgewicht) [g]

Ausgänge

  • Geschwindigkeit [Steps/s]

Parameter

  • Kp
ID Kapitel Inhalt Ersteller Datum
1 3 Ein stetiger Regler berechnet aus der Regeldifferenz eine Stellgröße. Diese ist konkret die Geschwindigkeit des Motors. Kachout, Gosedopp 13.11.2023
2 3 Negative Regeldifferenzen werden durch einen "Saturation"-Block eliminiert (zu Null gesetzt), da die Pumpe die Flüssigkeit nicht zurückpumpt. Kachout, Gosedopp 13.11.2023
3 3 Die Regelgröße darf nicht überschwingen, ebenfalls aus dem Grund, dass die Pumpe nicht zurückpumpt. Kachout, Gosedopp 13.11.2023
3 3 Der Regler besitzt gutes Führungsübertragungsverhalten, da keine Störungen in Form von Abflüssen vorliegen. Kachout, Gosedopp 13.11.2023
4 3 Der Regler muss in der Lage sein, die Sollgröße stationär zu erreichen. Kachout, Gosedopp 13.11.2023

Umsetzung (HW/SW)

Hardware

Die Umsetzung der Hardware umfasst die Verkabelung und Verlötung der elektrischen Komponenten, sowie die Entwicklung eines Gehäuses, worin die Komponenten untergebracht werden können.
Für das Gehäuse wurde zunächst mittels CAD-Software ein 3D-Modell entworfen, worin auch die einzelnen Komponenten mit deren Abmessungen berücksichtigt wurden. Dadurch konnten die Anordnung der Komponenten und entsprechende Größen einzelner Bauteile bestimmt werden. Durch den benötigten Bauraum stellte sich heraus, dass ein Gehäuse aus Holz sehr gut Umsetzbar ist. In diesem befinden sich dann die Peristaltikpumpe, der ArduinoMega, ein Netzteil zur Spannungsversorgung, ein Spannungswandler, ein Treibermodul für die Pumpe und ein 24bit-Analog-Digital-Umwandler, welcher das Messsignal der Wägezelle verarbeitet. Die Wägezelle selbst wird vor dem Gehäuse montiert. Diese benötigt Abstand zum festen Untergrund und zu dem "Wiegeteller", auf dem das Gefäß, in dem die Flüssigkeit gewogen wird, abgestellt werden kann. Durch diese Montageweise ist gewährleistet, dass sich die Wägezelle durch die erzeugte Gewichtskraft verformen kann und die Dehnungsmessstreifen eine elektrische Spannung erzeugen. Das HMI zur Eingabe der Flüssigkeitsdosierung wird, entgegen der ursprünglichen Idee, auf dem Gehäuse montiert, um es einfacher bedienen zu können.
Neben dem Gehäuse aus Holz wurden weitere Bauteile aus Kunststoff mittels dem Fused Deposition Modelling (FDM) Verfahren gefertigt, welche hauptsächlich die Funktion haben, einzelne Komponenten in Position zu halten. Folgende Bauteile wurden per FDM gefertigt und verbaut:

  • Aufnahme für das HMI (Deckel des Gehäuses)
  • 2 Ausgüsse mit Schlauchdurchführung, inkl. 2 Halter für die Ausgüsse
  • Halterung für das Netzteil
  • Halterung für die Peristaltikpumpe
  • Wiegeteller

In den folgenden Abbildungen ist links das 3D-Modell und rechts die Umsetzung dessen in die Realität zu sehen:


EINFÜGEN


Die elektrische Verbindung von HMI zu dem ArduinoMega erfolgt über ein Flachbandkabel. Der Arduino selbst ist so im Gehäuse montiert, dass seine USB-Schnittstelle für eventuelle Änderungen gut zugänglich ist. Alle Verkabelungen, welche vom Arduino abgehen, sowie die Verbindungen am Spannungswandler sind fest verlötet. Die restlichen Verbindungen sind steckbar.

In folgender Abbildung ist der Verdrahtungsplan zu sehen:


EINFÜGEN



Software

Die Umsetzung der Software für den Mikrocontroller erfolgt in MATLAB/Simulink. Sie besteht aus den wesentlichen Bestandteilen

  • Touchdisplays
  • Sensorsignalverarbeitung
  • Regler
  • Pumpenansteuerung

Touchdisplay und Sensorsignalverarbeitung sind im Programmablaufplan eng verknüpft und werden daher innerhalb eines Blocks umgesetzt. Für das Touchdisplay werden mehrere externe Bibliotheken genutzt, mit denen der Touchpunkt ausgelesen und die Anzeige von Text bzw. die Erstellung von Buttons ermöglicht wird. Für die Sensorsignalverarbeitung sind Bitshift-Operationen notwendig. Beides führt dazu, dass nicht mehr nur mit Standard-Simulink-Blöcken gearbeitet werden kann, sondern der C++ Code direkt in einem S-Function-Builder Block untergebracht werden muss. Welche Einstellungen man in dem Block tätigen muss, zeigt der Artikel Erstellen eigener S-Functions.

Touchdisplay

Die Software des Touchdisplays erfordert die Bibliotheken UTFT, UTFT_Buttons und URTouch, welche in der S-Function hinzugefügt werden müssen. Anschließend kann jede Seite nach vorab überlegtem Konzept implementiert werden. Da der Code dazu sehr lang ist, sei an dieser Stelle auf die Dokumentation der Bibliotheken unter den jeweiligen Links sowie unserer kommentierten Implementierung in SVN verwiesen. Wie eine einzelne Seite dargestellt wird, zeigt nichtsdestotrotz folgender Code-Schnipsel:

/***********************************************
Funktion zum Zeichnen der Startseite auf dem LCD
***********************************************/

// Parameter: Zeiger auf UTFT_Buttons Objekt
void drawStartseite(UTFT_Buttons *myButtons)
{
	// Display bereinigen
	myGLCD.clrScr();
	
	// Alle alten Buttons löschen
	myButtons->deleteAllButtons();
	
	// Neue Buttons anlegen. In diesem Fall zwei Buttons
	but1 = myButtons->addButton( 10,  140, 300,  30, "Messen");
	but2 = myButtons->addButton( 10,  180, 300,  30, "Kalibrieren");
	
	// Buttons zeichnen
	myButtons->drawButton(but1);
	myButtons->drawButton(but2);

	// Hintergrundfarbe und Textfarbe einstellen (RGB)
	myGLCD.setBackColor(0, 0, 0);   // Hintergrund schwarz
	myGLCD.setColor(255, 255, 255); // Text weiß
	
	// Text zeilenweise auf Display anzeigen
	myGLCD.print("Gewichtsgeregelte", CENTER, 50);
	myGLCD.print("Fluessigkeits-", CENTER, 70);
	myGLCD.print("dosierung", CENTER, 90);

	// Interne Variable für die aktuelle Seite zum späteren Abfragen
	seite = 1;
}

Die Abfrage eines Buttons sähe dann so aus:

// Wird das Display gedrückt?
if (myTouch.dataAvailable() == true)
{
	// Wenn die aktuelle Seite die Startseite ist, dann...
	if (seite == 1)
	{
		// ...überprüfe, welcher Button gedrückt wurde
		but = myButtons.checkButtons();
		
		// Wenn das der erste Button, also "Messen" war, dann...
		if (but == but1)
		{
			// ...zeichne die zugehörige nächste Seite "Messen"
			drawMessen(&myButtons);
		}
		
		// Wenn das der zweite Button, also "Kalibrieren" war, dann...
		else if (but == but2)
		{
			// ...zeichne die zugehörige nächste Seite "Kalibrieren1"
			drawKalibrieren1(&myButtons);
		}
		
		// Ansonsten nichts machen
	}
}

Sensorsignalverarbeitung

Wie bereits ausführlich erläutert, liefert der Sensor seriell eine 24-Bit Zweierkomplementzahl, welche entsprechend der Timing-Chart eingelesen werden muss. Der Code dazu sieht so aus:

/************************************************
Funktion zum Empfangen des  übertragenen Rohwerts
************************************************/

float scaleGetRaw()
{
	// Solange der Datenpin auf HIGH ist, ist die Messung noch nicht abgeschlossen
	while (digitalRead(myScale.dataPin) == HIGH) 
	{
		// Scheduler freigeben
		yield();
	}

	// Union zum Byteweisen Datenempfang
	union
	{
		// Variable vom Datentyp 32-Bit Zweierkomplementzahl
		long value;
		
		// Array vom Datentyp vorzeichenlose 8-Bit Ganzzahl
		uint8_t data[4];
	} rohwert;	// Direktes Anlegen Variable des Union Datentyps
	
	// Wert Nullen
	rohwert.value = 0;

	// Interrupts blockieren, ansonsten Übertragungsfehler möglich
	noInterrupts();

	// 25 Pulse an den Clock-Pin aussenden
	// In den ersten 24 Pulsen die geshifteten Daten am Datenpin auslesen
	rohwert.data[2] = shiftIn(myScale.dataPin, myScale.clockPin, MSBFIRST);
	rohwert.data[1] = shiftIn(myScale.dataPin, myScale.clockPin, MSBFIRST);
	rohwert.data[0] = shiftIn(myScale.dataPin, myScale.clockPin, MSBFIRST);

	// 25. Puls, um die Verstärkung auf 128 zu halten
	digitalWrite(myScale.clockPin, HIGH);
	digitalWrite(myScale.clockPin, LOW);
	
	// Interrupts wieder erlauben
	interrupts();

	// Vorzeichen von 24-Bit Wert an 32-Bit Wert anpassen
	if (rohwert.data[2] & 0x80) 
	{
		rohwert.data[3] = 0xFF;
	}
	
	// Rohwert als Fließkommazahl zurückgeben
	return 1.0 * rohwert.value;
}

Daraus wird das Istgewicht mit der ebenfalls bereits erklärten linearen Gleichung berechnet:

/***********************************************
Funktion zum berechnen des Messwerts in Gramm
***********************************************/

float scaleRead()
{
	// Wert einlesen und lineare Gleichung anwenden
	float units = myScale.scale * (scaleGetRaw() - myScale.offset);
	
	// Wert zurückgeben
	return units;
}

Regler

Zur Implementierung und Auslegung des Reglers wird zunächst ein Modell der Regelstrecke, also des Systems erstellt. Dieses Modell wird experimentell ermittelt, indem ein Sollwertsprung der Motorgeschwindigkeit in eingeleitet wird. Um die richtige Reglerart zu bestimmen, wird die Führungsübertragungsfunktion des geschlossenen Regelkreises für einen P-Regler betrachtet:

Der Regler wird vollständig in Simulink umgesetzt. Das Subsystem sieht in Simulink folgendermaßen aus:

HIER BILD EINFÜGEN


Pumpenansteuerung

Für diese Softwarekomponente wird ebenfalls eine S-Function erstellt, um die AccelStepper Bibliothek nutzen zu können.

Komponententest

Ergebnis

Nach Durchführung der Komponententests konnte das Gesamtsystem in Betrieb genommen werden. Zum Test wurden für die Flüssigkeiten Wasser, Milch und Speiseöl verschiedene Sollwerte auspropbiert, dessen Ergebnisse im Folgenden einmal dargestellt werden.

Dosierung von Wasser

Für Wasser wurden drei Test durchgeführt. Beim ersten Test wurde ein Sollwert von vorgegeben.

  • Abbildung 3: Ergebnis für Wasser mit Sollwert =

Hier ist gut das I-Verhalten der Regelstrecke ersichtlich. Außerdem kann man die Arbeitsweise des P-Reglers erkennen, der ab einer bestimmten Schwelle beginnt, die Geschwindigkeit des Motors zu verringern, um sich dem Zielwert langsam und präzise anzunähern. Der erreichte Endwert liegt bei , was einer Abweichung von entspricht. Im nächsten Test wird der Sollwert mit vorgegeben.

  • Abbildung 3: Ergebnis für Wasser mit Sollwert =

Bei dieser Messung ergibt sich ein ähnlicher Verlauf. Der Endwert beträgt , was einer Abweichung von entspricht. Der letzte Test soll das Maximum des regelbaren Gewichts von ausprobieren.

  • Abbildung 3: Ergebnis für Wasser mit Sollwert =

Hier beträgt der Endwert , die Abweichung beträgt .

Dosierung von Milch

Aufgrund der erfolgreichen Tests mit Wasser, wird für Milch und Speiseöl nur jeweils ein Test durchgeführt.

  • Abbildung 1: Ergebnis für Milch mit Sollwert =

Dosierung von Speiseöl

  • Abbildung 1: Ergebnis für Speiseöl mit Sollwert =

Alle drei Systemtests waren erfolgreich und haben die Genaugikeitsanforderung deutlich übertroffen. Damit eignet sich dieser Aufbau optimal, um Flüssigkeiten bis zu einem Gewicht von präzise zu dosieren.

Zusammenfassung

Das Ziel dieses Projekts war es, ein System zu entwicklen, mit dem es möglich ist, Flüssigkeiten grammgenau zu dosieren. Anwendung findet ein solcher Aufbau beispielsweise in der Chemieindustrie zum Abfüllen von Reinigungs-/Pflegeprodukten. Uns war außerdem wichtig, dass es sich um ein Tischprojekt handelt, um ortsunabhängigkeit zu gewährleisten. Unser Aufbau besteht aus den Eingabe/Verarbeitung/Ausgabe-Komponenten Wägezelle und Touchdisplay (E)/Arduino MEGA 2560 (V)/Schrittmotor und Touchdisplay (A). Die Wägezelle ermöglicht über eine erläuterte Signalaufbereitungs-/Signalverarbeitungskette die Messung des Gewichts der zugrundeliegenden Flüssigkeit. Auf dem Mikrocontroller des Arduino-Boards wird eine Regeldifferenz berechnet, sodass ein P-Regler dem Schrittmotor eine Geschwindigkeit vorgeben kann. Die Ergebnisse zeigen, dass der Aufbau vollständig funktioniert und die gestellten Anforderungen erfüllt werden.

Ausblick

Im Folgenden soll ein kurzer Ausblick auf künftige Verbesserungen des Systems gegeben werden, die im Laufe der Umsetzung aufgekommen sind.

  • Zwar funktioniert das System einwandfrei, jedoch erfolgt das Pumpen der Flüssigkeit nur sehr langsam. Dies ist dem Fakt geschuldet, dass wir im Team noch keinerlei Erfahrung mit Pumpen hatten und schlecht einschätzen konnten, was angemessene Pumpgeschwindigkeiten sind. Außerdem ist die Ansteuerung des Schrittmotors nicht optimal umgesetzt worden. Hier wurde auf eine Bibliothek zurückgegriffen, die, wenn die Pumpe laufen soll, permanent eine Funktion aufrufen muss. Weil die Software aber noch andere Bausteine besitzt, kommt es zu einem deutlich hörbarem Ruckeln oder der Motor läuft erst garnicht an. Daher wurde eine Messung immer nur in einigen Programmzyklen genommen. Hier könnte in Zukunft auf die Bibliothek verzichtet und evtl. mit Hardware-Interrups gearbeitet werden. Der Step-Pin des Motortreibers wird dann vom Timer-Baustein des Mikrocontrollers per Interrupt in der für die Sollgeschwindigkeit entsprechenden Frequenz gepulst. Da die vollumfängliche Implementierung dieser Funktion aber aufwendig ist und dem entwickeln einer eigenen Bibliothek gleichbedeutend ist, wurde sich für den Weg der Nutzung einer Bibliothek entschieden. Eine Alternative wäre es, statt eines Schrittmotors einen Gleichstrommotor zu verwenden, der mittels Pulsweitenmodulation (PWM) angesteuert wird.
  • Ein weiteres Verbesserungspotential ergibt sich in der Anwendung des Aufbaus: Wenn z.B. in einem Messvorgang Öl dosiert wurde und im nächsten Vorgang Wasser dosiert werden soll, dann müssen die Schläuche gereinigt werden. Ein Reinigungsmodus war allerdings nicht vorgesehen und ist aktuell auch nicht implementiert. Die Schläuche müssen also ausgebaut und manuell gereinigt werden, was allerdings auch möglich ist.
  • Zum Kalibrieren der Waage sollten eigentlich auf mehrere Nachkommastellen genaue Kalibriergewichte genutzt werden. Da diese in der Anschaffung aber sehr teuer sind, haben wir uns dagegen entschieden und eine Präzisionswaage als "Kalibrator" verwendet. Nach [[2], S. 23] sollte zur Messung des Wertes des Kalibriergewichts ein um drei bis sechs Zehnerpotenzen genaueres Messmittel genutzt werden, was bei uns deutlich nicht der Fall ist. Auf diese Weise könnten die Ergebnisse sicherlich noch deutlich verbessert werden.

Lessons Learned

Dieses Projekt hat uns gelehrt, ein System gemäß V-Modell von der Anforderungsdefinition, bis zu den Komponententests und der Inbetriebnahme zu entwickeln. Dabei waren Kenntnisse in der Elektrotechnik, Informatik bzw. Embedded Software Entwicklung sowie dem Projektmanagement erforderlich. Der unterschiedliche Wissenstand der Gruppenmitglieder konnte dadurch zum Teil angeglichen werden. Es wurden aber auch die Stärken der Gruppenmitglieder gezielt ausgenutzt, um schneller ans Ziel zu kommen, da auch in Projekten in Unternehmen mehrere Menschen mit unterschiedlichen Aufgaben in Teams zusammenarbeiten. Des Weiteren sind als Lessons Learned die folgenden Punkte besonders hervorzuheben:

  • Viel Arbeitsleistung in der Entwurfsphase macht die Implementierungs-/Umsetzungsphase deutlich einfacher
  • Umgang mit einem Lötkolben sowie mit Entlötlitzen und -pumpen
  • Umgang mit elektronischer Hardware, Zusammenspiel der Komponenten
  • Erstellung von S-Functions in Simulink
  • Konstruktion von 3D-Druck-Teilen in SolidWorks

Projektunterlagen

Projektplan

Projektplan

Projektdurchführung

YouTube Video

Weblinks

Literatur


→ zurück zur Übersicht: WS 22/23: Angewandte Elektrotechnik (BSE)

  1. https://wolles-elektronikkiste.de/dehnungsmessstreifen
  2. Schiessle, E. (2010): Industriesensorik. Vogel Buchverlag. ISBN: 978-3-8343-3076-5.