// 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 include $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();