-
Notifications
You must be signed in to change notification settings - Fork 1
Entwicklung
Zu Beginn wird die Basishardware des Systems zusammengebaut, sodass der Extruder mit seiner Aktorik und Sensorik an einen Controller angeschlossen werden kann.
- Extruder-Kit nach Anleitung montieren
- PT100 in die vorgesehene Bohrung einsetzen und mit einer Madenschraube fixieren
- PT100 an
F-
undF+
des Signalverstärkers anschließen - Die Heizpatronen in die vorgesehenen Bohrungen einsetzen und mit Madenschrauben fixieren
- Heizpatronen an jeweils ein Mosfet-Modul anschließen
- Mosfet-Module mit
24 V
Eingangsspannung versorgen
Zur initialen Entwicklung der Temperaturregelung wird der Einfachheit halber ein Arduino Uno verwendet. Hierzu wird der Arduino über USB mit einem Computer und über den SPI-Bus mit dem Temperatur-Sensorsignalverstärker verbunden. Dieser wird an 5 V
und GND
des Arduinos und mit den Pins SDI
, SDO
, CS
und CLK
an vier beliebige Digitalpins des Arduinos angeschlossen. Mithilfe der Bibliothek Adafruit_MAX31865.h
, die speziell für den Sensorsignalverstärker entwickelt wurde, kann nun ganz einfach die Temperatur am PT100 gemessen werden.
//Include libraries
#include <Adafruit_MAX31865.h>
//Define temperature sensor pins
#define MAX31865_CS 7 //Any digital pin
#define MAX31865_DI 8 //Any digital pin
#define MAX31865_DO 9 //Any digital pin
#define MAX31865_CLK 10 //Any digital pin
//Define PT100 parameters
#define RREF 430.0
#define RNOMINAL 100.0
//Declare temperature sensor
Adafruit_MAX31865 pt100(MAX31865_CS, MAX31865_DI, MAX31865_DO, MAX31865_CLK);
void setup() {
Serial.begin(9600);
pt100.begin(MAX31865_2WIRE);
}
void loop() {
Serial.println(pt100.temperature(RNOMINAL, RREF));
}
Die drei Mosfet-Module zur Ansteuerung der Heizpatronen werden ebenfalls jeweils an 5 V
und GND
des Arduinos angelegt. Außerdem wird jedes Modul mit dem Signal-Pin an einen PWM-Ausgang des Arduinos gelegt. Die Heizpatronen werden an den Ausgang der Mosfet-Module angeschlossen, wobei die Polarität keine Rolle spielt. Das Mosfet-Modul muss nun am Eingang mit 24 V
versorgt werden. Über ein PWM-Signal kann der Stromfluss durch die Heizpatronen und damit deren Leistung nahezu stufenlos gesteuert werden.
Die Nutzung der Arduino-Bibliothek PID_v1.h
ermöglicht eine einfache Regelung der Temperatur. Die Implementierung der Regelung in den obigen Code ergibt nun folgendes Arduino-Programm. Das PID-Objekt berechnet anhand der Soll- und Ist-Temperatur einen Wert zwischen 0
und 255
, der mit analogWrite()
direkt als PWM-Signal an die Mosfet-Module ausgegeben werden kann.
//Include libraries
#include <Adafruit_MAX31865.h>
#include <PID_v1.h>
//Define temperature sensor pins
#define MAX31865_CS 9 //Any digital pin
#define MAX31865_DI 10 //Any digital pin
#define MAX31865_DO 11 //Any digital pin
#define MAX31865_CLK 12 //Any digital pin
//Define heater pins
#define HEATER_1 3 //PWM pin
#define HEATER_2 5 //PWM pin
#define HEATER_3 6 //PWM pin
//Define PT100 parameters
#define RREF 430.0
#define RNOMINAL 100.0
//Define PID parameters
#define K_P 150.0
#define K_I 0
#define K_D 0
double heaterOutput;
double nominalTemp = 165.0; //[°C]
double actualTemp = 0.0; //[°C]
//Declare temperature sensor
Adafruit_MAX31865 pt100(MAX31865_CS, MAX31865_DI, MAX31865_DO, MAX31865_CLK);
//Declare PID object
PID pid(&actualTemp, &heaterOutput, &nominalTemp, K_P, K_I, K_D, DIRECT);
void setup() {
Serial.begin(9600);
pt100.begin(MAX31865_2WIRE);
pid.SetMode(AUTOMATIC);
pinMode(HEATER_1, OUTPUT);
pinMode(HEATER_2, OUTPUT);
pinMode(HEATER_3, OUTPUT);
}
void loop() {
//Read current temperature
actualTemp = pt100.temperature(RNOMINAL, RREF);
//Calculate PID output
pid.Compute();
//Update heater outputs
analogWrite(HEATER_1, heaterOutput);
analogWrite(HEATER_2, heaterOutput);
analogWrite(HEATER_3, heaterOutput);
//Print current temperature
Serial.println(String(actualTemp));
}
Die Reglerparameter K_P
, K_I
und K_D
müssen nun an das System angepasst werden. Durch eine sorgfältige Einstellung dieser Parameter ergibt sich ein Regelungsvorgang, der Dynamik und Genauigkeit optimal kombiniert. Die Anpassung der Reglerparameter erfolgt hier mithilfe der Einstellregeln nach Ziegler und Nichols.
Dabei werden im ersten Schritt die Parameter K_I = K_D = 0
und K_P = 1
gesetzt. Nun folgen mehrere Iterationen, in denen K_P
stetig erhöht und dabei der Regelvorgang aufgezeichnet wird, bis sich in der Temperatur eine gleichmäßige Schwingung einstellt. Sofern eine solche Schwingung zu beobachten ist, ist die kritische Verstärkung K_P_krit
erreicht.
Hinweis: Damit der Regler direkt für den finalen Prototypen eingestellt werden kann, wird der Extruder bereits zu diesem Zeitpunkt hitzeisoliert.
Die Erhöhung der Parameters K_P
ergab nachfolgenden Verlauf der Temperaturregelung, weshalb K_P_krit = 150
angenommen wird. Weiterhin lässt sich aus dem Plot eine Periodendauer von T_krit = 100 s
ablesen.
Nach Ziegler und Nichols berechnen sich die finalen Reglerparameter nun nach folgendem Muster.
Werden die berechneten Reglerparameter nun in obiges Arduino-Projekt übertragen, ergibt sich folgender Verlauf der Temperaturregelung.
Aufgrund der Trägheit des Systems kann die Regelung keine hohe Dynamik erreichen, allerdings ist die stationäre Genauigkeit der Regelung für die Anwendung im Extruder von höherer Bedeutung, da für die Extrusion eine konstante Temperatur benötigt wird. Damit ist der hier implementierte PID-Regler für die Anwendung im Extruder sehr gut geeignet.
Da der Extruder-Bausatz nur wesentliche Komponenten enthält, muss ein Trichter entworfen werden, der an den Trichter montiert werden kann und als Einfülltrichter für das Kunststoff-Rohmaterial dient. Der Getriebeblock
des Bausatzes bietet zwei freie Aufnahmen, an denen ein Trichter angebracht werden kann. Der Einfachheit halber wird ein Trichter konstruiert, der aus 2 mm
starkem Blech gebogen werden kann.
Die technischen Zeichnungen zur Fertigung des Einfülltrichters sind in cad/zeichnungen
abgelegt.
Für den Wicklungsmechanismus stehen zwei Schrittmotoren zur Verfügung, die über entsprechende Treiber angesteuert werden können. Einer der Motoren wird als Wicklungsmotor eingesetzt, auf dessen Welle die Filament-Spule montiert wird. Der zweite Motor dient als Führungsmotor und ist damit für die Positionierung des extrudierten Filaments auf der Breite der Spule verantwortlich.
Damit der Wicklungsmotor die Spule direkt antreiben kann, muss diese auf der Welle des Schrittmotors fixiert werden. Eine einfache Methode, dabei auch variierende Spulen-Innendurchmesser zu berücksichtigen, ist eine konische Aufnahme der Spule. Auf die Motorwelle wird eine Gewindestange montiert, die auf der gegenüberliegenden Seite gelagert ist. Auf diese Gewindestange können nun zwei Kegel aufgeschraubt werden, in denen je eine entsprechende Mutter verklebt ist. Mithilfe dieser beiden Kegel lässt sich die Spule nun einspannen, wobei sie automatisch konzentrisch ausgerichtet wird.
Um das Filament auf der Breite der Spule zu führen, bietet sich ebenfalls die Verwendung einer Gewindestange an. Das Filament wird durch einen Positionierer geführt, der mit einer Mutter verklebt ist. Durch die Konstruktion einer Führungsschiene wird verhindert, dass sich der Positionierer dreht. Die Wahl der Gewindegröße zu M12 führt dazu, dass die Geschwindigkeiten der beiden Motoren zu jedem Zeitpunkt gleich sind. Das liegt daran, dass die Steigung des Gewindes von 1,75 mm der Filamentbreite entspricht. So muss der Führungsmotor genau eine Umdrehung machen, um das Filament zu versetzen, während die Spule ebenfalls genau eine Umdrehung macht. Der Positionierer wird zudem so konstruiert, dass er auch zur Referenzierung des Führungsmotors genutzt werden kann, indem er einen optischen Endschalter auslöst. Weiterhin wird in die Konstruktion dieses Systems ein Lüfter eingebaut, der das Filament nach der Extrusion abkühlt.
Der Positionierer wurde nach ersten Tests um eine weitere Führungsöse ergänzt, da sich gezeigt hat, dass eine Niederhaltung des Filaments einige Zentimeter hinter der ersten Führungsöse das Wicklungsbild erheblich verbessert.
Eine einfache Möglichkeit, steuerungstechnische Abläufe zu implementieren, ist eine sog. Finite State Maschine (Zustandsautomat). Da das Extruder-System einem festgelegten Prozess-Ablauf folgt, um seiner Funktion gerecht zu werden, bietet sich eine grobe Anlehnung der FSM an diesen Ablauf an:
- Aufheizen des Extruders
- Starten der Extrusion
- Starten der Wicklung
Eine nähere Auseinandersetzung mit dem System ergibt, dass diese Zustände zwar die Basis des Prozesses bilden, der Zustandsautomat aber durchaus um einige zusätzliche States erweitert werden muss. So benötigt das System einen Initialisierungs-Zustand, in dem es sich beim Start befindet. Dieser wird benötigt, um z.B. Software-Objekte zu erstellen und diese mit Standardwerten an das System anzupassen. Zudem sollte ein State implementiert werden, in dem der Führungsmotor mithilfe des optischen Endschalters seine Position referenziert, bevor der Prozess gestartet werden kann. Damit der Prozessstart nicht automatisch erfolgt, sondern eine Nutzereingabe erwartet werden kann, wird ein Idle-State benötigt. Dieser wird verlassen, sobald der Bediener des Systems den Prozess starten möchte. An dieser Stelle kann also der Zustand Aufheizen implementiert werden, der automatisch in den nächsten Zustand Bereit zum Extrudieren wechselt, sobald die Vorgabetemperatur erreicht wird. Dieser Zwischenstatus sorgt ebenfalls dafür, dass die Extrusion nicht automatisch startet, sondern auch hier eine Interaktion des Bedieners erforderlich ist. Diese ist ohnehin erforderlich, da der Anfang des extrudierten Filaments in die Filament-Spule eingefädelt werden muss, bevor anschließend die Wicklung gestartet werden kann. Die Prozessfolge wird also durch die Zustände Extrusion und Wicklung vervollständigt.
Obige Überlegungen ergeben einen Zustandsautomaten, der nachfolgend vereinfacht dargestellt ist.
Das Interface, über das die Anlage gesteuert werden soll, sollte initial eine Oberfläche sein, die vom Raspberry Pi über einen Webserver bereitgestellt wird. So wird kein Display benötigt und die Oberfläche kann von jedem beliebigen PC erreicht werden, der sich im selben Netzwerk befindet, wie der Raspberry Pi.
Nähere Recherche hat gezeigt, dass eine Integration von HMI-Server und Anlagensteuerung auf dem Raspberry die Nutzung mehrerer Prozesse erfordert, die miteinander kommunizieren müssen. Eine solche Implementierung ist zwar möglich, aufgrund mangelnder Erfahrung in diesem Bereich allerdings nicht im Rahmen des Bachelorprojekts umsetzbar. Aus diesem Grund wurde noch während der Recherche zu diesem Thema entschieden, die Steuerung des Systems auf einem Arduino zu implementieren und an diesen ein Touch-Display als HMI anzuschließen.
Grundsätzlich ist die Ansteuerung eines Touch-Displays mit dem Arduino recht ressourcenaufwändig, während das Ergebnis im Bezug auf Nutzerfreundlichkeit nicht wirklich zufriedenstellend ist. Alternativ zur Steuerung des Displays über den Arduino kann ein Touch-Display verwendet werden, welches mit einem Prozessor ausgestattet ist, der die Ein- und Ausgabe auf dem Display übernimmt und über eine serielle Schnittstelle mit dem Arduino kommuniziert. So kann die Schnittstelle benutzt werden, um bei einem Touch auf ein bestimmtes Element eine Funktion auf dem Arduino aufzurufen, oder um auf dem Display angezeigte Parameter zu modifizieren.
Der Hersteller Nextion bietet solche Displays, sowie Software zur Programmierung der Displays und Libraries zur Anbindung der Displays an Arduinos an. Die Abwägung von Displaygröße und Anschaffungskosten führte zur Wahl eines Nextion NX4024K032.
Die Benutzeroberfläche kann mithilfe der von Nextion bereitgestellten Software Nextion Editor erstellt werden. Der Editor bietet eine Oberfläche, in der Buttons, Text, Bilder und weitere Elemente per Drag-and-Drop zu einzelnen Seiten zusammengestellt werden.
Die Oberfläche wird in mehrere Seiten unterteilt, die in etwa den States der Anlage entsprechen:
- Initialisierung
- Idle
- Aufheizen
- Extrusion
- Wicklung
- Settings
Der State RefStep, in dem der Positionierungsmotor seine Nullposition referenziert, wird im Display in die Initialisierungs-Seite implementiert. Der Ready-State, in dem der Bediener die Extrusion aktivieren kann, ist in die Seite Aufheizen integriert - sobald die notwendige Temperatur erreicht ist, wird der entsprechende Button aktiviert. Außerdem wird eine Seite integriert, in der der Bediener einige Einstellungen vornehmen kann. Damit ergeben sich die nachfolgend dargestellten Seiten.
Die Einbindung in die Steuerung auf dem Arduino erfolgt mithilfe der
Nextion.h
-Bibliothek. So können für Buttons und Textfelder
Objekte im Arduino-Projekt erstellt werden, die mithilfe der Seiten- und Objekt-ID aus dem Nextion Editor
eindeutig mit dem dazugehörigen Objekt verknüpft werden können. Damit das Display bestimmte Touch-Events registriert,
müssen Button-Objekte an die nexListenList
übergeben werden. Zur Einbindung eines Buttons muss zudem eine
Callback-Funktion definiert werden, die aufgerufen wird, sobald das Display einen Druck auf das Objekt an den
Arduino meldet.
#include "Nextion.h"
NexButton bHeatUp(1, 3, "bHeatUp");
NexTouch *nexListenList[] = {
&bHeatUp
}
void bHeatup_callback() {
Serial.print("currentState = heatup");
}
void setup() {
Serial.begin(9600);
nexInit();
bHeatUp.attachPop(bHeatup_callback);
}
void loop() {
nexLoop(nexListenList);
}
Nach diesem Schema wurden in filamentextruder.ino
alle Elemente der Bedienoberfläche eingebunden. Um einen Button oder Text ein- bzw. ausblenden zu können, muss
die Nextion-Bibliothek ein wenig modifiziert werden. Die Änderungen, die an der Bibliothek vorgenommen wurden,
sind in der README.md
des Arduino-Projekts festgehalten.
Filament-Extruder
Entwickelt von Tobias Freytag, Anton Neike, Max Sahlke, Lukas Wiesehan.
- Einführung
-
Konzeption
2.1. Projektidee
2.2. Anforderungsdefinition
2.3. Anforderungsliste
2.4. Komponentenauswahl -
Entwicklung
3.1. Temperaturregelung
3.2. Einfülltrichter
3.3. Wicklung
3.4. Finite State Machine
3.5. HMI