3D Konstruktion mit OpenSCAD – Einführung
4 verfasser
Seite 1 von 1
3D Konstruktion mit OpenSCAD – Einführung
Hallo.
Ich möchte euch einen kleinen Schnupperkurs in 3D Konstruktion mit dem Open Source Tool OpenSCAD geben. Ich bin selbst auch noch keine Leuchte, aber vielleicht ist gerade das ein Vorteil. Für jemand, der tagtäglich mit einem Programm arbeitet ist es oft sehr schwer, Probleme zu sehen, die ein Einsteiger vielleicht haben könnte. Da ich selbst noch Einsteiger bin, stolpere ich bestimmt über alle denkbaren und auch einige undenkbare Fallstricke…
Es gibt sehr viele Tools, um 3D Objekte am PC zu konstruieren. Von fast schon „kindertauglichen“ Geschichten wie Tinkercad bis hin zu Hochprofessionellen Tools wie AutoCAD oder Solidworks. Darunter sind auch einige, die man, zumindest als Privatperson, kostenlos nutzen kann. Das trifft z.B. auf FreeCAD oder Fusion 360 zu, Auch OpenSCAD gehört als OpenSource Software natürlich zu den kostenlosen Programmen. Im Gegensatz etwa zu Fusion 360 darf man OpenSCAD auch im professionellen Umfeld kostenlos verwenden, wenn man mag.
Was unterscheidet OpenSCAD von dem wesentlich bekannteren FreeCAD? Nun, in FreeCAD hat man ein aufwändiges GUI in dem man auf unzähligen „Workbenches“ unglaublich viele komplizierte Sachen machen kann. Die meisten andren Tools, auch die Professionellen, sind da ganz ähnlich gestrickt.
OpenSCAD ist einfach anders und dadurch zumindest für mich viel einfacher und leichter zu verstehen. In OpenSCAD gibt es zwar auch ein GUI, das dient aber vorrangig um die eigene Arbeit ansehen zu können. Das eigentliche Konstruieren geschieht in einem Text Editor. Ein entsprechender Editor ist eingebaut. Man kann aber auch extern, z.B. mit Notepad++ arbeiten. Mir hat der interne Editor bisher immer gereicht. Auch hier erschafft man sein Modell aus Grundkörpern, die skaliert, verschoben, addiert, subtrahiert,…. werden. Das Grundprinzip ist in vielen derartigen Programmen ganz ähnlich. Allerdings werden die Manipulationen an den Körpern in der GUI und nicht in Formeln durchgeführt. Mir behagt das klare Tippen von exakten Positionen und Abmessungen einfach mehr, als etwa ein Körper mit der Maus so zu verändern, wie ich ihn benötige. OpenSCAD ist so eine Art Programmieren, aber mit wenigen, leicht zu verstehenden Befehlen und Funktionen.
Da man wie in „richtigen“ Programmiersprachen auch mit Variablen arbeiten kann, hat OpenSCAD ein Alleinstellungsmerkmal, die freie Parametrierbarkeit. Nicht umsonst sind nahezu alle parametrierbaren Designs auf Thingiverse mit OpenSCAD hergestellt worden. Was bedeutet diese freie Paramtrierbarkeit nun genau?. Dazu werden wir in unserem ersten Beispiel eines Servo- Halters für verschiedene RC Servos noch mal genauer anschauen. Für jetzt so viel… Man legt am Anfang einige Variablen fest und weist ihnen Werte zu. Sagen wir mal:
$l = 7;
Wenn wir nun irgendwo in unserem „Programm“ nun $l (für Länge) einfügen wird hier immer der Wert 7 genutzt, wie wir es festgelegt haben. Durch dieses Definieren am Anfang kann man nur durch anpassen dieses einen Wertes das Objekt in ganz unterschiedlichen Größen und Formen erstellen.
Im Baubericht über meine Drehscheibe habe ich ein Adapter für den Stepper Motor vorgestellt. Dieser Adapter ist ebenfalls parametrierbar, um ihn an unterschiedliche Höhen und Durchmesser anpassen zu können, ohne jedes Mal das ganze Teil neu konstruieren zu müssen.
Da ich sonst in AutoIt programmiere und hier alle Variablen ein $ vorangestellt haben müssen, habe ich mir auch in OpenSCAD angewöhnt, eine Variable mit dem vorangestellten $ zu kennzeichnen. Das ist bei OpenSCAD nicht nötig. Man kann hier die Variablen völlig frei benennen, ganz nach eigenem Geschmack. Also eben auch mit einem voran gestellten $… Das erhöht die Übersicht, zumindest für mich…
Für unser erstes Übungsobjekt, einen Halter für RC Servos zum Weichen schalten, Tore öffnen, Signale stellen usw… ist die Parametrierbarkeit schon fast zwingend. Schließlich gibt es Dutzende von verschiedenen Größen für RC Servos. Und selten kommt man mit nur einer Größe aus. Wenn wir nun von vorne herein ein Auge darauf haben, müssen wir nur noch, wenn uns eine neue Servo- Größe unter kommt, die Abmessungen in den Anfang unseres Designs übertragen und der Halter sollte sofort wieder passen.
Doch bevor wir unseren Servo Halter konstruieren, müssen wir einige ganz elementare Basics lernen. Das lässt sich leider nicht vermeiden. Im nächsten Beitrag stelle ich zuerst die GUI von OpenSCAD vor und zeige den Umgang mit Grundkörpern.
Ich möchte euch einen kleinen Schnupperkurs in 3D Konstruktion mit dem Open Source Tool OpenSCAD geben. Ich bin selbst auch noch keine Leuchte, aber vielleicht ist gerade das ein Vorteil. Für jemand, der tagtäglich mit einem Programm arbeitet ist es oft sehr schwer, Probleme zu sehen, die ein Einsteiger vielleicht haben könnte. Da ich selbst noch Einsteiger bin, stolpere ich bestimmt über alle denkbaren und auch einige undenkbare Fallstricke…
Es gibt sehr viele Tools, um 3D Objekte am PC zu konstruieren. Von fast schon „kindertauglichen“ Geschichten wie Tinkercad bis hin zu Hochprofessionellen Tools wie AutoCAD oder Solidworks. Darunter sind auch einige, die man, zumindest als Privatperson, kostenlos nutzen kann. Das trifft z.B. auf FreeCAD oder Fusion 360 zu, Auch OpenSCAD gehört als OpenSource Software natürlich zu den kostenlosen Programmen. Im Gegensatz etwa zu Fusion 360 darf man OpenSCAD auch im professionellen Umfeld kostenlos verwenden, wenn man mag.
Was unterscheidet OpenSCAD von dem wesentlich bekannteren FreeCAD? Nun, in FreeCAD hat man ein aufwändiges GUI in dem man auf unzähligen „Workbenches“ unglaublich viele komplizierte Sachen machen kann. Die meisten andren Tools, auch die Professionellen, sind da ganz ähnlich gestrickt.
OpenSCAD ist einfach anders und dadurch zumindest für mich viel einfacher und leichter zu verstehen. In OpenSCAD gibt es zwar auch ein GUI, das dient aber vorrangig um die eigene Arbeit ansehen zu können. Das eigentliche Konstruieren geschieht in einem Text Editor. Ein entsprechender Editor ist eingebaut. Man kann aber auch extern, z.B. mit Notepad++ arbeiten. Mir hat der interne Editor bisher immer gereicht. Auch hier erschafft man sein Modell aus Grundkörpern, die skaliert, verschoben, addiert, subtrahiert,…. werden. Das Grundprinzip ist in vielen derartigen Programmen ganz ähnlich. Allerdings werden die Manipulationen an den Körpern in der GUI und nicht in Formeln durchgeführt. Mir behagt das klare Tippen von exakten Positionen und Abmessungen einfach mehr, als etwa ein Körper mit der Maus so zu verändern, wie ich ihn benötige. OpenSCAD ist so eine Art Programmieren, aber mit wenigen, leicht zu verstehenden Befehlen und Funktionen.
Da man wie in „richtigen“ Programmiersprachen auch mit Variablen arbeiten kann, hat OpenSCAD ein Alleinstellungsmerkmal, die freie Parametrierbarkeit. Nicht umsonst sind nahezu alle parametrierbaren Designs auf Thingiverse mit OpenSCAD hergestellt worden. Was bedeutet diese freie Paramtrierbarkeit nun genau?. Dazu werden wir in unserem ersten Beispiel eines Servo- Halters für verschiedene RC Servos noch mal genauer anschauen. Für jetzt so viel… Man legt am Anfang einige Variablen fest und weist ihnen Werte zu. Sagen wir mal:
$l = 7;
Wenn wir nun irgendwo in unserem „Programm“ nun $l (für Länge) einfügen wird hier immer der Wert 7 genutzt, wie wir es festgelegt haben. Durch dieses Definieren am Anfang kann man nur durch anpassen dieses einen Wertes das Objekt in ganz unterschiedlichen Größen und Formen erstellen.
Im Baubericht über meine Drehscheibe habe ich ein Adapter für den Stepper Motor vorgestellt. Dieser Adapter ist ebenfalls parametrierbar, um ihn an unterschiedliche Höhen und Durchmesser anpassen zu können, ohne jedes Mal das ganze Teil neu konstruieren zu müssen.
Da ich sonst in AutoIt programmiere und hier alle Variablen ein $ vorangestellt haben müssen, habe ich mir auch in OpenSCAD angewöhnt, eine Variable mit dem vorangestellten $ zu kennzeichnen. Das ist bei OpenSCAD nicht nötig. Man kann hier die Variablen völlig frei benennen, ganz nach eigenem Geschmack. Also eben auch mit einem voran gestellten $… Das erhöht die Übersicht, zumindest für mich…
Für unser erstes Übungsobjekt, einen Halter für RC Servos zum Weichen schalten, Tore öffnen, Signale stellen usw… ist die Parametrierbarkeit schon fast zwingend. Schließlich gibt es Dutzende von verschiedenen Größen für RC Servos. Und selten kommt man mit nur einer Größe aus. Wenn wir nun von vorne herein ein Auge darauf haben, müssen wir nur noch, wenn uns eine neue Servo- Größe unter kommt, die Abmessungen in den Anfang unseres Designs übertragen und der Halter sollte sofort wieder passen.
Doch bevor wir unseren Servo Halter konstruieren, müssen wir einige ganz elementare Basics lernen. Das lässt sich leider nicht vermeiden. Im nächsten Beitrag stelle ich zuerst die GUI von OpenSCAD vor und zeige den Umgang mit Grundkörpern.
Claus60- Skalpell-Künstler
Die Grundlagen
Hier geht es um die Grundlagen, um das GUI und die ersten einfachen Objekte.
Ich gehe davon aus, das OpenSCAD bereits installiert worden ist. Also starten wir das Programm einfach mal:
Links ist der schon erwähnte Editor zu finden, in dem wir später unsere Modelle kreieren. Rechts ist oben die Vorschau unserer Konstruktion und darunter ein oder zwei Boxen, die Informationen anzeigen. Zum einen die Konsole, in der alle Ausgaben von OpenSCAD anzeigt und eventuell (kann man ein- und ausschalten) eine Fehlerbox, in der explizit Fehler aufgelistet werden. Mir reicht die Ausgabe in der Konsole, weswegen ich die Fehlerbox in der Regel ausblende. Das geht oben im Menü unter „Fenster“.
Oberhalb des Editors und unterhalb der 3D Ansicht gibt es je eine Menüleiste mit verschiedenen Knöpfen. Die werde ich dann erklären, wenn wir sie brauchen. Nun können wir beginnen, unser Objekt zu konstruieren. Aber halt, bevor wir anfangen, noch ein kleiner Exkurs zum Thema „Kommentare“. Ein Kommentar ist etwas, das es in jeder Programmier- oder Skript- Sprache gibt. Allerdings macht ein Kommentar absolut gar nichts. Alle Kommentare werden in allen Sprachen vollständig ignoriert. Also wozu gibt es sie überhaupt? Nun, das ist ganz einfach zu erklären. Kommentare dienen dazu, den Code leichter lesbar und für andere Leute verständlicher zu machen. Auf diese Art kann man also bestimmte Abschnitte mit einer Art „Überschrift“ versehen oder auch z.B. Copyright- Notizen im Code verewigen. Außerdem kann man so bestimmte Bereiche vorübergehend deaktivieren, wenn man am Testen ist… Kommentare werden bei OpenSCAD mit // eingeleitet. Alles, was in einer Zeile nach einem Doppelslash // steht, wird einfach ignoriert.
Wir geben also eine Überschrift in den Editor ein:
// OpenSCAD Tutorial
und drücken anschließend die Enter Taste. Nun gibt es eine zweite Zeile, was man an der 2 erkennen kann.
Jetzt werden wir endlich unseren ersten Körper erzeugen. Machen wir z.B. mal einen Würfel mit exakt 10 mm Kantelänge. Das geht so:
cube(10);
cube ist der Befehl zum erzeugen eines Kubus. In den Klammern stehen die Maße und das Semikolon schließt den Befehl ab. Darauf muss man achten, denn wenn auch nur ein Semikolon am Ende fehlt (wird viel zu gerne vergessen, kann ich euch sagen), funktioniert gar nichts mehr.
Man kann sofort sehen, das unterschiedliche Farben für den Text verwendet werden. Das nennt sich „Syntax- Hervorhebung“ und ist ein elementarer Bestandteil eine guten Editors. Auf diese Art kann man sofort sehen, um was es sich bei dem Code handelt. Türkis ist ein Kommentar, Blau ein Befehl und Rot ein Wert. Andere Editoren verwenden andere Farben, aber der Effekt ist stets derselbe. Man kann die einzelnen Teile leichter auseinander halten, was ungemein hilfreich ist.
Damit haben wir unseren Würfel erzeugt. Aber wir sehen noch gar nichts in der Vorschau. Dazu müssen wir die Vorschau aktualisieren. Das geschieht nicht automatisch, um nicht ständig Fehlermeldungen zu bekommen, während man noch am Tippen ist. Um das zu machen, muss man nur auf den „Vorschau“ Knopf klicken. Den gibt es sowohl oberhalb des Editors als auch unterhalb der 3D Ansicht. Es ist der Knopf mit dem >> und dem gestrichelten Würfel drauf, der Knopf ganz links unter der 3D Ansicht. Wenn euch die Funktion eines Knopfes nicht klar ist, einfach mal die Maus darüber fahren und einen Moment warten. Dann bekommt man eine kurze Erklärung. Falls es euch lieber ist, die Vorschau lässt sich auch durch die Taste F5 ausführen. Egal wie ausgelöst, der Effekt ist immer derselbe. Wir sehen endlich unser erstes Objekt.
Wir sehen nun in der 3D Ansicht eine Würfel mit exakt 10 mm Kantenlänge.
Apropos STL Export. Wenn wir wollen, können wir den Würfel jetzt schon als STL exportieren und ausdrucken. Vor dem Export muss das Objekt aber noch gerendert werden, denn die Vorschau ist nur eine grobe Skizze, nicht aber das fertige Objekt. Das geht mit dem Knopf direkt rechts neben dem Vorschau Knopf in beiden Menüleisten oder mit F6. Bei komplexen Objekten kann das durchaus mal eine Weile dauern, hier geht es aber genau so schnell wie die Vorschau. Auf meinem, nicht sehr starken PC dauert das Rendern genau 4/100 Sekunden…
Das Rendern ist erledigt und wir exportieren spaßeshalber den Würfel mal als STL Datei, wie man sie zum Drucken benötigt.
Dazu klicken wir auf den Export Knopf. Das ist der, auf dem STL steht und der sich in der Menüzeile über dem Editor direkt rechts neben dem Rendern Knopf befindet. Nun können wir einen Namen und den Speicherort für unsere STL Datei festlegen. Ich habe die Datei unter „Würfel_10“ abgespeichert. Diese STL Datei können wir direkt in unser Slicer Programm (ist immer beim 3D Drucker dabei) einlesen. Bei meinem Elegoo Mars ist das Programm Chitubox dabei. Bei eurem Drucker könnte auch ein ganz anderes Programm dabei sein. Die Aufgaben dieser Programme sind aber eigentlich immer dieselben.
Das war es dann auch schon. Wir haben ein 3D Objekt erstellt, welches man direkt ausdrucken oder zu einem Dienstleister senden kann.
Eigentlich könnten wir jetzt aufhören, oder? Spaß beiseite, das war erst der Anfang. Aber zumindest haben wir den kompletten Prozess einmal durchgespielt…
In der Zeit, die ich brauche, um in FreeCAD die passende Workbench auszuwählen, habe ich in OpenSCAD den Würfel schon im 3D Drucker…
Das zu lesen dauert 1000 mal länger als es zu machen, von daher…
Im nächsten Teil geht es dann um das verändern der verschiedenen Grundkörper.
Ich gehe davon aus, das OpenSCAD bereits installiert worden ist. Also starten wir das Programm einfach mal:
Links ist der schon erwähnte Editor zu finden, in dem wir später unsere Modelle kreieren. Rechts ist oben die Vorschau unserer Konstruktion und darunter ein oder zwei Boxen, die Informationen anzeigen. Zum einen die Konsole, in der alle Ausgaben von OpenSCAD anzeigt und eventuell (kann man ein- und ausschalten) eine Fehlerbox, in der explizit Fehler aufgelistet werden. Mir reicht die Ausgabe in der Konsole, weswegen ich die Fehlerbox in der Regel ausblende. Das geht oben im Menü unter „Fenster“.
Oberhalb des Editors und unterhalb der 3D Ansicht gibt es je eine Menüleiste mit verschiedenen Knöpfen. Die werde ich dann erklären, wenn wir sie brauchen. Nun können wir beginnen, unser Objekt zu konstruieren. Aber halt, bevor wir anfangen, noch ein kleiner Exkurs zum Thema „Kommentare“. Ein Kommentar ist etwas, das es in jeder Programmier- oder Skript- Sprache gibt. Allerdings macht ein Kommentar absolut gar nichts. Alle Kommentare werden in allen Sprachen vollständig ignoriert. Also wozu gibt es sie überhaupt? Nun, das ist ganz einfach zu erklären. Kommentare dienen dazu, den Code leichter lesbar und für andere Leute verständlicher zu machen. Auf diese Art kann man also bestimmte Abschnitte mit einer Art „Überschrift“ versehen oder auch z.B. Copyright- Notizen im Code verewigen. Außerdem kann man so bestimmte Bereiche vorübergehend deaktivieren, wenn man am Testen ist… Kommentare werden bei OpenSCAD mit // eingeleitet. Alles, was in einer Zeile nach einem Doppelslash // steht, wird einfach ignoriert.
Wir geben also eine Überschrift in den Editor ein:
// OpenSCAD Tutorial
und drücken anschließend die Enter Taste. Nun gibt es eine zweite Zeile, was man an der 2 erkennen kann.
Jetzt werden wir endlich unseren ersten Körper erzeugen. Machen wir z.B. mal einen Würfel mit exakt 10 mm Kantelänge. Das geht so:
cube(10);
cube ist der Befehl zum erzeugen eines Kubus. In den Klammern stehen die Maße und das Semikolon schließt den Befehl ab. Darauf muss man achten, denn wenn auch nur ein Semikolon am Ende fehlt (wird viel zu gerne vergessen, kann ich euch sagen), funktioniert gar nichts mehr.
Man kann sofort sehen, das unterschiedliche Farben für den Text verwendet werden. Das nennt sich „Syntax- Hervorhebung“ und ist ein elementarer Bestandteil eine guten Editors. Auf diese Art kann man sofort sehen, um was es sich bei dem Code handelt. Türkis ist ein Kommentar, Blau ein Befehl und Rot ein Wert. Andere Editoren verwenden andere Farben, aber der Effekt ist stets derselbe. Man kann die einzelnen Teile leichter auseinander halten, was ungemein hilfreich ist.
Damit haben wir unseren Würfel erzeugt. Aber wir sehen noch gar nichts in der Vorschau. Dazu müssen wir die Vorschau aktualisieren. Das geschieht nicht automatisch, um nicht ständig Fehlermeldungen zu bekommen, während man noch am Tippen ist. Um das zu machen, muss man nur auf den „Vorschau“ Knopf klicken. Den gibt es sowohl oberhalb des Editors als auch unterhalb der 3D Ansicht. Es ist der Knopf mit dem >> und dem gestrichelten Würfel drauf, der Knopf ganz links unter der 3D Ansicht. Wenn euch die Funktion eines Knopfes nicht klar ist, einfach mal die Maus darüber fahren und einen Moment warten. Dann bekommt man eine kurze Erklärung. Falls es euch lieber ist, die Vorschau lässt sich auch durch die Taste F5 ausführen. Egal wie ausgelöst, der Effekt ist immer derselbe. Wir sehen endlich unser erstes Objekt.
Wir sehen nun in der 3D Ansicht eine Würfel mit exakt 10 mm Kantenlänge.
Apropos STL Export. Wenn wir wollen, können wir den Würfel jetzt schon als STL exportieren und ausdrucken. Vor dem Export muss das Objekt aber noch gerendert werden, denn die Vorschau ist nur eine grobe Skizze, nicht aber das fertige Objekt. Das geht mit dem Knopf direkt rechts neben dem Vorschau Knopf in beiden Menüleisten oder mit F6. Bei komplexen Objekten kann das durchaus mal eine Weile dauern, hier geht es aber genau so schnell wie die Vorschau. Auf meinem, nicht sehr starken PC dauert das Rendern genau 4/100 Sekunden…
Das Rendern ist erledigt und wir exportieren spaßeshalber den Würfel mal als STL Datei, wie man sie zum Drucken benötigt.
Dazu klicken wir auf den Export Knopf. Das ist der, auf dem STL steht und der sich in der Menüzeile über dem Editor direkt rechts neben dem Rendern Knopf befindet. Nun können wir einen Namen und den Speicherort für unsere STL Datei festlegen. Ich habe die Datei unter „Würfel_10“ abgespeichert. Diese STL Datei können wir direkt in unser Slicer Programm (ist immer beim 3D Drucker dabei) einlesen. Bei meinem Elegoo Mars ist das Programm Chitubox dabei. Bei eurem Drucker könnte auch ein ganz anderes Programm dabei sein. Die Aufgaben dieser Programme sind aber eigentlich immer dieselben.
Das war es dann auch schon. Wir haben ein 3D Objekt erstellt, welches man direkt ausdrucken oder zu einem Dienstleister senden kann.
Eigentlich könnten wir jetzt aufhören, oder? Spaß beiseite, das war erst der Anfang. Aber zumindest haben wir den kompletten Prozess einmal durchgespielt…
In der Zeit, die ich brauche, um in FreeCAD die passende Workbench auszuwählen, habe ich in OpenSCAD den Würfel schon im 3D Drucker…
Das zu lesen dauert 1000 mal länger als es zu machen, von daher…
Im nächsten Teil geht es dann um das verändern der verschiedenen Grundkörper.
Claus60- Skalpell-Künstler
Einfache Objekte
Im dritten Teil werden wir verschiedene Grundkörper erzeugen und verändern.
Den Würfel haben wir ja mit dem Befehl „cube“ erzeugt. Cube kann aber mehr als Würfel erzeugen. Dazu müssen wir statt der Kantenlänge eben drei Werte, Länge, Breite und Höhe angeben…
cube([10,10,10]);
Die eckigen Klammern gruppieren zusammengehörende Werte. Sie dürfen auch nicht fehlen, da sonst ebenfalls nichts mehr geht. Die Werte oben ergeben einen Würfel mit 10 mm Kantenlänge. Das hatten wir doch schon… Ja, aber nun können wir statt einem Würfel einen Kubus mit unterschiedlichen Kantenlängen erzeugen. Dazu müssen wir nur einen oder mehrere der Werte in der eckigen Klammer verändern. Also z.B.
cube([20,10,10]);
Das ergibt einen Kubus von 20 x 10 x 10 mm Abmessungen.
Durch verschiedene Werte kann man ganz unterschiedliche Objekte erzeugen, ganz wie man sie braucht. Spielt mal ein wenig mit unterschiedlichen Werten herum, um eine Gefühl dafür zu bekommen. Falls ihr eine genauere Größenangabe als 1 mm benötigt, könnt ihr auch Nachkommastellen angeben. Allerdings darf dafür kein Komma, sondern wie im Angelsächsischen Raum üblich, muss ein Punkt verwendet werden.
cube([20,15,0.5]);
Sonst würde es ja ein Durcheinander mit den verschiedenen Achsen geben, die ja durch Kommata getrennt werden. Obige Werte ergeben eine Art Platte mit 0,5 mm Dicke und 20 x 15 mm Abmessungen.
Es gibt noch einige andere Grundkörper, die wir uns nun anschauen wollen. Andere Grundkörper benötigen natürlich auch andere Parameter als ein Kubus, der mit Länge, Breite und Höhe vollständig beschrieben ist.
Das nächste Objekt was wir uns anschauen wollen, ist eine Kugel (englisch Sphere). Die benötigt entweder den Durchmesser oder den Radius, um vollständig beschrieben zu sein. In OpenSCAD kann man beides verwenden, also r = 5 oder d = 10 liefert dasselbe Ergebnis. Der genaue Befehl lautet also
sphere(d = 10);
und ergibt folgendes:
Was zum einen auffällt, ist das die Kugel mit dem Mittelpunkt auf dem Nullpunkt des Koordinatensystems liegt, wohingegen der Würfel mit eine Ecke auf dem Nullpunkt positioniert wurde. Beim Würfel (und Zylinder) kann man das umstellen, sofern gewünscht. Dazu muss man hinter den Werten für die Abmessungen mit einem Komma getrennt „true“ oder „center = true“ einfügen.
Doch zurück zur Kugel. Wenn wir uns die Vorschau genauer anschauen, so sieht das eher wie eine 1970er Jahre Diskokugel aus als eine schöne glatte Kugel. Das liegt daran, das alle 3D Programme intern mit Dreiecken rechnen. Daraus lässt sich mit dem geringsten Aufwand fast jede Form erzeugen. Nur alles, was wirklich rund ist, erfordert extrem kleine und extrem viele „Dreiecke“, bis wir das als „echte“ Rundung akzeptieren können. Da das aber viel Rechenaufwand viel Zeit und viel Speicherplatz bedeutet, kann man die „Glattheit“ der Rundungen selbst festlegen. Je glatter das Objekt wird, desto mehr Dreiecke sind nötig. Bei einer Kugel gibt es deswegen zusätzliche Parameter, um die Oberfläche im Detail zu beeinflussen. Wir verwenden der Einfachheit halber vorrangig nur die „Auflösung“, welche mit $fn = xxx festgelegt wird. Also
sphere(d = 10, $fn = 300);
ergibt dann das:
So sieht die Kugel schon eher nach Kugel aus. Um mal eine Vorstellung vom Rechenaufwand zu bekommen. Die „Diskokugel“ hat 18 tausendstel Sekunden für die Vorschau benötigt, die glattere Version immerhin schon 133 Tausendstel, also fast 8 mal so lange. Je größer der Wert für $fn, desto glatter wird die Kugel, desto länger dauert das Rendern und desto größer wird die STL Datei. Aus Erfahrung heraus weiß ich, das Werte zwischen 100 und 300 gute Ergebnisse bei vertretbarem Aufwand bedeuten.
Neben Kugel und Kubus gibt es in OpenSCAD noch zwei weitere Grundkörper, Zylinder (englisch cylinder) und Polyeder (Englisch polyhedron). Ein Polyeder kann wirklich jede beliebige Form annehmen und ist der universellste Grundkörper überhaupt. Leider ist er deswegen auch extrem kompliziert. Bisher hatte ich es noch nie nötig, mich damit zu beschäftigen. Womit wir uns hier aber unbedingt noch beschäftigen müssen, ist der Zylinder. Ein ebenfalls sehr nützlicher und vielseitiger Grundkörper.
Beim Zylinder benötigt man den Durchmesser (d) oder Radius (r), wie bei der Kugel. Zusätzlich muss man aber auch die Höhe (h) angeben:
cylinder(h=10, d=10);
Ergibt dann das:
Genau wie bei der Kugel können wir mit $fn die Seiten glätten.
cylinder(h=10, d=10, $fn = 300);
ergibt
Der Zylinder kann aber noch viel mehr. Man kann auch zwei verschiedene Radien bzw. Durchmesser angeben.
cylinder(h=10, d1=10, d2=0, $fn=300);
Damit bekommt man einen Kegel:
Man kann für d2 auch Werte größer als 0 verwenden,
cylinder(h=10, d1=10, d2=5, $fn=300);
das ergibt
Im Falle des Zylinders kann man mit der Glattheit $fn aber auch ganz andere Effekte erzielen, Wählen wir spaßeshalber mal 4 als Wert für $fn:
cylinder(h=10, d1=20, d2=0, $fn=4);
und schon haben wir…
eine Pyramide.
Das soll es mit den Grundkörpern gewesen sein. Ihr habt hoffentlich eine Einblick bekommen, was es alles so gibt. Im nächsten Kapitel werden wir die Körper verschieben und modifizieren lernen.
Den Würfel haben wir ja mit dem Befehl „cube“ erzeugt. Cube kann aber mehr als Würfel erzeugen. Dazu müssen wir statt der Kantenlänge eben drei Werte, Länge, Breite und Höhe angeben…
cube([10,10,10]);
Die eckigen Klammern gruppieren zusammengehörende Werte. Sie dürfen auch nicht fehlen, da sonst ebenfalls nichts mehr geht. Die Werte oben ergeben einen Würfel mit 10 mm Kantenlänge. Das hatten wir doch schon… Ja, aber nun können wir statt einem Würfel einen Kubus mit unterschiedlichen Kantenlängen erzeugen. Dazu müssen wir nur einen oder mehrere der Werte in der eckigen Klammer verändern. Also z.B.
cube([20,10,10]);
Das ergibt einen Kubus von 20 x 10 x 10 mm Abmessungen.
Durch verschiedene Werte kann man ganz unterschiedliche Objekte erzeugen, ganz wie man sie braucht. Spielt mal ein wenig mit unterschiedlichen Werten herum, um eine Gefühl dafür zu bekommen. Falls ihr eine genauere Größenangabe als 1 mm benötigt, könnt ihr auch Nachkommastellen angeben. Allerdings darf dafür kein Komma, sondern wie im Angelsächsischen Raum üblich, muss ein Punkt verwendet werden.
cube([20,15,0.5]);
Sonst würde es ja ein Durcheinander mit den verschiedenen Achsen geben, die ja durch Kommata getrennt werden. Obige Werte ergeben eine Art Platte mit 0,5 mm Dicke und 20 x 15 mm Abmessungen.
Es gibt noch einige andere Grundkörper, die wir uns nun anschauen wollen. Andere Grundkörper benötigen natürlich auch andere Parameter als ein Kubus, der mit Länge, Breite und Höhe vollständig beschrieben ist.
Das nächste Objekt was wir uns anschauen wollen, ist eine Kugel (englisch Sphere). Die benötigt entweder den Durchmesser oder den Radius, um vollständig beschrieben zu sein. In OpenSCAD kann man beides verwenden, also r = 5 oder d = 10 liefert dasselbe Ergebnis. Der genaue Befehl lautet also
sphere(d = 10);
und ergibt folgendes:
Was zum einen auffällt, ist das die Kugel mit dem Mittelpunkt auf dem Nullpunkt des Koordinatensystems liegt, wohingegen der Würfel mit eine Ecke auf dem Nullpunkt positioniert wurde. Beim Würfel (und Zylinder) kann man das umstellen, sofern gewünscht. Dazu muss man hinter den Werten für die Abmessungen mit einem Komma getrennt „true“ oder „center = true“ einfügen.
Doch zurück zur Kugel. Wenn wir uns die Vorschau genauer anschauen, so sieht das eher wie eine 1970er Jahre Diskokugel aus als eine schöne glatte Kugel. Das liegt daran, das alle 3D Programme intern mit Dreiecken rechnen. Daraus lässt sich mit dem geringsten Aufwand fast jede Form erzeugen. Nur alles, was wirklich rund ist, erfordert extrem kleine und extrem viele „Dreiecke“, bis wir das als „echte“ Rundung akzeptieren können. Da das aber viel Rechenaufwand viel Zeit und viel Speicherplatz bedeutet, kann man die „Glattheit“ der Rundungen selbst festlegen. Je glatter das Objekt wird, desto mehr Dreiecke sind nötig. Bei einer Kugel gibt es deswegen zusätzliche Parameter, um die Oberfläche im Detail zu beeinflussen. Wir verwenden der Einfachheit halber vorrangig nur die „Auflösung“, welche mit $fn = xxx festgelegt wird. Also
sphere(d = 10, $fn = 300);
ergibt dann das:
So sieht die Kugel schon eher nach Kugel aus. Um mal eine Vorstellung vom Rechenaufwand zu bekommen. Die „Diskokugel“ hat 18 tausendstel Sekunden für die Vorschau benötigt, die glattere Version immerhin schon 133 Tausendstel, also fast 8 mal so lange. Je größer der Wert für $fn, desto glatter wird die Kugel, desto länger dauert das Rendern und desto größer wird die STL Datei. Aus Erfahrung heraus weiß ich, das Werte zwischen 100 und 300 gute Ergebnisse bei vertretbarem Aufwand bedeuten.
Neben Kugel und Kubus gibt es in OpenSCAD noch zwei weitere Grundkörper, Zylinder (englisch cylinder) und Polyeder (Englisch polyhedron). Ein Polyeder kann wirklich jede beliebige Form annehmen und ist der universellste Grundkörper überhaupt. Leider ist er deswegen auch extrem kompliziert. Bisher hatte ich es noch nie nötig, mich damit zu beschäftigen. Womit wir uns hier aber unbedingt noch beschäftigen müssen, ist der Zylinder. Ein ebenfalls sehr nützlicher und vielseitiger Grundkörper.
Beim Zylinder benötigt man den Durchmesser (d) oder Radius (r), wie bei der Kugel. Zusätzlich muss man aber auch die Höhe (h) angeben:
cylinder(h=10, d=10);
Ergibt dann das:
Genau wie bei der Kugel können wir mit $fn die Seiten glätten.
cylinder(h=10, d=10, $fn = 300);
ergibt
Der Zylinder kann aber noch viel mehr. Man kann auch zwei verschiedene Radien bzw. Durchmesser angeben.
cylinder(h=10, d1=10, d2=0, $fn=300);
Damit bekommt man einen Kegel:
Man kann für d2 auch Werte größer als 0 verwenden,
cylinder(h=10, d1=10, d2=5, $fn=300);
das ergibt
Im Falle des Zylinders kann man mit der Glattheit $fn aber auch ganz andere Effekte erzielen, Wählen wir spaßeshalber mal 4 als Wert für $fn:
cylinder(h=10, d1=20, d2=0, $fn=4);
und schon haben wir…
eine Pyramide.
Das soll es mit den Grundkörpern gewesen sein. Ihr habt hoffentlich eine Einblick bekommen, was es alles so gibt. Im nächsten Kapitel werden wir die Körper verschieben und modifizieren lernen.
Claus60- Skalpell-Künstler
Verschieben und Kombinieren
Weiter geht's.
In diesem Teil geht es um das Bewegen, Drehen und Kombinieren von Objekten .
Zuerst erzeugen wir wieder einen Würfel. Das solltet ihr inzwischen können.
Der Würfel ist ja mit einer Ecke im Nullpunkt des Koordinatensystems platziert. Wenn wir den Würfel aber an einer anderen Stelle benötigen, müssen wir ihn verschieben. Der dafür benötigte Befehl heißt „translate“. Er wird vor das zu verschiebende Objekt geschrieben und benötigt, genau wie ein Kubus drei Werte, je für X Y und Z Richtung. Das sieht also beispielsweise so aus:
translate([5,0,0])cube(10);
Das Ergebnis ist dann
ein um 5 mm entlang der X- Achse verschobener Würfel mit 10 mm Kantenlänge. So lange wie wir nur ein einziges Objekt haben, spielt es eigentlich keine Rolle, wo das Objekt platziert ist. Das ändert sich aber schlagartig, wenn man mehr als ein Objekt benötigt.
Wir erzeugen nun einen Würfel mit 10 mm Kantenlänge und eine Kugel mit 10 mm Durchmesser. Das sollte kein Problem sein, haben wir beides schon gemacht. Um das aktuelle Problem besonders zu verdeutlichen, platzieren wir den Würfel Zentriert, also mit center=true als Parameter.
cube(10,true);
sphere(d=10, $fn=300);
Das Ergebnis ist zum einen erstaunlich, zum anderen aber auch nachvollziehbar:
Wir sehen nur den Würfel, von der Kugel fehlt jede Spur. Denkt man mal kurz darüber nach, ist schnell klar, die Kugel ist deswegen nicht zu sehen, weil sie vollständig im Inneren des Würfels liegt.
Hier kommt jetzt der translate Befehl zum Zuge. Wir bewegen die Kugel einfach um 10 mm entlang der Z Achse:
cube(10,true);
translate([0,0,10])sphere(d=10, $fn=300);
und schon taucht sie wie von Zauberhand auf und thront auf dem Würfel.
Man muss die Kugel natürlich nicht genau auf den Würfel setzen. Man kann sie darüber oder daneben platzieren oder auch partiell im Würfel versenken. Natürlich kann man auch den Würfel auf die Kugel setzen, wenn man möchte. Zur Verdeutlichung heben wir die Kugel mal nur um 5 mm an:
cube(10,true);
translate([0,0,5])sphere(d=10, $fn=300);
Das liefert dann dieses Ergebnis:
Und schon haben wir einen Buzzer konstruiert.
Bei einer Kugel spielt die Orientierung im Raum ja keine Rolle, bei einem Kubus aber durchaus. Um Objekte zu rotieren (englisch rotate) kommt, welch Wunder, der Befehl rotate zum Einsatz. Die Syntax ist praktisch identisch zu translate, nur das man bei rotate eben die Rotation in° angibt
rotate([45,45,45])cube(10);
Ergibt:
Man kann sehen, das ich die Kugel aus kommentiert habe (also die Zeile mit // eingeleitet habe). Somit wird sie ignoriert und ich kann sie im nächsten Schritt schnell wieder einbauen, ohne alles neu tippen zu müssen…
Nun binden wir die Kugel wieder ein und platzieren sie genau auf die eine Ecke des Würfels. dafür braucht man ein wenig Geometrie- Kenntnisse aus der Schule. Schon mal was von PI gehört? Klar, da war doch was… Irgendwas mit Kreis und 3,14.. Also versuchen wir das einfach mal:
rotate([45,45,45])cube(10);
translate([-3.14,-3.14,-3.14])sphere(d=10, $fn=300);
Erstaunlicherweise kommt dabei das raus:
ich gebe ja zu, ich habe es vorher ausprobiert und deswegen die 10 mm Durchmesser gewählt. Bei 20 mm Durchmesser hätte ich -6,28 nehmen müssen, usw… Eine kurze Formel dafür wäre (d/10) * 3,14
So könnte man das Objekt aber nicht drucken, da sich Würfel und Kugel nur in einem einzigen winzigen Punkt berühren. Man müsste entweder die Verbindung durch zusätzliche Objekte, z.B. einen Zylinder verstärken oder man „versenkt“ die Kugel teilweise im Würfel:
rotate([45,45,45])cube(10);
translate([-2.5,-2.5,-2.5])sphere(d=10, $fn=300);
Mit folgendem Ergebnis:
Nun ist die Verbindung zwischen Kugel und Würfel erheblich stabiler.
Eine weitere Operation muss ich noch behandeln, bevor wir tatsächlich anfangen können, etwas „Produktives“ zu machen. Stellen wir uns mal vor, wir möchten gerne Löcher in der Grundplatte unserer Servo- Halterung haben, um sie leicht anschrauben zu können.
Also konstruieren wir zunächst die Grundplatte selbst. Sie soll in diesem Beispiel 65 mm lang und 30 mm breit sein, sowie 3 mm dick. Die Maße habe ich für ein Modelcraft RS-2 Servo, welche es vor Jahren mal bei Conrad im Angebot für 2€ das Stück gab, ausgewählt. Dazu benötigen wir was? Natürlich einen Kubus mit [65,30,3] als Parameter.
cube([65,30,3]);
Da unsere Platte nun über das Sichtfeld hinaus ragt, können bzw. müssen wir die Ansicht verschieben oder verkleinern. Das macht man mit der Maus. Je nach dem, ob man rechts ode links geklickt hält, verändert sich die Position und/oder Perspektive. Mit dem Mausrad kann man hinein oder hinaus zoomen.
Viele der Knöpfe unterhalb der 3D Ansicht dienen dazu, die Position bzw. Perspektive zu verändern. Wenn ihr euch dabei völlig verheddert, keine Sorge. Dafür gibt es einen „Panik- Knopf“ und zwar den Kreis mit dem Pfeil drin, der sechste Knopf von links. Wenn ihr da drauf klickt, wird die Ansicht wieder auf Normal eingestellt…
Ich habe in diesem Fall eine Ansicht ziemlich von Oben gewählt, weil uns das gleich beim Erzeugen der Löcher hilft.
Das ist also unsere Grundplatte. Nun müssen wir Löcher hinein bohren. Natürlich virtuell in 3D und nicht später real am fertig gedruckten Objekt (was theoretisch auch funktionieren würde).
Dazu verwenden wir nun Zylinder, die wir von der Grundplatte abziehen werden. Der Zylinder soll 3,2 mm Durchmesser haben damit 3 mm Schrauben problemlos durchpassen. Und er muss etwas höher sein, als die eigentliche Grundplatte, damit die Öffnung auch tatsächlich vollständig wird.
cylinder(h=5, d=3.2, $fn = 300);
Das fügen wir nun unserem „Programm“ hinzu.
Diesen Zylinder werden wir später von der Grundplatte abziehen. Zunächst muss er aber erst mal an die richtige Stelle verschoben werden. In Z Richtung verschieben wir ihn um -1, damit er auch sicher komplett durch die Grundplatte ragt. Deswegen haben wir ihn ja 5 mm hoch und nicht 3 mm hoch gemacht. In X und Y Richtung verschieben wir ihn um 4 mm, also
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
Nun ist der Zylinder richtig platziert:
Erinnert ein ganz klein wenig an Lego, oder? Jetzt müssen wir den Zylinder „nur“ noch von der Grundplatte abziehen.
Dafür gibt es den Befehl „difference“. Da wir es hier mit einer Boolschen Operation zu tun haben, ist die Syntax etwas komplizierter als bei den bisherigen Beispielen.
Der difference Befehl muss vor den Objekten stehen, die voneinander abgezogen werden sollen. Außerdem müssen diese Objekte mit geschweiften Klammern eingefasst werden. Das erste Objekt ist das, von dem das andere Objekt abgezogen wird. Da differnece keine eigenen Parameter hat, bleiben die () leer. Das Ganze sieht dann so aus:
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Und als Ergebnis erhalten wir das:
Somit haben wir eine Grundplatte mit einem schönen Schraubenloch darin.
Wir wollen aber nicht nur eine Schraube verwenden, sondern in jeder Ecke eine. Also erzeugen wir nicht nur einen Zylinder, sondern vier. Das kann man blitzschnell mit Kopieren und (dreimal) Einfügen erledigen. Danach muss man nur noch die Koordinaten entsprechend anpassen. Das erste „Loch“ hatte jeweils 4 mm Abstand vom Nullpunkt. Das zweite Loch hat in Y Richtung 30 – 4 = 26 mm Abstand. 30 mm ist unsere Grundplatte breit. 4 mm soll der Abstand des Loches sein, also 30 -4 = 26 ist der Wert für die Verschiebung. In X Richtung muss die Verschiebung 65 -4 = 61 betragen. Das vierte Loch bekommt 61 und 26 mm Verschiebung…
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Voila, unsere Grundplatte ist fertig:
Das ganze ist jetzt schon eine etwas komplexere Operation gewesen. Aber man gewöhnt sich da ganz schnell dran, finde ich.
Hiermit sind die Basics abgearbeitet und wir können im nächsten Teil ernsthaft anfangen, unseren Halter zu konstruieren. Das erfolgt dann im nächsten Abschnitt…
In diesem Teil geht es um das Bewegen, Drehen und Kombinieren von Objekten .
Zuerst erzeugen wir wieder einen Würfel. Das solltet ihr inzwischen können.
Der Würfel ist ja mit einer Ecke im Nullpunkt des Koordinatensystems platziert. Wenn wir den Würfel aber an einer anderen Stelle benötigen, müssen wir ihn verschieben. Der dafür benötigte Befehl heißt „translate“. Er wird vor das zu verschiebende Objekt geschrieben und benötigt, genau wie ein Kubus drei Werte, je für X Y und Z Richtung. Das sieht also beispielsweise so aus:
translate([5,0,0])cube(10);
Das Ergebnis ist dann
ein um 5 mm entlang der X- Achse verschobener Würfel mit 10 mm Kantenlänge. So lange wie wir nur ein einziges Objekt haben, spielt es eigentlich keine Rolle, wo das Objekt platziert ist. Das ändert sich aber schlagartig, wenn man mehr als ein Objekt benötigt.
Wir erzeugen nun einen Würfel mit 10 mm Kantenlänge und eine Kugel mit 10 mm Durchmesser. Das sollte kein Problem sein, haben wir beides schon gemacht. Um das aktuelle Problem besonders zu verdeutlichen, platzieren wir den Würfel Zentriert, also mit center=true als Parameter.
cube(10,true);
sphere(d=10, $fn=300);
Das Ergebnis ist zum einen erstaunlich, zum anderen aber auch nachvollziehbar:
Wir sehen nur den Würfel, von der Kugel fehlt jede Spur. Denkt man mal kurz darüber nach, ist schnell klar, die Kugel ist deswegen nicht zu sehen, weil sie vollständig im Inneren des Würfels liegt.
Hier kommt jetzt der translate Befehl zum Zuge. Wir bewegen die Kugel einfach um 10 mm entlang der Z Achse:
cube(10,true);
translate([0,0,10])sphere(d=10, $fn=300);
und schon taucht sie wie von Zauberhand auf und thront auf dem Würfel.
Man muss die Kugel natürlich nicht genau auf den Würfel setzen. Man kann sie darüber oder daneben platzieren oder auch partiell im Würfel versenken. Natürlich kann man auch den Würfel auf die Kugel setzen, wenn man möchte. Zur Verdeutlichung heben wir die Kugel mal nur um 5 mm an:
cube(10,true);
translate([0,0,5])sphere(d=10, $fn=300);
Das liefert dann dieses Ergebnis:
Und schon haben wir einen Buzzer konstruiert.
Bei einer Kugel spielt die Orientierung im Raum ja keine Rolle, bei einem Kubus aber durchaus. Um Objekte zu rotieren (englisch rotate) kommt, welch Wunder, der Befehl rotate zum Einsatz. Die Syntax ist praktisch identisch zu translate, nur das man bei rotate eben die Rotation in° angibt
rotate([45,45,45])cube(10);
Ergibt:
Man kann sehen, das ich die Kugel aus kommentiert habe (also die Zeile mit // eingeleitet habe). Somit wird sie ignoriert und ich kann sie im nächsten Schritt schnell wieder einbauen, ohne alles neu tippen zu müssen…
Nun binden wir die Kugel wieder ein und platzieren sie genau auf die eine Ecke des Würfels. dafür braucht man ein wenig Geometrie- Kenntnisse aus der Schule. Schon mal was von PI gehört? Klar, da war doch was… Irgendwas mit Kreis und 3,14.. Also versuchen wir das einfach mal:
rotate([45,45,45])cube(10);
translate([-3.14,-3.14,-3.14])sphere(d=10, $fn=300);
Erstaunlicherweise kommt dabei das raus:
ich gebe ja zu, ich habe es vorher ausprobiert und deswegen die 10 mm Durchmesser gewählt. Bei 20 mm Durchmesser hätte ich -6,28 nehmen müssen, usw… Eine kurze Formel dafür wäre (d/10) * 3,14
So könnte man das Objekt aber nicht drucken, da sich Würfel und Kugel nur in einem einzigen winzigen Punkt berühren. Man müsste entweder die Verbindung durch zusätzliche Objekte, z.B. einen Zylinder verstärken oder man „versenkt“ die Kugel teilweise im Würfel:
rotate([45,45,45])cube(10);
translate([-2.5,-2.5,-2.5])sphere(d=10, $fn=300);
Mit folgendem Ergebnis:
Nun ist die Verbindung zwischen Kugel und Würfel erheblich stabiler.
Eine weitere Operation muss ich noch behandeln, bevor wir tatsächlich anfangen können, etwas „Produktives“ zu machen. Stellen wir uns mal vor, wir möchten gerne Löcher in der Grundplatte unserer Servo- Halterung haben, um sie leicht anschrauben zu können.
Also konstruieren wir zunächst die Grundplatte selbst. Sie soll in diesem Beispiel 65 mm lang und 30 mm breit sein, sowie 3 mm dick. Die Maße habe ich für ein Modelcraft RS-2 Servo, welche es vor Jahren mal bei Conrad im Angebot für 2€ das Stück gab, ausgewählt. Dazu benötigen wir was? Natürlich einen Kubus mit [65,30,3] als Parameter.
cube([65,30,3]);
Da unsere Platte nun über das Sichtfeld hinaus ragt, können bzw. müssen wir die Ansicht verschieben oder verkleinern. Das macht man mit der Maus. Je nach dem, ob man rechts ode links geklickt hält, verändert sich die Position und/oder Perspektive. Mit dem Mausrad kann man hinein oder hinaus zoomen.
Viele der Knöpfe unterhalb der 3D Ansicht dienen dazu, die Position bzw. Perspektive zu verändern. Wenn ihr euch dabei völlig verheddert, keine Sorge. Dafür gibt es einen „Panik- Knopf“ und zwar den Kreis mit dem Pfeil drin, der sechste Knopf von links. Wenn ihr da drauf klickt, wird die Ansicht wieder auf Normal eingestellt…
Ich habe in diesem Fall eine Ansicht ziemlich von Oben gewählt, weil uns das gleich beim Erzeugen der Löcher hilft.
Das ist also unsere Grundplatte. Nun müssen wir Löcher hinein bohren. Natürlich virtuell in 3D und nicht später real am fertig gedruckten Objekt (was theoretisch auch funktionieren würde).
Dazu verwenden wir nun Zylinder, die wir von der Grundplatte abziehen werden. Der Zylinder soll 3,2 mm Durchmesser haben damit 3 mm Schrauben problemlos durchpassen. Und er muss etwas höher sein, als die eigentliche Grundplatte, damit die Öffnung auch tatsächlich vollständig wird.
cylinder(h=5, d=3.2, $fn = 300);
Das fügen wir nun unserem „Programm“ hinzu.
Diesen Zylinder werden wir später von der Grundplatte abziehen. Zunächst muss er aber erst mal an die richtige Stelle verschoben werden. In Z Richtung verschieben wir ihn um -1, damit er auch sicher komplett durch die Grundplatte ragt. Deswegen haben wir ihn ja 5 mm hoch und nicht 3 mm hoch gemacht. In X und Y Richtung verschieben wir ihn um 4 mm, also
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
Nun ist der Zylinder richtig platziert:
Erinnert ein ganz klein wenig an Lego, oder? Jetzt müssen wir den Zylinder „nur“ noch von der Grundplatte abziehen.
Dafür gibt es den Befehl „difference“. Da wir es hier mit einer Boolschen Operation zu tun haben, ist die Syntax etwas komplizierter als bei den bisherigen Beispielen.
Der difference Befehl muss vor den Objekten stehen, die voneinander abgezogen werden sollen. Außerdem müssen diese Objekte mit geschweiften Klammern eingefasst werden. Das erste Objekt ist das, von dem das andere Objekt abgezogen wird. Da differnece keine eigenen Parameter hat, bleiben die () leer. Das Ganze sieht dann so aus:
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Und als Ergebnis erhalten wir das:
Somit haben wir eine Grundplatte mit einem schönen Schraubenloch darin.
Wir wollen aber nicht nur eine Schraube verwenden, sondern in jeder Ecke eine. Also erzeugen wir nicht nur einen Zylinder, sondern vier. Das kann man blitzschnell mit Kopieren und (dreimal) Einfügen erledigen. Danach muss man nur noch die Koordinaten entsprechend anpassen. Das erste „Loch“ hatte jeweils 4 mm Abstand vom Nullpunkt. Das zweite Loch hat in Y Richtung 30 – 4 = 26 mm Abstand. 30 mm ist unsere Grundplatte breit. 4 mm soll der Abstand des Loches sein, also 30 -4 = 26 ist der Wert für die Verschiebung. In X Richtung muss die Verschiebung 65 -4 = 61 betragen. Das vierte Loch bekommt 61 und 26 mm Verschiebung…
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Voila, unsere Grundplatte ist fertig:
Das ganze ist jetzt schon eine etwas komplexere Operation gewesen. Aber man gewöhnt sich da ganz schnell dran, finde ich.
Hiermit sind die Basics abgearbeitet und wir können im nächsten Teil ernsthaft anfangen, unseren Halter zu konstruieren. Das erfolgt dann im nächsten Abschnitt…
Claus60- Skalpell-Künstler
Der Servo- Halter
Hallo.
Nun geht es endlich richtig los. Wir konstruieren unseren parametrierbaren Servo- Halter. Als Ausgangsbasis verwenden wir die im letzten Kapitel konstruierte Grundplatte.
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Allerdings wollen wir unsere Konstruktion ja flexibel für alle möglichen Servos einsetzen können. Deswegen müssen wir die tatsächlichen Abmessungen als Variablen und nicht als feste Werte verwenden. Also müssen wir zunächst mal bestimmen, wie viele Variablen wir benötigen und vom tatsächlichen Servo abnehmen müssen, und was wir im Skript errechnen können. OpenSCAD kann einige mathematische Operationen durchführen, die uns dabei helfen werden. Je weniger Maße wir tatsächlich eingeben müssen, desto leichter und schneller ist der Halter anpassbar. Wenn wir uns hierbei vertun und ein Maß vergessen oder eines zu viel anlegen, macht das nichts. Man kann Variablen jederzeit hinzufügen oder entfernen.
Da wir jetzt etwas „für die Ewigkeit“ konstruieren, sollten wir unser Projekt natürlich auch speichern, um es später weiter bearbeiten oder verwenden zu können. Beim ersten Mal nutzen wir dazu „Speichern unter“, um einen Pfad und Dateinamen festlegen zu können. „Speichern unter“ ist, wie bei fast allen Programmen im Menü oben links unter „Datei“ zu finden. Wie ihr das Projekt benennt, ist euch überlassen. Bei mir heißt es „Servo_Halter.scad“ Der Namen spielt keine Rolle, sollte aber auf jeden Fall zum Wiederfinden geeignet sein. Die Dateiendung .scad ist allerdings Pflicht, damit OpenSCAD weiß, um was es sich handelt. Tatsächlich ist die .scad Datei eine reine Text Datei, die man in jedem Editor öffnen und anschauen kann. Darin steht genau das, was wir in den Editor von OpenSCAD getippt haben. Nicht mehr und nicht weniger. Sobald wir das Projekt gespeichert haben, steht oben in der Überschrift nicht mehr „Unbekannt“, sondern der Name, den wir unserer Datei gegeben haben.
Ich habe auch schon zusätzliche Kommentare sowie den Platz für die Variablen- Deklaration eingefügt. Man kann schon jetzt erkennen, das die Kommentare helfen, das Skript zu ordnen und übersichtlicher zu machen… Auch Leerzeilen kann und sollte man dazu einsetzen. Je sauberer man hier ist, desto leichter fällt einem in Monaten oder Jahren, durch das Script durchzublicken und zu verstehen, was man damals gemacht hat…
Welche Maße benötigen wir nun aber? Zunächst mal die Breite des Servos, die Höhe des Servos, aber ohne die Ausbuchtung für den Antrieb des Steuerhorns. Natürlich benötigen wir auch die Länge des Servos. Das messen wir aber ohne die Befestigungsflansche, dafür mit ca 1 mm Zugabe, um etwas Spielraum zu bekommen. Das reicht aber noch nicht. Wir brauchen daneben auch die Länge eines Befestigungsflansches sowie den Abstand zwischen der Unterseite des Flansches und der Oberseite des Servos (wieder ohne die Erhebungen für den Ruderhorn- Antrieb). Den Abstand zwischen den Befestigungslöchern benötigen wir auch noch. Wenn man den Halter für Mikro- Servos einsetzen will, die nur ein Befestigungsloch pro Seite haben, dann müssen wir den Abstand auf 0 setzen. Wenn ich richtig gezählt habe, sind das sechs Variablen, die wir nun deklarieren, also festlegen müssen.
Die Werte, die ich hier verwende passen für „meine“ Modelcraft RS-2 Servos. Bei euch sind höchstwahrscheinlich andere Werte zu verwenden. Genau darum machen wir das mit den Variablen ja..
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
// Grundplatte
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Wie man sieht, kann man auch mitten in einer Zeile mit einem Kommentar anfangen. Hier wird das dazu verwendet, zu beschreiben, für was die gerade festgelegte Variable eigentlich steht. Wie ihr die Variablen benennt, ist euch überlassen. Man muss nur aufpassen, das der Variablenname nicht derselbe wird, wie eine OpenSCAD Funktion oder Systemvariable. Das merkt ihr aber schon, wenn das Skript nicht funktioniert… Nun sollten wir under Projekt erst mal wieder speichern. Es ist sinnvoll, alle paar Minuten zu speichern, damit bei einem Absturz oder ähnlichem nicht die ganze Arbeit zum Teufel ist. Da wir bereits einen Namen und Pfad vergeben haben, können wir nun einfach „Speichern“ im Datei- Menü dazu verwenden. Wer lieber mit Tastaturkürzeln arbeitet, Speichern ist wie in sehr, sehr vielen anderen Programmen auch STRG und S…
Jetzt haben wir unsere Variablen festgelegt. Wie gesagt, wenn das noch nicht passt, man also was vergessen hat, kann man jederzeit weitere Variablen hinzufügen.
Weil wir gerade dabei sind, ich denke, es ist sinnvoll, auch die Dicke der Grundplatte einstellbar zu machen. Auf diese Art kann man bei Bedarf zusätzlichen Platz für ein Ruderhorn schaffen, welches in Richtung Grundplatte montiert werden soll/muss.. Also schnell noch eine Variable hinzugefügt:
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Ich denke, das reicht jetzt erst mal an Variablen… Fangen wir also an, unsere Grundplatte auf die Variablen umzustellen. Am einfachsten ist das bei der Dicke der Platte, da man dort keinerlei Berechnungen durchführen muss.
Das Ergebnis sieht nicht anders aus als vorher, was ja auch zu erwarten war. Um zu zeigen, wie die Werte für die Variablen das Objekt beeinflussen, legen wir mal 10 für $gd fest:
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 10; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([65,30,$gd]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Und voila:
Die Grundplatte ist nun 10 mm Dick. Dafür sind aber unsere Bohrlöcher verschwunden. Eigentlich sind sie noch da, doch sie sind nicht mehr lang genug, um vollständig durch die Grundplatte zu reichen… Würden wir ohne Variablen arbeiten, müssten wir jetzt also alle vier Zylinder manuell korrigieren. Wir müssten statt an einer Stelle oben im Skript, an 5 Stellen Anpassungen vornehmen… Schon an diesem Beispiel sieht man, das sich der Einsatz von Variablen lohnt. Als wir die Grundplatte zuerst erzeugt haben, haben wir die Länge der Zylinder um 2 mm größer gemacht, als die Dicke der Arbeitsplatte. Genau das machen wir jetzt auch wieder. Wir schreiben überall da, wo vorher h = 5 stand nun h = $gd + 2…
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 10; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([65,30,$gd]);
translate([4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
}
und schon sind die Löcher wieder da.
Wenn wir in Zukunft die Dicke der Grundplatte ändern, passen sich die Löcher automatisch mit an.
Hiermit haben wir die Dicke der Grundplatte und die Schraublöcher parametrierbar gemacht. Nun müssen wir noch die anderen Abmessungen, also Länge und Breite anpassen. Die Höhe der Grundplatte soll der Höhe des Servos entsprechen. Also ersetzen wir die 30 durch $ho. Die Länge der Grundplatte setzt sich zusammen aus der Länge des Servo $la, zweimal der Länge des Flansches $bf sowie 2 mm Spielraum zusätzlich. Also $la +$bf + $bf + 2. Das fügen wir nun statt der 65 bei der Definition des Kubus ein.
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
}
Und, unser Ergebnis überzeugt wieder nicht wirklich:
Natürlich müssen wir auch die Position der Löcher an die Maße der Grundplatte anpassen. Das erste Loch sitzt noch passend. Das zweite Loch ist zu weit oben, da wir die Breite der Grundplatte nun größer gewählt haben. Statt 26 brauchen wir hier $ho – 4 Dieselbe „Formel“ verwenden wir auch für das vierte Loch. Nun sitzen die Löcher in Y Richtung wieder passend. Loch 3 und 4 müssen aber noch in X Richtung angepasst werden, da unsere Grundplatte nun etwas kürzer ist. Zuvor haben wir 4 von der Länge der Grundplatte abgezogen. Das werden wir jetzt auch wieder tun. Also $la +$bf + $bf + 2 – 4.
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([4,$ho – 4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([$la +$bf + $bf + 2 – 4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([$la +$bf + $bf + 2 – 4,$ho – 4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
}
Ich lasse das mit +2 und – 4 bewusst erst mal stehen. Warum wird später aufgelöst.
Und nun passen die Löcher wieder.
Nun sind wir scheinbar wieder genau da, wo wir gestartet sind. Doch tatsächlich sind wir einen Riesensatz weiter. Wir können nun jede beliebig große Grundplatte mit passenden Löchern erzeugen, in dem wir nur ein paar wenige Abmessungen eingeben.
Nun noch die Auflösung, warum wir mit +2 – 4 hantiert haben. Inzwischen habe ich mir nämlich überlegt, das 3 mm Schrauben bei Mikro- Servos vielleicht etwas arg wuchtig sind. Deswegen möchte ich auch noch die Schraubenloch- Durchmesser und den dazu passenden Abstand vom Rand der Grundplatte einstellbar machen. Also definieren wir noch eine Variable, $dm, die den Schrauben- Durchmesser festlegt. Diesen Wert nutzen wir nun, um den Durchmesser der 4 Zylinder sowie den Abstand der Löcher vom Rand festzulegen. Der Durchmesser der Zylinder ist $dm + 0.2 und der Abstand wird $dm + 1. Das muss jetzt schon an sehr vielen Stellen geändert werden. Ein manuelles Ändern der Löcher wäre nachträglich also ziemlich mühsam.
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
$dm = 3 //Durchmesser der Befestigungsschrauben
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([$dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$dm + 1,$ho – $dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – $dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – $dm + 1,$ho – $dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
}
Nun haben wir aber gleich alles an der Grundplatte parametrierbar gemacht.
Doch, wenn wir den Wert für $dm tatsächlich ändern, entsteht ein Fehler:
Wir haben hier Klammern vergessen, denn 2 – $dm + 1 ist nicht das, was wir eigentlich haben wollen. Da müssen wir schon 2 – ($dm + 1) schreiben. Ganz wie früher im Mathe- Unterricht. Ja, ich weiß, lang, lang ist’s her. Aber manchmal lohnt es sich in der hintersten Ecke des Gehirns herum zu graben…
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
$dm = 1; //Durchmesser der Befestigungsschrauben
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([$dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$dm + 1,$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
}
Jetzt funktioniert es endlich.
Ein schweres Stück Arbeit, oder? Dafür sind wir jetzt schon fast fertig mit unserem Servo Halter. Wir brauchen nämlich nur noch 2 Kuben und 4 Zylinder, jeweils an den passenden Stellen und mit den passenden Abmessungen meint Parametern. Das war es dann auch schon (zumindest fast).
Um das Servo anschrauben zu können, benötigen wir zwei „Klötze“, die auf der Grundplatte befestigt sind. Das machen wir natürlich wieder mit einem Kubus. Der Kubus bekommt als X- Wert die Länge des Flansches + 1 (wir haben 2 mm bei der Grundplatte zugegeben, wisst ihr noch? Das war genau deswegen) also $bf + 1. In Z- Richtung bekommt der Kubus die Breite des Servos, also $br und in Y- Richtung können wir einen fixen Wert wählen. Dieser Wert sollte nicht zu klein sein, damit das Ganze stabil genug wird, aber auch nicht zu lang, damit er nachher nicht über die Grundplatte raus ragt, wenn wir besonders kleine Servos verwenden. Ich werde es erst mal mit 10 probieren. In den Kubus werden kleine selbst schneidende Schrauben eingedreht, für die wir Löcher vorbohren wollen. Das werden wir gleich mit erledigen. Dafür benötigen wir wieder die Zylinder. Die Löcher zur Befestigung in den Flanschen am Servo sind recht groß, da man speziell bei Einsatz von Verbrennungsmotoren in RC Modellen häufig starke Vibrationen hat. Deswegen werden dort normalerweise Gummitüllen eingefügt, die Vibrationen vom Servo fern halten. Bei der Modellbahn treten solche Vibrationen aber nicht auf. Deswegen können wir die Servos einfach festschrauben. Da 5 mm Schrauben viel zu wuchtig wären, muss man eine Schraube mit Unterlegscheibe verwenden. Die eigentlich zu großen Löcher übernehmen dabei die Funktion von Langlöschern, die eine Feinjustage erlauben. Allerhöchste Genauigkeit ist also nicht erforderlich.
Fügen wir also erst mal einen Kubus ein. Die andere Seite machen wir später wieder mit „Kopieren und Einfügen“.
cube([$bf + 1,10,$br]);
Das sieht dann so aus:
Hier können wir nach der Syntax Hervorhebung eine weitere Komfort Funktion eines brauchbaren Editors sehen. (Notepad ist übrigens kein brauchbarer Editor)… Komplexere Funktionen wie hier die „difference“ Funktion können sich über viel Zeilen erstrecken. In den meisten Editoren gibt es deswegen diese kleinen – bzw. + Zeichen in den Quadraten. Klickt man auf so ein Zeichen, wird der Bereich, der zu dieser komplexen Funktion gehört versteckt (bei Klick auf -) oder eingeblendet (bei Klick auf +). Das macht den Code deutlich übersichtlicher, weil man nur die Bereiche eingeblendet bekommt, an denen man gerade arbeitet. Unsere Grundplatte ist aber fertig. Da müssen wir nicht mehr ran. Also muss der viele Code auch nicht unbedingt angezeigt werden. Vorhanden ist er aber selbstverständlich weiterhin… Den Kubus an die passenden Position bringen, erledigen wir erst ganz am Ende. Zunächst erzeugen wir noch die Schraublöcher in dem Kubus. Dazu erzeugen wir einen Zylinder mit einem nicht zu großen Durchmesser, schließlich sollen die selbst schneidenden Schrauben ja Halt finden. Ich würde nicht mehr als maximal 1,5 mm Durchmesser wählen. Als Länge würde ich die Dicke des „Klotzes einstellen. Wenn wir dann wieder 1 mm „Luft“ im oberen Bereich lassen, gehen die Löcher nicht ganz durch.
cylinder(h = 10, d = 1.5);
Den Zylinder müssen wir um -90 Grad in X Richtung rotieren.
rotate([-90,0,0])cylinder(h = 10, d = 1.5);
Jetzt müssen wir ihn noch an die passende Stelle bewegen. In X Richtung muss er um die Hälfte der Kubusbreite verschoben werden, also ($bf + 1) / 2. Klammern nicht vergessen wegen Punkt vor Strich… In Y Richtung um -1. In Z Richtung sollten sich die beiden Löcher mit dem Lochabstand $lo mittig auf (eher in) dem Kubus sitzen. Der Wert ist also ($br – $lo) / 2
Also zusammen:
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
Unser zweites Loch muss nun in Z Richtung um den Lochabstand $lo höher sitzen.
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)] + $lo)rotate([-90,0,0])cylinder(h = 10, d = 1.5);
Die beiden Zylinder müssen wir nun natürlich vom Kubus abziehen, was nichts neues mehr ist.
difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Und wir haben zwei Löcher im „Befestigungsklötzchen“. Wenn $lo = 0 ist, weil es nur ein Loch gibt, liegen beide Zylinder genau in der Mitte exakt übereinander und ergeben so natürlich nur ein Loch. Also ist dieser Fall damit ebenfalls abgedeckt.
Nun müssen wir das ganze Gebilde noch an die passende Stelle bewegen. In Z Richtung muss es um die Dicke der Grundplatte verschoben werden. In Y Richtung um die Höhe des Flansches, $bfh. In X Richtung muss es gar nicht bewegt werden. Also alles zusammen:
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Ergebnis:
Fast fertig. Es fehlt nur noch die zweite Seitenhalterung. Dazu kopieren wir den ganzen Bereich, den wir gerade geschrieben haben und fügen ihn einfach darunter noch mal ein.
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Die Überschrift ändern wir nach Seitenhalterung 2. Nun müssen wir nur noch einen einzigen Wert anpassen, nämlich die 0 beim ersten translate Befehl. Statt 0 muss hier die Breite der Grundplatte abzüglich der Breite des „Befestigungsklötzchens“ eingetragen werden. Also
//Seitenhalterung 2
translate([$la +$bf + $bf + 2 – ($bf + 1),$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Damit ist unser Servo- Halter eigentlich fertig.
Wir können nun Halter für nahezu beliebig große bzw. kleine Servos herstellen.
Nur eigentlich fertig? Nun ja, man kann ihn so ohne Einschränkungen einsetzen, keine Frage. Aber vielleicht geht es ja etwas schöner… Schließlich ist das ein Tutorial, wo man etwas über das Programm lernen können soll…
Eine Möglichkeit unseren Halter zu verschönern wäre es, die Ecken der Grundplatte abzurunden. Dazu kann man in OpenSCAD die Minkowski Funktion verwenden. Was das bedeutet, kann man bei Interesse am besten direkt in Wikipedia nachlesen. Man kann unglaublich viel mit dieser OpenSCAD Funktion anstellen. Zu 99% ist das alles aber zu hoch für mich. Unser einfacher Anwendungsfall lässt sich aber noch ganz gut erklären und anwenden…
Wir fügen zuerst bei der Grundplatte einen Zylinder ein. Dieser soll eine Höhe von 0.1 und einen Durchmesser von 4 bekommen. Nun bilden wir die Minkowski Summe dieser Objekte.
minkowski()
{
cube([$la +$bf + $bf + 2,$ho,$gd]);
cylinder(h = 0.1, d = 4);
}
Das Ergebnis überrascht ein wenig:
Zumindest, wenn man so wie ich, keine Ahnung von der Minkowski Summe hat. Prinzipiell ist es in diesem Fall so, das die Höhe des Zylinders zur Höhe der Grundplatte hinzugefügt wird und der Durchmesser je zur Länge und zur Breite. Deswegen ist die Platte nun deutlich größer und man versteht vielleicht, warum ich nur 0.1 als Höhe für den Zylinder gewählt habe. 0 geht nicht, dann passiert überhaupt nichts. Und der Durchmesser des Zylinders bestimmt den Radius der Ecken, weswegen man ihn nicht beliebig klein machen kann… Man kann das Ganze zwar auch so lassen. Der Zehntelmillimeter in der Dicke stört überhaupt nicht und das die Platte ein paar Millimeter übersteht ist eigentlich auch egal. Aber trotzdem werden wir das korrigieren. Wir müssen also die Werte bei cube anpassen, genauer verkleinern. Der X und Y Wert muss je um den Durchmesser des Zylinders verringert werden, die Höhe des Kubus um die Höhe des Zylinders.
minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4);
}
Jetzt stimmen die Abmessungen der Grundplatte wieder, aber dafür ist sie jetzt verrutscht. Also korrigieren wir auch das, in dem wir noch ein translate Befehl einbauen:
translate([2,2,0])minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4);
}
Und nun haben wir die Grundplatte mit abgerundeten Ecken in der vorgesehenen Größe.
Eine Sache stört mich aber immer noch. Die Kanten sind nicht wirklich rund. Das hatten wir doch schon mal… Klar, wir haben vergessen die Auflösung bei dem Zylinder anzugeben,
translate([2,2,0])minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4, $fn = 300);
}
Jetzt sind die Rundungen auch wirklich rund.
Nun speichern wir das Projekt noch einmal. Anschließend können wir es rendern. Das wird eine ganze Weile dauern, da inzwischen doch einige Dreiecke zu berechnen sind…
Anschließend exportieren wir das Objekt als STL Datei und können unseren Servo Halter ausdrucken. Benötigen wir andere Größen, müssen wir nur das Projekt öffnen, am Anfang die Variablen entsprechend ändern und es ggfs. unter einem anderen Namen wieder speichern. Nun müssen wir es nur erneut rendern, als STL exportieren und die neue Halterung ausdrucken…
Diese Halterung besteht aus nur zwei verschiedenen Grundkörpern, 3 Kuben und 8 Zylindern (wobei wir mal den Zylinder für die Minkowski Summe außen vor lassen), ist also eigentlich nicht gerade ein komplexes Objekt… Nichtsdestotrotz qualmt einem am Anfang dabei sicher der Kopf anständig, oder?
Zum Abschluss noch mal ein Screenshot des fertigen Halters im Slicer:
Nun kann man einen ersten Testdruck machen. Hier ein paar schnelle Handy- Fotos.
Auf den ersten Blick sieht alles passend aus.
Auf den zweiten Blick auch.
Wenn man aber ganz genau hinschaut, passen die Bohrungen für die Befestigungsschrauben nicht wirklich. Nach kurzem Nachdenken ist auch klar, warum. Wir haben die Löcher mittig in den „Halteklötzchen“ positioniert. Doch die sind ja 1 mm breiter als die Befestigungslaschen des Servo. Außerdem haben wir ja bei der Länge des Servo ebenfalls 1 mm zugegeben. Dadurch rutschen die Löcher jetzt ganz an den äußeren Rand der Löcher im Flansch. Das Test- Exemplar kann man zwar verwenden, aber so soll das Skript nicht bleiben. Wir müssen also die Zylinder jeweils um 1 mm nach innen verschieben gegenüber der Position, in der sie jetzt sind. Nach all dem Hantieren mit Verschiebungen sollte das kein großer Aufwand sein. Also noch mal OpenSCAD angeschmissen und unser Skript geladen. Für den ersten Halter müssen die Zylinder um + 1 in X Richtung verschoben werden.
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
Beim zweiten Halter entsprechend um – 1
//Seitenhalterung 2
translate([$la +$bf + $bf + 2 – ($bf + 1),$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
Nun speichern wir das Projekt erneut und rendern es wieder. Danach exportieren wir es wieder als STL, um es erneut auszudrucken. Nun sollte alles passen. Aktuell druckt mein Drucker gerade ein weiteres Pärchen Zuckerrohrloren, weswegen ein zweiter Testdruck noch auf sich warten lässt. Aber in den Slicer laden und die Druckdatei vorbereiten kann ich derweil schon.
Sollte es wider Erwarten immer noch nicht passen, bessere ich hier selbstverständlich nach.
Wer sich nicht wirklich für das Tutorial interessiert, aber gerne den Servo- Halter haben will, hier ist noch mal das komplette, fertige Skript.
// OpenSCAD Tutorial Servo- Halter
// Variablen
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
$dm = 3; //Durchmesser der Befestigungsschrauben
// Grundplatte
difference() {
translate([2,2,0])minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4, $fn = 300);
}
translate([$dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$dm + 1,$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
}
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
//Seitenhalterung 2
translate([$la +$bf + $bf + 2 – ($bf + 1),$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
Und hier als Zip Archiv zum Download:
Servo_Halter
Im nächsten (und wohl letztem) Teil werden wir dann einen Umbausatz konstruieren, mit dem man aus einem Fleischmann Magic Train Personenwagen einen dazu passenden Packwagen basteln kann. Das wird allerdings als eigenständiger Baubericht im Modellbahn- teil erfolgen, denn den Packwagen habe ich natürlich gleich auch in Real gebaut, nicht nur am PC konstruiert.
Nun geht es endlich richtig los. Wir konstruieren unseren parametrierbaren Servo- Halter. Als Ausgangsbasis verwenden wir die im letzten Kapitel konstruierte Grundplatte.
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Allerdings wollen wir unsere Konstruktion ja flexibel für alle möglichen Servos einsetzen können. Deswegen müssen wir die tatsächlichen Abmessungen als Variablen und nicht als feste Werte verwenden. Also müssen wir zunächst mal bestimmen, wie viele Variablen wir benötigen und vom tatsächlichen Servo abnehmen müssen, und was wir im Skript errechnen können. OpenSCAD kann einige mathematische Operationen durchführen, die uns dabei helfen werden. Je weniger Maße wir tatsächlich eingeben müssen, desto leichter und schneller ist der Halter anpassbar. Wenn wir uns hierbei vertun und ein Maß vergessen oder eines zu viel anlegen, macht das nichts. Man kann Variablen jederzeit hinzufügen oder entfernen.
Da wir jetzt etwas „für die Ewigkeit“ konstruieren, sollten wir unser Projekt natürlich auch speichern, um es später weiter bearbeiten oder verwenden zu können. Beim ersten Mal nutzen wir dazu „Speichern unter“, um einen Pfad und Dateinamen festlegen zu können. „Speichern unter“ ist, wie bei fast allen Programmen im Menü oben links unter „Datei“ zu finden. Wie ihr das Projekt benennt, ist euch überlassen. Bei mir heißt es „Servo_Halter.scad“ Der Namen spielt keine Rolle, sollte aber auf jeden Fall zum Wiederfinden geeignet sein. Die Dateiendung .scad ist allerdings Pflicht, damit OpenSCAD weiß, um was es sich handelt. Tatsächlich ist die .scad Datei eine reine Text Datei, die man in jedem Editor öffnen und anschauen kann. Darin steht genau das, was wir in den Editor von OpenSCAD getippt haben. Nicht mehr und nicht weniger. Sobald wir das Projekt gespeichert haben, steht oben in der Überschrift nicht mehr „Unbekannt“, sondern der Name, den wir unserer Datei gegeben haben.
Ich habe auch schon zusätzliche Kommentare sowie den Platz für die Variablen- Deklaration eingefügt. Man kann schon jetzt erkennen, das die Kommentare helfen, das Skript zu ordnen und übersichtlicher zu machen… Auch Leerzeilen kann und sollte man dazu einsetzen. Je sauberer man hier ist, desto leichter fällt einem in Monaten oder Jahren, durch das Script durchzublicken und zu verstehen, was man damals gemacht hat…
Welche Maße benötigen wir nun aber? Zunächst mal die Breite des Servos, die Höhe des Servos, aber ohne die Ausbuchtung für den Antrieb des Steuerhorns. Natürlich benötigen wir auch die Länge des Servos. Das messen wir aber ohne die Befestigungsflansche, dafür mit ca 1 mm Zugabe, um etwas Spielraum zu bekommen. Das reicht aber noch nicht. Wir brauchen daneben auch die Länge eines Befestigungsflansches sowie den Abstand zwischen der Unterseite des Flansches und der Oberseite des Servos (wieder ohne die Erhebungen für den Ruderhorn- Antrieb). Den Abstand zwischen den Befestigungslöchern benötigen wir auch noch. Wenn man den Halter für Mikro- Servos einsetzen will, die nur ein Befestigungsloch pro Seite haben, dann müssen wir den Abstand auf 0 setzen. Wenn ich richtig gezählt habe, sind das sechs Variablen, die wir nun deklarieren, also festlegen müssen.
Die Werte, die ich hier verwende passen für „meine“ Modelcraft RS-2 Servos. Bei euch sind höchstwahrscheinlich andere Werte zu verwenden. Genau darum machen wir das mit den Variablen ja..
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
// Grundplatte
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Wie man sieht, kann man auch mitten in einer Zeile mit einem Kommentar anfangen. Hier wird das dazu verwendet, zu beschreiben, für was die gerade festgelegte Variable eigentlich steht. Wie ihr die Variablen benennt, ist euch überlassen. Man muss nur aufpassen, das der Variablenname nicht derselbe wird, wie eine OpenSCAD Funktion oder Systemvariable. Das merkt ihr aber schon, wenn das Skript nicht funktioniert… Nun sollten wir under Projekt erst mal wieder speichern. Es ist sinnvoll, alle paar Minuten zu speichern, damit bei einem Absturz oder ähnlichem nicht die ganze Arbeit zum Teufel ist. Da wir bereits einen Namen und Pfad vergeben haben, können wir nun einfach „Speichern“ im Datei- Menü dazu verwenden. Wer lieber mit Tastaturkürzeln arbeitet, Speichern ist wie in sehr, sehr vielen anderen Programmen auch STRG und S…
Jetzt haben wir unsere Variablen festgelegt. Wie gesagt, wenn das noch nicht passt, man also was vergessen hat, kann man jederzeit weitere Variablen hinzufügen.
Weil wir gerade dabei sind, ich denke, es ist sinnvoll, auch die Dicke der Grundplatte einstellbar zu machen. Auf diese Art kann man bei Bedarf zusätzlichen Platz für ein Ruderhorn schaffen, welches in Richtung Grundplatte montiert werden soll/muss.. Also schnell noch eine Variable hinzugefügt:
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([65,30,3]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Ich denke, das reicht jetzt erst mal an Variablen… Fangen wir also an, unsere Grundplatte auf die Variablen umzustellen. Am einfachsten ist das bei der Dicke der Platte, da man dort keinerlei Berechnungen durchführen muss.
Das Ergebnis sieht nicht anders aus als vorher, was ja auch zu erwarten war. Um zu zeigen, wie die Werte für die Variablen das Objekt beeinflussen, legen wir mal 10 für $gd fest:
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 10; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([65,30,$gd]);
translate([4,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=5, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=5, d=3.2, $fn = 300);
}
Und voila:
Die Grundplatte ist nun 10 mm Dick. Dafür sind aber unsere Bohrlöcher verschwunden. Eigentlich sind sie noch da, doch sie sind nicht mehr lang genug, um vollständig durch die Grundplatte zu reichen… Würden wir ohne Variablen arbeiten, müssten wir jetzt also alle vier Zylinder manuell korrigieren. Wir müssten statt an einer Stelle oben im Skript, an 5 Stellen Anpassungen vornehmen… Schon an diesem Beispiel sieht man, das sich der Einsatz von Variablen lohnt. Als wir die Grundplatte zuerst erzeugt haben, haben wir die Länge der Zylinder um 2 mm größer gemacht, als die Dicke der Arbeitsplatte. Genau das machen wir jetzt auch wieder. Wir schreiben überall da, wo vorher h = 5 stand nun h = $gd + 2…
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 10; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([65,30,$gd]);
translate([4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
}
und schon sind die Löcher wieder da.
Wenn wir in Zukunft die Dicke der Grundplatte ändern, passen sich die Löcher automatisch mit an.
Hiermit haben wir die Dicke der Grundplatte und die Schraublöcher parametrierbar gemacht. Nun müssen wir noch die anderen Abmessungen, also Länge und Breite anpassen. Die Höhe der Grundplatte soll der Höhe des Servos entsprechen. Also ersetzen wir die 30 durch $ho. Die Länge der Grundplatte setzt sich zusammen aus der Länge des Servo $la, zweimal der Länge des Flansches $bf sowie 2 mm Spielraum zusätzlich. Also $la +$bf + $bf + 2. Das fügen wir nun statt der 65 bei der Definition des Kubus ein.
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([4,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([61,26,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
}
Und, unser Ergebnis überzeugt wieder nicht wirklich:
Natürlich müssen wir auch die Position der Löcher an die Maße der Grundplatte anpassen. Das erste Loch sitzt noch passend. Das zweite Loch ist zu weit oben, da wir die Breite der Grundplatte nun größer gewählt haben. Statt 26 brauchen wir hier $ho – 4 Dieselbe „Formel“ verwenden wir auch für das vierte Loch. Nun sitzen die Löcher in Y Richtung wieder passend. Loch 3 und 4 müssen aber noch in X Richtung angepasst werden, da unsere Grundplatte nun etwas kürzer ist. Zuvor haben wir 4 von der Länge der Grundplatte abgezogen. Das werden wir jetzt auch wieder tun. Also $la +$bf + $bf + 2 – 4.
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([4,$ho – 4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([$la +$bf + $bf + 2 – 4,4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
translate([$la +$bf + $bf + 2 – 4,$ho – 4,-1])cylinder(h=$gd + 2, d=3.2, $fn = 300);
}
Ich lasse das mit +2 und – 4 bewusst erst mal stehen. Warum wird später aufgelöst.
Und nun passen die Löcher wieder.
Nun sind wir scheinbar wieder genau da, wo wir gestartet sind. Doch tatsächlich sind wir einen Riesensatz weiter. Wir können nun jede beliebig große Grundplatte mit passenden Löchern erzeugen, in dem wir nur ein paar wenige Abmessungen eingeben.
Nun noch die Auflösung, warum wir mit +2 – 4 hantiert haben. Inzwischen habe ich mir nämlich überlegt, das 3 mm Schrauben bei Mikro- Servos vielleicht etwas arg wuchtig sind. Deswegen möchte ich auch noch die Schraubenloch- Durchmesser und den dazu passenden Abstand vom Rand der Grundplatte einstellbar machen. Also definieren wir noch eine Variable, $dm, die den Schrauben- Durchmesser festlegt. Diesen Wert nutzen wir nun, um den Durchmesser der 4 Zylinder sowie den Abstand der Löcher vom Rand festzulegen. Der Durchmesser der Zylinder ist $dm + 0.2 und der Abstand wird $dm + 1. Das muss jetzt schon an sehr vielen Stellen geändert werden. Ein manuelles Ändern der Löcher wäre nachträglich also ziemlich mühsam.
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
$dm = 3 //Durchmesser der Befestigungsschrauben
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([$dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$dm + 1,$ho – $dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – $dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – $dm + 1,$ho – $dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
}
Nun haben wir aber gleich alles an der Grundplatte parametrierbar gemacht.
Doch, wenn wir den Wert für $dm tatsächlich ändern, entsteht ein Fehler:
Wir haben hier Klammern vergessen, denn 2 – $dm + 1 ist nicht das, was wir eigentlich haben wollen. Da müssen wir schon 2 – ($dm + 1) schreiben. Ganz wie früher im Mathe- Unterricht. Ja, ich weiß, lang, lang ist’s her. Aber manchmal lohnt es sich in der hintersten Ecke des Gehirns herum zu graben…
// OpenSCAD Tutorial Servo- Halter
// Variablendeklaration
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
$dm = 1; //Durchmesser der Befestigungsschrauben
// Grundplatte
difference() {
cube([$la +$bf + $bf + 2,$ho,$gd]);
translate([$dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$dm + 1,$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
}
Jetzt funktioniert es endlich.
Ein schweres Stück Arbeit, oder? Dafür sind wir jetzt schon fast fertig mit unserem Servo Halter. Wir brauchen nämlich nur noch 2 Kuben und 4 Zylinder, jeweils an den passenden Stellen und mit den passenden Abmessungen meint Parametern. Das war es dann auch schon (zumindest fast).
Um das Servo anschrauben zu können, benötigen wir zwei „Klötze“, die auf der Grundplatte befestigt sind. Das machen wir natürlich wieder mit einem Kubus. Der Kubus bekommt als X- Wert die Länge des Flansches + 1 (wir haben 2 mm bei der Grundplatte zugegeben, wisst ihr noch? Das war genau deswegen) also $bf + 1. In Z- Richtung bekommt der Kubus die Breite des Servos, also $br und in Y- Richtung können wir einen fixen Wert wählen. Dieser Wert sollte nicht zu klein sein, damit das Ganze stabil genug wird, aber auch nicht zu lang, damit er nachher nicht über die Grundplatte raus ragt, wenn wir besonders kleine Servos verwenden. Ich werde es erst mal mit 10 probieren. In den Kubus werden kleine selbst schneidende Schrauben eingedreht, für die wir Löcher vorbohren wollen. Das werden wir gleich mit erledigen. Dafür benötigen wir wieder die Zylinder. Die Löcher zur Befestigung in den Flanschen am Servo sind recht groß, da man speziell bei Einsatz von Verbrennungsmotoren in RC Modellen häufig starke Vibrationen hat. Deswegen werden dort normalerweise Gummitüllen eingefügt, die Vibrationen vom Servo fern halten. Bei der Modellbahn treten solche Vibrationen aber nicht auf. Deswegen können wir die Servos einfach festschrauben. Da 5 mm Schrauben viel zu wuchtig wären, muss man eine Schraube mit Unterlegscheibe verwenden. Die eigentlich zu großen Löcher übernehmen dabei die Funktion von Langlöschern, die eine Feinjustage erlauben. Allerhöchste Genauigkeit ist also nicht erforderlich.
Fügen wir also erst mal einen Kubus ein. Die andere Seite machen wir später wieder mit „Kopieren und Einfügen“.
cube([$bf + 1,10,$br]);
Das sieht dann so aus:
Hier können wir nach der Syntax Hervorhebung eine weitere Komfort Funktion eines brauchbaren Editors sehen. (Notepad ist übrigens kein brauchbarer Editor)… Komplexere Funktionen wie hier die „difference“ Funktion können sich über viel Zeilen erstrecken. In den meisten Editoren gibt es deswegen diese kleinen – bzw. + Zeichen in den Quadraten. Klickt man auf so ein Zeichen, wird der Bereich, der zu dieser komplexen Funktion gehört versteckt (bei Klick auf -) oder eingeblendet (bei Klick auf +). Das macht den Code deutlich übersichtlicher, weil man nur die Bereiche eingeblendet bekommt, an denen man gerade arbeitet. Unsere Grundplatte ist aber fertig. Da müssen wir nicht mehr ran. Also muss der viele Code auch nicht unbedingt angezeigt werden. Vorhanden ist er aber selbstverständlich weiterhin… Den Kubus an die passenden Position bringen, erledigen wir erst ganz am Ende. Zunächst erzeugen wir noch die Schraublöcher in dem Kubus. Dazu erzeugen wir einen Zylinder mit einem nicht zu großen Durchmesser, schließlich sollen die selbst schneidenden Schrauben ja Halt finden. Ich würde nicht mehr als maximal 1,5 mm Durchmesser wählen. Als Länge würde ich die Dicke des „Klotzes einstellen. Wenn wir dann wieder 1 mm „Luft“ im oberen Bereich lassen, gehen die Löcher nicht ganz durch.
cylinder(h = 10, d = 1.5);
Den Zylinder müssen wir um -90 Grad in X Richtung rotieren.
rotate([-90,0,0])cylinder(h = 10, d = 1.5);
Jetzt müssen wir ihn noch an die passende Stelle bewegen. In X Richtung muss er um die Hälfte der Kubusbreite verschoben werden, also ($bf + 1) / 2. Klammern nicht vergessen wegen Punkt vor Strich… In Y Richtung um -1. In Z Richtung sollten sich die beiden Löcher mit dem Lochabstand $lo mittig auf (eher in) dem Kubus sitzen. Der Wert ist also ($br – $lo) / 2
Also zusammen:
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
Unser zweites Loch muss nun in Z Richtung um den Lochabstand $lo höher sitzen.
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)] + $lo)rotate([-90,0,0])cylinder(h = 10, d = 1.5);
Die beiden Zylinder müssen wir nun natürlich vom Kubus abziehen, was nichts neues mehr ist.
difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Und wir haben zwei Löcher im „Befestigungsklötzchen“. Wenn $lo = 0 ist, weil es nur ein Loch gibt, liegen beide Zylinder genau in der Mitte exakt übereinander und ergeben so natürlich nur ein Loch. Also ist dieser Fall damit ebenfalls abgedeckt.
Nun müssen wir das ganze Gebilde noch an die passende Stelle bewegen. In Z Richtung muss es um die Dicke der Grundplatte verschoben werden. In Y Richtung um die Höhe des Flansches, $bfh. In X Richtung muss es gar nicht bewegt werden. Also alles zusammen:
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Ergebnis:
Fast fertig. Es fehlt nur noch die zweite Seitenhalterung. Dazu kopieren wir den ganzen Bereich, den wir gerade geschrieben haben und fügen ihn einfach darunter noch mal ein.
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Die Überschrift ändern wir nach Seitenhalterung 2. Nun müssen wir nur noch einen einzigen Wert anpassen, nämlich die 0 beim ersten translate Befehl. Statt 0 muss hier die Breite der Grundplatte abzüglich der Breite des „Befestigungsklötzchens“ eingetragen werden. Also
//Seitenhalterung 2
translate([$la +$bf + $bf + 2 – ($bf + 1),$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
translate([($bf + 1) / 2, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5);
}
Damit ist unser Servo- Halter eigentlich fertig.
Wir können nun Halter für nahezu beliebig große bzw. kleine Servos herstellen.
Nur eigentlich fertig? Nun ja, man kann ihn so ohne Einschränkungen einsetzen, keine Frage. Aber vielleicht geht es ja etwas schöner… Schließlich ist das ein Tutorial, wo man etwas über das Programm lernen können soll…
Eine Möglichkeit unseren Halter zu verschönern wäre es, die Ecken der Grundplatte abzurunden. Dazu kann man in OpenSCAD die Minkowski Funktion verwenden. Was das bedeutet, kann man bei Interesse am besten direkt in Wikipedia nachlesen. Man kann unglaublich viel mit dieser OpenSCAD Funktion anstellen. Zu 99% ist das alles aber zu hoch für mich. Unser einfacher Anwendungsfall lässt sich aber noch ganz gut erklären und anwenden…
Wir fügen zuerst bei der Grundplatte einen Zylinder ein. Dieser soll eine Höhe von 0.1 und einen Durchmesser von 4 bekommen. Nun bilden wir die Minkowski Summe dieser Objekte.
minkowski()
{
cube([$la +$bf + $bf + 2,$ho,$gd]);
cylinder(h = 0.1, d = 4);
}
Das Ergebnis überrascht ein wenig:
Zumindest, wenn man so wie ich, keine Ahnung von der Minkowski Summe hat. Prinzipiell ist es in diesem Fall so, das die Höhe des Zylinders zur Höhe der Grundplatte hinzugefügt wird und der Durchmesser je zur Länge und zur Breite. Deswegen ist die Platte nun deutlich größer und man versteht vielleicht, warum ich nur 0.1 als Höhe für den Zylinder gewählt habe. 0 geht nicht, dann passiert überhaupt nichts. Und der Durchmesser des Zylinders bestimmt den Radius der Ecken, weswegen man ihn nicht beliebig klein machen kann… Man kann das Ganze zwar auch so lassen. Der Zehntelmillimeter in der Dicke stört überhaupt nicht und das die Platte ein paar Millimeter übersteht ist eigentlich auch egal. Aber trotzdem werden wir das korrigieren. Wir müssen also die Werte bei cube anpassen, genauer verkleinern. Der X und Y Wert muss je um den Durchmesser des Zylinders verringert werden, die Höhe des Kubus um die Höhe des Zylinders.
minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4);
}
Jetzt stimmen die Abmessungen der Grundplatte wieder, aber dafür ist sie jetzt verrutscht. Also korrigieren wir auch das, in dem wir noch ein translate Befehl einbauen:
translate([2,2,0])minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4);
}
Und nun haben wir die Grundplatte mit abgerundeten Ecken in der vorgesehenen Größe.
Eine Sache stört mich aber immer noch. Die Kanten sind nicht wirklich rund. Das hatten wir doch schon mal… Klar, wir haben vergessen die Auflösung bei dem Zylinder anzugeben,
translate([2,2,0])minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4, $fn = 300);
}
Jetzt sind die Rundungen auch wirklich rund.
Nun speichern wir das Projekt noch einmal. Anschließend können wir es rendern. Das wird eine ganze Weile dauern, da inzwischen doch einige Dreiecke zu berechnen sind…
Anschließend exportieren wir das Objekt als STL Datei und können unseren Servo Halter ausdrucken. Benötigen wir andere Größen, müssen wir nur das Projekt öffnen, am Anfang die Variablen entsprechend ändern und es ggfs. unter einem anderen Namen wieder speichern. Nun müssen wir es nur erneut rendern, als STL exportieren und die neue Halterung ausdrucken…
Diese Halterung besteht aus nur zwei verschiedenen Grundkörpern, 3 Kuben und 8 Zylindern (wobei wir mal den Zylinder für die Minkowski Summe außen vor lassen), ist also eigentlich nicht gerade ein komplexes Objekt… Nichtsdestotrotz qualmt einem am Anfang dabei sicher der Kopf anständig, oder?
Zum Abschluss noch mal ein Screenshot des fertigen Halters im Slicer:
Nun kann man einen ersten Testdruck machen. Hier ein paar schnelle Handy- Fotos.
Auf den ersten Blick sieht alles passend aus.
Auf den zweiten Blick auch.
Wenn man aber ganz genau hinschaut, passen die Bohrungen für die Befestigungsschrauben nicht wirklich. Nach kurzem Nachdenken ist auch klar, warum. Wir haben die Löcher mittig in den „Halteklötzchen“ positioniert. Doch die sind ja 1 mm breiter als die Befestigungslaschen des Servo. Außerdem haben wir ja bei der Länge des Servo ebenfalls 1 mm zugegeben. Dadurch rutschen die Löcher jetzt ganz an den äußeren Rand der Löcher im Flansch. Das Test- Exemplar kann man zwar verwenden, aber so soll das Skript nicht bleiben. Wir müssen also die Zylinder jeweils um 1 mm nach innen verschieben gegenüber der Position, in der sie jetzt sind. Nach all dem Hantieren mit Verschiebungen sollte das kein großer Aufwand sein. Also noch mal OpenSCAD angeschmissen und unser Skript geladen. Für den ersten Halter müssen die Zylinder um + 1 in X Richtung verschoben werden.
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
Beim zweiten Halter entsprechend um – 1
//Seitenhalterung 2
translate([$la +$bf + $bf + 2 – ($bf + 1),$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
Nun speichern wir das Projekt erneut und rendern es wieder. Danach exportieren wir es wieder als STL, um es erneut auszudrucken. Nun sollte alles passen. Aktuell druckt mein Drucker gerade ein weiteres Pärchen Zuckerrohrloren, weswegen ein zweiter Testdruck noch auf sich warten lässt. Aber in den Slicer laden und die Druckdatei vorbereiten kann ich derweil schon.
Sollte es wider Erwarten immer noch nicht passen, bessere ich hier selbstverständlich nach.
Wer sich nicht wirklich für das Tutorial interessiert, aber gerne den Servo- Halter haben will, hier ist noch mal das komplette, fertige Skript.
// OpenSCAD Tutorial Servo- Halter
// Variablen
$la = 42; //Länge des Servo + 1 mm Spielraum
$br = 20; //Breite des Servo
$ho = 35; //Höhe des Servo
$bf = 8; //Länge des Flansch
$bfh = 11; // Höhe des Flansch
$lo = 10; //Lochabstand
$gd = 3; // Dicke der Grundplatte, nicht unter 2 mm
$dm = 3; //Durchmesser der Befestigungsschrauben
// Grundplatte
difference() {
translate([2,2,0])minkowski()
{
cube([($la +$bf + $bf + 2)-4,$ho-4,$gd-0.1]);
cylinder(h = 0.1, d = 4, $fn = 300);
}
translate([$dm + 1,$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$dm + 1,$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$dm + 1,-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
translate([$la +$bf + $bf + 2 – ($dm + 1),$ho – ($dm + 1),-1])cylinder(h=$gd + 2, d=$dm + 0.2, $fn = 300);
}
//Seitenhalterung 1
translate([0,$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 + 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
//Seitenhalterung 2
translate([$la +$bf + $bf + 2 – ($bf + 1),$bfh,$gd])difference(){
cube([$bf + 1,10,$br]);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2)])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
translate([($bf + 1) / 2 – 1, -1,(($br – $lo) / 2) + $lo])rotate([-90,0,0])cylinder(h = 10, d = 1.5,$fn = 300);
}
Und hier als Zip Archiv zum Download:
Servo_Halter
Im nächsten (und wohl letztem) Teil werden wir dann einen Umbausatz konstruieren, mit dem man aus einem Fleischmann Magic Train Personenwagen einen dazu passenden Packwagen basteln kann. Das wird allerdings als eigenständiger Baubericht im Modellbahn- teil erfolgen, denn den Packwagen habe ich natürlich gleich auch in Real gebaut, nicht nur am PC konstruiert.
Claus60- Skalpell-Künstler
bluetrain, SibirianTiger, Spur 1 und folkwang mögen diesen Beitrag
Re: 3D Konstruktion mit OpenSCAD – Einführung
Hi.
Irgendwer hat mal geschrieben, 3D Konstruktion in OpenSCAD ist so einfach wie einen Einkaufszettel zu schreiben. So ganz würde ich dem zwar nicht zustimmen, aber den Kindern/Enkeln beim Mathe- Unterricht helfen zu müssen ist sehr viel schwerer...
Man muss einfach anfangen, Schritt für Schritt. Dann erschließt sich einem der Kram von ganz alleine. Klar, bei jemandem bei dem 1 + 1 mal 3 und mal 5 ergibt, wird es schwierig. Aber ein bisschen im Gehirn stöbern und die Mathe- Kenntnisse aus der Mittelstufe (maximal, eher Orientierungsstufe, falls es das noch gibt) abrufen, dann hat man mehr als man braucht.
Wenn es dich interessiert, einfach mal mit den ersten sehr einfachen Beispielen anfangen. Ich empfinde OpenSCAD als das mit Abstand am leichtesten zu durchschauende 3D Programm überhaupt.
Als ich damals zum ersten Mal mit OpenSCAD in Berührung gekommen bin, war ich auch erst etwas verwirrt. Aber es hat keine 2 Stunden gedauert, bis ich mit Hilfe von (englischen) Tutorien meine ersten nützlichen Objekte konstruiert hatte. Dabei handelte es sich um "Schwellenüberzieher" um H0 Gleis zu 0e Gleis (der Haupt- Unterschied sind deutlich größere Schwellen) umzubauen. Heute mache ich sowas in 30 Sekunden, aber damals war das was Tolles und ein echter Erfolg.
Inzwischen bastele ich an sowas rum:
Das wird ein funktionsfähiges Modell im Maßstab 1:45, 16,5mm Spurweite (also 0e) der ungarischen C50 Lokomotive, die auch heute noch in unzähligen Exemplaren überall auf der Welt unterwegs ist. Im Original wurden viele LKW Teile verwendet, was der Lok ihr uriges Aussehen verleiht. Dadurch ist die Lok aber robust, zuverlässig und günstig. Der große Erfolg dieser Lok verwundert also nicht. Sie wurde für nahezu alle denkbaren Schmalspur- Spurweiten gebaut. Man kann sie deswegen auf Feldbahn- Gleisen, auf 750 mm Gleisen und auch auf der Meterspur antreffen.
Als Ausgangspunkt habe ich hier zwei frei verfügbare STL Dateien von Thingiverse verwendet. Aber ich muss für meine Zwecke viele Anpassungen vornehmen. Das fängt bei dem Ausschnitt für die Kupplung an (ist jetzt ein Normschacht, in den mal fast alle gängigen Kupplungen einstecken kann) und hört beim Einbau eines völlig anderen als den vorgesehenen Antrieb (von einem Roco Taurus, der nicht unter 200€ zu haben ist, dazu noch einen Faulhaber Motor für 100€, das sprengt den Rahmen doch gewaltig weswegen das was anderes rein muss) noch nicht auf...
Ein guter Freund von mir möchte die Lok gerne mit abnehmbaren Dach haben, also muss ich das Dach abschneiden und als einzelnes Druckteil ausführen. Es soll zwei verschiedene Antriebsmöglichkeiten geben. Zum einen kann als Basis eine alte Roco Köf3 (die kann man so ab 30€ auftreiben) verwendet werden, allerdings mit einem 1020er Glockenanker Motor, den man ab etwa 15€ bekommt. Die alten Roco Motoren sind oft in keinem guten Zustand mehr, da lohnen sich die 15 € auf jeden Fall... Die H0 Köf 3 hat exakt den passenden Radstand und auch den passenden Rad- Durchmesser für die C50 in 1:45. Die andere Variante wird für ein Halling Vario Fahrwerk vorgesehen. Hier passt der Achsstand nicht ganz (es fehlen 3mm) und auch der Rad- Durchmesser ist etwas zu klein. Dafür laufen diese Fahrwerke ohne Basteln sehr gut und sie sind leicht neu zu bekommen. Preislich liegen sie etwas über dem Niveau der Köf 3 mit Glockenanker- Motor, (50-75€, je nach Motor- Güte) aber nicht mal ansatzweise so teuer wie die Original- Lösung...
Sobald es hier etwas "Reales" zu sehen gibt, gibt es auch einen Baubericht...
Irgendwer hat mal geschrieben, 3D Konstruktion in OpenSCAD ist so einfach wie einen Einkaufszettel zu schreiben. So ganz würde ich dem zwar nicht zustimmen, aber den Kindern/Enkeln beim Mathe- Unterricht helfen zu müssen ist sehr viel schwerer...
Man muss einfach anfangen, Schritt für Schritt. Dann erschließt sich einem der Kram von ganz alleine. Klar, bei jemandem bei dem 1 + 1 mal 3 und mal 5 ergibt, wird es schwierig. Aber ein bisschen im Gehirn stöbern und die Mathe- Kenntnisse aus der Mittelstufe (maximal, eher Orientierungsstufe, falls es das noch gibt) abrufen, dann hat man mehr als man braucht.
Wenn es dich interessiert, einfach mal mit den ersten sehr einfachen Beispielen anfangen. Ich empfinde OpenSCAD als das mit Abstand am leichtesten zu durchschauende 3D Programm überhaupt.
Als ich damals zum ersten Mal mit OpenSCAD in Berührung gekommen bin, war ich auch erst etwas verwirrt. Aber es hat keine 2 Stunden gedauert, bis ich mit Hilfe von (englischen) Tutorien meine ersten nützlichen Objekte konstruiert hatte. Dabei handelte es sich um "Schwellenüberzieher" um H0 Gleis zu 0e Gleis (der Haupt- Unterschied sind deutlich größere Schwellen) umzubauen. Heute mache ich sowas in 30 Sekunden, aber damals war das was Tolles und ein echter Erfolg.
Inzwischen bastele ich an sowas rum:
Das wird ein funktionsfähiges Modell im Maßstab 1:45, 16,5mm Spurweite (also 0e) der ungarischen C50 Lokomotive, die auch heute noch in unzähligen Exemplaren überall auf der Welt unterwegs ist. Im Original wurden viele LKW Teile verwendet, was der Lok ihr uriges Aussehen verleiht. Dadurch ist die Lok aber robust, zuverlässig und günstig. Der große Erfolg dieser Lok verwundert also nicht. Sie wurde für nahezu alle denkbaren Schmalspur- Spurweiten gebaut. Man kann sie deswegen auf Feldbahn- Gleisen, auf 750 mm Gleisen und auch auf der Meterspur antreffen.
Als Ausgangspunkt habe ich hier zwei frei verfügbare STL Dateien von Thingiverse verwendet. Aber ich muss für meine Zwecke viele Anpassungen vornehmen. Das fängt bei dem Ausschnitt für die Kupplung an (ist jetzt ein Normschacht, in den mal fast alle gängigen Kupplungen einstecken kann) und hört beim Einbau eines völlig anderen als den vorgesehenen Antrieb (von einem Roco Taurus, der nicht unter 200€ zu haben ist, dazu noch einen Faulhaber Motor für 100€, das sprengt den Rahmen doch gewaltig weswegen das was anderes rein muss) noch nicht auf...
Ein guter Freund von mir möchte die Lok gerne mit abnehmbaren Dach haben, also muss ich das Dach abschneiden und als einzelnes Druckteil ausführen. Es soll zwei verschiedene Antriebsmöglichkeiten geben. Zum einen kann als Basis eine alte Roco Köf3 (die kann man so ab 30€ auftreiben) verwendet werden, allerdings mit einem 1020er Glockenanker Motor, den man ab etwa 15€ bekommt. Die alten Roco Motoren sind oft in keinem guten Zustand mehr, da lohnen sich die 15 € auf jeden Fall... Die H0 Köf 3 hat exakt den passenden Radstand und auch den passenden Rad- Durchmesser für die C50 in 1:45. Die andere Variante wird für ein Halling Vario Fahrwerk vorgesehen. Hier passt der Achsstand nicht ganz (es fehlen 3mm) und auch der Rad- Durchmesser ist etwas zu klein. Dafür laufen diese Fahrwerke ohne Basteln sehr gut und sie sind leicht neu zu bekommen. Preislich liegen sie etwas über dem Niveau der Köf 3 mit Glockenanker- Motor, (50-75€, je nach Motor- Güte) aber nicht mal ansatzweise so teuer wie die Original- Lösung...
Sobald es hier etwas "Reales" zu sehen gibt, gibt es auch einen Baubericht...
Claus60- Skalpell-Künstler
folkwang mag diesen Beitrag
Re: 3D Konstruktion mit OpenSCAD – Einführung
Auch wenn das nicht meine Baustelle ist - Respekt!
Da hast du dir für uns richtig viel Arbeit gemacht.
Da hast du dir für uns richtig viel Arbeit gemacht.
Thoto- Modellbau-Experte
Re: 3D Konstruktion mit OpenSCAD – Einführung
Erst mal Danke für deine Arbeit Claus, Wahnsinn was man mit einigen Zeilen Code so zaubern kann.
Schade das es so was nicht als PDF gibt..
Schade das es so was nicht als PDF gibt..
doc_raven1000- Modellbaumeister
Re: 3D Konstruktion mit OpenSCAD – Einführung
Na ja, es wäre nicht all zu viel Aufwand, das Tut als PDF zu erzeugen... Mal sehen, vielleicht mache ich das die Tage mal fertig...
Claus60- Skalpell-Künstler
Re: 3D Konstruktion mit OpenSCAD – Einführung
Das wäre super Claus, wenn ich sehe was man damit wohl alles machen kann wie..
- Code:
http://www.mojoptix.com/2015/10/25/mojoptix-001-digital-sundial/
doc_raven1000- Modellbaumeister
Re: 3D Konstruktion mit OpenSCAD – Einführung
Hi.
Das ist eine wirklich nette, interessante Sonnenuhr. Sowas habe ich bisher noch nie gesehen. Wie gesagt, fast alles, was parametrierbar ist (so wie diese Sonnenuhr) auf Thingiverse ist mit OpenSCAD gemacht worden...
Eigentlich kann man mit OpenSCAD nämlich absolut alles machen. Wenn es sein muss, sogar einen Formel 1 Rennwagen oder eine Raumkapsel in 1:1 konstruieren.
Ich zeige mal ein paar Beispiele (nicht von mir), was im Bereich Modellbau (Modellbahn) mit OpenSCAD so alles geht...
und die E03 Front mal ausgedruckt:
Ich hoffe die Bilder sind zu sehen. So weit bin ich selbst noch lange nicht, aber man muss sich ja Ziele setzen. Das Programm setzt der eigenen Kreativität keine Grenzen. Man muss sich nur darauf einlassen und natürlich lernbereit sein. Sowas ist immer mit sehr viel Lernen verbunden, logisch. Aber für die Mühe beim Lernen wird man mit unendlichen Möglichkeiten belohnt. Damit wird ein 3D Drucker erst wirklich komplett. Ok, man kann natürlich auch andere 3D Programme verwenden und damit ähnliches vollbringen. Zumindest für mich wird es damit aber nur erheblich komplizierter...
Zu Beginn habe ich mal versucht, in Blender zwei Objekte präzise zueinander zu positionieren. Genau ging es darum die Wandstärken eine Lok- Gehäuses zu verstärken, das das Modell eigentlich für LGB, also in 1:22,5 gedacht war. Durch das runter skalieren wurden die Wände aber so dünn, das man das Gehäuse nicht mehr ausdrucken konnte. Mein Gott, was habe ich da gefummelt und geflucht, bis ich zumindest irgendwas hin bekommen habe. Das ist aber nicht wirklich gut genug geworden, weswegen ich das demnächst noch mal neu, diesmal in OpenSCAD in Angriff nehmen werde. In OpenSCAD ist das eine Sache von Minuten, nicht Tagen, speziell seitdem ich raus gefunden habe, wie man STL Dateien (z.B. von Thingiverse) vernünftig in OpenSCAD einlesen und somit modifizieren kann... Andere Tools wie Blender, Meshmixer usw. sind mega kompliziert (finde ich), weil dort immer und für alles mit Meshes, also lauter Dreiecken, hantiert wird und man die Positionierung mit der Maus treffen muss. In OpenSCAD ist so eine STL Datei nicht wirklich etwas anderes als ein Grundkörper und lässt sich genau so leicht wie ebendiese verändern...
Das ist eine wirklich nette, interessante Sonnenuhr. Sowas habe ich bisher noch nie gesehen. Wie gesagt, fast alles, was parametrierbar ist (so wie diese Sonnenuhr) auf Thingiverse ist mit OpenSCAD gemacht worden...
Eigentlich kann man mit OpenSCAD nämlich absolut alles machen. Wenn es sein muss, sogar einen Formel 1 Rennwagen oder eine Raumkapsel in 1:1 konstruieren.
Ich zeige mal ein paar Beispiele (nicht von mir), was im Bereich Modellbau (Modellbahn) mit OpenSCAD so alles geht...
und die E03 Front mal ausgedruckt:
Ich hoffe die Bilder sind zu sehen. So weit bin ich selbst noch lange nicht, aber man muss sich ja Ziele setzen. Das Programm setzt der eigenen Kreativität keine Grenzen. Man muss sich nur darauf einlassen und natürlich lernbereit sein. Sowas ist immer mit sehr viel Lernen verbunden, logisch. Aber für die Mühe beim Lernen wird man mit unendlichen Möglichkeiten belohnt. Damit wird ein 3D Drucker erst wirklich komplett. Ok, man kann natürlich auch andere 3D Programme verwenden und damit ähnliches vollbringen. Zumindest für mich wird es damit aber nur erheblich komplizierter...
Zu Beginn habe ich mal versucht, in Blender zwei Objekte präzise zueinander zu positionieren. Genau ging es darum die Wandstärken eine Lok- Gehäuses zu verstärken, das das Modell eigentlich für LGB, also in 1:22,5 gedacht war. Durch das runter skalieren wurden die Wände aber so dünn, das man das Gehäuse nicht mehr ausdrucken konnte. Mein Gott, was habe ich da gefummelt und geflucht, bis ich zumindest irgendwas hin bekommen habe. Das ist aber nicht wirklich gut genug geworden, weswegen ich das demnächst noch mal neu, diesmal in OpenSCAD in Angriff nehmen werde. In OpenSCAD ist das eine Sache von Minuten, nicht Tagen, speziell seitdem ich raus gefunden habe, wie man STL Dateien (z.B. von Thingiverse) vernünftig in OpenSCAD einlesen und somit modifizieren kann... Andere Tools wie Blender, Meshmixer usw. sind mega kompliziert (finde ich), weil dort immer und für alles mit Meshes, also lauter Dreiecken, hantiert wird und man die Positionierung mit der Maus treffen muss. In OpenSCAD ist so eine STL Datei nicht wirklich etwas anderes als ein Grundkörper und lässt sich genau so leicht wie ebendiese verändern...
Claus60- Skalpell-Künstler
Re: 3D Konstruktion mit OpenSCAD – Einführung
Hallo Claus,
Solche Objekte wie du hier zeigsts würde ich weder mit Inventor noch mit SCAD hinkriegen, bei mir scheitert das Ganze an meiner Vorstellung von Objekten, egal ob aus Dreiecken oder "primitiven" Grundformen mit Adition oder Subtraktion... werde deinen Trööt aber weiter folgen, vielleicht fällt es mir leichter mit Zahlen umzugehen..
Solche Objekte wie du hier zeigsts würde ich weder mit Inventor noch mit SCAD hinkriegen, bei mir scheitert das Ganze an meiner Vorstellung von Objekten, egal ob aus Dreiecken oder "primitiven" Grundformen mit Adition oder Subtraktion... werde deinen Trööt aber weiter folgen, vielleicht fällt es mir leichter mit Zahlen umzugehen..
doc_raven1000- Modellbaumeister
Ähnliche Themen
» Link: NASA - Space Shuttles, Einführung von Captain Archer...
» Konstruktion und Bau des VT 137 322 in HOe
» Anlagenbau: Konstruktion von großen Radien
» Konstruktion und Probebau der D311 im Maßstab 1:25
» Rungenwagen Bauart Linz 1:25, Konstruktion von Adam Koch
» Konstruktion und Bau des VT 137 322 in HOe
» Anlagenbau: Konstruktion von großen Radien
» Konstruktion und Probebau der D311 im Maßstab 1:25
» Rungenwagen Bauart Linz 1:25, Konstruktion von Adam Koch
Seite 1 von 1
Befugnisse in diesem Forum
Sie können in diesem Forum nicht antworten