From 11116136f2f36227ca3688fd914513d31e19220b Mon Sep 17 00:00:00 2001 From: TQ Hirsch Date: Thu, 24 Feb 2022 16:31:18 +0100 Subject: [PATCH] Added pulleys, bom item listing --- assembly.scad | 34 ++++++++++++++---------- lib.scad | 5 ++++ parts.scad | 47 +++++++++++++++++++++++++-------- stock_parts.scad | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 24 deletions(-) create mode 100644 lib.scad diff --git a/assembly.scad b/assembly.scad index 9bb06d2..1e67aac 100644 --- a/assembly.scad +++ b/assembly.scad @@ -28,10 +28,12 @@ module corners() { } module rails() { - frame_offset = frame_size / 2 + corner_size / 2; + frame_offset = yrail_offset; colorize(stock_color) { for (xpos = [frame_offset, xsize - frame_offset]) { + rail_len = ysize - corner_offset * 2; + bom_item(printable=false, label = str("steel_bar(d=8mm, len=", rail_len, "mm)")); translate([xpos, frame_size / 2 + wall_thickness]) rotate([-90, 0, 0]) @@ -41,13 +43,15 @@ module rails() { } module ysled_rails() { - frame_offset = frame_size + corner_size / 2; yoff = ysled_rail_spacing / 2; + rail_len = xsize - frame_size - yrail_offset * 2; colorize(stock_color) - for (ypos = [-yoff, yoff]) + for (ypos = [-yoff, yoff]) { + bom_item(printable=false, label = str("steel_bar(d=8mm, len=", rail_len, "mm)")); translate([frame_size / 2, ypos, 0]) rotate([0, 90, 0]) - cylinder(d = rail_diam, h = xsize - frame_size * 2 - corner_size); + cylinder(d = rail_diam, h = rail_len); + } } @@ -59,15 +63,17 @@ module xsled() { } module moving_parts(xpos = cur_xpos, ypos = cur_ypos) { - translate([frame_size / 2 + corner_size / 2, - cur_ypos, 0]) { - ysled_slider(spread = sled_ysize, associated_parts = true); - translate([xsize - frame_size - corner_size, 0, 0]) - rotate([0, 180, 0]) - ysled_slider(spread = sled_ysize, associated_parts = true); - ysled_rails(); + translate([yrail_offset, cur_ypos, 0]) + ysled_slider(spread = sled_ysize); + + translate([xsize - yrail_offset, cur_ypos, 0]) + rotate([0, 180, 0]) + ysled_slider(spread = sled_ysize); + + translate([yrail_offset, cur_ypos, 0]) + if($preview) ysled_rails(); - } + translate([cur_xpos, cur_ypos, 0]) { // xsled(); xsled2(); @@ -75,8 +81,8 @@ module moving_parts(xpos = cur_xpos, ypos = cur_ypos) { } union() { - frame(); - rails(); + if($preview) frame(); + if($preview) rails(); corners(); moving_parts(); } diff --git a/lib.scad b/lib.scad new file mode 100644 index 0000000..7f3f2bf --- /dev/null +++ b/lib.scad @@ -0,0 +1,5 @@ +module bom_item(printable = true, label = "") { + print_label = printable ? " print " : " stock "; + item_label = label == "" ? parent_module(1) : label; + echo(str("BOM:", print_label, item_label)); +} \ No newline at end of file diff --git a/parts.scad b/parts.scad index 21b4c2c..d07f735 100644 --- a/parts.scad +++ b/parts.scad @@ -1,4 +1,5 @@ include ; +include ; include ; include ; @@ -11,6 +12,8 @@ corner_size=30; // will be $L. corner_offset = frame_size / 2 + wall_thickness; rail_diam = 8; +// distance between centerline of rail and centerline of frame Y tube. +yrail_offset = (frame_size + corner_size / 2) / 2; ysled_extralen = frame_size; // on each end @@ -23,6 +26,7 @@ ysled_rail_spacing = (sled_ysize); // Generates bar of length $l, centered on origin extending in +Z module tslot(l) { + bom_item(printable=false, label = str("tslot(", l, "mm)")); colorize(stock_color) { translate([-frame_size/2, -frame_size/2, 0]) cube([frame_size, frame_size, l]); @@ -60,23 +64,28 @@ module rail_holder(in_x) { ldim = frame_size/2 + corner_size; tube_offset = (corner_size) / 2 + wall_thickness; tube_rotation = in_x ? 90 : 0; + + translated_rail_offset = yrail_offset - frame_size / 2; + translate([frame_size/2, frame_size/2, -frame_size/2]) { difference() { linear_extrude(frame_size) - polygon(points = [[wall_thickness, wall_thickness], - [wall_thickness, corner_size], - [corner_size, wall_thickness]]); - translate([corner_size / 2, corner_size/2, frame_size/2]) - rotate([tube_rotation -90, tube_rotation, 0]) - translate([0, 0, -corner_size]) - cylinder(d = rail_diam, corner_size * 2); + polygon(points = [[wall_thickness, wall_thickness], + [wall_thickness, corner_size], + [corner_size, wall_thickness]]); + + translate([translated_rail_offset, translated_rail_offset, frame_size/2]) + rotate([tube_rotation -90, tube_rotation, 0]) + translate([0, 0, -corner_size]) + cylinder(d = rail_diam, corner_size * 4); } } } // centered on -module ysled_slider(spread, associated_parts = false) { +module ysled_slider(spread, associated_parts = $preview) { + bom_item(label = str("ysled_slider(", spread, ")")); sled_len = spread + frame_size; sled_height = frame_size; @@ -145,35 +154,48 @@ module nema17_housing() { } module flcorner() { + bom_item(); rotate([0, 0, 0]) { corner_base(); rail_holder(false); } translate([(corner_size-wall_thickness)/2, 0, 0]) nema17_housing(); + + if($preview) translate([(corner_size - wall_thickness) / 2, -nema17_face/2 - frame_size/2 - wall_thickness, frame_size/2]) { nema17(); + translate([0, 0, 2]) { + pulley(16,6,1,7); + } } } module frcorner() { + bom_item(); rotate([0, 0, 90]) { corner_base(); rail_holder(true); } translate([-(corner_size-wall_thickness)/2, 0, 0]) nema17_housing(); + + if($preview) translate([-(corner_size - wall_thickness) / 2, -nema17_face/2 - frame_size/2 - wall_thickness, frame_size/2]) { nema17(); + translate([0,0,2]) { + pulley(16, 1, 6, 7); + } } } module blcorner() { + bom_item(); rotate([0, 0, 270]) { corner_base(); rail_holder(true); @@ -181,6 +203,7 @@ module blcorner() { } module brcorner() { + bom_item(); rotate([0, 0, 180]) { corner_base(); rail_holder(false); @@ -212,17 +235,20 @@ module xsled_slider() { } } + if($preview) rotate([0, 90, 0]) bushing(); } module sled_cornera() { + bom_item(); corner_base(); translate([-frame_size/2 - wall_thickness, 0, -frame_size]) xsled_slider(); } module sled_cornerb() { + bom_item(); corner_base(); rotate([0,0,90]) translate([-frame_size/2 - wall_thickness, 0, -frame_size]) @@ -270,7 +296,7 @@ module xsled_frame() { } module xsled2() { - + bom_item(); tab_len = bushing_len * 2; tab_thickness = bushing_od + wall_thickness * 2; @@ -368,4 +394,5 @@ module xsled2() { } } // render() -//xsled2(); +// xsled2(); + diff --git a/stock_parts.scad b/stock_parts.scad index 89d3448..35fd58a 100644 --- a/stock_parts.scad +++ b/stock_parts.scad @@ -1,3 +1,6 @@ +include ; +include ; + stock_color = "#aaa4"; bushing_od = 12; @@ -15,6 +18,7 @@ module colorize(colorname) { } module bushing() { + bom_item(printable=false, label="Bushing"); colorize(stock_color) render() { difference() { cylinder(d = bushing_od, h = bushing_len); @@ -26,6 +30,7 @@ module bushing() { // located with the shaft in +z, face on the XY plane module nema17(depth = 23.5) { + bom_item(printable=false, label="NEMA-17 stepper motor"); face = 42.3; screw_pitch = 31 / 2; color(stock_color) @@ -51,3 +56,65 @@ module nema17(depth = 23.5) { } } + +// belts and pulleys +belt_pitch = 2; // 2mm tooth width for GT2 = 2mm pitch +belt_width = 6; +belt_thickness = 3; +tooth_height = 2; + +module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true) { + bom_item(printable=false, label=str( + toothed ? "pulley(" : "idler(", + "teeth=", teeth, ", ", + "flange1=", min(lrim, urim), "mm, ", + "flange2=", max(lrim, urim), "mm, ", + "channel=", belt_width, "mm, ", + "shaft=", shaft, "mm", + ")" + )); + inner_rad = belt_pitch * teeth / TAU; + outer_rad = inner_rad + belt_thickness; + minor_rad = inner_rad - tooth_height; + mid_rad = inner_rad - tooth_height / 2; + + dtheta = 180 / teeth; + + tooth_points = [ + for (i = [1:1:teeth]) + let (theta = i * 360 / teeth) + each [ + [sin(theta) * minor_rad, cos(theta) * minor_rad], + [sin(theta) * inner_rad, cos(theta) * inner_rad], + [sin(theta + dtheta) * inner_rad, cos(theta + dtheta) * inner_rad], + [sin(theta + dtheta) * minor_rad, cos(theta + dtheta) * minor_rad] + ] + ]; + + //echo([each [0:1:teeth]]); + + //echo(tooth_points); + + colorize(stock_color) + render() + difference() { + union() { + cylinder(r=outer_rad, h=lrim); + translate([0,0,lrim]) + if (toothed) { + linear_extrude(belt_width) + polygon(tooth_points, convexity = teeth * 2 + 4); + } else { + cylinder(r = minor_rad, h = belt_width); + } + + translate([0,0,lrim + belt_width]) + cylinder(r=outer_rad, h=urim); + } + + translate([0,0,-1]) + cylinder(d=shaft, h=belt_width + lrim + urim + 2); + } +} + +//!pulley(12, 6, 2, toothed=false); \ No newline at end of file