173 lines
7.2 KiB
OpenSCAD
173 lines
7.2 KiB
OpenSCAD
// ------------------------------------------------------------------------
|
|
// Customizable girders for fischertechnik.
|
|
// The modules in this file can be used to generate:
|
|
// - Angle girders with a customizable length, height and width.
|
|
// If the height or width are greater than the 15mm basic block size,
|
|
// the corresponding side of the girder has a row of eyelets every
|
|
// 15mm. The length sides both have flat grooves (the original angle
|
|
// girder has a flat groove on one side and a pin on the other side).
|
|
// If the width is greater than 15mm then there are grooves every 15mm.
|
|
// - U-Girders with a customizable length and width.
|
|
//
|
|
|
|
//----------------------- parameters ---------------------------
|
|
/* [Girder type] */
|
|
//
|
|
Girder_type = 0; // [0 : no output, 1:Anglegirder, 2: U-Girder]
|
|
/* [Angel girder options] */
|
|
// The length of the angel girder
|
|
Length = 60; // [15,30,45,60,75,90,105,120,150,180]
|
|
// The height of the angel girder
|
|
Height = 15; // [15,30,45,60,75,90,105,120,150,180]
|
|
// The width of the angel girder
|
|
Width = 15; // [15,30,45,60,75,90,105,120,150,180]
|
|
/* [U-Girder options] */
|
|
// The length of the U-Girder
|
|
U_Length = 90; // [15,30,45,60,75,90,105,120,135, 150,165,180,195]
|
|
// The width of the U-Girder
|
|
U_Width = 30; // [15,30,45,60,75,90,105,120,135, 150,165,180,195]
|
|
|
|
// Build plate size correction for the eyelets
|
|
Correction = 0.2; // [0.0, 0.1, 0.2, 0.3]
|
|
|
|
/* [Hidden] */
|
|
|
|
// **********************
|
|
// ** Static Settings: **
|
|
// **********************
|
|
include<ft_util.scad>
|
|
|
|
|
|
// *********************
|
|
// ** Helper Modules: **
|
|
// *********************
|
|
|
|
// --------------------------------------------------------------------
|
|
// The girder body without eyelets and grooves
|
|
// --------------------------------------------------------------------
|
|
module girder_body(len = BASIC_BLOCK_SIZE * 4, w = BASIC_BLOCK_SIZE * 2, h = BASIC_BLOCK_SIZE, angle = true) {
|
|
// make room for the flat grooves
|
|
additionalheadthickness = 1.5;
|
|
// the u-girder has an additional wall
|
|
innerwidth =
|
|
(angle == true) ?
|
|
w - WALL_THICKNESS + MANIFOLD_CORRECTION :
|
|
w - WALL_THICKNESS * 2;
|
|
|
|
innerheight = h - WALL_THICKNESS + MANIFOLD_CORRECTION;// + 0.1;
|
|
difference() {
|
|
cube([w, len, h]);
|
|
translate([WALL_THICKNESS, WALL_THICKNESS + additionalheadthickness, WALL_THICKNESS])
|
|
cube([innerwidth, len - ( 2 * WALL_THICKNESS + 2 * additionalheadthickness), innerheight]);
|
|
}
|
|
}
|
|
|
|
// *********************
|
|
// ** Girder Modules: **
|
|
// *********************
|
|
|
|
// --------------------------------------------------------------------
|
|
// Customizable anglegirder
|
|
// This version of the angle girder has no pin, but grooves on both sides.
|
|
// The pins are difficult to print, so i decided to use a second groove
|
|
// and an original Fischertechnik spring cam (Federnocken)
|
|
// The length of the girder can be set in the customizer, but it should
|
|
// always be set to multiples of the basic block size (15 mm) to have
|
|
// complete eylets on the girder.
|
|
// The same applies to the height and width of the girder.
|
|
// --------------------------------------------------------------------
|
|
module angle_girder(len = BASIC_BLOCK_SIZE * 4, w = BASIC_BLOCK_SIZE, h = BASIC_BLOCK_SIZE) {
|
|
w_cnt = w / BASIC_BLOCK_SIZE;
|
|
h_cnt = h / BASIC_BLOCK_SIZE;
|
|
|
|
difference() {
|
|
difference() {
|
|
girder_body(len, w, h);
|
|
for (i = [0 : BASIC_BLOCK_SIZE : (w_cnt - 1) * BASIC_BLOCK_SIZE]) {
|
|
translate([i, 0 ,0])
|
|
eyelet_row(len = len, height = WALL_THICKNESS * 2 + MANIFOLD_CORRECTION);
|
|
}
|
|
for (i = [0 : BASIC_BLOCK_SIZE : (h_cnt - 1) * BASIC_BLOCK_SIZE]) {
|
|
translate([0, 0, i])
|
|
rotate([0,270,0])
|
|
eyelet_row(len = len, height = WALL_THICKNESS * 2 + MANIFOLD_CORRECTION);
|
|
}
|
|
}
|
|
for (i = [0 : BASIC_BLOCK_SIZE : (w_cnt - 1) * BASIC_BLOCK_SIZE]) {
|
|
translate([BASIC_BLOCK_HALF + i, 0, h / 2])
|
|
flat_groove(h);
|
|
rotate([180,0,0])
|
|
translate([BASIC_BLOCK_HALF + i, -Length, -(h / 2)])
|
|
flat_groove(h);
|
|
}
|
|
}
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
// customizable u-girder
|
|
// --------------------------------------------------------------------
|
|
module u_girder(len = BASIC_BLOCK_SIZE * 6, w = BASIC_BLOCK_SIZE * 3, h = BASIC_BLOCK_SIZE) {
|
|
separator_thickness = 1;
|
|
separator_height = 10;
|
|
hole_diameter = PLATE_HOLE_DIAMETER;
|
|
difference() {
|
|
union() {
|
|
difference() {
|
|
// first, the girder body without any holes or eyelets
|
|
girder_body(len = len, w = w, h = h, angle = false);
|
|
// now cut out the grooves on both ends of the girder
|
|
translate([w /2 , 0, BASIC_BLOCK_HALF])
|
|
rotate([0,90,0])
|
|
flat_groove(w);
|
|
translate([w /2 , len, BASIC_BLOCK_HALF])
|
|
rotate([180,90,0])
|
|
flat_groove(w);
|
|
|
|
// next, cut out the eyelets
|
|
for (i = [0 : BASIC_BLOCK_SIZE : (h / BASIC_BLOCK_SIZE - 1) * BASIC_BLOCK_SIZE]) {
|
|
translate([0, 0, i])
|
|
rotate([0, 270, 0])
|
|
eyelet_row(len = len, height = WALL_THICKNESS * 2 + MANIFOLD_CORRECTION);
|
|
translate([w - WALL_THICKNESS, 0, i])
|
|
rotate([0, 270, 0])
|
|
eyelet_row(len = len, height = WALL_THICKNESS * 2 + MANIFOLD_CORRECTION);
|
|
}
|
|
|
|
// finally cut out the holes for the pins of the basic blocks
|
|
for (i = [0 : BASIC_BLOCK_SIZE : len - BASIC_BLOCK_SIZE])
|
|
for (j = [BASIC_BLOCK_HALF : BASIC_BLOCK_SIZE : w ])
|
|
translate([j, PLATE_HOLE_DIAMETER - 0.1 + i, 0])
|
|
cube_with_cylinder(dir = "up");
|
|
}
|
|
// now add the inner separator walls and the cylinders for the round holes
|
|
for(k = [BASIC_BLOCK_SIZE : BASIC_BLOCK_SIZE : len - BASIC_BLOCK_SIZE]) {
|
|
translate([0, k - separator_thickness,0])
|
|
cube([w,separator_thickness, separator_height]);
|
|
for(l = [BASIC_BLOCK_SIZE : BASIC_BLOCK_SIZE : w - BASIC_BLOCK_SIZE])
|
|
translate([l, k - separator_thickness / 2, 0])
|
|
cylinder(r = 3.4, h = separator_height);
|
|
}
|
|
}
|
|
// drill the holes through the girder
|
|
for(m = [BASIC_BLOCK_SIZE : BASIC_BLOCK_SIZE : len - BASIC_BLOCK_SIZE])
|
|
for(n = [BASIC_BLOCK_SIZE : BASIC_BLOCK_SIZE : w - BASIC_BLOCK_SIZE])
|
|
translate([n, m - separator_thickness / 2, -(MANIFOLD_CORRECTION / 2)])
|
|
cylinder(d = PLATE_HOLE_DIAMETER, h = separator_height + MANIFOLD_CORRECTION);
|
|
|
|
}
|
|
}
|
|
|
|
// ********************
|
|
// ** Build section: **
|
|
// ********************
|
|
module main() {
|
|
if (Girder_type == 1) {
|
|
angle_girder(len=Length, w=Width, h=Height);
|
|
}
|
|
else if (Girder_type == 2) {
|
|
u_girder(len=U_Length, w=U_Width);
|
|
}
|
|
}
|
|
|
|
main();
|