(Modellbahn-) Fotografie Teil 1 – Studio- Dauerlicht

Studio- Dauerlicht

Als zweitbeste Lösung, speziell wenn man nicht so bewegliche Motive wie die junge Dame auf dem ersten Foto, sondern wie bei der Modellbahn- Fotografie üblich eher kleine und ruhig stehende Objekte fotografiert, ist Studio- Dauerlicht, am besten in Form von  LED Studiolampen. Die verbrauchen wenig Strom und werden nicht so heiß wie andere Lichtquellen… Dazu ist dann aber ein Stativ für die Kamera nötig, sofern man keine verwackelten und verrauschten Bilder haben will denn die Lichtmenge ist um ein Vielfaches kleiner als bei Blitzgeräten. Dafür kann man diese Leuchten in aller Regel auch zum Video Filmen verwenden.

Hier kann man für ganz kleines Geld einsteigen, in dem man sich eine “Lichtbox” oder “Studiobox” anschafft. Diese fangen bei unter 20€ an (mit Glück kann man sie auch schon mal für unter 10€ bekommen) und es gibt sie in verschiedenen Größen mit unterschiedlichen Lichtquellen zu verschiedenen Preisen. Generell gibt es zwei Typen.

(Bildquelle: amazon.de Auf das Bild klicken, um zur Quelle zu gelangen)

Zum Einen die weißen Boxen, die man sowohl von innen als auch von Außen mit Licht bestücken kann. Das hat fast immer Vorteile, außer man benötigt sehr kontrolliertes Licht in einer sehr hellen und unruhigen Umgebung. Dann, und nur dann sind schwarze Studioboxen, die nur von Innen ausgeleuchtet werden können, von Vorteil.

(Bildquelle: amazon.de Auf das Bild klicken, um zur Quelle zu gelangen)

Diese Studioboxen werden in aller Regel mit mehreren verschiedenfarbigen Hintergründen ausgeliefert, mit denen man die unterschiedlichsten Objekte gut vom Hintergrund abheben kann. Schwarz und Weiß sind eigentlich immer dabei und werden auch am häufigsten benötigt. Hat die eigene Box keinen passenden Hintergrund dabei, kann man sich auch immer mit farbigem Fotokarton aus dem Bastelladen oder dem Künstlerbedarf helfen. Stoff, Folien oder ähnliches kann man natürlich auch einsetzen, um bestimmte Effekte zu erzielen wobei matte Materialien in der Regel zu bevorzugen sind, um unerwünschte Reflexe auf dem Hintergrund zu vermeiden. Die kreativen Möglichkeiten sind enorm und werden eigentlich nur durch die eigene Fantasie beschränkt. Man ist keinesfalls auf die mitgelieferten Hintergründe beschränkt.

Bei den “weißen” Boxen gibt es welche (die überwiegende Mehrzahl), bei denen das Licht fest unter der “Decke” montiert ist. Damit bekommt man eine schattenarme Ausleuchtung hin, wie man sie z.B. für eBay Fotos ganz gut gebrauchen kann. Aber man hat kaum Gestaltungsmöglichkeiten mit dem Licht, da man die Position nicht verändern kann…

Deswegen habe ich mir eine Studiobox mit getrennt aufstellbaren LED Lampen gekauft. Leider ist diese Box aktuell nicht mehr bei Amazon gelistet. Deswegen kann ich keinen Link dazu einstellen… Meine Box ist 40x40x40 cm groß. Für meine 0e Fahrzeuge reicht das locker aus.  Ich will mir noch mal ein “Foto- Gleis” bauen, das genau in die Box passt. Damit kann ich dann meine Fahrzeuge stilvoll und gut ausgeleuchtet präsentieren. Besonders, so lange meine Anlage noch alles andere als “fotogen” ist…

Daneben gibt es auch größere Sets mit Studio- Licht als Dauerlicht.

(Bildquelle: amazon.de Auf das Bild klicken, um zur Quelle zu gelangen)

Die Lichtform ist praktisch mit dem vorherigen Studioblitz- Set identisch. Die zur Verfügung stehende Lichtmenge ist aber um ein vielfaches geringer und der Stromverbrauch um ein vielfaches höher als beim Blitz- Set.  Dafür kostet so ein Set gerade mal 50€. Für Leute, die gerne Filmen sicher eine besondere Überlegung wert. Nur zum Fotografieren würde ich aber immer, sofern möglich, Blitzgeräte bevorzugen…

Deswegen will ich mir demnächst wieder ein Studioblitz- Set ähnlich wie das weiter vorne verlinkte Beispiel anschaffen. Auch wenn ich schon lange keine Portraits wie das ganz vorne (natürlich mit Studio- Blitzgeräten ausgeleuchtet) mehr fotografiert habe, so sind mir die Lichtmenge und die Gestaltungsmöglichkeiten mit den beiden bei der Box mitgelieferten LED Lampen einfach nicht ausreichend.  Da ich eher nicht so der Videograf bin, sondern mehr der Fotograf, geht meine Tendenz hier eindeutig hin zu Studioblitzen…

ZurückWeiter

(Modellbahn-) Fotografie Teil 1 – Studio- Blitzlicht

Studio- Blitzlicht

Mit Abstand am besten für das Fotografieren geeignet sind Blitzgeräte wie sie im Profi Foto- Studio verwendet werden. Sie haben austauschbare “Lichtformer”, also Vorsätze für den Blitz, mit denen man das Blitzlicht ganz nach Wunsch gestalten kann.  Damit ist ganz weiches, aber auch ganz hartes gerichtetes Licht möglich, exakt so, wie das Motiv es erfordert. Um sehr weiches Licht zu bekommen, benötigt man eine sehr große, gleichmäßig leuchtende Fläche. Bei Studio- Blitzen oder auch Studio- Lampen wird das meist über Softboxen oder Studioschirme erreicht.  Studioschirme sehen tatsächlich aus wie Regenschirme, die entweder weiß durchsichtig sind und das Licht durch den Schirm auf das Motiv leuchtet oder sie sind silber- bzw. goldfarben reflektierend, wobei das Licht dann umgelenkt wird und nur noch indirekt auf das Motiv scheint. Beides hat seine Vorteile, aber auch Nachteile.. Das durchscheinende Licht ist etwas stärker gerichtet. Das muss nicht immer schlecht sein. Außerdem ist die Ausbeute beim Licht etwas besser. Der Durchlichtschirm “verschluckt” also etwas weniger Licht als der “Reflexschirm”.

 

(Bildquelle amazon.de, Auf das Bild klicken, um zur Quelle zu gelangen)

Hier sind gleich drei verschiedene Studioschirme zu sehen. Die beiden, die außen schwarz sind, sind Reflex- Schirme. Der innen Silberne macht neutrales Licht wohingegen der Goldene warmes Licht liefert. Der komplett weiße Schirm ist ein Durchlicht- Schirm.

Meist wird aber mit sogenannten “Softboxen” gearbeitet, da sie in aller Regel das “schönste” Ergebnis liefern. Sie sind meist wie ein pyramidenförmiges Zelt aufgebaut. Der Blitz sitzt dann in der Spitze und die eigentliche Leuchtfläche ist der Boden der Pyramide. Im Prinzip ist eine Softbox eine Kombination von beiden Arten Studio- Schirmen. Die Softbox ist von außen Schwarz, damit kein Licht austreten kann, außer dort, wo es gewünscht ist. Von innen sind die Softboxen mit einer reflektierenden Schicht ausgestattet, so das alles Licht, was am “Boden der Pyramide” zurück reflektiert wird, erneut Richtung Motiv geleitet wird. Softboxen gibt es von wenigen cm Größe, die man auf einen herkömmlichen Aufsteckblitz bauen bis hin zu Größen, mit denen man ganze LKW ausleuchten kann… Im “Hobbystudiobereich” setzt man vorrangig Softboxen von ca. 40 cm bis etwa 120 cm Größe ein. Zu klein ist die Wirkung oft nicht ausreichend, zu groß wird es unhandlich…

(Bildquelle amazon.de, Auf das Bild klicken, um zur Quelle zu gelangen)

Hier ist mal eine achteckige Softbox abgebildet. Es gibt sie halt in ganz unterschiedlichen Formen, wobei die rechteckigen Softboxen am verbreitetsten  sind…

Wenn man sich unten das Beispiel für eine Studioblitz- Anlage anschaut findet man im Set auch 2 Softboxen…

Dank unserer chinesischen Freunde gibt es nämlich inzwischen auch für Hobby- Knipser durchaus erschwingliche Studio- Blitzanlagen. Diese starten so im Bereich von 200€ bis 300€ für ein Set, mit dem man schon eine ganze Menge anfangen kann.

(Bildquelle: amazon.de Auf das Bild klicken, um zur Quelle zu gelangen)

Das oben abgebildete Set kostet gut 200€ und beinhaltet alles, was man für den Anfang braucht.

Diese Studio- Blitze sind unabhängig von der eigentlichen Kamera und lassen sich sowohl mit einer Profi- Spiegelreflex als auch mit einem Smartphone verwenden. Und natürlich mit allem, was dazwischen liegt. So lange man dort die Belichtung und den Blitz manuell einstellen kann, was bei den etwas besseren Geräten in aller Regel der Fall ist. Kann das vorhandene Smartphone das nicht, hilft oft eine alternative Kamera- App. Geht es dann immer noch nicht, sollte man sich nach einer eigenständigen Kamera oder nach einem besseren Smartphone umschauen…

Die Studio- Blitzgeräte stellen defacto die Spitze der Kunstlicht- Evolution im Bereich der Fotografie dar, obwohl es sie schon seit fast 100 Jahren gibt. Denn neben der großen Lichtmenge, der kurzen und somit  verwacklungsarmen Blitzdauer besitzen Studioblitze auch noch ein sogenanntes Einstelllicht, das vom selben Punkt her scheint wie der Blitz selbst. Dadurch kann man, obwohl man den Blitz ja nicht sehen kann, genau beurteilen, wie das  Blitzlicht aussieht…

Rote Augen gibt es beim Studioblitz nicht, genau so wenig wie bei allen anderen Arten von “entfesseltem Blitzen”. Die typischen roten “Blitzaugen” entstehen durch Lichtreflektionen an der stark durchbluteten Netzhaut im Auge. Das Rot, was man sieht, ist tatsächlich Blut. Diese Reflektionen folgen natürlich den physikalischen Gesetzen (Einfallswinkel gleich Ausfallswinkel, schon mal gehört?) und sind deswegen um so stärker zu erkennen, je näher der Blitz am Objektiv ist. Deswegen haben Aufsteckblitze damit schon erheblich weniger Probleme als die unmittelbar neben den Objektiven eingebauten internen Blitze. Studioblitze sind aber immer so weit entfernt von der Kamera, das die (immer vorhandenen) Reflektionen nie in das Objektiv und damit nie auf das Bild gelangen können.

Aber Studioblitze sind groß, schwer und benötigen fast immer einen Stromanschluss. Deswegen sind sie viel weniger verbreitet, als sie es eigentlich sein sollten. Auf eine Wanderung würde ich allerdings auch keine Studio- Blitzgeräte mitnehmen, logisch.

ZurückWeiter

(Modellbahn-) Fotografie Teil 1 – Lichtform

Lichtform

Neben der Lichtfarbe und der eigentlichen Menge spielt in der Fotografie die Lichtform eine ganz entscheidende Rolle. Eigentlich ist die Lichtform sogar wichtiger als alle anderen Kriterien, mit Abstand.

Was muss man sich unter “Lichtform” vorstellen? Nun, wenn der Himmel wolkenverhangen ist, dann wird der ganze Himmel gleichmäßig zu einer riesigen Lichtquelle.  Man kann weder Schatten sehen  noch erkennen, von woher das Licht kommt.  Hier haben wir eine “unendlich” große Lichtquelle.  Als das andere Extrem stellen wir uns einen Taschenlampe vor, die im Dunkeln einen kleinen Punkt anstrahlt. Hierbei gibt es extreme Schatten und man hat überhaupt keine Probleme zu erkennen, woher das Licht kommt… Das ist der Unterschied zwischen einer quasi unendlich großen Lichtquelle und einer mit  nur wenigen mm Größe…

Beide Extreme sind aber kein besonders “schönes” Fotografierlicht.  Der graue Himmel verursacht einfach ein Grau in Grau, man hat kaum Kontraste im Bild. Das wirkt schnell fad und öde. Die fehlende Licht- Richtung ist obendrein eher verwirrend. Trotzdem ist so ein Licht viel besser als ein Mini- Spot, wie ihn die Taschenlampe oder leider auch die eingebauten Blitzgeräte liefern. Vergleicht man so einen Blitz von der Fläche her mit dem Himmel über uns, so kann man sich vorstellen, wie “Unnatürlich” das aussieht. Dazu muss man wissen, das jede Kamera, egal wie gut oder modern sie auch sein mag, die Kontraste, also die Unterschiede zwischen Hell und Dunkel, nicht im gleichen Umfang wie das menschliche Auge erfassen kann. Die Kameras werden in diesem Punkt zwar immer besser, aber durch die Fähigkeit des Auges, sich an unterschiedliche Helligkeiten zu adaptieren, werden es die Kameras auch in Zukunft schwer haben, dort jemals hin zu kommen, was ein durchschnittliches menschliches Auge zu leisten vermag. Also sollte das “Fotografierlicht” keine zu hohen Kontraste erzeugen und keine zu starken Schatten werfen. Ganz ohne Schatten ist zwar auch fad, aber meist hat man mit zu starken und ungünstig verlaufenden Schatten zu kämpfen. Deswegen versucht man meist, das Licht weicher, also mit weniger stark ausgeprägten Schatten zu gestalten.

Dabei ist Blitzlicht eigentlich das ideale Kunstlicht zum Fotografieren. Die Lichtfarbe ist konstant und dem Tageslicht sehr ähnlich. Die Lichtmenge ist sehr groß, die Leuchtdauer sehr kurz, was zu weniger Verwacklungen sowie niedrigen ISO Werten (Lichtempfindlichkeiten, Erklärung später) führt, wodurch das Bildrauschen minimiert wird. Wenn da nur nicht die viel zu kleine leuchtende Fläche wäre.

Doch dagegen kann man etwas unternehmen. Aber was? Man vergrößert “einfach” die leuchtende Fläche.  Dazu gibt es viele Möglichkeiten. Einige davon werden wir kurz ansprechen.

Ab hier folgen Beispiele von Amazon. Ich habe mit den Produkten, den Herstellern oder den Verkäufern nichts zu tun und kann nicht mal die Tauglichkeit für einen bestimmten Zweck bestätigen. Die Bilder dienen ausschließlich zu Veranschaulichung.

ZurückWeiter

(Modellbahn-) Fotografie Teil 1 – Lichtfarbe

Lichtfarbe

Als Lichtquelle für meine Lackierbox habe ich mir eine LED Leuchte mit in drei Stufen einstellbarer Farbtemperatur, 3000K, 5000K und 6500K gekauft.  Darüber bin ich überhaupt erst auf dieses Thema gekommen.

K steht für Kelvin, was eigentlich nichts anderes ist als °C, also eine Temperatureinheit. Nur das Kelvin nicht beim Gefrierpunkt von Wasser (0 °C) sondern beim absoluten Nullpunkt (entspricht -273,15 °C) anfängt zu zählen. Deswegen gibt es keine “negativen” Kelvin, denn nichts kann kälter als der absolute Nullpunkt werden. Das wiederum erleichtert das Rechnen mit den Temperaturen, weswegen Kelvin in der Wissenschaft bevorzugt wird… Die Schritte sind aber gleich. Ein K Unterschied ist gleich ein °C Unterschied.  Diese Temperaturen oben sind also ungefähr 2700 °C, 4700 °C und 6200 °C, also ziemlich heiß.

Wieso wird denn eine “Farbe” als Temperatur angegeben?  Der Begriff Farbtemperatur ist sicher schon mal irgendwo aufgetaucht. Er rührt daher, das es in der Physik einen “idealen Strahler”, der auch “Plankscher Strahler” (nach Max Plank) genannt wird, gibt. Das ist ein Körper, der alle Energie, die er aufnimmt als reine Strahlung wieder abgibt. Die Farbtemperatur entspricht dann der Lichtfarbe, die ein Plankscher Strahler bei der entsprechenden Temperatur abstrahlen würde.  In der Realität gibt es das natürlich nicht, aber man kann damit in der Physik schön rechnen.

Vermutlich hat aber jeder schon mal gesehen, wie Metall erhitzt wird. Es fängt irgendwann an dunkelrot zu glühen. Erhitzt man es weiter, so ändert sich die Farbe über Gelb bis im Extremfall zu Blau. Das entspricht dem Verhalten des Plankschen Strahlers. Dieser Zusammenhang ist der “Pate” für den Begriff “Farbtemperatur”. Je heißer das Metall, desto “blauer” ist das Licht, das es abstrahlt.

Umgangssprachlich ist es aber eigentlich genau anders rum. Warmes Licht ist eher Rot-Gelb und kaltes Licht ist eher Blau. Das hängt aber mit den Wetter- Bedingungen zusammen. Wenn die Sonne scheint, ist das Tageslicht mehr Rot-Gelb, ist es bewölkt, so ist das Tageslicht viel blauer. Deswegen hat “kaltes” Licht eine höhere Farbtemperatur als “warmes” Licht. Zugegeben, schon etwas verwirrend. Aber es ist nun mal so.

Aber (fast) egal welche Farbtemperatur auch immer, das menschliche Auge interpretiert nach einer kurzen Eingewöhnung alles das als “Weiß”. Dabei hat Licht tatsächlich ganz unterschiedliche Farben. Wenn man mal nachts durch eine beleuchtete Stadt geht, so kann man wunderbar an den beleuchteten Fenstern sehen, wie unterschiedlich doch das Licht eigentlich ist. Da gibt es Gelb- Orange Fenster, hinter denen schummriges “gemütliches” Licht brennt, aber auch “Grüne”, hinter denen Leuchtstoffröhren eingeschaltet sind. Leuchtstoffröhren werden meist in Büros oder anderen Arbeitsplätzen verwendet, weil das eher “ungemütliche” Licht die Produktivität erhöht…

Um wieder zu den unterschiedlichen Temperaturen zurück zu kommen. In der Fotografie hat “genormtes” Tageslicht eine Temperatur von 5500K  auf die fast alle Farbfilme (als man noch mit Film und nicht digital fotografiert hat) eingestellt waren.  Das entspricht dem Licht an einem sonnigen Tag mit leichter Bewölkung, die die Sonne ein wenig verschleiert. Also gemeinhin das, was man als “ideales” Fotgrafierlicht betrachtet. Tatsächlich hat Tageslicht aber eine große Spannbreite von der Morgenröte über strahlendem Sonnenschein oder grauem Himmel bis zur “blauen Stunde”… Kunstlicht hingegen ist meist entweder deutlich gelber bzw. röter oder, im Falle von “klassischen” Neonröhren auch grünlicher als durchschnittliches Tageslicht. Früher zu Zeiten, als man noch auf Film fotografiert hat, musste man entweder den Film- Typ ändern, wenn sich das Licht geändert hat oder man musste durch entsprechende Farbfilter (z.B. Blau, wenn man bei Kunstlicht mit Tageslicht- Film fotografieren wollte) eine Anpassung vornehmen. Sonst wurden die Fotos extrem Farbstichig. Ein analoger Film kann sich nämlich nicht an unterschiedliche Lichtfarben anpassen, wie es das menschliche Auge kann. Als Beispiel habe ich ja mal drei Fotos mit “simuliertem analogen Film” also deaktiviertem automatischen Weißabgleich (Erklärung dieses Begriffs folgt gleich) in der Lackierkabine gemacht. Ich zeige sie hier noch einmal.

3000K:

5000K:

6500K:

Zum beurteilen der Lackierung ist die mittlere Einstellung natürlich am besten geeignet. Zum Fotografieren mit deaktiviertem Weißabgleich übrigens auch…

In der Fotografie ist das heute alles kein Problem mehr, dank der Digitaltechnik. Jede Digitalkamera, egal ob groß oder klein, ob teuer oder billig ob Smartphone oder Profi Kamera, ob Foto- oder Video, wirklich jede Digitalkamera hat einen sogenannten “Weißabgleich”. Das ist die elektronische Simulation der Fähigkeit des menschlichen Auges, sich an unterschiedliche Lichtfarben anzupassen. Einfachere Kameras erledigen das vollautomatisch. Das funktioniert meistens sehr gut, aber eben nicht immer.  Speziell, wenn es sehr ungleiche Verteilungen der Farben im Bild gibt. Man stelle sich nur mal eine rote Wand vor, an der ein kleines, blaues Kunstwerk hängt. Je nach dem, wie viel man von der Wand im Bild hat, wird entweder die rote Wand in Richtung Grau verschoben, oder eben das blaue Kunstwerk. Deswegen haben bessere Kameras auch fest einstellbare Werte (ganz so wie früher der analoge Film) und einen “manuellen” Weißabgleich. Der manuelle Abgleich ist komplizierter in der Anwendung, im Ergebnis aber präziser. Dabei wird eine weiße Fläche (Papier, Wand oder was man auch gerade griffbereit hat) in den Sucher genommen. Dann wird der manuelle Weißabgleich vorgenommen.  und die Kamera “weiß” jetzt, was Weiß sein soll. Dann bleibt die rote Wand rot und das blaue Kunstwerk bleibt blau, so lange sich das Licht nicht ändert.

In der Regel brauchen wir uns heutzutage um die Lichtfarbe keine großen Gedanken mehr machen. Moderne Kameras haben das meist auch ohne unser Zutun im Griff. Zur Not kann man das in gewissem Umfang auch nachträglich noch in der Bildbearbeitung korrigieren. Aber es ist wichtig zu wissen, warum da manchmal etwas schief gehen und was man dagegen tun kann. Wenn bei unseren Aufbau ständig farbstichige Fotos vorkommen, müssen wir mal den Weißabgleich der Kamera kontrollieren und, sofern möglich auch mal manuell einstellen…

ZurückWeiter

Anycubic Eco 3D Resin, Geruchsneutral und aus Sojabohnen hergestellt.

Ich habe, nachdem ich bisher stets das Wasser- Waschbare Harz von Elegoo genutzt habe, ein (zumindest für mich) ganz neues Resin von Anycubic entdeckt. Das Resin ist rein auf pflanzlicher Basis (aus Sojabohnenöl) ohne chemische Inhaltsstoffe hergestellt . Außerdem soll es ungiftig sein und nicht riechen. Das musste ich natürlich sofort ausprobieren und habe mir zum Testen eine 500g Flasche (in Grau) für 14,44€ bestellt. Gewaschen wird es entweder mit Alkohol oder in “Prilwasser”… (Fast) Ungiftig, nicht stinkend und mit Geschirrspülmittel gewaschen, das wäre ja endlich mal eine echte Weiterentwicklung…

Eigentlich wollte ich ja als nächstes das ABS- Like Resin probieren, aber das Bio- Resin interessiert mich dann doch mehr. Es ist (wie fast immer über Amazon) binnen einem Tag angekommen. Es ist tatsächlich nahezu geruchslos. Wenn man die Nase direkt in die Flasche hält, dann kann man etwas Geruch erahnen. Mehr ist da aber nicht. Das Zeug ist übrigens tatsächlich wie grau eingefärbtes Sojaöl, auch von der Konsistenz her. Meinen Salat würde ich damit natürlich trotzdem nicht anrichten. ich bin nämlich Olivenöl Fan…  😉

Mit reinem Wasser kann man es übrigens nicht waschen. Das schmiert nur, eben genau wie wenn man Öl oder Fett mit Wasser abwaschen will… Man benötigt wirklich Seifenwasser oder Alkohol dafür.

Als erstes habe ich mal die passende Belichtungszeit ermittelt. Dafür gibt es ja Test- Dateien im Internet. Als Ergebnis kam für meinen Drucker (Elegoo Mars 1. Generation) 7 Sekunden heraus, also 1 Sekunde mehr als für das herkömmliche Harz, das ich bisher immer verwendet habe.
Die Ausdrucke fühlen sich ungehärtet ziemlich Fettig an, was ja nicht wirklich verwundert. Gehärtet habe ich noch nichts. Aktuell drucke ich gerade das Gehäuse für das C 50 Projekt. Wird aber wohl nicht mehr rechtzeitig fertig um es noch heute zu fotografieren oder zu beurteilen. Morgen muss ich wieder zu diversen Ärzten. Da weiß ich nicht, ob ich es schaffe, Fotos zu machen und hier einzustellen. Von Donnerstag bis Sonntag bin ich gar nicht zu Hause, also könnte es etwas dauern, bis es die Ergebnisse zu sehen gibt…

Zur Zeit bin ich zufrieden. Der Geruch ist absolut nicht mehr störend, beim Drucken überhaupt nicht mehr wahrnehmbar. Man muss kein teures IPO zum Spülen verwenden . Und es wird kein Erdöl dafür ver(sch)wendet sondern ein nachwachsender Rohstoff, eben Sojabohnen, genutzt.

Zu den eigentlichen Druckergebnissen kann ich natürlich noch nichts sagen, da der erste “echte” Druck zur Zeit noch läuft… Sobald ich da was genaueres weiß, stelle ich das hier ein.

Leider hat der Druck nicht funktioniert. Das lag aber nicht am Harz, sondern daran, das ein winziges Loch in der FEP Folie ist. Wie das da rein kommt, weiß ich nicht. Auf jeden Fall ist deswegen etwas Harz unter den Tank gelaufen und hat natürlich das richtige Belichten verhindert. Dadurch ist das C50- Gehäuse nur teilweise gedruckt worden. Die Teile, die da sind, sehen ziemlich gut aus. Auch scheint die Stabilität eher besser als bei herkömmlichem Harz zu sein. Aber das kann ich so natürlich nicht wirklich beurteilen…

Zum Glück habe ich noch FEP Folien vorrätig. Nur ob ich es, bevor ich übers Wochenende weg fahre, noch schaffe, einen neuen Druck fertig zu bekommen, kann ich nicht versprechen…

Wie gesagt, dieses Problem kann man dem Harz keinesfalls anlasten. Das was ich unter diesen Umständen sehen konnte, ist aber vielversprechend. Bewahrheitet sich das so wie ich aktuell vermute, wird das Anycubic ECO Harz mein neuer Standard… Die Vorteile liegen klar auf der Hand. Keine Geruchsbelästigung, kein Erdöl sondern nachwachsende Rohstoffe (Sojabohnen) als Basis, sehr viel geringere Giftigkeit des flüssigen Resins bei (fast) Lebensmittel- Echtheit der ausgehärteten Objekte, Gute Druckergebnisse und keine Unmengen von IPO zu entsorgen… Das “Prilwasser” sammele ich in einem Eimer (abgedeckt, damit keine Tiere an das Wasser können) den ich nach draußen stelle und vom Tageslicht vollständig durchhärten lasse. Der Wasser- Rest kann dann in Ruhe verdunsten und es bleiben nur noch kleinste Partikel zum Entsorgen… IPO würde zwar deutlich schneller verdunsten als Wasser, aber solche Mengen IPO in die Luft zu blasen, ist dann auch nicht sooo nett wohingegen verdunstetes Wasser einfach nur Wasser ist…

Magic Train Packwagen Umbau

Hallo.

Hier gibt es den Bricht zum Umbau eines Magic Train Personenwagens in einen Packwagen. Das ganze soll auch als Abschluss des OpenSCAD Kurses dienen, weswegen die Code für die 3D Druckteile ausführlicher besprochen wird.

Bei den Magic Train Personenwagen gibt es tatsächlich Unterschiede. Es sind nicht alle Wagen gleich. Generell gibt es zwei unterschiedliche Dächer und auch zwei unterschiedliche Aufbauten. Für den Umbau ist nur der eine Typ Aufbau geeignet und, sofern man alles so umsetzen möchte, wie hier vorgestellt, auch nur eine Dachform.

Schauen wir uns die verschiedenen Typen mal genauer an. Zuerst mal ein “Oktoberfest- Wagen”, wobei die Farbgebung und die Aufdrucke völlig nebensächlich sind. Nach dem Umbau muss der Wagen sowieso neu lackiert werden.

Von diesem Wagen ist der Aufbau die geeignete Variante, aber das Dach nur für den teilweisen Umbau.

Da ich nur einen einzigen Wagen mit dem anderen Aufbau- Typ habe und der schon stark umgebaut seinen Weg zu mir gefunden hat, bitte nicht wundern. Die Unterschiede kann man trotzdem erkennen, hoffe ich. Dieser Wagen ruht nicht auf dem Magic Train Einheits- Fahrwerk sondern auf zwei Feldbahn- Loren, die als Drehgestelle genutzt werden:

Dieser Wagen hätte die passende Dachform, aber der Aufbau ist auf Grund der zusätzlichen Oberlichter über den eigentlichen Fenstern nicht wirklich für den geplanten Umbau zu gebrauchen…

Wir benötigen also den Aufbau von Nummer 1 und das Dach von Nummer 2. Voila, hier ist exakt der Wagen, den ich umbauen werde:

Dieser Wagen, genauer der Aufbau und das Dach stammen von einem Startpackungswagen, der ohne Fensterscheiben ausgeliefert wurde. Ich habe vor geraumer Zeit diesen Aufbau mit Dach mal geschenkt bekommen. Ein Fahrwerk hatte er nicht.  Deswegen thront  er jetzt auf einem Güterwagen Fahrwerk, von dem der Aufbau für ein anderes Bastel- Projekt benötigt wurde. Güterwagen haben aber im Gegensatz zu den Personenwagen maximal eine Bühne. Die ist hier auf dem Foto rechts zu erkennen. Dadurch sieht die linke Seite nun etwas kahl aus. Wenn man einen vollständigen Personenwagen umbaut, kann man natürlich auf beiden Seiten die Bühnen belassen.  Dann sind beide Dachformen für den Umbau geeignet. In diesem Fall soll aber der Aufbau auf der linken Seite so weit verlängert werden, das er in etwa bündig mit dem Fahrwerk und dem Dach abschließt.  Dabei stellt das mehrfach geneigte Dach des Typs “Oktoberfest- Wagen” eine massive Erschwernis dar. Deswegen das “gerade” Dach…

Theoretisch könnte man nun den Aufbau zerschneiden und mit Kunststoffplatten verlängern, so das er die benötigte Länge bekommt.  Das erfordert definitiv weniger Aufwand beim 3D Konstruieren, hat aber zwei nicht zu vernachlässigende Nachteile. Zum einen ist die Stabilität eines zerschnittenen und wieder zusammen geleimten Aufbaus deutlich niedriger als bei einem nicht modifizierten Aufbau.  Daneben passen dann die Rast- Nasen nicht mehr und man müsste den Aufbau mit dem Fahrwerk verkleben.  Für mich besonders gravierend ist aber die Tatsache, das man danach das Dach ebenfalls festkleben müsste. Da aber eine batteriebetriebene Innenbeleuchtung vorgesehen ist, ist ein leicht abzunehmendes Dach einfach Pflicht.

Also wird der “Umbausatz” ein 3D Teil zu Verlängerung der “linken” Stirnseite enthalten. Daneben benötigen wir Einsätze, um die überzähligen Fenster zu verschließen. Pro Seite sind das zwei. Das dritte Fenster wird von der Schiebetür verdeckt, die samt Schienen einfach auf die Seite des Wagens geklebt werden. Eine geöffnete Darstellung ist nicht vorgesehen. Das Fenster ganz rechts bleibt erhalten. Dahinter wird das Zugführer Büro eingerichtet. Dieses Büro bekommt dann auch eine LED Beleuchtung, die aus einer Knopfzellen- Batterie gespeist wird…

Fangen wir also an zu konstruieren. Doch halt, dieses Mal wird nicht mit OpenSCAD angefangen. Die Form der Seitenwand ist durch die unterschiedlichen Radien des Daches etwas komplexer. Man könnte das sicher auch direkt in OpenSCAD hin bekommen, aber ich möchte mir das Leben nicht unnötig schwer machen. OpenSCAD kann nämlich auch SVG Dateien importieren. Das sind Vektor Grafiken, wie sie z.B.  das kostenlose Zeichenprogramm Inkscape erzeugen kann. Das alleine hilft uns aber auch nicht viel. Wenn wir die genauen Radien wüssten, dann könnten wir auch direkt in OpenSCAD anfangen. Also kommt noch ein (kostenloses) Programm zum Einsatz, eine Bildbearbeitungs- Software. Die gibt es in unzähligen Varianten und Preisklassen vom kostenlosen Paint.net (Windows only) über das ebenfalls kostenlose Gimp (alle Plattformen) und preisgünstige Programme wie Affinity Photo (30-55€, je nach Angebot) oder Corel PhotoPaint (ca 70-80€) und Photoshop Elements (ca 100€) bis hin zu der Profi- Software Photoshop, die es nur im Abo für ca 40€ monatlich gibt… Ich habe hier Paint.NET verwendet, was besonders einfach zu bedienen ist. Doch wie bekommen wir nun unsere Seitenwand in den PC? Ganz einfach mit einem Scanner. Damit bekommt man perspektivisch korrekte Bilder von allem, was man auf die (meist Din A4) Scanfläche legen kann.

Um die Seitenwand einzuscannen, muss man natürlich den Wagen auseinander bauen. Nur dann kann man die Stirnwand des Magic Train Wagens auf den Scanner legen. Allerdings ist sie nicht ganz eben. Deswegen habe ich zwei Abschnitte eines Kaffee- Rührstäbchens unter gelegt. So “kippelt” der Aufbau nicht und es gibt keine Verzerrungen. Mein Scanner verschluckt leider ein oder zwei Millimeter am oberen Rand. Deswegen kann man das zu scannende Objekt, sofern es zu 100% erfasst werden soll, nicht ganz an den Rand legen. Dadurch besteht aber die Gefahr, das man den Aufbau nicht exakt rechtwinklig auflegt.  Man muss also einen graden Gegenstand als Anschlag dazwischen legen. Da die Inneneinrichtung sowieso im Weg lag, habe ich sie genutzt.

Jetzt lässt sich der Aufbau gut ausgerichtet auf dem Scanner platzieren.

Normalerweise wird ja alles, wo nichts liegt, beim Scannen weiß. Da wir aber den Deckel nicht schließen, kann er das Licht nicht reflektieren. Die ungenutzten Bereiche werden deswegen schwarz, also nicht wundern. Das Scannen können wir direkt aus Paint.NET erledigen. Wichtig ist nur, mit wie viel DPI der Scann durchgeführt wird. ich habe 300 DPI verwendet. Diesen Wert brauchen wir später in OpenSCAD, deswegen gut merken oder aufschreiben…

So sieht das dann aus. Die Holzstäbchen und die Tür stempeln wir einfach mit dem Kopierstempel weg. Diese Funktion hat jede Bildbearbeitung. Im Prinzip bestimmt man einen kleinen Bereich des Bildes, der auf eine andere Stelle kopiert wird. So kann man viele störende Elemente entfernen…

Jetzt haben wir schon fast das, was wir benötigen, aber eben nur fast. Als nächstes müssen wir den Hintergrund (das was schwarz ist) entfernen. Dazu verwenden wir den “Zauberstab”, ebenfalls ein Werkzeug, das praktisch jede Bildbearbeitung hat. Damit werden Bereich mit gleicher oder sehr ähnlicher Farbe ausgewählt. Wir klicken also mit dem Zauberstab in den schwarzen Bereich. Wird zu viel oder zu wenig ausgewählt, muss man die Toleranz anpassen, bis das gewünschte Ergebnis erzielt wird. Nun ist also alles, was schwarz im Bild ist, ausgewählt. Durch einfaches Drücken auf die Löschen Taste wird der ausgewählte Bereich entfernt.

So könnten wir zwar schon weiter machen. Aber es ist einfacher, wenn die Seitenwand wirklich einfarbig ist. Da wir ja nun alles ausgewählt haben, was wir nicht einfärben wollen, müssen wir die Auswahl einfach invertieren. Das ist oben im Menü unter Auswahl zu finden. Jetzt ist alles, was rot ist, ausgewählt. Nun aber bitte nicht wieder auf Löschen klicken, dann ist sowohl das Schwarze als auch das Rote weg… Wir verwenden das Füll- Werkzeug, oft als Spraydose markiert. Damit können wir den ausgewählten Bereich mit einer Farbe, Schwarz bietet sich an, ausfüllen.

Jetzt sind wir wirklich fertig und können das Bild speichern. Das muss zwingend als PNG erfolgen. Wir haben einen transparenten Hintergrund. JPG oder BMP können keine Transparenz verarbeiten. Dann wäre alle Arbeit vergeblich. Also bitte als PNG abspeichern.

Jetzt kommt dann Inkscape zum Einsatz. Wir legen ein neues Projekt an (geschieht normalerweise direkt beim Öffnen des Programms). In dieses Projekt importieren wir die gerade erzeugte PNG Datei. Danach sollten wir die Dokumentengröße an das Objekt anpassen lassen.

Nun lassen wir die Form der Stirnwand automatisch nachzeichnen. Das ist oben im Menu unter Pfad zu finden und heißt “Bitmap nachzeichnen”.

Zunächst sehen wir keinen Unterschied, aber wenn man genau hin schaut, ist jetzt ein zweites Objekt vorhanden. Das erste Objekt heißt imagexxx (die Zahl ist jedes mal anders, spielt aber hier keine Rolle) und ist unser importiertes PNG. Darüber taucht nun aber ein weiteres Objekt auf, das pathxxx heißt. Sofern wir die Füllung nicht angegeben haben, ist das Objekt nicht sichtbar, aber dennoch vorhanden. OpenSCAD interessiert sich nicht für die Farbe, von daher wäre es egal. Aber wenn wir sehen können, was wir machen, ist das natürlich schöner. Also stellt man, sofern nicht bereits geschehen, die Füllung für unseren Pfad auf Schwarz ein.

Mit den “Augen- Piktogrammen” können wir nun sowohl das Bild als auch den Pfad ein- und ausblenden. Solange wenigstens eines der beiden Objekte sichtbar ist, ändert sich scheinbar nichts.  Aber zwischen einer Bitmap, die wir mit dem Scanner in Paint.NET erzeugt haben und einer Vektor- Grafik liegen Welten… OpenSCAD benötigt eben Vektor- Zeichnungen und keine Bitmaps, zumindest nicht für das, was wir hier vorhaben. Nun löschen wir das Bild wieder, in dem wir einfach die Löschen Taste drücken, sofern das Bild (imagexxx) blau hinterlegt, also ausgewählt ist.  Jetzt müssen wir die Datei nur noch als SVG speichern. SVG ist das “native” Format von Inkscape, das sollte also gar keine Probleme bereiten.

Packwagen-Stirnseite

Für alle, die das nicht selbst machen wollen, habe ich hier die SVG Datei angehängt.

Aus diesem Scan eines Magic- Train Wagens erzeugen wir nun in OpenSCAD ein 3D Modell…

Neben den schon bekanntem “translate” brauchen wir zwei neue Befehle. Zum einen “linear_extrude”, was aus einem 2D Objekt durch Extrudieren ein 3D Objekt erzeugt. Daneben müssen wir die SVG Datei ja irgendwie in OpenSCAD rein bekommen. Das geht mit dem Befehl Import.

translate([0,0,0.75])linear_extrude(height = 1.5, center = true, convexity = 10)
import("Packwagen-Stirnseite.svg", dpi = 300);

Das ist alles, was wir in OpenSCAD benötigen, um eine dreidimensionale Stirnwand zu bekommen. Mit “height” wird die Dicke der Wand angegeben. ich habe mich für 1,5 mm entschieden um das Anbauteil nicht zu schwer aber auch nicht zu instabil zu machen.  convexity = 10 ist eine reine Formalie und hat auf das Ergebnis keinen Einfluss, fehlt es aber, gibt es Probleme… Wenn die SVG Datei im selben Verzeichnis wie das OpenSCAD Skript liegt, muss kein Pfad angegeben werden, so wie im Beispiel hier. Sonst muss der vollständige Pfad dort angegeben werden. Bei Windows müsste obendrein alle \ doppelt geschrieben werden, da sie sonst als Steuerzeichen und nicht als Teil des Pfades interpretiert werden. Am besten ist es also, die Datei einfach im gleichen Ordner zu haben.

Soweit erst mal für jetzt. Als nächstes muss ein Test- Druck gemacht werden, ob alles soweit passt. Ein wenig Spachteln werden wir sicher müssen, aber das Anbauteil sollte doch so gut wie möglich passen.

Weiter geht es dann mit den Seitenwänden und dem Boden, die je nur aus einfachen Kuben bestehen. Dazu muss ich aber den Wagen erst wieder zusammenbauen und ein paar Maße nehmen…

Auf diese Art kann man natürlich auch noch sehr viel komplexere Vorbilder in das 3D Programm bringen. Bei Fotos muss man halt die Perspektive korrigieren und die Größe so anpassen, das es zum angedachten Maßstab passt. Beim Einscannen von (halbwegs) ebenen Objekten passt sowohl die Perspektive als auch die Größe von Haus aus, Deswegen habe ich kein Foto vom Wagen gemacht, sondern den Scanner verwendet…

Inzwischen habe ich die benötigten Maße vom Wagen abgenommen und das Anbauteil weiter konstruiert.

Statt die Wände aus einzelnen Kuben zusammen zu setzen, extrudiere ich lieber die Wand auf die volle benötigte Dicke und höhle das Teil dann aus. Macht weniger Arbeit…

//Packwagen- Verlängerung

difference(){
translate([0,0,6.5])linear_extrude(height = 13, center = true, convexity = 10)
import("Packwagen-Stirnseite.svg", dpi = 300); // Aus Scan extrudierte Grundplatte

translate([4,3,-1]) cube([48,70,12]); //Aushöhlung des Anbauteils

translate([16.5,0,-1]) cube([20,4,3]); //Aussparung für die Tür
}

Die Version oben würde bündig mit dem Fahrwerk und dem Dach abschließen. Die untere Aussparung ist als Spielraum für die erhaben ausgeführte Tür des Aufbaus vorgesehen. So besteht keine Gefahr, das der Anbau nicht bündig passt.

Eine andere denkbare Version, die wohl nicht so “nackig” daher kommt, wäre es, den Anbau  kürzer zu machen und dafür zwei U- Profile an die Stirnwand zu bauen, wie man sie häufig bei Güterwagen findet..

//Packwagen- Verlängerung

difference(){
translate([0,0,6.5])linear_extrude(height = 12, center = true, convexity = 10)
import("Packwagen-Stirnseite.svg", dpi = 300); // Aus Scan extrudierte Grundplatte

translate([4,3,-1]) cube([48,70,11]); //Aushöhlung des Anbauteils

translate([16.5,0,-1]) cube([20,4,3]); //Aussparung für die Tür

}

//U-Profil zur Auflockerung

difference(){
translate([10.5,-5,12]) cube([3,56,1]);
translate([11.25,-6,12.5]) cube([1.5,58,0.5]);

}// Erstes Profil

difference(){
translate([42,-5,12]) cube([3,56,1]);

translate([42.75,-6,12.5]) cube([1.5,58,0.5]);

}// Zweites Profil

Ich musste ein wenig mit den Werten jonglieren, bis es gefällig aussieht…

Diese Version werde ich nun erst mal ausdrucken und testen, ob alles passt…

Das sieht so zwar gefällig aus, kann aber nicht funktionieren. Denn das Fahrwerk würde mit den U- Profilen kollidieren. Zum Glück ist mir das noch vor dem Testdruck aufgefallen, sonst hätte ich die überstehenden Profile mühsam abtrennen müssen…

//Packwagen- Verlängerung

difference(){
translate([0,0,6.5])linear_extrude(height = 12, center = true, convexity = 10)
import("Packwagen-Stirnseite.svg", dpi = 300); // Aus Scan extrudierte Grundplatte

translate([4,3,-1]) cube([48,70,11]); //Aushöhlung des Anbauteils

translate([16.5,0,-1]) cube([20,4,3]); //Aussparung für die Tür

}

//U-Profil zur Auflockerung

difference(){
translate([10.5,0.5,12]) cube([3,50.5,1]);
translate([11.25,-1,12.5]) cube([1.5,53,0.5]);

}// Erstes Profil

difference(){
translate([42,0.5,12]) cube([3,50.5,1]);

translate([42.75,-1,12.5]) cube([1.5,53,0.5]);

}// Zweites Profil

Also auf ein Neues ab in den Slicer.

So, nun aber wirklich drucken. Das wird so ca 2 Stunden (incl. Versäubern und Aushärten) dauern…

Während das Teil druckt, habe ich noch eben schnell die Fenster- Einsätze konstruiert. Die könnte man sicher auch einfach aus Kunststoff ausschneiden, aber wenn man schon einen 3D Drucker hat, warum sollte man das von Hand machen?

// Fenster Einsatz für Magic Train Personenwagen

cube([20,17,1]);

translate([1,1,0])cube([17.6,14.6,2.9]);

Der Code ist so simpel, das man ihn wirklich nicht mehr erklären muss..

Da man ja vier Einsätze für einen Wagen braucht, fügt man das Teil eben vier mal in den Slicer ein. So werden alle vier Teile auf einmal ausgedruckt…

Die Drucke sind fertig und passen leidlich gut. Die Fenster- Einsätze könnten 0,1 mm dicker sein, aber das spachtele ich einfach weg…

Jetzt kann man doch schon gut sehen, was das mal werden soll.

Das Ansatzteil passt saugend unter das Dach. Es ist noch nicht angeklebt, hält aber bombenfest. Bevor ich die Schiebetür, die erst noch konstruiert und gedruckt werden muss, anbauen kann, muss der Wagen- Aufbau erst verspachtelt und geschliffen werden.  Dann können die Schiebetüren angebaut und der Aufbau lackiert werden. Zuletzt kommt dann die Inneneinrichtung und die Beleuchtung. Dann sollte der Packwagen so weit fertig sein…

Heute habe ich die Schiebetür(en) konstruiert. Zumindest mal eine erste Version. Ob das dann alles auch so passt und druckbar ist, muss sich erst noch zeigen…

Als grobe Vorlage habe ich ein Foto eines GMS 54 Güterwagen- Modells von Lenz hergenommen. Wenn man zu viele Details wie z.b. Holzmaserung und Bretterfugen auf der Tür verwirklicht, wird es vermutlich mit dem sehr glatten “geschweißten Blech- Aufbau” des Magic Train Wagens nicht wirklich harmonieren. Der GMS 54 hat glatte Blech- Türen und die eigentliche Schiebe- Mechanik ist in den Schienen verborgen. Trotzdem sind diverse Bolzen, Hebel und Verstärkungs- “Bleche” vorhanden. Eigentlich besteht die Schiebetür nur aus den Grundkörpern, die am Anfang des OpenSCAD Kurses behandelt wurden. Als kleinen Trick verwende ich hier Zylinder mit einer “Auflösung” $fn=6 womit man schöne Sechskant- Bolzen bekommt.

cylinder(h = 1, r = 0.5, $fn = 6);

Das ergibt Bolzen mit 45 mm Durchmesser umgerechnet von 1:45…

Daneben wird noch eine komplett neue Funktion angewendet, die “surface” Funktion. Damit kann aus einer PNG Bitmap ein Objekt erzeugt werden, bei dem die Helligkeits- Informationen der Grafik als Definition für die Höhe. Je dunkler das Bild ist, desto höher wird das Objekt an dieser Stelle. Man kann das Ganze auch umkehren. Dann wird es mit zunehmender Helligkeit höher. Was man bevorzugt, ist Geschmackssache. Eigentlich müsste man sich die PNG Datei selbst herstellen, um die gewünschte Größe des Objekts genau bestimmen zu können. Da ich diese Funktion nur für die Trittstufen verwendet habe, habe ich mir den Aufwand gespart und mir ein PNG im Internet gesucht. Allerdings war das viel zu groß, so das ich sehr seltsame Skalierungewerte verwenden musste.

Hier ist die erste Version des Codes für die linke Seite (sofern man die verbleibenden Fenster als “vorne” ansieht:

// Schiebetür 1

// Auflösung
$fn=100;

// Tür- Grundkörper
translate([1,0,0]) cube([26,40,1]);

// Untere Schiene
difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Obere Schiene
translate([0,40,2])rotate([180,0,0])difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Stütze
translate([54.5,0,0])difference(){
cube([1.5,40,2]);
translate([0,0,0.5])cube([0.75,40,1]);
}

// Puffer
translate([54.2,21,1])sphere(d=2);

translate([54,20,0])
cube(2);

// Rahmen
translate([1,2.8,1])difference(){
cube([26,34.8,1]);
translate([2,2,0.5])cube([22,30.8,2]);
}

// Verstärkungsecken
translate([3,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([3,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);

//U-Profil
translate([13,2.3,1])difference(){
translate([0,0.5,0]) cube([2,34.8,1.5]);
translate([0.5,-1,1]) cube([1,43,1]);
}

// Türpuffer
translate([27.3,21,1])sphere(d=2);

translate([25.5,20,0])
cube(2);

// Handgriff 1
translate([2.1,7.9,0])cylinder(h = 4, r = 0.3);
translate([2.1,7.9,4]) sphere(0.3);
translate([2.1,15.9,0])cylinder(h = 4, r = 0.3);
translate([2.1,15.9,4]) sphere(0.3);
translate([2.1,15.9,4])rotate([90,0,0])cylinder(h = 8, r = 0.3);

// Schrauben unten
translate([2.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben oben
translate([2.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben links
translate([2.1,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben rechts
translate([25.9,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Tritt 1
translate([3,1,0.8])rotate([90,0,0])cylinder(h=6.7, r=0.5);
translate([3,-4.8,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([13,1,0.8])rotate([90,0,0])cylinder(h=6.7, r=0.5);
translate([13,-4.8,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([2.2,-5.5,2.5])
scale([0.0233, 0.005, 0.01])rotate([-90,0,0])
surface(file = "holz.png");

// Riegel 1
translate([0.8,19,0])cylinder(h = 3, r = 0.3);
translate([0.8,19,3]) sphere(0.3);
translate([0.8,19,3])rotate([0,90,0])cylinder(h = 4, r = 0.3);
translate([4.8,19,3]) sphere(0.3);
translate([3,18.4,2])cube([2,0.5,1.5]);
translate([3,18.4,2])cube([2,1.5,0.5]);
translate([3,18.4,3])cube([2,1.5,0.5]);

Die andere Seite unterscheidet sich bei der Anordnung des Handgriffs, des Riegels und des Tritts..

// Schiebetür 2

// Auflösung
$fn=100;

// Tür- Grundkörper
translate([1,0,0]) cube([26,40,1]);

// Untere Schiene
difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Obere Schiene
translate([0,40,2])rotate([180,0,0])difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Stütze
translate([54.5,0,0])difference(){
cube([1.5,40,2]);
translate([0,0,0.5])cube([0.75,40,1]);
}

// Puffer
translate([54.2,21,1])sphere(d=2);

translate([54,20,0])
cube(2);

// Rahmen
translate([1,2.8,1])difference(){
cube([26,34.8,1]);
translate([2,2,0.5])cube([22,30.8,2]);
}

// Verstärkungsecken
translate([3,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([3,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);

//U-Profil
translate([13,2.3,1])difference(){
translate([0,0.5,0]) cube([2,34.8,1.5]);
translate([0.5,-1,1]) cube([1,43,1]);
}

// Türpuffer
translate([27.3,21,1])sphere(d=2);

translate([25.5,20,0])
cube(2);

// Handgriff 2
translate([2.1,23.9,0])cylinder(h = 4, r = 0.3);
translate([2.1,23.9,4]) sphere(0.3);
translate([2.1,31.9,0])cylinder(h = 4, r = 0.3);
translate([2.1,31.9,4]) sphere(0.3);
translate([2.1,31.9,4])rotate([90,0,0])cylinder(h = 8, r = 0.3);

// Schrauben unten
translate([2.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben oben
translate([2.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben links
translate([2.1,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben rechts
translate([25.9,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Tritt 2
translate([3,45.8,0.8])rotate([90,0,0])cylinder(h=6.6, r=0.5);
translate([3,46.2,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([13,45.8,0.8])rotate([90,0,0])cylinder(h=6.6, r=0.5);
translate([13,46.2,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([2.2,45.7,0])
scale([0.0233, 0.005, 0.01])rotate([90,0,0])
surface(file = "holz.png");

// Riegel 2
translate([0.8,21,0])cylinder(h = 3, r = 0.3);
translate([0.8,21,3]) sphere(0.3);
translate([0.8,21,3])rotate([0,90,0])cylinder(h = 4, r = 0.3);
translate([4.8,21,3]) sphere(0.3);
translate([3,21.4,2])cube([2,0.5,1.5]);
translate([3,20,2])cube([2,1.5,0.5]);
translate([3,20,3])cube([2,1.5,0.5]);

Und hier noch ein Screenshot aus OpenSCAD…

Und die beiden Türen mal als Bild exportiert:

Und die andere Seite:

Die zweite Tür ist die, die auf die Seite kommt, welches man auf dem Foto vom Packwagen mit den schon angebauten 3D Teilen sehen kann. Die andere Tür kommt entsprechend auf die nicht sichtbare Seite…

Jetzt muss ich die Türen noch rendern und ausdrucken. Das wird aber nicht mehr heute geschehen…

Eine erste Lage Spachtel ist ebenfalls schon aufgetragen und wieder runter geschliffen. Ist ja meist so, das man fast alles, was man an Spachtel aufträgt nachher mühsam wieder abschleifen muss… Aber das kleine Bisschen, was übrig bleibt, macht eben den Unterschied… Aber ich muss noch mal eine zweite Lage auftragen, um wirklich alle Unebenheiten zu beseitigen. Bei dem Staub und Dreck habe ich keine Fotos gemacht. Das passiert erst dann wieder, wenn die Schleiferei vorbei ist.

Heute habe ich die Schiebetüren gerendert und ausgedruckt. Das Rendern hat auf Grund der Holzmaserung auf den Tritten ca 20 Minuten gedauert. Also nicht wundern. Das eigentliche Ausdrucken hat nicht viel länger gedauert.

Ein weiterer “Brocken” wird ja noch die Inneneinrichtung aber bisher hat mich der Packwagen- Umbau gerade mal 1,50€ an Harz gekostet. Viel mehr als 1€ dürfte aber auch die Inneneinrichtung nicht verschlingen. Und der Slicer rechnet immer mit 60€ pro Liter. Tatsächlich kostet das Harz aber eher 35-40€. Der Rest ist (mehr als großzügig) für den Verschleiß des Displays und der Folien einkalkuliert.

An sich hat der Druck gut funktioniert. Nur der Haken zum Verriegeln der Tür ist , warum auch immer, nicht mit gedruckt worden. Die filigranen freistehenden Griffstangen sind dagegen wunderbar gedruckt geworden.

Da der aktuell umzubauende Wagen gerade frisch gespachtelt ist und erst mal durchtrocknen muss, hier als ersten Eindruck mal eine Tür auf einen Personenwagen gelegt, der später ebenfalls zu einem Packwagen umgebaut werden soll…

Ich muss  die Tür doch etwas höher machen. Es schien passend zu sein, als ich gemessen habe, aber nun sieht es so aus, als ob die Tür etwas arg klein ist… Dabei werde ich auch gleich das Problem mit dem Riegel lösen.  und die hintere Strebe etwas verstärken. Wenn Teile zu dünn über eine zu lange Strecke werden, verziehen sie sich leider gerne mal, wie man auf dem Foto ja leider sehen kann… Außerdem werde ich statt der zwar einwandfrei gedruckten Handgriffe lieber zwei Löcher für etwas Messingdraht vorsehen. Die Griffe brechen nämlich schon vom Anpusten ab, so filigran sind sie geworden. Auch die Tritte werde ich eine Nummer robuster machen. Die kommen ebenfalls papierdünn aus dem Drucker. Auch die dürften kein langes Leben haben, so wie sie sind…

Also erneut in OpenSCAD gehen und ein paar Sachen ändern.

// Schiebetür 1

// Auflösung
$fn=100;

scale([1.05,1.08,1])
difference(){
union(){
// Tür- Grundkörper
translate([1,0,0]) cube([26,40,1]);

// Untere Schiene
difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Obere Schiene
translate([0,40,2])rotate([180,0,0])difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Stütze
translate([54.5,0,0])//difference(){
cube([1.5,40,2]);
//translate([0,0,0.5])cube([0.75,40,1]);
//}

// Puffer
translate([54.2,21,1])sphere(d=2);

translate([54,20,0])
cube(2);

// Rahmen
translate([1,2.8,1])difference(){
cube([26,34.8,1]);
translate([2,2,0.5])cube([22,30.8,2]);
}

// Verstärkungsecken
translate([3,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([3,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);

//U-Profil
translate([13,2.3,1])difference(){
translate([0,0.5,0]) cube([2,34.8,1.5]);
translate([0.5,-1,1]) cube([1,43,1]);
}

// Türpuffer
translate([27.3,21,1])sphere(d=2);

translate([25.5,20,0])
cube(2);

// Schrauben unten
translate([2.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben oben
translate([2.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben links
translate([2.1,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben rechts
translate([25.9,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Tritt 1
translate([3,1,0.8])rotate([90,0,0])cylinder(h=6.7, r=0.5);
translate([3,-4.8,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([13,1,0.8])rotate([90,0,0])cylinder(h=6.7, r=0.5);
translate([13,-4.8,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([0,-5.5,0])
cube([16,1,3]);

// Riegel 1
translate([0.7,19,0])cylinder(h = 3, r = 0.5);
translate([0.7,19,3]) sphere(0.5);
translate([0.7,19,3])rotate([0,90,0])cylinder(h = 4, r = 0.5);
translate([4.5,19,3]) sphere(0.5);
difference(){
translate([3,18,0])cube([2,2,4]);
translate([2,18.55,3.2])cube([3.5,1,1]);

}
}
// Löcher für Handgriff 1
translate([2.1,7.9,0])cylinder(h = 4, r = 0.5);
translate([2.1,15.9,0])cylinder(h = 4, r = 0.5);
}

Und die andere Seite:

// Schiebetür 2

// Auflösung
$fn=100;

scale([1.05,1.08,1])
difference(){
union(){
// Tür- Grundkörper
translate([1,0,0]) cube([26,40,1]);

// Untere Schiene
difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Obere Schiene
translate([0,40,2])rotate([180,0,0])difference(){
cube([56,2,2]);
translate([27.7,1.1,0.5])cube([28,1,1]);
}

// Stütze
translate([54.5,0,0])//difference(){
cube([1.5,40,2]);
//translate([0,0,0.5])cube([0.75,40,1]);
//}

// Puffer
translate([54.2,21,1])sphere(d=2);

translate([54,20,0])
cube(2);

// Rahmen
translate([1,2.8,1])difference(){
cube([26,34.8,1]);
translate([2,2,0.5])cube([22,30.8,2]);
}

// Verstärkungsecken
translate([3,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([3,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,3.5,1.5])rotate([0,0,45])cube([2,2,0.2]);
translate([24.9,34.1,1.5])rotate([0,0,45])cube([2,2,0.2]);

//U-Profil
translate([13,2.3,1])difference(){
translate([0,0.5,0]) cube([2,34.8,1.5]);
translate([0.5,-1,1]) cube([1,43,1]);
}

// Türpuffer
translate([27.3,21,1])sphere(d=2);

translate([25.5,20,0])
cube(2);

// Schrauben unten
translate([2.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,3.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben oben
translate([2.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([6.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([10.1,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([21.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([17.9,36.6,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben links
translate([2.1,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([2.1,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Schrauben rechts
translate([25.9,7.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,11.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,15.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,19.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,23.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,27.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);
translate([25.9,31.9,0.5])cylinder(h = 2, r = 0.5, $fn = 6);

// Tritt 2
translate([3,45.8,0.8])rotate([90,0,0])cylinder(h=6.7, r=0.5);
translate([3,46.2,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);
translate([13,45.8,0.8])rotate([90,0,0])cylinder(h=6.7, r=0.5);
translate([13,46.2,0.8])rotate([90,0,0])cylinder(h = 1, r = 0.5, $fn = 6);

translate([0,44.7,0])
cube([16,1,3]);

// Riegel 2
translate([0.7,21,0])cylinder(h = 3, r = 0.5);
translate([0.8,21,3]) sphere(0.5);
translate([0.8,21,3])rotate([0,90,0])cylinder(h = 4, r = 0.5);
difference(){
translate([3,20,0])cube([2,2,4]);
translate([2,20.55,3.2])cube([3.5,1,1]);

}
}

// Löcher für Handgriff 2
translate([2.1,23.9,0])cylinder(h = 4, r = 0.5);
translate([2.1,31.9,0])cylinder(h = 4, r = 0.5);
}

Statt alle Abmessungen zu ändern habe ich einfach die ganze Tür per “union” zu einem Objekt vereint und dieses Objekt dann mit “scale” in der Größe verändert.  Obwohl ich unterschiedliche Werte für X Y und Z

(scale([1.05,1.08,1])

verwendet habe, sind die Verzerrungen nicht zu sehen. So passt die Tür aber genau. Den wirklich sauber gedruckten Handgriff, der aber mit 0,6 mm Durchmesser einfach zu empfindlich ist, habe ich durch zwei entsprechende Löcher für etwas Messingdraht ersetzt. Leider sind die Löcher beim Drucken dann ziemlich zugelaufen, so das ich sie nach dem Lackieren noch mal aufbohren muss. Aber das ist kein Problem… Beim zweiten Packwagen werde ich sie noch etwas größer vom Durchmesser her machen, was ich schon in den Quellcode oben eingebaut habe. Aber für jetzt geht es erst mal so… Den Riegel habe ich auch überarbeitet, meint etwas grober gemacht. Nun wird er anständig gedruckt.

Nach dem Drucken und Aushärten hatte ich dann tatsächlich zwei brauchbare Türen für meinen Packwagen.

Schnell noch eine “Anprobe”:

Und die Türen können an den gespachtelten und geschliffenen Aufbau angeklebt werden.

Jetzt ist der Wagen im Rohbau so weit fertig und kann lackiert werden.

Nun muss noch die Inneneirichtung fürs Büro, die Fensterscheiben und die Innenbeleuchtung hergestellt werden.  Vielleicht spendiere ich meinen Magic Train Wagen auch noch Fensterahmen aus 0,5 mm dickem, schwarzen, gelaserten Karton.

Die Inneneinrichtung wird auch noch im 3D Druck hergestellt. Dabei will ich neben der Einrichtung für den Packwagen auch eine für die “normalen” Personenwagen konstruieren. Das, was bei Magic Train mitgeliefert wird, ist nicht mal ein Witz, völlig unbrauchbar…

Wenn alles so weit fertig ist, werde ich noch mal gesammelt alle STL, SCAD, SVG und PNG Dateien in einem Zip- Archiv zum Download einstellen.

Inzwischen bin ich mit der Inneneinrichtung angefangen. Wie angekündigt, habe ich zunächst die Einrichtung für die “normalen” Personenwagen konstruiert. Dazu habe ich ein .PNG erzeugt, welches den Dielenboden des Wagens darstellen soll.

Daraus habe ich dann per “Surface” Befehl  den Fußboden  erzeugen lassen. Dadurch wird das Rendern zwar wieder stark verlangsamt, aber anders sind solche Effekte nur schwer hin zu bekommen…

Die Wagen bekommen eine Toilette, wofür jeweils ein Fenster mit weißem Papier hinterlegt werden muss.

Die Sitze habe ich einzeln als Modul in einer externen Datei “sitz.scad” konstruiert und später mit “include” in die eigentliche Inneneinrichtung eingebunden. Das Modul wird in der ersten Zeile definiert.  Das geht mit “module modulname() {” und erfordert natürlich noch eine schließende } am Ende… Der Modulname kann frei gewählt werden. Hier heißt das Modul sitz, was passend erscheint…

// Sitz - Modul
module sitz() {

$fn=100;

// Füße
translate([0.5,2,0])cube([7,4,5]);
translate([0.5,14,0])cube([7,4,5]);

//Sitzfläche
translate([0,0,4.99])
difference(){
minkowski()
{ translate([1.0,2,0])
cube([5.2,16,1]);
cylinder(h = 0.1, d = 4);

}
translate([-3,0,-0.1])cube([3.7,21,3]);
}

//Rückenlehne

difference(){
rotate([0,-5,0])
cube([1.2,20,18]);
translate([-0.1,0,-10.1])cube([10,25,10]);
}

difference(){
minkowski()
{ translate([-1.5,2,18])cube([1.2,16,14]);
rotate([0,90,0])cylinder(h = 0.1, d = 4);
}
translate([-1.5,-0.1,8.9])cube([1.2,21,9]);
}

// Gepäcknetz
translate([2.5,0,0])rotate([0,-5,0])union(){translate([-1,1.5,25])rotate([0,90,0])cylinder(h=5, d=1);
translate([4,1.5,25])
sphere(d=1);

translate([-1,18.5,25])rotate([0,90,0])cylinder(h=5, d=1);
translate([4,18.5,25])
sphere(d=1);

translate([4,18.5,25])rotate([90,0,0])cylinder(h=17, d=1);

translate([0.5,18.5,25])rotate([90,0,0])cylinder(h=17, d=0.3);
translate([1.5,18.5,25])rotate([90,0,0])cylinder(h=17, d=0.3);

translate([2.5,18.5,25])rotate([90,0,0])cylinder(h=17, d=0.3);

translate([-1,5.75,25])rotate([0,90,0])cylinder(h=5, d=0.3);

translate([-1,10,25])rotate([0,90,0])cylinder(h=5, d=0.3);

translate([-1,14.5,25])rotate([0,90,0])cylinder(h=5, d=0.3);
}
}

Sonst ist hier nichts, was wir nicht schon gehabt hätten. Während der Bearbeitung kann/sollte man das Modul einmal aufrufen, damit der Sitz angezeigt wird. Das geht dann so:

sitz();

Ist man fertig, muss man diese Zeile löschen oder aus- kommentieren, da sonst bei jedem Aufruf des Moduls zusätzlich ein Sitz bei 0,0,0 erzeugt wird. Das wäre gar nicht sinnvoll…

Wenn man jetzt was am Sitz ändern will, z.B. noch Polster oder Armlehnen anbauen will, muss man an der Datei für die Inneneinrichtung nichts mehr ändern, einfach neu  rendern (das dauert sehr lange, nicht wundern) und neu als STL exportieren…

In der eigentlichen Konstruktion für die Inneneinrichtung wird die Grundplatte, die Wände mit Tür für die Toilette und die Position der Sitze festgelegt…

// Inneneinrichtung Magic Train Personenwagen

//Includes

include <sitz.scad> //Die Sitze als Modul

//Grundplatte mit Holzboden
difference(){

union(){
cube([102,49,1.3]);
translate([0,0,1.3])scale([0.341, 0.343, 0.005])
surface(file = "Holzbohlen2.png");
}

translate([-0.1,-0.1,-0.5])cube([2,2,3]);
translate([0.,47.1,-0.5])cube([2,2,3]);
translate([100.1,-0.1,-0.5])cube([2,2,3]);
translate([100.1,47.1,-0.5])cube([2,2,3]);
translate([10,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
translate([92,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
}
// Toilette, Gangseite
translate([0,1.1,0])union(){
difference(){translate([0,18,1])cube([24.5,1,40]);
translate([2,18.1,1])cube([12,1.2,37]);
}

translate([2.2,18.1,1])cube([11.6,1,36.8]);

// Türscharniere
translate([2.1,19.1,34])cylinder(h=2, d=0.5, $fn=100);

translate([2.1,19.1,4])cylinder(h=2, d=0.5, $fn=100);

// Türklinke

translate([11.5,18.9,19])cube([1.5,0.5,2.8]);

translate([12.25,19.9,20.8])rotate([90,0,0])cylinder(h = 1.5, r = 0.3, $fn=100);
translate([12.25,19.9,20.8]) sphere(0.3, $fn=100);
translate([12.25,19.9,20.8])rotate([0,-90,0])cylinder(h = 1.8, r = 0.3, $fn=100);

}
// Toilette, Sitzseite
translate([23.5,0,1])cube([1,19.5,40]);

// Sitzreihe Fensterseite
difference(){
translate([1.2,28.15,0])rotate([0,0,0])sitz();
translate([-40,28,0])cube(40);
}

translate([25.6,28.15,0])sitz();

translate([23.6,48.15,0])rotate([0,0,180])
sitz();

translate([50.6,28.15,0])sitz();

translate([48.6,48.15,0])rotate([0,0,180])
sitz();

translate([75.6,28.15,0])sitz();

translate([73.6,48.15,0])rotate([0,0,180])
sitz();

difference(){
translate([100.6,48.15,0])rotate([0,0,180])
sitz();
translate([102,10,0])cube(40);
}

// Sitzreihe Toilettenseite
translate([25.6,0.05,0])sitz();

translate([50.6,0.15,0])sitz();

translate([48.6,20.15,0])rotate([0,0,180])
sitz();

translate([75.6,0.15,0])sitz();

translate([73.6,20.15,0])rotate([0,0,180])
sitz();

difference(){
translate([100.6,20.08,0])rotate([0,0,180])sitz();
translate([102,0,0])cube(40);
}

Auch hier sind keine unbekannten Befehle enthalten, wenn man von dem Include ganz oben absieht und dem mehrfachen Aufruf unseres eigenen Moduls “sitz()”.

Nach dem sehr lange dauernden Rendern habe ich das Modell als .STL Datei exportiert. Da die Inneneinrichtung auch für Leute interessant sein könnte, die keinen Packwagen- Umbau machen oder dem OpenSCAD Kurs nicht verfolgen, hänge ich die STL Datei hier einfach mal an:

Inneneinrichtung

Die Datei ist noch ungetestet, sprich noch nicht gedruckt. Das wird heute Nacht passieren.

Sollten noch Änderungen nötig werden, werde ich die Datei neu hochladen…

Die Inneneinrichtung für den Packwagen ist längst nicht so kompliziert, sollte also schnell erledigt sein. Das gehe ich dann als nächstes an.

Man könnte auf die Sitze per “surface” auch Bretterfugen machen.  Aber ich hatte eher vor, dort Sitzpolster drauf zu machen statt Bretterfugen. Schließlich ist das keine “Museumsbahn”, sondern eine Touristen- Attraktion… Die Gepäcknetze kommen übrigens (fast) einwandfrei aus dem Drucker. Lediglich eines der vielen Netze ist nicht 100% sauber geworden. 0.3 mm “Drähte” kann ich drucken. Nur die Stabilität ist minimal. Das wird aber durch den stabilen Rahmen abgemildert…

Ich habe die “sitz.scad” Datei noch mal überarbeitet, so das man den Sitz jetzt wahlweise mit oder ohne Sitzpolster drucken kann. Als Standard wird der Sitz mit Polstern gedruckt. Wenn man das nicht möchte, muss man das Modul mit einem Argument aufrufen sitz(0);  statt wie bisher sitz();  Mit sitz(1); werden die Polster ebenfalls gedruckt, bei jeder beliebigen anderen Zahl nicht…

// Sitz - Modul

module sitz(polster=1) {

// Wenn man keine Sitzpolster will, einfach das Modul mit sitz(0); oder irgendeiner anderen Zahl außer 1 aufrufen

//Auflösung
$fn=100;

// Füße
translate([0.5,2,0])cube([7,4,5]);
translate([0.5,14,0])cube([7,4,5]);

//Sitzfläche
translate([0,0,4.99])
difference(){
minkowski()
{ translate([1.0,2,0])
cube([5.2,16,1]);
cylinder(h = 0.1, d = 4);

}
translate([-3,0,-0.1])cube([3.7,21,3]);
}

 

//Rückenlehne

difference(){
rotate([0,-5,0])
cube([1.2,20,18]);
translate([-0.1,0,-10.1])cube([10,25,10]);
}

difference(){
minkowski()
{ translate([-1.5,2,18])cube([1.2,16,14]);
rotate([0,90,0])cylinder(h = 0.1, d = 4);
}
translate([-1.5,-0.1,8.9])cube([1.2,21,9]);
}

// Gepäcknetz
color("silver")translate([2.5,0,0])rotate([0,-5,0])union(){translate([-1,1.5,25])rotate([0,90,0])cylinder(h=5, d=1);
translate([4,1.5,25])
sphere(d=1);

translate([-1,18.5,25])rotate([0,90,0])cylinder(h=5, d=1);
translate([4,18.5,25])
sphere(d=1);

translate([4,18.5,25])rotate([90,0,0])cylinder(h=17, d=1);

translate([0.5,18.5,25])rotate([90,0,0])cylinder(h=17, d=0.3);
translate([1.5,18.5,25])rotate([90,0,0])cylinder(h=17, d=0.3);

translate([2.5,18.5,25])rotate([90,0,0])cylinder(h=17, d=0.3);

translate([-1,5.75,25])rotate([0,90,0])cylinder(h=5, d=0.3);

translate([-1,10,25])rotate([0,90,0])cylinder(h=5, d=0.3);

translate([-1,14.5,25])rotate([0,90,0])cylinder(h=5, d=0.3);
}

if (polster==1){
color("aqua")translate([0.5,2,6.01])minkowski(){
cube([6,6.8,0.5]);
cylinder(h=0.1, r=1,$fn=100);
}

color("aqua")translate([0.5,11.5,6.01])minkowski(){
cube([6,6.8,0.5]);
cylinder(h=0.1, r=1, $fn=100);
}

color("aqua")translate([0,2,6.01])rotate([0,-5,0])minkowski(){
cube([1.2,6.8,8.5]);
rotate([0,90,0]) cylinder(h=0.1, r=1, $fn=100);
}

color("aqua")translate([0,11.5,6.01])rotate([0,-5,0])minkowski(){
cube([1.2,6.8,8.5]);
rotate([0,90,0]) cylinder(h=0.1, r=1, $fn=100);
}

}
}
//sitz();

Ich musste aber sowieso noch mal ran. Die Position der Sitze ist leider nicht ganz richtig. Ich habe mich um ca 0.5 mm verrechnet. Deswegen stehen die Sitze nicht genau mittig zwischen den Fenstern, sondern der Abstand ist je um 0.5 mm zu klein. Dadurch rutschen die Sitze immer mehr an die Kante der Bereiche zwischen den Fenstern…

Außerdem ist die “Gewichtsverteilung” nicht gut. Unten ein dünnes, durchgehendes “Brett” und oben lauter frei in die Höhe ragende schwere Teile. Nach dem Aushärten fängt das Teil leider an sich massiv zu verziehen. Direkt nach dem Aushärten war der Boden noch topfeben. Über Nacht nimmt er immer mehr eine Kugelform an…

Hier ist das überarbeitete OpenSCAD Skript, für alle, die die Inneneinrichtung trotzdem an einem Stück drucken wollen. Ich habe die Position der Sitze korrigiert und die Toilette verstärkt in der Hoffnung, das der Verzug nicht mehr so extrem wird..

// Inneneinrichtung Magic Train Personenwagen

//Includes

include <sitz.scad> //Die Sitze als Modul

//Grundplatte mit Holzboden
difference(){

union(){
cube([102,49,1.3]);
translate([0,0,1.3])scale([0.341, 0.343, 0.005])
surface(file = "Holzbohlen2.png");
}

translate([-0.1,-0.1,-0.5])cube([2,2,3]);
translate([0.,47.1,-0.5])cube([2,2,3]);
translate([100.1,-0.1,-0.5])cube([2,2,3]);
translate([100.1,47.1,-0.5])cube([2,2,3]);
translate([10,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
translate([92,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
}
// Toilette, Gangseite
translate([0,1.1,0])union(){
difference(){translate([0,18,1])cube([24.5,1,40]);
translate([2,18.1,1])cube([12,1.2,37]);
}

translate([0,1,1])cube([24.5,17.5,15]);

translate([2.2,18.1,1])cube([11.6,1,36.8]);

// Türscharniere
translate([2.1,19.1,34])cylinder(h=2, d=0.5, $fn=100);

translate([2.1,19.1,4])cylinder(h=2, d=0.5, $fn=100);

// Türklinke

translate([11.5,18.9,19])cube([1.5,0.5,2.8]);

translate([12.25,19.9,20.8])rotate([90,0,0])cylinder(h = 1.5, r = 0.3, $fn=100);
translate([12.25,19.9,20.8]) sphere(0.3, $fn=100);
translate([12.25,19.9,20.8])rotate([0,-90,0])cylinder(h = 1.8, r = 0.3, $fn=100);

}
// Toilette, Sitzseite
translate([23.5,0,1])cube([1,19.5,40]);

translate([0,1.9,1])cube([1,18,40]);

// Toilette, Dach
translate([0,0.5,39.9])cube([24.5,19.5,1.5]);

// Sitzreihe Fensterseite
difference(){
translate([1.2,28.15,0])rotate([0,0,0])sitz();
translate([-40,28,0])cube(40);
}

translate([25.6,28.15,0])sitz();

translate([23.1,48.15,0])rotate([0,0,180])
sitz();

translate([50.1,28.15,0])sitz();

translate([47.6,48.15,0])rotate([0,0,180])
sitz();

translate([74.6,28.15,0])sitz();

translate([72.1,48.15,0])rotate([0,0,180])
sitz();

difference(){
translate([100.6,48.15,0])rotate([0,0,180])
sitz();
translate([102,10,0])cube(40);
}

// Sitzreihe Toilettenseite
translate([25.1,0.05,0])sitz();

translate([49.6,0.15,0])sitz();

translate([47.6,20.15,0])rotate([0,0,180])
sitz();

translate([74.1,0.15,0])sitz();

translate([72.1,20.15,0])rotate([0,0,180])
sitz();

difference(){
translate([100.6,20.08,0])rotate([0,0,180])sitz();
translate([102,0,0])cube(40);
}

Ich selbst werde den Boden, die Sitze und die Toilette aber einzeln drucken und später zusammen kleben…

Die Grundplatte passt so auch zum Packwagen:

Ich habe die Bilder mal ein wenig mit Farbe aufgepeppt, damit man die Details besser erkennen kann… Auf die STL Dateien oder gar das Druck- Resultat hat das keinerlei Einfluss. Hier das OpenSCAD Skript. Die Farbe wird mit “color(“grey”) gesetzt. Man kann hier die gängigen (englischen) Farben- Namen  (hier “grey” für Grau) verwenden, oder RGB Werte direkt eingeben. Wie gesagt, ist für das fertige Modell völlig unerheblich, macht nur die Bilder etwas “schöner”…

// Fußboden Magic Train Personenwagen

//Grundplatte mit Holzboden
difference(){

color("grey") union(){
cube([102,49,1.3]);
translate([0,0,1.3])scale([0.341, 0.343, 0.005])
surface(file = "Holzbohlen2.png");
}

translate([-0.1,-0.1,-0.5])cube([2,2,3]);
translate([0.,47.1,-0.5])cube([2,2,3]);
translate([100.1,-0.1,-0.5])cube([2,2,3]);
translate([100.1,47.1,-0.5])cube([2,2,3]);
translate([10,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
translate([92,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
}

Nun der Doppelsitz. Hiervon werden für die komplette Inneneinrichtung 5 Stück gebraucht. Falls man auf die Toilette verzichten will, benötigt man 6 Stück…

Das Skript:

// Doppel-Sitz

//Includes

include <sitz.scad> //Die Sitze als Modul

// Mit Sitzpolster
sitz();

translate([-1.7,20.15,0])rotate([0,0,180])
sitz();

// Ohne Sitzpolster muss es jeweils sitz(0); heißen

 

Und noch der Einzelsitz… Davon benötigt man 3 Stück, Sofern man ohne Toilette baut, braucht man 4 solcher Sitze…

// Einzel-Sitz

//Includes

include <sitz.scad> //Die Sitze als Modul

// Mit Sitzpolster
sitz();

// Ohne Sitzpolster muss es sitz(0); heißen

 

 

Und zum Schluss noch die Toilette.

// Inneneinrichtung Magic Train Personenwagen

//Includes

include <sitz.scad> //Die Sitze als Modul

// Toilette, Gangseite
translate([0,1.1,0])union(){
color("maroon")difference(){translate([0,18,0])cube([24.5,1,40]);
translate([2,18.1,0])cube([12,1.2,37]);
}

translate([0,1,0])cube([24.5,17.5,15]);

color("teal")translate([2.2,18.1,0])cube([11.6,1,36.8]);

// Türscharniere
color("silver")translate([2.1,19.1,34])cylinder(h=2, d=0.5, $fn=100);

color("silver")translate([2.1,19.1,4])cylinder(h=2, d=0.5, $fn=100);

// Türklinke

color("silver")translate([11.5,18.9,19])cube([1.5,0.5,2.8]);

color("silver")translate([12.25,19.9,20.8])rotate([90,0,0])cylinder(h = 1.5, r = 0.3, $fn=100);
color("silver")translate([12.25,19.9,20.8]) sphere(0.3, $fn=100);
color("black")translate([12.25,19.9,20.8])rotate([0,-90,0])cylinder(h = 1.8, r = 0.3, $fn=100);

}
// Toilette, Sitzseite
color("maroon")translate([23.5,0,0])cube([1,19.5,40]);

translate([0,1.9,0])cube([1,18,40]);

// Toilette, Dach
color("maroon")translate([0,0,39.9])cube([24.5,20.1,1.5]);

// Sitz an Toilette
translate([25.1,0.05,0])sitz();

Die Toilette wird pro Wagen (maximal) einmal benötigt.

Man sieht, ich habe jetzt in drei verschiedenen Dateien jeweils das Sitz- Modul aus “sitz.scad” eingebunden und verwendet… Sonst hätte ich nach einem “Kopieren und Einfügen” alle drei Dateien entsprechend anpassen müssen, damit die Sitzpolster mit gedruckt werden können…

Allerdings geht mein Harz zur Neige… Ich überlege mir inzwischen, auf das ABS- LIke Resin umzusteigen. Nur dazu benötige ich eine “Waschanlage”, die mit Isopropylalkohol gefüllt werden kann… Dazu sind entweder zusätzliche Bastel- Arbeiten nötig oder eine Investition in eine “Elegoo Merkur” Wasch- und Aushärtekammer (gut 100€)… Daneben bin ich in den nächsten 2 Wochen arg beschäftigt, so das ich kaum Zeit finden werde, mich mit dem für mich neuen Harz und der Verarbeitung zu beschäftigen… Generell scheint mir das ABS- Like Harz aber besser für unsere Zwecke zu sein, als das herkömmliche, wasserwaschbare Harz. Deswegen würde ich es gerne mal versuchen, aber wie gesagt, das ist mit Arbeit und Geldausgeben verbunden…

Hier sind die .scad und .stl Dateien für die Personenwagen- Inneneirichtung, zusammengefasst in einem Zip Archiv:

STL_SCAD

Inzwischen habe ich auch die Inneneinrichtung für den Packwagen konstruiert.

Hier habe ich aber trotzdem versucht, die Einrichtung in einem Stück zu drucken. Dazu habe ich diverse Verstärkungen eingebaut. Beim Packwagen geht das, da ja große Teile des Raumes unsichtbar sind…

// Inneneinrichtung Magic Train Packwagen

// Modul Regal

module regal() {
difference(){
cube([4.6,8.8,20.8]);
translate([1,1,1])cube([4.6,6.8,4]);
translate([1,1,5.8])cube([4.6,6.8,4]);
translate([1,1,10.8])cube([4.6,6.8,4]);
translate([1,1,15.8])cube([4.6,6.8,4]);
}
}

//Grundplatte mit Holzboden
difference(){

color("grey") union(){
cube([102,49,1.3]);
translate([0,0,1.3])scale([0.341, 0.343, 0.005])
surface(file = "Holzbohlen2.png");
}

translate([-0.1,-0.1,-0.5])cube([2,2,3]);
translate([-0.1,47.1,-0.5])cube([2,2,3]);
translate([50.1,-0.1,-0.5])cube([60,8,3]);
translate([50,42,-0.5])cube([60,8,3]);
translate([10,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
translate([92,24.5,-0.1])cylinder(d=5, h= 1.5, $fn=100);
}

//Versteifung
translate([30,20,0])cube([70,10,20]);

// Büro
translate([0,1.1,0])union(){
// Tür
rotate([0,0,90])translate([10,-44.2,1])union(){
color("teal")translate([2.2,18.1,1])cube([11.6,1,36.8]);

// Türscharniere
color("silver")translate([2.1,19.1,34])cylinder(h=2, d=0.5, $fn=100);

color("silver")translate([2.1,19.1,4])cylinder(h=2, d=0.5, $fn=100);

// Türklinke

color("silver")translate([11.5,18.9,19])cube([1.5,0.5,2.8]);

color("silver")translate([12.25,19.9,20.8])rotate([90,0,0])cylinder(h = 1.5, r = 0.3, $fn=100);
color("silver")translate([12.25,19.9,20.8]) sphere(0.3, $fn=100);
color("black")translate([12.25,19.9,20.8])rotate([0,-90,0])cylinder(h = 1.8, r = 0.3, $fn=100);
}
}

translate([25.5,0,1])cube([10,48.9,41]);

translate([0,1.9,1])cube([1,16,41]);

translate([0,31,1])cube([1,16,41]);

// Dach
translate([0,11.5,41.9])difference(){cube([35.5,27.5,1.5]);
translate([14,12.5,-0.5])cylinder(h=3, d=3.2, $fn=50);
}

// Büroeinrichtung

// Aktenschrank
cube([25.5,7,15]);
color("teal")translate([0.1,0,14.9])cube([25.8,9,0.5]);
color("teal")translate([1.9,6.8,2.4])cube([11,0.5,9]);
color("silver")translate([12.0,7.3,7.9])rotate([0,0,90])cylinder(h = 2.5, r = 0.3, $fn=50);

color("teal")translate([1.9,6.8,11.9])cube([11,0.5,2]);
color("silver")translate([6.2,7.3,12.9])rotate([90,0,90])cylinder(h = 2.5, r = 0.3, $fn=50);

color("teal")translate([13.5,6.8,2.4])cube([11,0.5,9]);
color("silver")translate([14.0,7.3,7.9])rotate([0,0,90])cylinder(h = 2.5, r = 0.3, $fn=50);

color("teal")translate([13.5,6.8,11.9])cube([11,0.5,2]);
color("silver")translate([17.6,7.3,12.9])rotate([90,0,90])cylinder(h = 2.5, r = 0.3, $fn=50);

//Schreibtisch
color("teal")translate([0.1,39.8,14.9])cube([25.8,9,0.5]);

difference(){translate([2,40.8,0])color("maroon")cube([21.8,7,15.3]);
color("aqua")translate([-0.5,41.75,-0.9])cube([24.8,5,15.0]);
color("aqua")translate([3,40.75,-0.9])cube([19.8,9,15.0]);
}

// Regale "aufhängen"
translate([0.5,0.2,18])regal();

translate([0.5,39.9,18])regal();

scale([1,1.8,1])rotate([0,0,180])translate([-26,-25.2,18])regal();

Die Regale habe ich als Modul konzipiert und es insgesamt dreimal verwendet. Das dritte Regal ist in eine Richtung (Breite) verzerrt worden, was in dem Fall keinen negativen Einfluss auf die Optik hat. Hier habe ich das Modul nicht als externe Datei ausgeführt, sondern es einfach am Anfang des Skripts eingebaut. Einen Stuhl habe ich bewusst nicht mit integriert. Stühle gibt es zuhauf fertig konstruiert auf Thingiverse (einfach mal nach “chair” suchen). So kann man ihn nachträglich leichter bemalen und mit einer Figur versehen…

Die Aussparungen in der Grundplatte habe ich erst nachdem ich mein Exemplar gedruckt habe, eingebaut. Durch die Fenster- Füllstücke ist der Packwagen innen enger als ein “normaler” Personenwagen. Ohne diese Aussparungen bekommt man die Einrichtung nicht in den Wagen eingesetzt. Ich habe bei meinem Exemplar einfach mit einem Seitenschneider etwas abgezwickt. Sieht nicht schön aus, funktioniert aber. Der Bereich ist ja am fertigen Modell nicht zu sehen, von daher ist es völlig egal und kein Grund, diesen Druck wegzuwerfen. Besonders, da ich nur noch sehr wenig Harz habe…

Das “Dach” dient vorrangig zum Versteifen der Konstruktion. Das “Loch” hat genau Platz für eine Standard- LED mit 3 mm Durchmesser. Damit wird die Innenbeleuchtung realisiert.

Ich hoffe, das Ganze verzieht sich jetzt dann nicht mehr. Muss man aber erst abwarten.

Hier ein paar Fotos vom ersten Testdruck. Das harz ist inzwischen auch schon ziemlich alt, wird Zeit, das es verbraucht wird. Ich muss noch einiges bereinigen, bevor ich die Einrichtung lackieren und einbauen kann…

Zunächst mal solo.

man sieht leider gut, wo der Druck nicht ganz sauber ist.

Aber im eingebauten Zustand dürfte das kaum noch auffallen. Schließlich handelt es sich hier um Magic Train und nicht um Fulgurex…

Leider dürfte mein Harz nicht mehr reichen, um die Inneneinrichtungen für alle “Rheingold”- Wagen zu drucken. Ich will aber alle vier Wagen auf einmal lackieren, damit ich nicht so oft die Farben in der Airbrush wechseln muss… Deswegen dürfte die endgültige Fertigstellung meines ersten “Theme Train” noch ein paar Wochen dauern… Vom lackieren abgesehen, ist der Umbau jetzt aber abgeschlossen. Na ja, vielleicht nicht ganz…

Ich will nämlich mal sehen, ob ich nicht eine Trittstufe für Tackerklammern lasern kann, vielleicht aus 1 mm Balsaholz. Diese feinen Plastik- Teile sind einfach zu empfindlich und brechen zu schnell ab. Tackerklammern aus Metall sind da wesentlich robuster und haben für 0e bzw. 0n30 eine recht passable Größe… Das ist als Ersatz für die “angespritzten” Trittstufen bei den Schiebetüren gedacht, da sich schon wieder ein Tritt “selbstständig” gemacht hat…

Und wie versprochen, hier sind alle STL und OpenSCAD Dateien sowohl für den kompletten Packwagen Umbau als auch für die Personenwagen Inneneinrichtung.

Packwagen-Umbau

Personenwagen-Inneneinrichtung

Viel Spaß damit. Für private Zwecke kann sie jeder der mag, verwenden. Bei einer eventuellen kommerziellen Nutzung muss aber vorher mit mir geredet werden. Dann will ich meinen Anteil abhaben wobei wir uns da sicher einig werden…

3D Konstruktion mit OpenSCAD – Der Servo- Halter

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. Hier geht es zum Bericht.

Zurück

3D Konstruktion mit OpenSCAD – Verschieben und Kombinieren

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 oder 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…

ZurückWeiter

 

3D Konstruktion mit OpenSCAD – 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.

ZurückWeiter

3D Konstruktion mit OpenSCAD – 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.

ZurückWeiter