Seite 1 von 1

Zapfenverbinder mit openSCAD

Verfasst: Fr 8. Jan 2016, 22:57
von RAU
Ich stand letztens vor der Frage, wie ich am besten zwei Teilstücke eines Modells, das im Ganzen zu groß zum Drucken ist, stabil miteinander verbinden könnte. Aus Gründen der Stabilität kam ich zu dem Schluss, dass es am besten mit gerundeten Zapfen gehen sollte. Scharfe Ecken, z.B. Schalbenschwanzverbindungen, werden von der Physik ja schamlos als Sollbruchstelle ausgenutzt.

Mit openSCAD habe ich ein parametrisches Modell für die Verbindung gemacht, bei dem man die Größe und Anzahl der Zapfen anpassen kann um es dann in andere Modelle einzubauen. Mit vielen kleineren Zapfen und geringer Höhe eignet es sich zum verbinden dünner Platten:
plattenverbinder.jpg
Man kann aber auch massivere Teile damit ausstatten:
zapfenverbinder.JPG
Ein Probedruck ohne das gesamte Modell ist ratsam, um die richtige Einstellung für das Spaltmaß (zv_c) zu finden.

Weitere Details kann man den Kommentaren im Skript entnehmen. Hier ist es:

Code: Alles auswählen

// Zapfenverbinder

$fn = 128;

// zum Passungsspalt
// Erfahrung mit ABS, Extr.Multiplier 0.9, 0.4mm Düse, 2mm Wanddicke
// 0.10mm --> gute Passung, kein Spiel, gut zerlegbar
// 0.05mm --> gute stramme Passung, schwer zerlegbar
// 0,00mm --> zu stramm! aber möglicherweise geeignet für Aceton-Verschweißung
// Je nach Material und Einstellung des Druckers sind andere Ergebnisse zu erwarten.

// Parameter
zv_w = 20;     // Wanddicke (Höhe)
zv_c = 0.05;  // Passungsspalt (clearance) s.o.
zv_h = 4;     // Zapfen-Halsbreite
zv_d = 5;     // Zapfen-Kreisdurchmesser, es muss zv_d > zv_h !
zv_n = 2;     // Anzahl Zapfen

// abgeleitete Variablen
zv_p = zv_d/2 + zv_h/2; // Pitch, Abstand Kreise in X
zv_t = sqrt(pow(zv_d, 2) - pow(zv_p, 2)); // Tiefe, Abstand Kreise in Y
zv_b = (zv_n+1)*zv_h + zv_n*zv_d; // Breite des Blocks

// Blockgröße (eine Hälfte), die sich aus den Parametern ergibt
echo (zv_Breite=zv_b);
echo (zv_Tiefe=2*zv_d);

// Weiblein
color("pink") difference() {
    union() {
        translate([0, -2*zv_d, 0]) cube([zv_b, 2*zv_d, zv_w]);
        translate([0, -2*zv_d, 0]) cube([zv_h/2, 2.5*zv_d + (zv_t-zv_c)/2, zv_w]);
        translate([zv_b - zv_h/2, -2*zv_d, 0]) cube([zv_h/2, 2.5*zv_d + (zv_t-zv_c)/2, zv_w]);
        for (i=[0:zv_n]) {
            translate([zv_h/2 + i*2*zv_p, zv_t/2, 0]) cylinder(d=zv_d-zv_c, h=zv_w);
        }
    }
    for (i=[1:zv_n]) {
        translate([zv_h/2 - zv_p + i*2*zv_p, -zv_t/2, -1]) cylinder(d=zv_d+zv_c, h=zv_w+2);
    }
    translate([-zv_d, -2*zv_d, -1]) cube([zv_d, 2.5*zv_d + (zv_t-zv_c)/2, zv_w+2]);
    translate([zv_b, -2*zv_d, -1]) cube([zv_d, 2.5*zv_d + (zv_t-zv_c)/2, zv_w+2]);
}

// Männlein
color("blue") translate([zv_b+zv_d, 0, 0]) difference() {
    union() {
        translate([0, -2*zv_d, 0]) cube([zv_b, 2*zv_d, zv_w]);
        for (i=[1:zv_n]) {
            translate([zv_h/2 - zv_p + i*2*zv_p, zv_t/2, 0]) cylinder(d=zv_d-zv_c, h=zv_w);
        }
    }
    for (i=[0:zv_n]) {
        translate([zv_h/2 + i*2*zv_p, -zv_t/2, -1]) cylinder(d=zv_d+zv_c, h=zv_w+2);
    }
    translate([-1, -zv_t/2 - zv_d/2 - zv_c/2, -1]) cube([zv_h/2 + 1, 2*zv_d, zv_w+2]);
    translate([zv_b - zv_h/2, -zv_t/2 - zv_d/2 - zv_c/2, -1]) cube([zv_h/2 + 1, 2*zv_d, zv_w+2]);
}
Vielleicht ist es mal irgendwo nützlich. (Es war eine ziemliche Rechnerei :))