Files
ft-parts/ft_gears.scad
2026-04-05 20:11:23 +02:00

140 lines
5.6 KiB
OpenSCAD

// Fischertechnik compatible gears.
// Makes use of the library
// https://github.com/chrisspen/gears.git
// instead of the MCAD "Parametric Involute Bevel and Spur Gears" library
// which has really a lot of parameters and looks quite complicate.
//
// The Fischertechnik technical background is described here:
// https://www.ftcommunity.de/ftpedia/2011/2011-2/ftpedia-2011-2.pdf
// page 30 ff; // Zahnräder und Übersetzungen (Teil 1)
// https://www.ftcommunity.de/ftpedia/2011/2011-3/ftpedia-2011-3.pdf
// page 30 ff; // Zahnräder und Übersetzungen (Teil 2)
// https://www.ftcommunity.de/ftpedia/2012/2012-1/ftpedia-2012-1.pdf
// page 12 ff; // Zahnräder und Übersetzungen (Teil 3)
//
// Fischertechnik uses two diffferent modules which can be set in the configurator:
// m = 1.5 for the gears with the large teeth and
// m = 0.5 for the gears with the small teeth.
// and also a fixed number of teeth:
// 10, 15, 20, 30, 40
// Feel free to extend both of them as needed.
//
/* [Gear type] */
// a normal gear or two gears stacked on each other
type = 0; // [0:none, 1:normal, 2:stacked]
/* [Gear options] */
// Type of gear, defined by modulus
modulus_1 = 1.5; // [0.5:small gears, 1.5:big gears]
// The number of teeth of the bigger gear
teeth_1 = 20; // [10, 15, 20, 30, 40]
// Only if stacked: the number of teeth of the smaller gear
teeth_2 = 10; // [10, 15, 20, 30, 40]
// The height of a single gear
height_1 = 5;
// Is the gear optimized by a cutout?
is_optimized = 0; // [0:no, 1:yes]
// Do we have a round axis or a clip axis?
has_clip_axle = 0; // [0:no, 1:yes]
/* [Hidden] */
// **********************
// ** Static Settings: **
// **********************
include<ft_util.scad>
include<gears.scad>
$fn=50;
// Depends on the printer and the ft parts.
// For me this seems to work best:
hole_diameter = 4.32;
// --------------------------------------------------------------------
// A module to calculate an ft compatible gear.
//
// The used gears library does some weird optimizations to reduce
// material and weight of the gear: in addition to cutting out part
// of the inner circle with a small height it also cuts out some holes.
// We just want the inner circle cutout, but deeper and without the
// additional holes.
// In addition we have the option to get a clip axle instead of
// a normal hole for a standard axle.
// This gears are a bit different than the original gears because
// the top of the original teeth is a bit smaller than the gear
// itsself. The replicas have the same width of the teeth at the
// top and the bottom.
// --------------------------------------------------------------------
module normalgear(modulus=1.5, teeth=20, height=5, hole=4.25, clipaxle=false, optimize=true) {
// adjust?
inner_cylinder_radius = 6.75 / 2;
clip_axle_length = 7.5;
clip_axle_thickness = 2.7;
// calculate the approx. radius of the cut out
r1 = (teeth * modulus / 2) - (modulus >= 1 ? 2 * modulus : 1.5);
if (optimize == 1) {
difference () {
// for ease of use we will move the gear to the center position
translate([0,0,height/2])
rotate([0,180,0])
spur_gear (modulus, teeth, height, hole, optimized=false);
// leave 1.5 mm of the gear and cut out the rest
translate([0,0,1.5])
cylinder(h = height, r = r1, center = true );
}
// add an inner cylinder for the axle and subtract the hole or
// clip axle hidden by the just added inner cylinder
if (clipaxle == 1) {
difference() {
cylinder(h = height, r = inner_cylinder_radius, center = true );
clip_axle_hole(length = clip_axle_length, diameter = hole, thickness = clip_axle_thickness);
}
}
else {
difference() {
cylinder(h = height, r = inner_cylinder_radius, center = true );
cylinder(h = height + MANIFOLD_CORRECTION, d = hole, center = true );
}
}
}
else {
// A solid gear is much simpler and also needs only the clip axle
// to be painted if required
translate([0,0,height/2])
rotate([0,180,0])
spur_gear (modulus, teeth, height, hole, optimized=false);
if (clipaxle == 1) {
difference() {
// the radius could be smaller, but so what ...
cylinder(h = height, r = inner_cylinder_radius, center = true );
clip_axle_hole(length = clip_axle_length, diameter = hole, thickness = clip_axle_thickness);
}
}
}
}
// --------------------------------------------------------------------
// This is no Fischertechnik part. It is here just for convinience.
// Build two gears in a line. No optimization because they are stacked
// and no clip axle hole: the hole is too long for it (max 7.5 mm with
// real length of 5 mm, the rest is for the cone of the clip axle).
// --------------------------------------------------------------------
module doublegear(modulus=1.5, teeth1=20, teeth2=10, height=5, hole=4.2) {
normalgear (modulus, teeth1, height, hole, clipaxle=false, optimize = false);
translate([0,0,height-0.01])
normalgear (modulus, teeth2, height, hole, clipaxle=false, optimize = false);
}
// ********************
// ** Build section: **
// ********************
module main() {
if (type == 1){
normalgear (modulus=modulus_1, teeth=teeth_1, height=height_1, hole=hole_diameter, clipaxle=has_clip_axle, optimize=is_optimized);
}
else if (type == 2) {
doublegear (modulus=modulus_1, teeth1=teeth_1, teeth2=teeth_2, height_1, hole_diameter);
}
}
main();