Freitag, 14. August 2015

CAD - womit konstruiert man seine 3D Druckobjekte?

Seit dem ersten Post hier in diesem Blog war mir klar, dass ich die Fähigkeit entwickeln musste, eigene 3D-Objekte entwerfen zu können. Der Gedanke "Es wird sicher irgendwann auf mich zu kommen, etwas zu drucken, was es nicht schon fertig zum Download irgendwo gibt." begleitete mich von Anfang an.
Von der 8. bis zur 12. Klasse habe ich Unterricht im technischen Zeichnen bekommen. Freilich nicht an einem CAD-Arbeitsplatz. Stattdessen gab es mit Bleistift oder Tusche ausgeführte 3-Tafel-Projektionen sich durchdringender Körper, deren isometrische Ansicht und immer mal wieder Abwicklungen, die man dann auch ausschneiden konnte und so einen 3-dimensionalen Körper vor sich hatte.
(c) Wikipedia

Beruflich habe ich hin und wieder mit CAD Dateien zu tun, welche von Architekten stammen - die Masse davon ist aber 2-dimensional. Dennoch kommt man in die Verlegenheit, einmal in die Welt der Profi-CADer zu schnuppern. Leider ist meine Begeisterung was z.B. AutoCAD betrifft nicht sehr groß. Diese Software zu lizenzieren ist mangels Budget nicht möglich. Die Home-Use Lizenz von Visio nutze ich hin und wieder.

Die Grundlagen was das 2-dimensionale betrifft, wären also vorhanden. Das reicht aber bei Weitem nicht aus. Ein Beispiel:

Vor einigen Monaten ergab sich am Stammtisch die Notwendigkeit, an einem fertigen 3D-Objekt ein wenig Hand anlegen zu müssen. Damals hatte ich weder die richtigen Werkzeuge noch das nötige Wissen um so etwas zu machen. Ich glaube, eine Wand an dem Körper war zu hoch, oder ein Durchbruch zu klein - jedenfalls etwas ziemlich Einfaches. Natürlich gelang es uns nicht, die Datei so zu manipulieren, wie wir wollten. Letztlich wurde der Versuch abgebrochen. Das war dann der Auslöser, endlich eine Konstruktionssoftware näher kennenzulernen.

Für den 3D-Druck werden .stl Dateien benötigt. Alle Programme, die nicht in der Lage sind .stl Dateien zu exportieren, scheiden aus. Von einem Programm habe ich bei diversen Anlässen schon gehört. Es wird auch in meinem Umfeld von ein paar wenigen Leuten benutzt: Blender


Blender ist ein Multitalent. Es kann viel mehr als nur 3D-Objekte erzeugen. Es dauert seine Zeit, bis man "drin" ist - und selbst nach vielen Stunden des Lernens gibt es noch immer einiges zu entdecken. Man muss sich auch darauf einstellen, dass die Einheiten, die Blender verwendet, nur mit Mühe in reale Dimensionen überführt werden können. Ein Bekannter äußerte sich mal zu diesem Problem mit "Blender kann nicht exakt, Blender kann hauptsächlich schön".

Einen Abend lang habe ich einen Freecad Workshop besucht. Diese Software kann man relativ schnell erlernen. Freecad versucht irgendwie alles zu können. Ob Maschinenbau oder Architektur, es hat Schnittstellen für Makroprogrammierung, es kann Bemaßen, viele Formate anderer Programme im- oder exportieren, Bewegungen simulieren und vieles mehr. Natürlich lernt man an einem Abend nicht alles - aber es genügt um  weiter zu machen. Gestört hat mich  bei Freecad lediglich, dass man alle Konstruktionsschritte erst 2-dimensional macht und dann in die dritte Dimension bringt.


Mein erster Eintrag in diesem Blog enthält einen Abschnitt wie ich meinen 3D-Drucker ausgewählt habe:


Der hat eine recht innovative Sache zur Konstruktion des Druckers verwendet: OpenSCAD. Diese Software hat keine Zeichenwerkzeuge. Stattdessen (be)schreibt man seine Objekte durch Positionieren, Dimensionieren und Kombinieren von Grundkörpern. Dabei hat man auch die Möglichkeit, Variable zu verwenden. Im Ergebnis kommt eine höchst flexible Konstruktion dabei heraus. Will man z.B. statt der M6 Gewindestangen welche mit M8 verwenden, trägt man das in eine Parameterdatei ein und lässt den Drucker einfach neu "berechnen". Alle davon abhängenden Bereiche werden automatisch angepasst. faszinierende Sache das. 
Ja, so faszinierend das zu Beginn war, es war - und ist zum Teil auch heute noch - schwer verständlich, was mein Druckerkonstrukteur in den vielen Dateien anstellt.
Zum Erlernen ist das ungeeignet. Dennoch hat mir das dahinter liegende Prinzip so gut gefallen, dass ich dabei geblieben bin. Natürlich konstruiere ich nicht jeden Tag irgendwelche Objekte. Aber immer wenn es zu einer Konstruktion kommt, merke ich, dass ich immer mehr Sprachelemente in effektiverer Weise benutze als früher.


Dieser Rackmount-Winkel erlaubt es, einen Raspberry Pi in einen 19" Schrank zu montieren. Die beiden Bauteile benötigen knapp 270 Zeilen Code. Dabei geht es im wesentlichen darum, Platten zu positionieren, Quader auszuhöhlen und Löcher zu bohren. Die Positionen und Dimensionen dieser Bauelemente werden in Konstanten vorgehalten. Aus dem Wikipedia-Eintrag zum 19" Rack entnimmt man z.B. diesen Satz
"Das 19-Zoll-Rack-System ist für gute Kompatibilität genormt (EIA 310-D, IEC 60297 und DIN 41494 SC48D). Die Frontplatten der Einschübe sind demnach ein Vielfaches einer Höheneinheit, welche 1,75 Zoll entspricht. Für etwas Spielraum beim Ein- und besonders Ausbau werden von Frontplatten einmal 1/32 Zoll (entspricht 0,787 mm) abgezogen."
und bildet daraus die Konstante in Millimeter für eine Höheneinheit:
he = (1.75 - 1/32) * 25.4;
In gleicher Art bildet man alle weiteren Konstanten, die man zur Konstruktion benötigt. Wenn dann später die Teilkonstruktionen definiert werden, kann man sich auf diese Konstanten beziehen und die Frontplatte einfach mit
cube([platte_l, platte_d, he]);  // 1 HE Platte
konstruieren. Sollte später festgestellt werden, dass die Stärke der Platte platte_d=2; nicht ausreicht, wird einfach der Wert verändert und man muss nicht den Code nach allen in Frage kommenden Stellen durchsuchen. Ähnlich einfach werden die beiden Montagelöcher gesetzt:

// Loch unten
translate([winkel / 2, -0.5, he / 2 - lochabstand / 2])
   rotate([-90, 0, 0])
      cylinder(d=m6_durchgangsloch, h=platte_d + 1);
 
// Loch oben
translate([winkel / 2, -0.5, he / 2 + lochabstand / 2])
   rotate([-90, 0, 0])
      cylinder(d=m6_durchgangsloch, h=platte_d + 1);

Die volle Eleganz von OpenSCAD kommt aber erst zum Vorschein, wenn man z.B. gleichartige Objekte geometrisch verteilen will. Beim LED-Halter für meine Kamera war es notwendig, 23 Abstandshalter (+ 1 Lücke für die Anschlußkabel) auf 24 Positionen zu verteilen:

In OpenSCAD ist das ein 6-Zeiler:
for(i=[0:22])
{
  rotate([0, 0, i * 360 / 24 - 75])
     translate([led_halter_m, 0, 1])
        cylinder(d=5, h=1);
}
Dabei wird i pro Schleifendurchlauf von 0 bis 22 iteriert. Pro Schleifendurchlauf wird der Rotationswinkel neu berechnet. Er durchläuft nacheinander die Werte -75°, -60°, -45° ... 255°. Der Zylinder wird in x-Richtung im Halter etwas erhöht positioniert und anschließend entlang der Kreislinie des Halters rotiert.

Was aktuell in OpenSCAD schlecht ist, wären die verfügbaren Bibliotheken. Einerseits gibt es weder einen einheitlichen Ort, wo man Bibliotheken findet, andererseits gibt es Bibliotheken die Fehler enthalten. Die mitgelieferte Bibliothek ist auch noch sehr schlecht dokumentiert. Man sollte davon ausgehen, dass eine Bibliothek für DIN-Gewinde, Objekte erzeugt, die man benutzen kann. Ich habe eine je eine Mutter und Schraube mit M20 Gewinde gedruckt - leider passen sie nicht ineinander. Die gedruckte Mutter lässt sich nur mit Mühe auf eine gekaufte M20 Schraube drehen, die gekaufte Mutter geht gar nicht auf die gedruckte Schraube. Das bedeutet nun für mich, dass ich die Bibliothek auseinander nehmen müsste um die dort enthaltenen Fehler zu finden. Das Gleiche gilt für eine Bibliothek zum Erzeugen von Zahnrädern mit Evolvente. Daran versucht sich derzeit ein Bekannter von mir.

Zum Schluss noch eine Fähigkeit, die man nicht so oft benötigt - aber eindrucksvoll zeigt, was alles machbar ist. OpenSCAD kann mittels der Variable $t animierte Darstellungen der Konstruktion erzeugen:


Die so erzeugten Einzelbilder lassen sich dann entweder zu einem .gif oder zu einem Film zusammenfassen.

Wer jetzt neugierig geworden ist, kann sich ja den Blogeintrag von gestern durchlesen und die Workshop-Dateien durcharbeiten. Viel Spaß!

Donnerstag, 13. August 2015

OpenSCAD - kannst Du nicht mal einen Kurs dazu geben?

Ende Mai bin ich während eines 3D Drucker-Abends im OpenLab Augsburg gefragt worden, ob ich mein Wissen nicht mal an Andere weitergeben möchte. Auslöser war die Bitte, mal schnell einen "Winkelhalter" zu konstruieren. In der Tat war der schnell in OpenSCAD fertig:

In knapp 30 Zeilen beschreibt man die Einzelteile und wie sie zusammengefügt werden:

//
// Winkelhalter
//

hoehe=40;
nut_h=8;
nut_l=11;
laenge=56.8;
dicke=6;
offset=-0.1;

difference()
{
 union()
 {
  cube([laenge, dicke, hoehe]);
  cube([dicke, laenge, hoehe]);
  linear_extrude(dicke)
   polygon(points=[[dicke + offset, dicke + offset], 
                   [dicke + offset, laenge], 
                   [laenge, dicke + offset]], 
            paths=[[0, 1, 2]]);
 }
 for(i=[1/5, 3/5])
 {
  translate([laenge*i, -0.5, hoehe/2 - nut_h / 2])
   cube([nut_l, dicke+1, nut_h]);
  translate([-0.5, laenge*i, hoehe/2 - nut_h / 2])
   cube([dicke+1, nut_l, nut_h]);
 }
}

Meine Behauptung, dass das eine relativ einfache Aufgabenstellung gewesen sei, löste die Frage nach dem Kurs aus.

Also habe ich mich hingesetzt und überlegt, wie man sowas machen könnte. Ich bin kein Freund von "Frontunterricht". Ich weiß aber auch, dass die ersten paar Stunden in OpenSCAD ziemlich frustrierend sein können. Die originale Dokumentation beschränkt sich leider auf das reine Auflisten von Funktionen und lässt dabei auch noch wesentliche Dinge aus. Im Internet gibt es einige Unterlagen, die man als Kursmaterial verwenden könnte. Auch Videos sind reichlich verfügbar - das meiste jedoch in englisch. Ich werde also nicht darum herum kommen, wesentliche Teile der Dokumentation zu wiederholen - dabei aber möglichst vollständig.
Anstelle der schlechten Beispiele wollte ich Aufgaben stellen, die nach etwa einer Woche durch Musterlösungen von mir abgeschlossen werden. Die Teilnehmer sollen die Aufgaben in dem Tempo lösen, welches ihnen angenehm ist - wahlweise auch in der Gruppe oder einzeln zu Hause. Zwischen den Aufgaben gibt's Erklärungen und nachfolgende Aufgaben sollen das bisher vermittelte Wissen zur Anwendung bringen.
Eine weitere Herausforderung war, nicht jeder der teilnehmen wollte, hatte zu den Drucker-Abenden auch immer Zeit. Deshalb ist jetzt der Kurs so geworden, dass man ihn auch zu Hause mitverfolgen kann. Die einzelnen Teile gibt's als PDF-Datei und meine Musterlösungen stehen ebenfalls zum Download bereit.

Inhaltlich wollte ich von Anfang an sinnvolle Beispiele und Aufgaben haben. Das ist zu Beginn, wenn noch der Großteil der OpenSCAD-Fähigkeiten unbekannt ist, eine extra Herausforderung. Dennoch ist es mir gelungen, schon auf der dritten Seite - am Ende des ersten Teils - 2 Aufgaben zu platzieren, die die implizierte Vereinigungsmenge von OpenSCAD ausnutzt, obwohl dieser Umstand zu diesem Zeitpunkt noch nicht erklärt wurde.

Im Original stört mich ganz besonders das Weglassen von Möglichkeiten. Erst durch Kombination von Dingen wie z.B. $fn=20 (Anzahl der Facetten eines runden Körpers) und cylinder(d=10, h=20) (Zylinder mit dem Durchmesser 10 und Höhe 20) zu cylinder(d=10, h=20, $fn=6) erhält man ein 6-eckiges Prisma. Auf ähnliche Art kann man pyramidenartige Teile konstruieren. Im Original wird dagegen eine Pyramide mit der ungleich schwierigeren Funktion polyhedron()erzeugt:


polyhedron(
  points=[ [10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0], // the four points at base
           [0,0,10]  ],                                 // the apex point 
  faces=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4],              // each triangle side
              [1,0,3],[2,1,3] ]                         // two triangles for square base
 );

In meinem Script kommt diese Funktion erst dann vor, wenn man sie wirklich benötigt. Dagegen wird nach der Einführung von Berechnungsmöglichkeiten und Konstanten eine maßstabsgetreue Cheops-Pyramide zur Aufgabe gestellt. Die Teilnehmer sollen hier auch alle zur Berechnung nötigen Angaben aus Quellen im Internet beschaffen.

Berechnungen von Durchnmessern ... Satz des Pythargoras ... das ist lange her als das mal in der Schule ein Thema war. Ich kann mich auch nicht erinnern, dass ich während meines Berufslebens jemals solche Berechnungen anstellen musste. Es schadet aber auch nicht, die grauen Zellen mal wieder ein wenig arbeiten zu lassen. Später im Script kommen auch noch trigonometrische Berechnungen vor und an einem Kreissegment soll gerechnet werden - komplizierter wird es aber nicht.
Die Alternative zu den Berechnungen wäre, Näherungswerte zu schätzen. Dummerweise sind diese Schätzwerte bei einer Veränderung von Maßen unbrauchbar. Gerade das ist aber die herausragende Eigenschaft von OpenSCAD - alles anhand von numerischen Werten zu beschreiben und den Rest dazu passend mit den richtigen Formeln auszurechnen. Letztlich ist es jedem selbst überlassen, ob er sich den mathematischen "Ballast" erspart und die Möglichkeiten nicht voll ausschöpft.

Im zweiten Teil werden auch die Operationen aus der Mengenlehre eingeführt und anhand von Beispielen erläutert. Am Ende werden diese Mengenoperationen benötigt, um Rohlinge einer M20 Mutter und M20 Hutmutter zu konstruieren.

Der dritte Teil führt die noch fehlenden 3D-Objekte und Transformationen ein und geht dann in eine mehrseitige Aufgabensammlung zur Konstruktion eines Regals aus Aluminium Strangprofilen über. Dabei werden 2D-Objekte und deren Extrusion gezeigt.


Im letzten Teil des Kurses werden Module, Funktionen und Bibliotheken benutzt um Teilkonstruktionen noch flexibler einzusetzen. Im Ergebnis wird in Aufgabe 18 das Regal konstruiert:


Bei derartigen Konstruktionen ist es wichtig, die richtige Menge an Material im Auge zu behalten. OpenSCAD kann den Anwender dabei unterstützen, eine Einkaufsliste zu erzeugen. Ein paar echo() Anweisungen in der Konstruktion erzeugen nach Filterung durch grep, sort, sed und uniq so eine Teileliste:


Zum Abschluss des letzten Teils soll ein Raspberry Pi in ein 19" Rack geschraubt werden. Die Aufgabe hört sich einfach an - die Probleme stecken in den Details. Es geht los mit den Abmessungen eines solchen Racks. Die Lochabstände, freizuhaltende Bereiche, umzurechnende Zollangaben - einzelne Kleinigkeiten zwar, aber am Ende sollte es halt passen. Einen Raspberry Pi zu befestigen ist einfach - es so zu tun, dass zumindest die Netzwerkbuchse bedienbar bleibt ist schon schwieriger.

Rückblickend muss ich feststellen, dass die Teilnehmer leider nicht so mitgemacht haben, wie ich mir das gedacht habe. Anfangs habe ich sehr viele Lösungen bekommen - teils sogar mehrere Varianten pro Aufgabe. Im Laufe des Kurses wurden es aber immer weniger. Vielleicht gibt es ein paar Neu- / Wiedereinsteiger nach Veröffentlichung dieses Eintrags - mal sehen. Jedenfalls ist es möglich, jederzeit zu beginnen und wer nicht in die Musterlösungen spickt, wird jede Menge dabei lernen.

Zu guter Letzt hier noch die Dateien zum Kurs:

Workshop OpenSCAD Seite 1-3.pdf
Workshop OpenSCAD Seite 4-7.pdf
Workshop OpenSCAD Seite 8-10.pdf
Workshop OpenSCAD Seite 11-16.pdf
Musterloesungen.zip