-// PRUSA iteration3
-// X end idler
-// GNU GPL v3
-// Josef Průša <iam@josefprusa.cz> and contributors
-// http://www.reprap.org/wiki/Prusa_Mendel
-// http://prusamendel.org
-// Alterations for reprap wilson by M. Rice <mrice411@gmail.com>
-
-include <configuration.scad>
-use <x-end.scad>
-
-idler_offs_z = -1; // negative here means "up" when installed
-idler_offs_y = 4;
-
-center_z = 30.25 -1;
-tensioner_size_z = 12;
-
-module x_end_idler_base(){
- x_end_base();
-}
-
-module x_end_idler_holes(){
- x_end_holes();
- translate([0,idler_offs_y,idler_offs_z]) {
- #translate(v=[0,-22,30.25]) rotate(a=[0,-90,0]) cylinder(h = 80, r=idler_bearing[2]/2+.3, $fn=30);
- #translate(v=[2,-22,30.25]) rotate(a=[0,-90,0]) cylinder(h = 10, r=idler_bearing[2]/2 + 1, $fn=30);
- #translate(v=[-21.5,-22,30.25]) rotate(a=[0,-90,0]) rotate(a=[0,0,30]) cylinder(h = 80, r=idler_bearing[2], $fn=6);
-
- // create a notch for the X tensioner, to improve the length of
- // travel available
- translate (v=[0,-22,30.25]) translate(v=[-10,-20,1]) #difference() {
- rotate(a=[45,0,0]) cube(size=[30,22,22],center=true);
- translate(v=[0,14,0]) cube(size=[31,4,8],center=true);
- }
- }
-}
-
-// Final part
-module x_end_idler(){
- mirror([0,1,0]) difference(){
- x_end_idler_base();
- x_end_idler_holes();
- }
-
- // added ridges to keep the tensioner from pitching
- for (x = [-9.8, -20.2], z = [center_z-tensioner_size_z/2 - .5, center_z+tensioner_size_z/2 + .5]) {
- d = 2;
- translate(v=[x,1, z]) intersection () {
- rotate ([45, 0, 90]) cube(size=[20,d, d],center=true);
- translate ([(x < -15) ? d : -d, 0, 0]) rotate ([0, 0, 90]) cube(size=[20,d*2, d*2],center=true);
- }
- }
-}
-
-x_end_idler();
-
-
+// PRUSA iteration3
+// X end idler
+// GNU GPL v3
+// Josef Průša <iam@josefprusa.cz> and contributors
+// http://www.reprap.org/wiki/Prusa_Mendel
+// http://prusamendel.org
+// Alterations for reprap wilson by M. Rice <mrice411@gmail.com>
+
+include <configuration.scad>
+use <x-end.scad>
+use <inc/bearing-guide.scad>
+use <y-drivetrain.scad>
+
+// todo:
+
+// - restore y and z offsets. shift y with bearing_z, z with
+// idler_bearing diameter to maintain a straight belt line
+
+module x_end_idler_base(){
+ x_end_base();
+}
+
+module x_end_idler_holes(){
+ x_end_holes();
+
+ // tensioner mount
+ translate([-20, -15 - z_delta / 2, 30]) {
+ rotate([0, 90, 0]) cylinder(r=m4_diameter / 2, h=33, center=true, $fn=small_hole_segments);
+ translate([15 - 2 * single_wall_width, 0, 0]) rotate([90, 0, 90]) cylinder(r=m4_nut_diameter_horizontal / 2, h=3, $fn=6);
+ }
+ // create a notch for the X tensioner, to improve the length of
+ // travel available
+ // todo: doesn't scale with size of idler bearing correctly
+ translate (v=[x_base_back() + x_box_width/2,(-sqrt(2)*22)/2 + x_base_inside() + idler_bearing[0],x_box_height/2]) difference() {
+ rotate(a=[45,0,0]) cube(size=[x_box_width*2,22,22],center=true);
+ translate(v=[0,14,0]) cube(size=[x_box_width*2,4,8],center=true);
+ }
+}
+
+// Final part
+module x_end_idler(){
+ mirror([0,1,0]) difference(){
+ x_end_idler_base();
+ x_end_idler_holes();
+ }
+
+ %translate([-14 - xy_delta / 2, 25, 30.5 - (max(idler_width, 16) / 2)]) x_tensioner();
+}
+
+module x_tensioner(len=50, idler_height=max(idler_bearing[0], 16)) {
+ // todo: scal narrow_width with size of belt hole, if that becomes scalable
+ idlermount(len=len, rod=m4_diameter / 2 + 0.5, idler_height=idler_height, narrow_len=30, narrow_width=9);
+}
+
+translate([-40, 0, 4 - bushing_xy[0]]) x_tensioner();
+
+x_end_idler();
+
+if (idler_bearing[3] == 1) { // bearing guides
+ translate([-39, -60 - idler_bearing[0] / 2, 4 - bushing_xy[0]]) rotate([0, 0, 55]) {
+ render() bearing_assy();
+ }
+}