Sonntag, 25. Mai 2014

Mein Mendel90 bekommt ein LCD

Damit nicht ständig ein PC den Drucker mit Druckdaten füttern muss, habe ich schon seit langem einen Raspberry Pi mit Octoprint/Octopi am Drucker angebaut. Soweit so gut. Beeinflussen kann man den Drucker dann über jeden Browser im Netz. Das hat zur Folge, dass doch während dem Drucken irgendwo ein Rechner läuft - falls was schief geht und der Druck gestoppt werden muss. Einfach Ausschalten ginge natürlich auch, aber das mag das Dateisystem auf der SD-Karte im Raspberry Pi nicht so gerne.

Deshalb wollte ich eigentlich immer schon ein Display direkt am Drucker haben. Es soll Systemzustände anzeigen, über ein Menü sollen Dateien auf der SD-Karte zum Druck ausgewählt werden können, man kann die Achsen verfahren, Temperaturen einstellen und vieles mehr.

Grundsätzlich gibt es alphanumerische und graphische Displays. Auch in der Art der Ansteuerung unterscheiden sie sich. Je mehr Anschlussdrähte man benötigt, desto schwieriger wird es, das Wunschdisplay an die eigene Hardware anzuschließen, weil so ein Mikrocontroller halt nur eine bestimmte Anzahl an Anschlüssen hat. Einige davon werden ja bereits für den Drucker selbst benötigt.

Auf der Suche nach geeigneten Displays bin ich auf dieses gestoßen:



Leider war ich um mehrere Monate zu spät, um noch bei der Crowdfunding-Aktion mitzumachen. Die Finanzierung hat auch leider nicht dazu geführt, dass dieses Display dauerhaft erhältlich ist. Doch noch im September 2013 hat der Entwickler seine Prototypen und Restbestände verkaufen wollen - blos geantwortet hat er mir nie.

Ab November 2013 wurde von einem eine Sammelbestellung gestartet. Es haben sich aber nicht genügend Interessenten gemeldet. Letztlich brach auch hier der Kontakt zum Sammelbesteller ab.

Ergo: Immer noch kein Wunschdisplay für mich. Also suchte ich weiter.

Am 29.04.2014 traf für mich eine private Nachricht im Reprap-Forum ein. Ein Mitglied hat tatsächlich so ein Display übrig und will es mir verkaufen! Freu! Hüpf! Wenige Tage später hatte ich das Display in Händen:


Der Entwickler hat auch ein Gehäuse dazu entworfen und auf Thingiverse abgelegt. Dummerweise hat es Fehler. Die untere Gehäusehälfte hat in der Luft schwebende Haltestifte für die Platine:


Die obere Gehäusehälfte hat nur ein 3mm Loch für den Speaker. 17mm wären nötig gewesen. Ich habe deshalb seine Dateien repariert und nun kann jeder aus meinen Dateien ein passendes Gehäuse drucken.


Der grüne Drehknopf kommt vom Parametric Potentiometer Knob Generator. Meine Parameter sind


01_knob_diameter_top = 20;
02_knob_diameter_bottom = 20;
03_knob_height = 16;
04_knob_smoothness = 40;
05_shaft_diameter = 6.2
06_shaft_height = 10;
07_shaft_smoothness = 20;
08_shaft_hole_is_flatted = "true";
09_shaft_hole_flat_size = 5.0;
10_set_screw = "false";
15_top_edge_smoothing = "true";
16_top_edge_smoothing_radius = 5.0;
17_top_edge_smoothing_smoothness = 20.0;
18_pointy_external_indicator = "false";
21_top_of_knob_arrow_indicator = "false";
28_indentations_sphere = "false";
36_indentations_cylinder = "true";
37_number_of_cylinder_indentations = 6;
38_smoothness_of_cylinder_indentations = 50;
39_diameter_of_top_of_the_cylinder = 5.0;
40_diameter_of_bottom_of_the_cylinder = 5.0;
41_height_of_cylinder_indentations = 15.0;
42_position_of_cylinder_x = -0.0;
43_position_of_cylinder_y = 0.0;
44_position_of_cylinder_z = -5.0;
45_cylinder_starting_rotation = -30;


Damit erhält man diesen Knopf generiert:



Nun kam der schwierige Teil - die Firmware meines Druckers so konfigurieren, dass das LCD auch was anzeigt, der Drehknopf funktioniert und der Piepser Töne von sich gibt.

Das schöne an einem Komplettbausatz, so wie ich ihn im September 2013 bestellt und zusammengebaut habe, ist, dass alles zusammenpast. Insbesondere ist die richtige Firmware schon fertig vorkonfiguriert und auf die Controllerplatine hochgeladen. Als ich im Oktober 2013 den Drucker kalibriert hatte, war ich zuletzt in den Innereien der Firmware unterwegs. Die damalige Version war Marlin 1.0.0 RC2 (von ca. Mitte 2012). Allerdings wurde an dieser Version vom Bausatz-Verkäufer diverse Anpassungen vorgenommen, die es sehr schwierig machen, neuere Versionen vom Hauptentwickler zu verwenden.

Insbesondere die LCD-Erweiterungen, die gegen Mitte 2013 ins Projekt geflossen sind, sind in meiner Version nicht vorhanden. Glücklicherweise hat sich im März 2014 jemand gefunden, der die Änderungen zusammenbringt und verfügbar macht.

Soweit so gut. Ich habe mich also daran gemacht, die Anweisungen für mein Melzi-Controllerboard in die Quelldateien einzubauen. Dummerweise steht bei den Anweisungen, man solle Diverses in diversen Zeilen modifizieren. Das mag zum damaligen Zeitpunkt ausreichend gewesen sein - mittlerweile passt das hinten und vorne nicht mehr. Es wäre besser gewesen, wenn die notwendigen Abschnitte Bestandteil der Marlin Firmware geworden wären und man in gewohnter Manier die Konfiguration vornimmt. Leider gab es beim Compilieren dann auch noch einen Fehler:

Binary sketch size: 130,666 bytes (of a 129,024 byte maximum)

Tja ... so ein Atmel Mikrocontroller hat halt nun mal nur begrenzte Ressourcen. Hier ist der Flashspeicher zu klein. Als einzigen Ausweg, den Code kleiner zu bekommen, ist es, Dinge, die man nicht braucht, wegzulassen. Bei mir kommen die EEPROM-Funktionen in Frage. Die habe ich eh nie benutzt. Dort könnte man diverse Parameter (Temperaturen, Geschwindigkeiten) dauerhaft speichern.

Letztendlich klappte es und ich konnte die Firmware hochladen. Nur um festzustellen, dass die deutschen Umlaute nicht passen. In diesem Thread wird das behandelt. Interessant ist vor allem, dass ein kleines "ä" problemlos angezeigt wird, wenn man es als "\0xe4" im Text kodiert. Ein kleines "ü" bekommt man mit einem "\0xfc" aber nicht hin. Warum? Weil der "Entwickler" in der Fontdefinition gepfuscht hat:

Also muss man den Pfusch wieder grade ziehen, dann klappt's auch mit den Umlauten:



Der SD-Kartenleser zickt noch ein bissl und ich muss noch eine geeignete Haltekonstruktion für das Display entwerfen und drucken, dann steht dem autarken Drucken nichts mehr im Wege.