Skip to content

Entwicklung

lukaswiesehan edited this page Oct 4, 2020 · 25 revisions

Temperaturregelung

Aufbau

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- und F+ 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

Auslesen des PT100

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

Ansteuerung der Heater

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.

PID-Regelung

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

Anpassung der Reglerparameter

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.

Temperaturregelung mit K_P = 150

Temperaturregelung

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.

Temperaturregelung mit eingestelltem Regler

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.

Einfülltrichter

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.

Konstruktion des Trichters

Einfülltrichter

Die technischen Zeichnungen zur Fertigung des Einfülltrichters sind in cad/zeichnungen abgelegt.

Wicklungsmechanismus

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.

Aufnahme der Spule

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.

Aufnahmeprinzip

Spulenaufnahme

Führung des Filaments

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.

Führungssystem

Filamentführung

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.

Finite State Machine

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:

  1. Aufheizen des Extruders
  2. Starten der Extrusion
  3. 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.

Vereinfachtes Schema des Zustandsautomaten

Zustandsautomat

HMI

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.

Wahl des Displays

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.

Entwurf der Bedienoberfläche

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.

Nextion Editor

Nextion Editor

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.

Seiten der Benutzeroberfläche

Benutzeroberfläche

Anbindung an den Arduino

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.

Beispielhafte Einbindung eines Buttons
#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.