Seite 1 von 4

Steuerungsbox

Verfasst: Do 11. Jun 2015, 02:18
von T1230
Hallo RF`ler,

hab jetzt schon einige Zeit nicht mehr ins Forum geschaut, deshalb gebe ich mal einen Einblick zu meinen (etwas explodierten) Projekt:

Ich habe mir mittels Raspberry2 eine Temperatur-Regel-Steuerung gebaut. Hintergrund dazu: ich möchte den RF in einem Zimmer ohne Fenster betreiben, lediglich ein Abzug befindet sich in den Raum. Meine Anfangsidee war folgende:

Eine Plexiglas-Container für den Druckbereich (nur für den Druckbereich, die Steuerung soll sozusagen im "freien" liegen), wobei oben ein 120mm PWM Lüfter als Luftausgang dient, und seitlich am Plexi-Cont. sind Lüfteinlässe (diese sind mit Feinstaubfiltern versehen, und relativ dick). Oben am 120mm Lüfter steckt ein Schlauch, der zum Abzug geführt wird, wo wiederrum ein 2ter 120mm PWM Lüfter montiert ist.
Die Teile für den Kasten hab ich schon alle beisammen, mit dem Zusammenbau beginne ich wohl am Wochenende.

Was aber schon fertig ist, ist die Raspi Steuerung (Bilder anbei, wobei ich dazusagen muss, dass ich gerade eine V2 davon drucke, da ich bei meinen ersten Live Test auf einige Probleme bzgl. Timelaps Videos gestoßen bin, später dazu mehr).

Folgende Funktionen habe ich beim Raspi mittels Python bzw. .sh implementiert:

Hardware:
2x 120mm PWM Lüfter mittels PWM Signal ansteuern (das sind die 2 bereits erwähnten - die Logik dahinter grob:
ich Schalte im Druckmodus per Taster zwischen PLA und ABS um, jeweils mit einer bestimmten Soll-Temperatur im Druckbereich. Überschreitet die per Temp.fühler gemesene Temp. um 1 Grad -> Lüfter 10%, 2 Grad 20%, 3 Grad 50%, 40 Grad 100%).
1x 120mm Lüfter, der auf der Raspi-Box sitzt, und ähnlich reagiert wie die 2 erwähnten Lüfter, nur dass der Raspi leider nur 2 getrennt steuerbare PWM Ausgänge hat, also schalte ich diesen Lüfter einfach ein, wenn die Raspi-CPU-Temp oder die Raspi-Box-Temp. einen Schwellwert überschreitet
2x 40mm Lüfter, die an den Lufteinlässen des RF befestigt sind (zur Kühlung der RF Steuerung). Die laufen einfach immer, sobald die Steuerugn gestartet wird
3x Temp.fühler: einer im Plexglas-Druck-Container, einer in der Raspi-Box, und einer im Raum
1x Raspi-Webcam
1x usb-schaltbare Steckdose mit 4 schaltbaren Eingängen, und 2 Eingängen mit Dauerstrom
2x Taster für die Raspi Box
1x LCD-Display für den Raspi
6x Transistor
15x div. Widerstände

Softwarefunktionen:
-Lüftersteuerung temp.abhängig
-Webserver zur Darstellung der Livedaten, sowie zum Steuern (siehe Screenshot - diesen habe ich am Ipad gemacht, da ich hauptsächlich übers Ipad mitverfolge, wie gerade aussieht).
-Repetier-Server (zurzeit eigentlich hauptsächlich zum auslesen der Extr. und HB Temp.- ich muss da noch ein bisschen testen, aber bei der Vorschau von übertragenen g-codes sieht das ganz komisch aus, obwohl am lokalen Repetier Host alles gut aussieht...)
-Steuerung der Steckdosen: zurzeit sieht das ganze so aus: am fixen Stromeingang ist der Raspi angeschlossen (eine seperate Schaltsteckdose, sodass ich per Druck auf deren Knopf den Raspi einschalten kann. RF an einer schaltbaren Steckdose (RF-Strom wird Software-mäßig vom Raspi gesteuert). Die ganzen Lüfter laufen alle mit 12V und brauchen ein extra Netzteil (weil der Raspi nur 5V versorgen kann, und auch nur wenig Strom zur Verfügung stellt - auch diese Versorung schaltet der Raspi aus/ein.
-Raspi-Webcam: betreibe ich im Timelapse Modus (einstellung: 5MP, volle Qualität, 2 Sekunden Timelapse). Hierzu gleich eine Anmerkung, weil ich dazu in einem anderen Thread etwas gelesen habe: das Problem mit stockender Bildübertragung (bei allen Raspi-Modellen, 1,2,A,B,+...) liegt daran, dass auf einem internen USB-Datenübertragungsbus alle externen USB-Slots (und damit WLAN) sowie das Ethernet angeschlossen sind. Das hat zur Folge, dass man den ganzen Verfügbaren I/O vom Raspi mit einem intensiven Stream zumachen kann, und dann auch eine USB-Kommunikation zum RF im Schlimmstenfall warten muss, und dadurch der Drucker ins stocken kommt. Da mir bei der Bildübertragung aber Auflösung wichtiger ist, als FPS, fahre ich mit den erwähnten Einstellungen ganz gut (da ist auch noch genug Spielraum am Datenbus vorhanden).
-Mails: prinzipiell werden in jeden Fehlerfall (z.B.: maximale Temperaturüberschreitung, Prozesse tod,...) alle Logfiles (vom kompletten Raspi-Steuerkreislauf über RF-Logfiles) an meine Mailadresse geschickt. Ausserdem habe ich einen "nicht-daheim-Modus" eingebaut, sodass ich alle 30min eine Mail mit den Logfiles sowie einen Thumbnail Screenshot der Webcam (1280x1024, q50 -> damit nicht soviel Webtraffic entsteht). Diesen Modus kann ich sowohl per Taster am Raspi, als auch im Webgui aktivieren bzw. deaktivieren.
-Dead-Check: ein Überwachungsscript, dass überprüft, ob eh noch alle Dienste am Raspi laufen, und wenn nicht, diese ggfl. neustarten. Wenn das auch nicht hilft, startet sich der Raspi selbst neu, und geht sofort wieder in den letzten bekannten Modus über (z.B.: war PLA eingestellt, also wird nach dem Reboot gleich wieder PLA gestartet. Bei so einen Reboot werden natürlich nicht die schaltbaren Steckdoesen deaktiviert, sonst wäre ja der RF stromlos....
-Webgui: alle Funktionen können hier aktiviert / deaktiviert werden (z.B. Steckdosen schalten, Steuerprogramm ABS/PLA starten, sowie Anzeige des aktuellen Status (Raspi-, Raum, 3D-Druckbereich, Extruder und Heatbed Temperatur)
-beim beenden des Steuerprogramms: automatische Erstellung eines .mp4 Timelapse Videos aus den erstellten .jpg`s (-> 5MP Timelapse Video, schaut echt fein aus), sowie Übertragung aller Rohdaten (Durckerlogfiles, Raspi-Logfiles, jpgs und Timelapse Video) auf meine Netzwerkfestplatte.

Anmerkung zum Raspi-Box Screenshot: Die Webcam hab ich provisorisch mit Klebeband befestigt, deshalb sieht das so komisch aus, aber wie gesagt, ich drucke gerade das V2 Gehäuse.

Zwei Fragen zum Repetier-Server:
verwendet hier jemand die API, um den RF per SH, Python, oder sonstwie zu steuern?

Weiß vielleicht jemand, woher das WebGUI vom Rep.Server solche Infos wie die aktuelle Layer Position nimmt? Bzw. die Restzeitanzeige? Ich kann das in keinem Logfile finden, und würde das noch gerne in meinen GUI anzeigen...

Falls jemand an etwas ähnlichen arbeitet, kann ich gerne Code zur Verfügung stellen.

LG Thomas

Re: Steuerungsbox

Verfasst: Mo 19. Okt 2015, 22:50
von T1230
Also ich bin mit meinen Projekt fast fertig, ein paar Kleinteile muss ich noch ausdrucken, aber die Grundfunktion habe ich schonmal erfolgreich getestet. Es hat dann doch ziemlich lange gedauert, weil ich das ganze Konzept während der Projektphase ständig erweitert habe.

Stand jetzt (die Fotos habe ich leider immer Abends gemacht, vielleicht reiche ich noch ein paar bei Tageslicht nach):

Luftdichter Kasten, rechts ein Frischlufteinlass mit Hepa-Filter.
Auf diesen kasten die Filamenthalterung, doppelt Kugelgelagert, das ist eigentlich zu leichtgängig geworden, sodass ich den Filamentschlau etwas länger gemacht habe, da sich sonst bei einen kleinen Zug vom RF gleich mehrere Meter Filament abrollen....
2 Touchscreen-Displays (jeweils auf einen Raspberry laufend)
a.) Repetier-Server-Touch - da habe ich eigentlich nichts angepasst, dass passt mir schon out-of-the-box sehr gut
b.) Ein selbst-programmiertes Touch-GUI, dass die komplette Stromsteuerung, Webcamaufnahmen, Webserver für den IPad- und Internetzugriff, sowie die Lüftersteuerungen beinhaltet. Ein paar Drucker-Steuerbefehle habe ich jedoch auch hier eingebaut, da die großen Buttons leichter zu bedienen sind, als das kleine Interface vom Repetier-Server (im Screenshot sind das die blauen Buttons)

Ich habe heute einen ersten 5 Stündigen PLA-Druck gemacht, und die Lüftersteuerung hat die Temperatur im Druckraum konstant auf 26° gehalten - ABS werde ich am Wochenende testen, ob die Temperaturkonstanz auch bei über 40° noch passt.

Komplett abdedichet ist der Druckraum noch nicht, das mache ich erst, wenn der Kasten ins Abstellkamerl übersiedelt wird (im Moment steht das ganze noch in der Küche...)

Was noch fehlt, bevor ich die Übersiedelung starte:
2te Y-Führungsschiene (schon bestellt, Lieferung zieht sich aber ganz schön hin...)

LG Thomas

Re: Steuerungsbox

Verfasst: Mo 19. Okt 2015, 23:25
von RAU
wow

Gibt's eigentlich kein richtiges Staunen-Smiley? Etwa dieses: :ohmy: ?

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 00:06
von Zaldo
Saubere Sache! :good:

Für die Abstellkammer viel zu schade :traurig:

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 07:34
von druckttoll
Wow! Da steckt reichlich Begeisterung drin! Klasse!

Ciao for now
druckttoll

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 19:01
von schnibli
Ich neheme an du arbeitest mit "Repetier Server"?
Welche befehle muss man für die angabe senden oder bez. wie hast du das hingerichtet :coolbubble:

Neidisch bin xD

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 19:41
von T1230
Schnibli,

im Nachhinein betrachtet funktioniert das recht einfach, ein Code Beispiel habe ich hier schonmal gepostet:
http://www.rf1000.de/forum/rf1000-forum ... rt=18#7839

Um das ein wenig genauer zu erklären:
Grundstein ist ein Raspberry, auf dem ein Touchdisplay angeschlossen wird. Ich habe dazu das offizielle verwendet, da man das einfach per Flachkabel am Raspi anschließt.
Für den Raspi habe ich dann ein Python Script geschrieben, welches dann die Kommunikation zum Drucker (bzw. den Repetier-Server) übernimmt - eigentlich auf dieselbe Weise, wie der Repetier-Server das selbst auch macht - per websocket.

Man schickt da einfach über websocket die G-Code Befehle an den Drucker, falls jemand ein konkretes Beispiel braucht:

einfach mit vi ein file erstellen, z.B.: output_object.py
da kommt dann in etwa dieser Code rein:

Code: Alles auswählen

#!/usr/bin/python

import datetime
from websocket import create_connection

timestamp = datetime.datetime.now().strftime('%Y-%m-%d_%H%M')

f = open("/var/www/log/druckerbefehle.txt",'a')
f.write(timestamp + "\n")

ws = create_connection("ws://192.168.1.18:3344/socket/")
f.write("Sending...:" + "\n")
b = ws.send("{\"action\":\"send\",\"data\":{\"cmd\":\"M400\"},\"printer\":\"RF1000\",\"callback_id\":915}")
f.write("Waiting for Movements complete - M400" + "\n")
f.write("Receiving..." + "\n")
result =  ws.recv()
f.write("Received '%s'" % result + "\n")
ws.close()

ws = create_connection("ws://192.168.1.18:3344/socket/")
f.write("Sending...:" + "\n")
b = ws.send("{\"action\":\"send\",\"data\":{\"cmd\":\"M3079\"},\"printer\":\"RF1000\",\"callback_id\":916}")
f.write("Output object - M3079" + "\n")
f.write("Receiving..." + "\n")
result =  ws.recv()
f.write("Received '%s'" % result + "\n")
ws.close()

ws = create_connection("ws://192.168.1.18:3344/socket/")
f.write("Sending...:" + "\n")
b = ws.send("{\"action\":\"send\",\"data\":{\"cmd\":\"M400\"},\"printer\":\"RF1000\",\"callback_id\":917}")
f.write("Waiting for Movements complete - M400" + "\n")
f.write("Receiving..." + "\n")
result =  ws.recv()
f.write("Received '%s'" % result + "\n")
ws.close()

f.close()
Das kann man eigentlich 1:1 so übernehmen, wenn der eigene Drucker ebenfalls als "RF1000" im Repetier-Server benannt wurde.
Die IP Adresse 192.168.1.18:3344 muss natürlich auch geändert werden, auf die IP Adresse eures Repetier-Servers. In meinen Fall ist das halt ein 2ter Raspi.
Man kann das Ganze eigentlich auch auf einem Raspi hinbekommen, aber da ich 2 Touchdisplays rumliegen hatte....

Falls jemand etwas ähnliches starten will, kann ich auch genauere Hilfestellung geben....

LG Thomas

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 21:17
von schnibli
Vielen Dank...
Da werde ich mich morgen mal dran setzen :)
Hast du schon eine möglichkeit gefunden sachen auszulesen (zb. Drucktemperatur oder dortschritt?)

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 21:36
von legend
T1230 hat geschrieben: Falls jemand etwas ähnliches starten will, kann ich auch genauere Hilfestellung geben....
Wenn ich die Zeit hätte würde ich sicher gerne eine ähnliche Bedieneinheit realisieren. Sieht wirklich sehr durchdacht und sehr gut umgesetzt aus bei dir. :yes:
Mich schreckt vor allem der Programmieraufwand ab.

Grüße Steffen

Re: Steuerungsbox

Verfasst: Di 20. Okt 2015, 21:56
von T1230
Also die Drucktemperatur habe ich in einer früheren Version mal ausgewertet, und als Overlay beim Webcam Stream angezeigt, meine Lösung war folgende:

.sh Script erstellen:

Code: Alles auswählen

#!/bin/bash

while true; do
	if [[ "$(tail -n 1 '/var/lib/Repetier-Server/printer/RF1000/logs/connected.log' | awk '{ print $3 }')" = *"T:"* ]]; then
		echo "$(tail -n 1 '/var/lib/Repetier-Server/printer/RF1000/logs/connected.log' | awk '{ print $3 }' | sed 's/^..//')" > /var/www/werte/temp_extruder.txt
		echo "$(tail -n 1 '/var/lib/Repetier-Server/printer/RF1000/logs/connected.log' | awk '{ print $2 }')" > /var/www/werte/time_temp_extruder.txt
 
	fi

	if [[ "$(tail -n 1 '/var/lib/Repetier-Server/printer/RF1000/logs/connected.log' | awk '{ print $5 }')" = *"B:"* ]]; then
       		echo "$(tail -n 1 '/var/lib/Repetier-Server/printer/RF1000/logs/connected.log' | awk '{ print $5 }' | sed 's/^..//')" > /var/www/werte/temp_heatbed.txt

	fi
	
	sleep 1
done

Das schreibt dir beim Aufruf jede Sekunde in das File temp-extruder.txt bzw. headbed.txt die aktuellen Temperaturen ein (überschreibt es, d.h. es ist immer die aktuelle Temperatur in den File).
Auf diese Weise müsste man auch den Druckfortschritt auslesen können, allerdings wird für jedes Druckprojekt ein Ordner mit dem Projektnamen erstellt. Man müsste halt vorher abfragen, welches der aktuellste Ordner ist, und diesen dann auslesen.

War mir dann aber ehrlich gesagt zuviel Aufwand, da der Rep-Server das eh sehr übersichtlich anzeigt (also die Temperaturen des Druckers, Fortschritt usw. - deshalb auch verworfen). Aber wenn man das mit einem Raspi lösen will, geht das sicher...


LG Thomas