// Tube mount for bike trainer control dial // length units are millimeters // built on its side, so depth is x-axis, height is y-axiz, width is z-axis mountWidth = 25.83; mountDepth = 36.7; mountHeight = 6.69; rubberHoleWidth = 5.20; rubberHoleSunkWidth = 8.20; rubberHoleDepth = 8.92; rubberHoleSunkDepth = rubberHoleDepth; rubberHoleSunkHeight = 1.5; screwHoleRadius = 3.50/2; screwHoleDepthOffset = 4.67 + screwHoleRadius; screwSpikeWidthOffset = 7.10; screwSpikeWidth = 2.30; screwSpikeDepthOffset = 2.00; screwSpikeDepth = 5.5; ledgeGapHeightOffset = 2.80; ledgeGapHeight = mountHeight + 0.01 - ledgeGapHeightOffset;//3.18; ledgeGapDepth = 5.41; ledgeGapWidth = 9.02; handlebarStemRadius = 33.45 / 2; handlebarRadius = 32.07 / 2; clampRadius = handlebarRadius + 1.5; clampInnerRadius = handlebarRadius; clampHeightOffset = 3.75; clampEndHeightOffset = clampRadius * 1.85; circleResolution=360*2; // faces per rotation difference() { union() { // mount base cube([mountDepth, mountHeight, mountWidth]); // circular clamp translate([mountDepth/2, clampRadius + clampHeightOffset, mountWidth/2]) { rotate([0, 0, 0]) { difference() { cylinder(h = mountWidth, r = clampRadius, center=true, $fn=circleResolution); union() { cylinder(h = mountWidth * 1.1, r = clampInnerRadius, center=true, $fn=circleResolution); translate([-(clampRadius + 0.01), clampEndHeightOffset - clampRadius, -(mountWidth/2 + 0.01)]) { cube([(clampRadius * 2) + 0.02, clampRadius * 2.02, mountWidth + 0.02]); } } } } } } union() { // hole for rubber grip to clip in translate([(mountDepth/2)-(rubberHoleDepth/2), -0.01, (mountWidth/2) - (rubberHoleWidth/2)]) { cube([rubberHoleDepth, 10, rubberHoleWidth]); } // slightly larger hole so rubber grip clip can clip translate([(mountDepth/2)-(rubberHoleSunkDepth/2), -0.01, (mountWidth/2) - (rubberHoleSunkWidth/2)]) { cube([rubberHoleSunkDepth, mountHeight- rubberHoleSunkHeight, rubberHoleSunkWidth]); } // screw hole translate([screwHoleDepthOffset, -0.01, (mountWidth/2)]) { rotate([-90,0,0]) { cylinder(h = mountHeight + 0.02, r = screwHoleRadius, $fn=circleResolution); } } // lower hole for spikes on each side of screw translate([screwSpikeDepthOffset, -0.01, screwSpikeWidthOffset]) { cube([screwSpikeDepth, 5, screwSpikeWidth]); } // higher hole for spikes on each side of screw translate([screwSpikeDepthOffset, -0.01, mountWidth - (screwSpikeWidth + screwSpikeWidthOffset)]) { cube([screwSpikeDepth, 5, screwSpikeWidth]); } // lower ledge at x-axis high end for dial's clip translate([mountDepth - ledgeGapDepth, ledgeGapHeightOffset, -0.01]) { cube([ledgeGapDepth + 0.01, ledgeGapHeight, ledgeGapWidth + 0.01]); } // higher ledge at x-axis high end for dial's clip translate([mountDepth - ledgeGapDepth, ledgeGapHeightOffset, mountWidth + 0.01 -ledgeGapWidth]) { cube([ledgeGapDepth + 0.01, ledgeGapHeight, ledgeGapWidth + 0.01]); } } }