AdSense

Dienstag, 2. Juli 2019

WLAN-Thermometer mit dem DHT22 und EPS8266-12E

(English version) Eigentlich sollte ich ja an den Posts zum Drucker weitermachen, aber ich habe gerade an einem ESP8266-12E gearbeitet und dabei super einfach ein WLAN-Thermometer (mit dem ESP8266-12E als Web-Client, welcher an einen Apache-Server auf meinem Raspberry PI sendet) realisiert, sodass ich das erstmal hier erklären möchte.


1. Der ESP8266-12E
Der ESP8266-12E ist ein Arduino-ähnlicher Baustein, welcher einen WLAN-Baustein mit integriert hat. Sucht man auf Google danach, findet man diesen bei vielen Quellen zu kaufen. Das Tolle ist, dass er mit der Arduino-Umgebung programmiert werden kann, sodass alle Libraries auch funktionieren!

2. Einrichtung Arduino für den ESP8266-12E
Zuerst sollte der CH340-Treiber installiert werden. Da es dazu genug im Internet gibt werde ich darauf nicht eingehen. Als nächstes muss in der Arduino-Umgebung auf die Voreinstellungen gehen:

Hier trägt man nun die zusätzliche Boardverwalter-URL ein:
http://arduino.esp8266.com/stable/package_esp8266com_index.json

Danach kann man dann auch schon im Boardverwalter die Einstellungen für die Boards herunterladen:

Hier muss nun nach "ESP8266" gesucht werden und das sollte dann auch installiert werden:

Nun ist eigentlich alles vorbereitet und wir können das Board auswählen, ich habe dabei "NodeMCU 1.2 (ESP8266-12E Module)" ausgewählt:


3. Der Code
Zu dem Code gibt es eigentlich nicht viel zu erklären. Einerseits muss man seine WLAN-Daten eingeben, darunter wird der DHT22-Sensor initialisiert. In "Loop" wird getestet ob man mit dem WLAN verbunden ist, sollte dies der Fall sein, so wird Temperatur und Luftfeuchte gemessen (float t und float h), diese Werte werden in einen String (requestString) geschrieben und dann als HTTP Get-Request an einen Webserver gesendet. Den Code für den Web-Server habe ich unten angefügt.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char* ssid     = "***";
const char* password = "***";   
int wifiStatus;
    
#include "DHT.h"
#define DHTPIN D2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:

  Serial.print("Your are connecting to;");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  dht.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  wifiStatus = WiFi.status();
  
  if(wifiStatus == WL_CONNECTED){
    Serial.println("");
    Serial.println("Your ESP is connected!");  
    Serial.println("Your IP address is: ");
    Serial.println(WiFi.localIP()); 
    float t = dht.readTemperature(); 
    float h = dht.readHumidity(); 
    HTTPClient http;
    char requestString[255] = "";
    sprintf(requestString, "http://webServer.de/Send.php?name=TemperatureSensor&data=%f,%f", t, h);
    http.begin(requestString);  //Specify request destination
    int httpCode = http.GET();                                                                  //Send the request
    
    if (httpCode > 0) 
    { //Check the returning code
      String payload = http.getString();   //Get the request response payload
      Serial.println(payload);                     //Print the response payload
    }
    
    http.end();   //Close connection
    
    delay(300000);
  }
  else{
    Serial.println("");
    Serial.println("WiFi not connected");
    delay(1000);
  }
}

4. Der Server-Code
Auf meinem Raspberry Pi läuft ein Apache-Webserver. In /var/www liegt die Datei "Send.php", welche einfach Sensordaten annimmt und in .csv-Dateien schreibt. Dabei übergibt der Sensor im Get-Befehl seinen Namen, das wird dann auch der Dateiname, hier wird dann mit aktuellem Zeitstempel der Inhalt von "data" angehängt, was in diesem Fall die Temperatur in °C und die Luftfeuchte in % ist.

<html>
 <head>
  <title>Send Sensor Values</title>
 </head>
 <body>
  <?php

$name = htmlspecialchars($_GET["name"]);
$data = htmlspecialchars($_GET["data"]);

$date = date("Y-m-d") . "T" . date("H:i:s.u") . "Z";

$file = "data/".$name.".csv";
$Saved_File = fopen($file, 'a');
fwrite($Saved_File, $date . "," . $data . "\r\n");
fclose($Saved_File);

  ?>
 </body>
</html>

Donnerstag, 20. Juni 2019

2.85mm-Filament Bowden Extruder Getriebe-Feeder

(English version) Wie angekündigt werde ich nun die Einzelteile meines Multimaterial-Ultimakers beschreiben. Heute widme ich mich dem Feeder. Leider habe ich keine gute fertige Lösung gefunden, deshalb musste ich aus teils gekauften Teilen den Feeder selber bauen. Der Feeder besteht aus einigen 3D-gedruckten Teilen.

Für den Extruder werden folgende Teile benötigt:
  • 3D-Druck Teile: https://www.thingiverse.com/thing:3703063
  • Einige Teile von ebay oder anderen Shops (hier am besten anhand der Bilder unten die richtigen Teile kaufen)
    • Ein 1,75 mm Metall-Feeder ("MK8 Metal Bowden Extruder" bei ebay)
    • Ein 4/6 mm Bowden-Schlauch (PTFE, Innendurchmesser 4 mm, Außendurchmesser 6 mm)
    • Ein Bowden-Coupler (vergleichbar mit den Originalteilen beim Ultimaker 2+, "Bowden tube clip" bei ebay)
    • Extruder-Vorschubrad
    • 2 x 26-zähniges Extruder-Vorschubrad
    • 2 x Kugellager 625ZZ (16x5x5 mm)
    • Nema17-Motor, 1,7A, 0,9°
  • Schrauben
    • 3 x M3x10
    • 3 x M3x30 (besser sind eher längere Schrauben, also z.B. 35 mm Länge)
    • M4x30
  • Alu-Stange, 5 mm Durchmesser (bei mir gab es nur 5,3, das passt aber auch)
Zuerst wird nun der Motor am Hauptgestell befestigt.

Als nächstes muss beim Feeder ein Loch aufgebohrt werden, dafür nehme ich einen 5er Metallbohrer. Anschließend sollten die Kanten etwas abgerundet werden.

Danach muss die Schraube, auf welche die kleine Feder gesteckt wird, gekürzt werden, da sonst die zwei sich gegenüberliegenden Schrauben berührer bevor die Feder genug Druck aufbaut.

Als nächstes wird nun auch der Bowden-Coupler montiert und der Bowden-Schlauch montiert.

Danach wird der Feeder mit einer M3x10-Schraube an das Hauptgestell geschraubt, von unten wird dabei ein Kugellager in die dafür vorhergesehene Halterung gelegt und dies alles zusammen mit der Schraube befestigt. Dabei sollte man achten, dass der Kopf der Schraube im Metallteil liegt, sonst könnte es später Probleme geben.


Als nächstes wird der Arm des Feeders zusammengebaut (Hier wird auch die M4-Schraube eingebaut) und montiert, dafür werden nun drei M3x30-Schrauben in entgegengesetzter Richtung wie die M3x10-Schraube eingesetzt. Danach wird die Feder für den Arm eingesetzt.



Danach wird ein 52 mm langes Stück von dem Alu-Stab abgeschnitten und mit 7 mm Abstand zu einer Seite das Vorschubrad montiert.

Auf dieses Stück wird nun die lange Hülse geschoben, danach wird es von oben durch das Kugellager geschoben. Hier muss man eventuell den Hebel unter der Feder etwas drücken, damit es hinein passt.

Falls man die M3x30-Schrauben davor mit Muttern fixiert hat, sollte man diese Muttern jetzt entfernen. Als nächstes wird das zweite Kugellager auf die Achse gesteckt und der passende Halter dafür von oben aufgesetzt. Das Ganze kann man nun an der unteren Schraube fixieren, wenn man etwas Druck auf die Feder über die M4-Schraube ausübt fallen die anderen Schrauben nun auch nicht mehr heraus.

Danach wird noch der große Halteclip montiert, hier können nun die beiden anderen Muttern angeschraubt werden

Als nächstes geht es auf der anderen Seite weiter. Dabei werden die zwei Vorschubräder mit 26 Zähnen in die großen Zahnräder montiert, dabei kann man einen kleinen Tropfen Klebstoff aufsetzen, damit die Zahnräder nicht entlang der Achse auseinanderrutschen. Die kleine Hülse wird auf die Achse gesteckt, ansonsten reibt das große Zahnrad auf dem Kunststoffteil, welches das Kugellager hält und fängt an, mit diesem Teil zusammenzuschmelzen. Die Zahnräder werden nun auf die Achse bzw. die Achse vom Motor montiert, dabei sollte ein wenig Gegendruck von unten auf die Achse ausgeführt werden, damit es kein Spiel gibt und etwas anfängt, zu wackeln.

Und damit ist der Extruder fertig und kann eingesetzt werden. Der Extruder kann natürlich auch einfach so für 3D-Drucker eingesetzt werden und muss nicht zwingend im Zusammenhang mit einem Mehrfarbendruck stehen.

Sollte ich irgendeinen Schritt nicht sauber erklärt haben oder falls ich Materialien benutze, von denen ich oben nichts geschrieben habe, bitte einfach kurz Bescheid geben, dann passe ich das an.

Sonntag, 16. Juni 2019

Vollautomatischer Mehrfarbendruck mit dem Ultimaker 2+

(English version) Wie im letzten Post vom November letzten Jahres angekündigt habe ich mich mit dem Mehrfarbendruck mit dem Ultimaker 2+ beschäftigt. Inzwischen habe ich nach vielen Monaten Arbeit eine Lösung gefunden, um mit einem Ultimaker 2+ mit beliebig vielen Farben zu drucken. In diesem Post möchte ich die einzelnen Komponenten davon kurz beschreiben und dann in den folgenden Posts jeweils darauf eingehen.

Das Grundprinzip ist ähnlich wie beim halbautomatischen Mehrfarbendruck, es wird im Gegensatz zum Ultimaker 3 nur eine Nozzle benutzt und bei einem Farbwechsel wird das Material herausgezogen und das nächste Material hineingeschoben. Dafür habe ich hinter dem Extruder einen Y-Splitter angebracht, in welchem mehrere Filamentschläuche zusammenlaufen. Am Ende von jedem dieser Schläuche befindet sich dann ein eigenen Feeder, sodass ich für jede Farbe, mit der ich gleichzeitig drucken möchte, einen extra Feeder bauen musste. Beim Herausziehen von einem Material kodiert der Drucker dabei den nächsten benötigten Extruder in der Bewegung, sodass eine externe Elektronik erkennt, welcher Motor als nächstes angeschaltet werden soll und schaltet diesen dann über eine Relaiskarte an. Das Gesamtprojekt gliedert sich also in die folgenden Teile:
  1. Y-Splitter für die Filamentschläuche
  2. Multiple Feeder
  3. Externe Elektronik zum Umschalten der Extruder
  4. Skripte in Slic3r
Punkt 1 ist relativ leicht gelöst, dazu habe ich Designs für 4, 8 und 16 Filamentschläuche erstellt und diese auf Thingiverse hochgeladen. Eventuell muss hier bei den Druckeinstellungen (Horizontal expansion) gespielt werden, dass die Adapter gut passen.
https://www.thingiverse.com/thing:3695457

Samstag, 10. November 2018

Halbautomatischer Mehrfarbendruck mit dem Ultimaker 2+

(English version) Sehr lange, ziemlich genau 2 Jahre ist hier nichts mehr passiert - das will ich nun ändern. Ich arbeite momentan an einem Projekt, welches ich auf jeden Fall teilen will: Ich rüste meinen Ultimaker 2+ um, sodass ich mehrere Farben drucken kann, bis zu 15 ist da der aktuelle Plan. Dazu werde ich in Zukunft, vor allem wenn ich den Umbau überhaupt ersteinmal vorgenommen habe, mehr schreiben. Heute möchte ich aber schonmal die Vorstufe davon präsentieren: Halbautomatischer Mehrfarbendruck mit dem Ultimaker 2+. Die Grundidee ist dabei sowohl beim vollautomatischen als auch beim halbautomatischen Mehrfarbendruck, dass nur eine Nozzle benutzt wird und der Drucker immer das alte Filament herauszieht und dann das neue durchdrückt, vergleichbar mit dem Prusa i3 Multi-Material Upgrade, hier wird auch nur eine Nozzle verwendet.

Zuerst einmal: Was meine ich mit halbautomatisch? Ganz einfach: Der Drucker druckt eine Farbe, irgendwann wirft er das Material aus und wartet, bis ich das andere Material hineingetan habe. Damit kann man einfache Sachen drucken, welche z.B. aus einer Grundfarbe bestehen und ab einer gewissen Höhe eine andere Farbe haben - Beispiele wären hierfür z.B. Schrift auf einem Objekt, ein Leitkegel (https://www.thingiverse.com/thing:3207478) oder z.B. aus dem Bereich des Geländebaus dieses "Gemüsebeet" (https://www.thingiverse.com/thing:3207486).

Was musste ich dafür anpassen? Am Drucker? Gar nichts! Das ist das Tolle. Als Slicer habe ich nun "Slic3r" genommen, da ich hier benutzerdefinierten G-Code einfügen kann und die Software theoretisch beliebig viele Extruder unterstützt. Ich werde hier jetzt Schritt für Schritt erklären, wie meine Druckprofile in Slic3r aussehen. Zuerst die Printer Settings in Slic3r:

Hier habe ich jetzt für jeden Extruder das Folgende eingestellt:

Im Bereich Custom G-code habe ich die folgenden Sachen stehen:
Start G-code
M109 S[first_layer_temperature] ; heat nozzle to first layer temperature and wait until reached
G21 ; metric values
G90 ; absolute positioning
M82 ; Extruder to Absolute
G28 ; home all axes
G1 X7 Y7 F6000 ; bring extruder to the front
G1 Z25 F2000 ; Raise Bed to Head
G92 E0 ; zero the extruded length
T0 ; Select Extruder 1
G92 E0 ; Zero Extrude L
G1 F200 E8 ; Extrude 16 @ 200mm/s
G92 E0 ; Zero Extrude L
G1 F50 E4 ; Extrude 16 @ 50mm/s
G92 E0 ; Zero Extrude L
G1 F20 E2 ; Extrude 2 @ 20mm/s
G1 X100 Y7 F6000 ; bring extruder to the front
G92 E0 ; Zero Extrude L
G92 E0 ; zero the extruded length again
End G-code
; Add Change Tool To Extruder 0 here

G92 E0 ; zero the extruded length
G1 E-2 F200 ; Extrude(Retract) -2mm @ 50mm/s
G28 ; home all
M104 S0 ; turn off heaters
M140 S0 ; turn off bed
M84 ; disable motors
Before layer change G-code
;XXX Before Layer Change
After layer change G-code
;LayerChange
G90 ; absolute positioning
G1 X190 Y190 F6000;

G92 E0 ; zero the extruded length
;G1 E7 F2100 ; Retraction compensation


;Prime Tower

;Prime Tower Routine
G91; Relative mode
G1 Z-1 F2100; Lower Head 1mm
G90 ; absolute positioning
G1 X180 Y190 F6000;
G91; Relative mode

;Rectangle around
G1 Y16 E7.1 F600
G1 X-128 E1 F1200
G1 Y-16 E0.1
G1 X128 E1
G1 Y-16 E0.1
G1 X-128 E1
G1 Y16 E0.1

;Prime Nozzle
;G1 X-128 F3600;No extrusion because part of border


G1 X16 Y-16 F6000
G1 Y32 E0.1 F1200
G1 X16  F6000
G1 Y-32 E0.1 F1200
G1 X16 F6000
G1 Y32 E0.1 F1200
G1 X16 F6000
G1 Y-32 E0.1 F1200
G1 X16 F6000
G1 Y32 E0.1 F1200
G1 X16 F6000
G1 Y-32 E0.1 F1200
G1 X16 F6000
G1 Y32 E0.1 F1200
G1 X16 F6000
;G1 E-7 F2100 ; Retract
G1 Y-32 E-6.9 F1200;No extrusion because part of border

G1 Z1 F2100; Raise Head 1mm

G90 ; absolute positioning
G92 E0 ; zero the extruded length


;Retract
;G92 E0
;LayerEnd
Tool change G-code
;XXX Tool Change
;M104 S100
G90 ; absolute positioning
G1 X190 Y190 F6000;

G92 E0 ; zero the extruded length
G1 E-399 F10000 ; Extrude(Retract) -500mm @ 50mm/s
G1 E-40[next_extruder] F30 ; Extrude(Retract) -1mm @ 1mm/s
G1 E-715 F10000 ; Extrude(Retract) -500mm @ 50mm/s

G92 E0 ; zero the extruded length
G1 F50 E-40 ; Extrude 8 @ 50mm/s

M0;

;M104 S[temperature_0]
G90 ; absolute positioning
G92 E0 ; zero the extruded length
G1 F50 E20 ; Extrude 8 @ 50mm/s

G92 E0 ; zero the extruded length
G1 E700 F10000 ; Extrude(Insert)500mm @ 50mm/s

G92 E0 ; zero the extruded length
G1 F50 E20 ; Extrude 16 @ 50mm/s


;Prime Tower

;Prime Tower Routine
G91; Relative mode
G1 Z-1 F2100; Lower Head 1mm
G90 ; absolute positioning
G1 X180 Y190 F6000;
G91; Relative mode

;Prime Nozzle
G1 Y1 F6000
G1 Y[next_extruder] F6000
G1 X-128 E2 F700
G1 Y-16 F6000
G1 X128 E2 F700
G1 Y-1 F6000
G1 Y-[next_extruder] F6000
G1 X-128 F6000

G1 X1 F6000
G1 X[next_extruder] F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E0.2 F700
G1 X16 F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E0.2 F700
G1 X16 F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E0.2 F700
G1 X16 F6000
G1 Y32 E0.2 F700
G1 X16 F6000
G1 Y-32 E-6.8 F700

G1 Z1 F2100; Raise Head 1mm

G90 ; absolute positioning
G92 E0 ; zero the extruded length


;Retract
;G92 E0
;ToolEnd
Als nächstes kommen die Filament Settings für Filament und Cooling:







 
Als nächstes kommt nun der größte Block, nämlich die Print Settings mit allen Unterkategorien:














Hier sollte natürlich der richtige Pfad zu dem entsprechenden Skript eingetragen werden. Ich musste nämlich ein Post-Script schreiben, welches meinen G-Code bearbeitet, da Slic3r T0, T1, ... für die verschiedenen Extruder verwendet - ich aber nur einen benutze. Füttert man den Ultimaker mit T1, so bewegt sich der erste (und einzige) Extruder nicht mehr, was in diesem Fall ja der falsche Ansatz wäre. Das Post-Script tut 2 Dinge:
  • Alle T1, T2, ... zu T0 ändern
  • Ein Problem mit der Retraction beheben - Slic3r macht eine Retraction bei Tools die ich nicht benutze bzw. schiebt das Material nach dem Custom G-Code wieder in die Nozzle. Das macht er aber nicht, wenn ich ein Tool zum ersten Mal verwende, da Slic3r ja in diesem Tool auch kein Material herausgezogen hat. Daher checkt mein Post-Script, ob in der entsprechenden Zeile nach einem Tool Change ein E7-Befehl ist, also ob das Material 7mm wieder in die Nozzle gedrückt wird, falls nicht fügt das Post-Script dies hinzu
Das Post-Script ist in Octave (Matlab-ähnlich) geschrieben, das sollte man sich also ebenfalls installieren. Mein PostScript "StartOctave.bat" sieht so aus:
C:\Octave\Octave-4.2.1\octave.bat C:\Slic3rSkripte\OctavePostScript.m %1
Es ruft also die Datei "OctavePostScript.m" auf, welche so aussieht:
s = argv(){1};

myfile = fopen("testOctave.txt", "w");
fprintf(myfile, "%s\r\n", s);
fclose(myfile);

%s = "I:\Traffic_Cone_Rings_Orange.gcode";
myfile = fopen (s, "r");
outText = [];
tline = fgetl(myfile);
i = 1;
outText{i} = tline;
while ischar(tline)
  i = i+1;
  outText{i} = tline;
 
 
  tline = fgetl(myfile);
end
imax = i;
fclose(myfile);

myfile = fopen(s, "w");
%fprintf(myfile, ";EDITED!\r\n");
insertLine = 0;
for i=1:imax
  tempLine = outText{i};
 
  if (size(tempLine,2) > 1)
    if (tempLine(1) == "T")
      outText{i} = "T0";
    end
  end
 
 
  if (strcmp(tempLine,";ToolEnd"))
    insertLine = 7;
  end
  
  if (insertLine > 0)
    insertLine = insertLine -1;
  end
 
  if (insertLine == 1)
    if (tempLine(4) == "E")
    else
      fprintf(myfile, "G1 E7.00000 F2100.00000\r\n");
      fprintf(myfile, "G92 E0 \r\n");
    end
  end

  fprintf(myfile, "%s\r\n", outText{i});
end
fclose(myfile);
Nun muss also nur noch ein Objekt in Slic3r geladen werden, über Rechtsklick-Settings kann man dann mit "Load Part" die weiteren Farb-Objekte dazu laden und dann den jeweiligen Extruder bzw. die jeweilige Farbe einstellen. Für Tests könnte man also die Thingiverse-Links oben von mir nutzen.

Der Quellcode ist definitiv noch ausbaufähig, wer Verbesserungsvorschläge hat kann diese mir gerne mitteilen, man sollte das alles auch unter dem Hintergrund betrachten, dass ich bereits versuche, alle auf einen automatischen Materialwechsel auszulegen, sodass einige Sachen vielleicht teilweise etwas zu kompliziert aussehen könnten.