commit 860d81bf8597c2ff7ac53b8b737731fb8ecca16d Author: TQ Hirsch Date: Tue Feb 22 22:08:01 2022 +0100 Most of the frame up to the Y sleds is done diff --git a/assembly.scad b/assembly.scad new file mode 100644 index 0000000..f2663a3 --- /dev/null +++ b/assembly.scad @@ -0,0 +1,82 @@ +use_colors = true; + +xsize = 500; +ysize = 400; +sled_size = 6 * 25.4; + +cur_xpos = 100; +cur_ypos = 200; + +include ; + + +csize = 15; + +module frame() { + translate([corner_offset, 0, 0]) + rotate([0, 90, 0]) + tslot(xsize - 2 * corner_offset); + + translate([0, corner_offset, 0]) + rotate([-90, 0, 0]) + tslot(ysize - 2*corner_offset); + + translate([corner_offset, ysize, 0]) + rotate([0, 90, 0]) + tslot(xsize - 2*corner_offset); + + translate([xsize, corner_offset, 0]) + rotate([-90, 0, 0]) + tslot(ysize - 2*corner_offset); +} +module corners() { + render() { + translate([0,0]) flcorner(); + translate([xsize, 0, 0]) frcorner(); + translate([xsize, ysize, 0]) brcorner(); + translate([0, ysize, 0]) blcorner(); + } +} + +module rails() { + frame_offset = frame_size / 2 + corner_size / 2; + colorize(stock_color) + { + for (xpos = [frame_offset, xsize - frame_offset]) { + translate([xpos, + frame_size / 2 + wall_thickness]) + rotate([-90, 0, 0]) + cylinder(d = rail_diam, h = ysize - corner_offset * 2); + } + } +} + +module ysled_rails() { + frame_offset = frame_size + corner_size / 2; + yoff = (sled_size + ysled_extralen * 2 - frame_size) / 2; + colorize(stock_color) + for (ypos = [-yoff, yoff]) + translate([frame_size / 2, ypos, 0]) + rotate([0, 90, 0]) + cylinder(d = rail_diam, h = xsize - frame_size * 2 - corner_size); +} + + + +union() { + frame(); + rails(); + corners(); +} + +translate([frame_size / 2 + corner_size / 2, cur_ypos, 0]) { + ysled(associated_parts = true); + translate([xsize - frame_size - corner_size, 0, 0]) + rotate([0, 180, 0]) + ysled(associated_parts = true); + ysled_rails(); +} + + //translate([0, 0, -1000]) cube(2000, center=true); + + diff --git a/parts.scad b/parts.scad new file mode 100644 index 0000000..1e0fd72 --- /dev/null +++ b/parts.scad @@ -0,0 +1,139 @@ +include ; +include ; + +frame_size = 20; +wall_thickness = 2; +corner_size=30; +// The length along each edge that the corner bracket takes. I.e., if +// you construct a frame of four corner brackets and 4 tubes of length +// $L-$corner_size, the distance between opposite tubes' centerlines +// will be $L. +corner_offset = frame_size / 2 + wall_thickness; +rail_diam = 8; + +ysled_extralen = frame_size; // on each end + + + +// Generates bar of length $l, centered on origin extending in +Z +module tslot(l) { + colorize(stock_color) { + translate([-frame_size/2, -frame_size/2, 0]) + cube([frame_size, frame_size, l]); + } +} + +// A corner, with tubes extending in +x and +y. +module corner_base() { + odim = frame_size/2 + wall_thickness; + ldim = frame_size/2 + corner_size; + cap_points = [[-odim, -odim], + [-odim, ldim], + [ odim, ldim], + [ ldim, odim], + [ ldim, -odim]]; + difference() { + translate([0, 0, -odim]) + linear_extrude(odim * 2) + polygon(points = cap_points); + + // two bars... + translate([-frame_size/2, corner_offset, -frame_size/2]) + cube([frame_size, ldim, frame_size]); + translate([corner_offset, -frame_size/2, -frame_size/2]) + cube([ldim, frame_size, frame_size]); + translate([corner_offset, corner_offset, -frame_size/2]) + cube([ldim, ldim, frame_size]); + //translate([-odim - 1, -odim - 1, 0]) + //cube(ldim*2); + } +} + +module rail_holder(in_x) { + odim = frame_size/2 + wall_thickness; + ldim = frame_size/2 + corner_size; + tube_offset = (corner_size) / 2 + wall_thickness; + tube_rotation = in_x ? 90 : 0; + 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); + + } + } +} + +// centered on +module ysled(spread = 6*inch, associated_parts = false) { + sled_len = spread + ysled_extralen * 2; + sled_height = frame_size; + + colorize("green") + render() + translate([0, -sled_len/2, 0]) + rotate([-90, 0, 0]) { + difference() { + union() { + translate([-frame_size/2, -frame_size/2, 0]) + cube([frame_size + 5, frame_size, sled_len]); + } + + cylinder(d = bushing_id * 1.1, h = sled_len); + + translate([0,0,-1]) + cylinder(d = bushing_od, h = bushing_len+1); + translate([0,0,sled_len - bushing_len]) + cylinder(d = bushing_od, h = bushing_len+1); + + for (zpos = [frame_size / 2, sled_len - frame_size / 2]) { + translate([sled_height/2, 0, zpos]) + rotate([0,90,0]) { + cylinder(h = sled_height + 1, d = rail_diam); + } + } + } + } + // TODO: add posts for the idlers + + translate([0, -sled_len/2, 0]) + rotate([-90, 0, 0]) + if (associated_parts) { + bushing(); + translate([0,0,sled_len - bushing_len]) bushing(); + } +} + +module flcorner() { + translate([0, 0, 0]) + rotate([0, 0, 0]) { + corner_base(); + rail_holder(false); + } +} + +module frcorner() { + rotate([0, 0, 90]) { + corner_base(); + rail_holder(true); + } +} + +module blcorner() { + rotate([0, 0, 270]) { + corner_base(); + rail_holder(true); + } +} + +module brcorner() { + rotate([0, 0, 180]) { + corner_base(); + rail_holder(false); + } +} diff --git a/stock_parts.scad b/stock_parts.scad new file mode 100644 index 0000000..6bbebd1 --- /dev/null +++ b/stock_parts.scad @@ -0,0 +1,23 @@ +stock_color = "lightgray"; + +bushing_od = 12; +bushing_id = 8; +bushing_len = 8; + +module bushing() { + colorize(stock_color) { + difference() { + cylinder(d = bushing_od, h = bushing_len); + translate([0,0,-1]) + cylinder(d = bushing_id, h = bushing_len + 2); + } + } +} + +module colorize(colorname) { + if (use_colors) { + color(colorname) union() { children(); } + } else { + children(); + } +} diff --git a/units.inc b/units.inc new file mode 100644 index 0000000..8c1070a --- /dev/null +++ b/units.inc @@ -0,0 +1,2 @@ +inch = 25.4; +cm = 10; \ No newline at end of file