Ran openscad-format over everything
This commit is contained in:
@@ -1,43 +1,37 @@
|
||||
include <constants.scad>;
|
||||
include <parts.scad>;
|
||||
include <constants.scad>
|
||||
include <parts.scad>
|
||||
|
||||
csize = 15;
|
||||
|
||||
module frame() {
|
||||
translate([corner_offset, 0, 0])
|
||||
rotate([0, 90, 0])
|
||||
tslot(xsize - 2 * corner_offset);
|
||||
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([ 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([ 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);
|
||||
translate([ xsize, corner_offset, 0 ]) rotate([ -90, 0, 0 ])
|
||||
tslot(ysize - 2 * corner_offset);
|
||||
}
|
||||
module corners() {
|
||||
translate([0,0]) flcorner();
|
||||
translate([xsize, 0, 0]) frcorner();
|
||||
translate([xsize, ysize, 0]) brcorner();
|
||||
translate([0, ysize, 0]) blcorner();
|
||||
translate([ 0, 0 ]) flcorner();
|
||||
translate([ xsize, 0, 0 ]) frcorner();
|
||||
translate([ xsize, ysize, 0 ]) brcorner();
|
||||
translate([ 0, ysize, 0 ]) blcorner();
|
||||
}
|
||||
|
||||
module rails() {
|
||||
frame_offset = yrail_offset;
|
||||
colorize(stock_color)
|
||||
{
|
||||
for (xpos = [frame_offset, xsize - frame_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])
|
||||
cylinder(d = rail_diam, h = 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 ])
|
||||
cylinder(d = rail_diam, h = ysize - corner_offset * 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,45 +39,39 @@ module rails() {
|
||||
module ysled_rails() {
|
||||
yoff = ysled_rail_spacing / 2;
|
||||
rail_len = xsize - frame_size - yrail_offset * 2;
|
||||
colorize(stock_color)
|
||||
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 = rail_len);
|
||||
colorize(stock_color) 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 = rail_len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module xsled() {
|
||||
xdiff = sled_xsize / 2 + frame_size / 2;
|
||||
|
||||
translate([0, 0, frame_size])
|
||||
xsled_frame();
|
||||
translate([ 0, 0, frame_size ]) xsled_frame();
|
||||
}
|
||||
|
||||
module moving_parts(xpos = cur_xpos, ypos = cur_ypos) {
|
||||
translate([yrail_offset, cur_ypos, 0])
|
||||
ysled_slider(spread = sled_ysize);
|
||||
|
||||
translate([xsize - yrail_offset, cur_ypos, 0])
|
||||
rotate([180, 180, 0])
|
||||
ysled_slider(spread = sled_ysize);
|
||||
|
||||
translate([yrail_offset, cur_ypos, 0])
|
||||
if($preview) ysled_rails();
|
||||
|
||||
|
||||
translate([cur_xpos, cur_ypos, 0]) {
|
||||
// xsled();
|
||||
translate([ yrail_offset, cur_ypos, 0 ]) ysled_slider(spread = sled_ysize);
|
||||
|
||||
translate([ xsize - yrail_offset, cur_ypos, 0 ]) rotate([ 180, 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();
|
||||
}
|
||||
}
|
||||
|
||||
union() {
|
||||
if($preview) frame();
|
||||
if($preview) rails();
|
||||
if ($preview)
|
||||
frame();
|
||||
if ($preview)
|
||||
rails();
|
||||
corners();
|
||||
moving_parts();
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ cur_xpos = 155;
|
||||
// 140..260
|
||||
cur_ypos = 140;
|
||||
|
||||
echo(str("Range = ", [ xsize - xmin * 2, ysize - ymin*2 ]));
|
||||
echo(str("Range = ", [ xsize - xmin * 2, ysize - ymin * 2 ]));
|
||||
|
||||
$fs = 1.5;
|
||||
$include_substock = true;
|
||||
|
||||
6
lib.scad
6
lib.scad
@@ -1,5 +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));
|
||||
print_label = printable ? " print " : " stock ";
|
||||
item_label = label == "" ? parent_module(1) : label;
|
||||
echo(str("BOM:", print_label, item_label));
|
||||
}
|
||||
448
parts.scad
448
parts.scad
@@ -1,11 +1,11 @@
|
||||
include <units.inc>;
|
||||
include <lib.scad>;
|
||||
include <constants.scad>;
|
||||
include <stock_parts.scad>;
|
||||
include <constants.scad>
|
||||
include <lib.scad>
|
||||
include <stock_parts.scad>
|
||||
include <units.inc>
|
||||
|
||||
frame_size = 20;
|
||||
wall_thickness = 2;
|
||||
corner_size=30;
|
||||
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
|
||||
@@ -26,63 +26,59 @@ belt_height2 = belt_height1 + belt_width + 2;
|
||||
ysled_rail_spacing = (sled_ysize);
|
||||
motor_shaft_xoffset = (corner_size - wall_thickness) / 2;
|
||||
|
||||
|
||||
|
||||
// Generates bar of length $l, centered on origin extending in +Z
|
||||
module tslot(l) {
|
||||
bom_item(printable=false, label = str("tslot(", l, "mm)"));
|
||||
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]);
|
||||
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]];
|
||||
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);
|
||||
|
||||
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);
|
||||
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;
|
||||
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;
|
||||
|
||||
translated_rail_offset = yrail_offset - frame_size / 2;
|
||||
|
||||
translate([frame_size/2, frame_size/2, -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]]);
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,59 +89,52 @@ module ysled_slider(spread, associated_parts = $preview) {
|
||||
sled_len = spread + frame_size;
|
||||
sled_height = frame_size;
|
||||
idler_spacing = spread / 3;
|
||||
|
||||
colorize("green")
|
||||
render()
|
||||
translate([0, -sled_len/2, 0])
|
||||
rotate([-90, 0, 0]) {
|
||||
|
||||
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]);
|
||||
translate([pulley_sbend_offset - yrail_offset + motor_shaft_xoffset - pulley_clearance_rad - 4,
|
||||
-frame_size / 2, 0])
|
||||
cube([frame_size + 5, frame_size, sled_len]);
|
||||
translate([ -frame_size / 2, -frame_size / 2, 0 ])
|
||||
cube([ frame_size + 5, frame_size, sled_len ]);
|
||||
translate([
|
||||
pulley_sbend_offset - yrail_offset + motor_shaft_xoffset -
|
||||
pulley_clearance_rad - 4,
|
||||
-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);
|
||||
}
|
||||
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
|
||||
|
||||
//color("#f00")
|
||||
translate([pulley_sbend_offset - yrail_offset + motor_shaft_xoffset, 0, 0]) {
|
||||
translate([0, idler_spacing / 2, 0]) {
|
||||
|
||||
// color("#f00")
|
||||
translate(
|
||||
[ pulley_sbend_offset - yrail_offset + motor_shaft_xoffset, 0, 0 ]) {
|
||||
translate([ 0, idler_spacing / 2, 0 ]) {
|
||||
idler_post(belt_height = belt_height1);
|
||||
}
|
||||
translate([0, -idler_spacing / 2, 0]) {
|
||||
*cylinder(d=3, h=30, $fs=1);
|
||||
translate([ 0, -idler_spacing / 2, 0 ]) {
|
||||
*cylinder(d = 3, h = 30, $fs = 1);
|
||||
*idler(belt_height2);
|
||||
rotate([0, 0, -90]) {
|
||||
idler_post(belt_height = belt_height2);
|
||||
}
|
||||
|
||||
rotate([ 0, 0, -90 ]) { idler_post(belt_height = belt_height2); }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
translate([0, -sled_len/2, 0])
|
||||
rotate([-90, 0, 0])
|
||||
if (associated_parts) {
|
||||
translate([ 0, -sled_len / 2, 0 ])
|
||||
rotate([ -90, 0, 0 ]) if (associated_parts) {
|
||||
bushing();
|
||||
translate([0,0,sled_len - bushing_len]) bushing();
|
||||
translate([ 0, 0, sled_len - bushing_len ]) bushing();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,33 +144,26 @@ module nema17_housing() {
|
||||
hdepth = frame_size + wall_thickness * 2;
|
||||
|
||||
screw_dxy = 31 / 2;
|
||||
translate([0,
|
||||
-nema17_face/2 - frame_size/2 - wall_thickness,
|
||||
0])
|
||||
render()
|
||||
difference() {
|
||||
cube([hwidth, hheight, hdepth],
|
||||
center=true);
|
||||
translate([ 0, -nema17_face / 2 - frame_size / 2 - wall_thickness, 0 ])
|
||||
render() difference() {
|
||||
cube([ hwidth, hheight, hdepth ], center = true);
|
||||
|
||||
translate([0,0,-2])
|
||||
cube([nema17_face+1, nema17_face+1, hdepth],
|
||||
center=true);
|
||||
cylinder(d=23, frame_size);
|
||||
translate([ 0, 0, -2 ])
|
||||
cube([ nema17_face + 1, nema17_face + 1, hdepth ], center = true);
|
||||
cylinder(d = 23, frame_size);
|
||||
|
||||
for (x = [-screw_dxy, screw_dxy],
|
||||
y = [-screw_dxy, screw_dxy])
|
||||
translate([x, y, frame_size/2 + wall_thickness])
|
||||
rotate([180, 0, 0]){
|
||||
cylinder(d=5,h=3);
|
||||
for (x = [ -screw_dxy, screw_dxy ], y = [ -screw_dxy, screw_dxy ])
|
||||
translate([ x, y, frame_size / 2 + wall_thickness ])
|
||||
rotate([ 180, 0, 0 ]) {
|
||||
cylinder(d = 5, h = 3);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// belt height is the center of the belt.
|
||||
// Roration is in Z axis, from +x/+y
|
||||
module idler_post(belt_height, toothed=true) {
|
||||
gap=0.5;
|
||||
module idler_post(belt_height, toothed = true) {
|
||||
gap = 0.5;
|
||||
|
||||
post_radius = pulley_clearance_rad + 4;
|
||||
top_shelf_thickness = 4;
|
||||
@@ -193,23 +175,22 @@ module idler_post(belt_height, toothed=true) {
|
||||
union() {
|
||||
// outer shell
|
||||
cylinder(h = total_height, r = post_radius);
|
||||
translate([0, -post_radius, 0])
|
||||
cube([post_radius, post_radius, total_height]);
|
||||
translate([-post_radius,0, 0])
|
||||
cube([post_radius, post_radius, total_height]);
|
||||
translate([ 0, -post_radius, 0 ])
|
||||
cube([ post_radius, post_radius, total_height ]);
|
||||
translate([ -post_radius, 0, 0 ])
|
||||
cube([ post_radius, post_radius, total_height ]);
|
||||
}
|
||||
|
||||
translate([0,0,belt_height - idler_zmargin.x - gap]) {
|
||||
translate([ 0, 0, belt_height - idler_zmargin.x - gap ]) {
|
||||
cylinder(r = slot_radius, slot_height);
|
||||
translate([-slot_radius, 0, 0])
|
||||
cube([post_radius*2, post_radius * 2, slot_height]);
|
||||
translate([0, -slot_radius, 0])
|
||||
cube([post_radius * 2, post_radius * 2, slot_height]);
|
||||
translate([ -slot_radius, 0, 0 ])
|
||||
cube([ post_radius * 2, post_radius * 2, slot_height ]);
|
||||
translate([ 0, -slot_radius, 0 ])
|
||||
cube([ post_radius * 2, post_radius * 2, slot_height ]);
|
||||
}
|
||||
|
||||
cylinder(d = 3, h=total_height + 1, $fn=60);
|
||||
translate([0, 0, total_height - 2])
|
||||
cylinder(r = 3, h = 3);
|
||||
cylinder(d = 3, h = total_height + 1, $fn = 60);
|
||||
translate([ 0, 0, total_height - 2 ]) cylinder(r = 3, h = 3);
|
||||
}
|
||||
|
||||
idler(height = belt_height);
|
||||
@@ -217,49 +198,45 @@ module idler_post(belt_height, toothed=true) {
|
||||
|
||||
module flcorner() {
|
||||
bom_item();
|
||||
rotate([0, 0, 0]) {
|
||||
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, -frame_size/2 + belt_height2]) {
|
||||
active_pulley();
|
||||
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, -frame_size / 2 + belt_height2 ]) { active_pulley(); }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module frcorner() {
|
||||
bom_item();
|
||||
rotate([0, 0, 90]) {
|
||||
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,belt_height1 - frame_size / 2]) {
|
||||
rotate([180,0,0])
|
||||
active_pulley();
|
||||
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, belt_height1 - frame_size / 2 ]) {
|
||||
rotate([ 180, 0, 0 ]) active_pulley();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module blcorner() {
|
||||
bom_item();
|
||||
rotate([0, 0, 270]) {
|
||||
rotate([ 0, 0, 270 ]) {
|
||||
corner_base();
|
||||
rail_holder(true);
|
||||
}
|
||||
@@ -267,7 +244,7 @@ module blcorner() {
|
||||
|
||||
module brcorner() {
|
||||
bom_item();
|
||||
rotate([0, 0, 180]) {
|
||||
rotate([ 0, 0, 180 ]) {
|
||||
corner_base();
|
||||
rail_holder(false);
|
||||
}
|
||||
@@ -277,84 +254,65 @@ module xsled_slider() {
|
||||
slider_len = bushing_len + 10;
|
||||
screw_tab_len = 20;
|
||||
screw_tab_thickness = 10;
|
||||
|
||||
|
||||
render()
|
||||
//translate([screw_tab_len, 0, 0])
|
||||
difference() {
|
||||
// translate([screw_tab_len, 0, 0])
|
||||
difference() {
|
||||
union() {
|
||||
rotate([0, 90, 0]) {
|
||||
cylinder(d = frame_size, h = slider_len);
|
||||
}
|
||||
rotate([ 0, 90, 0 ]) { cylinder(d = frame_size, h = slider_len); }
|
||||
|
||||
translate([0, -frame_size/2, 0])
|
||||
cube([slider_len, frame_size, frame_size / 2]);
|
||||
translate([ 0, -frame_size / 2, 0 ])
|
||||
cube([ slider_len, frame_size, frame_size / 2 ]);
|
||||
|
||||
*translate([-screw_tab_len, -frame_size/2, frame_size/2])
|
||||
cube([screw_tab_len * 2 + slider_len, frame_size, screw_tab_thickness]);
|
||||
*translate([ -screw_tab_len, -frame_size / 2, frame_size / 2 ]) cube(
|
||||
[ screw_tab_len * 2 + slider_len, frame_size, screw_tab_thickness ]);
|
||||
}
|
||||
rotate([0, 90, 0]) {
|
||||
rotate([ 0, 90, 0 ]) {
|
||||
cylinder(d = bushing_od, h = bushing_len);
|
||||
cylinder(d = rail_diam * 1.1, slider_len * 2);
|
||||
}
|
||||
|
||||
}
|
||||
if($preview)
|
||||
rotate([0, 90, 0])
|
||||
bushing();
|
||||
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();
|
||||
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])
|
||||
xsled_slider();
|
||||
rotate([ 0, 0, 90 ])
|
||||
translate([ -frame_size / 2 - wall_thickness, 0, -frame_size ])
|
||||
xsled_slider();
|
||||
}
|
||||
|
||||
module xsled_frame() {
|
||||
translate([-sled_xsize / 2 + corner_offset, -ysled_rail_spacing/2, 0])
|
||||
rotate([0, 90, 0])
|
||||
tslot(sled_xsize - corner_offset * 2);
|
||||
translate([-sled_xsize / 2 + corner_offset, ysled_rail_spacing/2, 0])
|
||||
rotate([0, 90, 0])
|
||||
tslot(sled_xsize - corner_offset * 2);
|
||||
translate([-sled_xsize / 2, -ysled_rail_spacing/2 + corner_offset, 0])
|
||||
rotate([-90, 0, 0])
|
||||
tslot(sled_ysize - corner_offset * 2);
|
||||
translate([sled_xsize / 2, -ysled_rail_spacing/2 + corner_offset, 0])
|
||||
rotate([-90, 0, 0])
|
||||
tslot(sled_ysize - corner_offset * 2);
|
||||
translate([ -sled_xsize / 2 + corner_offset, -ysled_rail_spacing / 2, 0 ])
|
||||
rotate([ 0, 90, 0 ]) tslot(sled_xsize - corner_offset * 2);
|
||||
translate([ -sled_xsize / 2 + corner_offset, ysled_rail_spacing / 2, 0 ])
|
||||
rotate([ 0, 90, 0 ]) tslot(sled_xsize - corner_offset * 2);
|
||||
translate([ -sled_xsize / 2, -ysled_rail_spacing / 2 + corner_offset, 0 ])
|
||||
rotate([ -90, 0, 0 ]) tslot(sled_ysize - corner_offset * 2);
|
||||
translate([ sled_xsize / 2, -ysled_rail_spacing / 2 + corner_offset, 0 ])
|
||||
rotate([ -90, 0, 0 ]) tslot(sled_ysize - corner_offset * 2);
|
||||
|
||||
translate([-sled_xsize / 2, -sled_ysize / 2, 0])
|
||||
sled_cornera();
|
||||
translate([sled_xsize / 2, sled_ysize / 2, 0])
|
||||
rotate([0,0,180])
|
||||
sled_cornera();
|
||||
|
||||
translate([sled_xsize / 2, -sled_ysize / 2, 0])
|
||||
rotate([0,0,90])
|
||||
sled_cornerb();
|
||||
translate([-sled_xsize / 2, sled_ysize / 2, 0])
|
||||
rotate([0,0,270])
|
||||
sled_cornerb();
|
||||
translate([ -sled_xsize / 2, -sled_ysize / 2, 0 ]) sled_cornera();
|
||||
translate([ sled_xsize / 2, sled_ysize / 2, 0 ]) rotate([ 0, 0, 180 ])
|
||||
sled_cornera();
|
||||
|
||||
translate([ sled_xsize / 2, -sled_ysize / 2, 0 ]) rotate([ 0, 0, 90 ])
|
||||
sled_cornerb();
|
||||
translate([ -sled_xsize / 2, sled_ysize / 2, 0 ]) rotate([ 0, 0, 270 ])
|
||||
sled_cornerb();
|
||||
|
||||
// simulate a piece of film
|
||||
if (false) {
|
||||
color("#0008")
|
||||
cube([
|
||||
5*inch,
|
||||
4*inch,
|
||||
1
|
||||
],
|
||||
center=true);
|
||||
color("#0008") cube([ 5 * inch, 4 * inch, 1 ], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -371,34 +329,28 @@ module xsled2() {
|
||||
lip_width = glass_thickness;
|
||||
|
||||
glass_holder_points = [
|
||||
[0,0],
|
||||
[lip_depth + wall_thickness, 0],
|
||||
[lip_depth + wall_thickness, wall_thickness + 0.5],
|
||||
[lip_depth, wall_thickness + 0.5],
|
||||
[lip_depth, wall_thickness + glass_thickness],
|
||||
[lip_depth - glass_thickness, wall_thickness + glass_thickness],
|
||||
[lip_depth - glass_thickness, wall_thickness + glass_thickness*2],
|
||||
[0, tab_thickness]
|
||||
[ 0, 0 ], [ lip_depth + wall_thickness, 0 ],
|
||||
[ lip_depth + wall_thickness, wall_thickness + 0.5 ],
|
||||
[ lip_depth, wall_thickness + 0.5 ],
|
||||
[ lip_depth, wall_thickness + glass_thickness ],
|
||||
[ lip_depth - glass_thickness, wall_thickness + glass_thickness ],
|
||||
[ lip_depth - glass_thickness, wall_thickness + glass_thickness * 2 ],
|
||||
[ 0, tab_thickness ]
|
||||
];
|
||||
|
||||
|
||||
for (xsign = [1,-1],
|
||||
ysign = [1,-1]) {
|
||||
translate([sled_xsize / 2 * xsign,
|
||||
sled_ysize / 2 * ysign,
|
||||
0])
|
||||
rotate([0, -90 * xsign, 0]) {
|
||||
for (xsign = [ 1, -1 ], ysign = [ 1, -1 ]) {
|
||||
translate([ sled_xsize / 2 * xsign, sled_ysize / 2 * ysign, 0 ])
|
||||
rotate([ 0, -90 * xsign, 0 ]) {
|
||||
difference() {
|
||||
union() {
|
||||
cylinder(d = tab_thickness, h = tab_len);
|
||||
translate([-tab_thickness/2,
|
||||
ysign > 0 ? -tab_thickness/2: 0,
|
||||
0])
|
||||
cube([tab_thickness, tab_thickness/2, tab_len]);
|
||||
translate(
|
||||
[ -tab_thickness / 2, ysign > 0 ? -tab_thickness / 2 : 0, 0 ])
|
||||
cube([ tab_thickness, tab_thickness / 2, tab_len ]);
|
||||
}
|
||||
translate([0,0,-0.5]) {
|
||||
cylinder(d = bushing_od, h = bushing_len+0.5);
|
||||
cylinder(d = rail_diam * 1.1 , h = tab_len + 1);
|
||||
translate([ 0, 0, -0.5 ]) {
|
||||
cylinder(d = bushing_od, h = bushing_len + 0.5);
|
||||
cylinder(d = rail_diam * 1.1, h = tab_len + 1);
|
||||
}
|
||||
}
|
||||
if ($preview) {
|
||||
@@ -406,59 +358,55 @@ module xsled2() {
|
||||
}
|
||||
}
|
||||
|
||||
//cube([sled_xsize, inner_ysize, tab_thickness/2], center=true);
|
||||
// cube([sled_xsize, inner_ysize, tab_thickness/2], center=true);
|
||||
difference() {
|
||||
union() {
|
||||
translate([-sled_xsize/2, -inner_ysize/2, -tab_thickness/2])
|
||||
rotate([0, 90, 0])
|
||||
rotate([0,0,90])
|
||||
linear_extrude(sled_xsize)
|
||||
polygon(glass_holder_points);
|
||||
translate([ -sled_xsize / 2, -inner_ysize / 2, -tab_thickness / 2 ])
|
||||
rotate([ 0, 90, 0 ]) rotate([ 0, 0, 90 ]) linear_extrude(sled_xsize)
|
||||
polygon(glass_holder_points);
|
||||
|
||||
translate([sled_xsize/2, inner_ysize/2, -tab_thickness/2])
|
||||
rotate([0, 90, 180])
|
||||
rotate([0,0,90])
|
||||
linear_extrude(sled_xsize)
|
||||
polygon(glass_holder_points);
|
||||
translate([ sled_xsize / 2, inner_ysize / 2, -tab_thickness / 2 ])
|
||||
rotate([ 0, 90, 180 ]) rotate([ 0, 0, 90 ])
|
||||
linear_extrude(sled_xsize) polygon(glass_holder_points);
|
||||
|
||||
translate([sled_xsize/2, -inner_ysize/2, -tab_thickness/2])
|
||||
rotate([0, 90, 90])
|
||||
rotate([0,0,90])
|
||||
linear_extrude(inner_ysize)
|
||||
polygon(glass_holder_points);
|
||||
translate([ sled_xsize / 2, -inner_ysize / 2, -tab_thickness / 2 ])
|
||||
rotate([ 0, 90, 90 ]) rotate([ 0, 0, 90 ])
|
||||
linear_extrude(inner_ysize) polygon(glass_holder_points);
|
||||
|
||||
translate([-sled_xsize/2, inner_ysize/2, -tab_thickness/2])
|
||||
rotate([0, 90, -90])
|
||||
rotate([0,0,90])
|
||||
linear_extrude(inner_ysize)
|
||||
polygon(glass_holder_points);
|
||||
translate([ -sled_xsize / 2, inner_ysize / 2, -tab_thickness / 2 ])
|
||||
rotate([ 0, 90, -90 ]) rotate([ 0, 0, 90 ])
|
||||
linear_extrude(inner_ysize) polygon(glass_holder_points);
|
||||
}
|
||||
|
||||
translate([-10, inner_ysize/2 - 1 - lip_depth + glass_thickness, -tab_thickness/2 + wall_thickness + glass_thickness])
|
||||
cube([20, glass_thickness + 1, 30]);
|
||||
translate([
|
||||
-10, inner_ysize / 2 - 1 - lip_depth + glass_thickness,
|
||||
-tab_thickness / 2 + wall_thickness +
|
||||
glass_thickness
|
||||
]) cube([ 20, glass_thickness + 1, 30 ]);
|
||||
}
|
||||
}
|
||||
|
||||
color("#fff3")
|
||||
if ($preview) {
|
||||
color("#fff3") if ($preview) {
|
||||
// draw glass sheets
|
||||
translate([0,0,-tab_thickness/2 + wall_thickness + glass_thickness/2])
|
||||
cube([sled_xsize - lip_depth*2, inner_ysize - lip_depth*2, glass_thickness],
|
||||
center=true);
|
||||
translate([0,0,-tab_thickness/2 + wall_thickness + 3*glass_thickness/2])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - lip_depth*2 + glass_thickness*2,
|
||||
inner_ysize - lip_depth*2 + glass_thickness*2,
|
||||
glass_thickness
|
||||
],
|
||||
center=true);
|
||||
|
||||
translate(
|
||||
[ 0, 0, -tab_thickness / 2 + wall_thickness + glass_thickness / 2 ])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - lip_depth * 2, inner_ysize - lip_depth * 2,
|
||||
glass_thickness
|
||||
],
|
||||
center = true);
|
||||
translate(
|
||||
[ 0, 0, -tab_thickness / 2 + wall_thickness + 3 * glass_thickness / 2 ])
|
||||
cube(
|
||||
[
|
||||
sled_xsize - lip_depth * 2 + glass_thickness * 2,
|
||||
inner_ysize - lip_depth * 2 + glass_thickness * 2,
|
||||
glass_thickness
|
||||
],
|
||||
center = true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// render()
|
||||
// xsled2();
|
||||
|
||||
|
||||
115
stock_parts.scad
115
stock_parts.scad
@@ -1,5 +1,5 @@
|
||||
include <MCAD/math.scad>;
|
||||
include <lib.scad>;
|
||||
include <MCAD/math.scad>
|
||||
include <lib.scad>
|
||||
|
||||
stock_color = "#aaa4";
|
||||
|
||||
@@ -18,128 +18,111 @@ module colorize(colorname) {
|
||||
}
|
||||
|
||||
module bushing() {
|
||||
bom_item(printable=false, label="Bushing");
|
||||
bom_item(printable = false, label = "Bushing");
|
||||
colorize(stock_color) render() {
|
||||
difference() {
|
||||
cylinder(d = bushing_od, h = bushing_len);
|
||||
translate([0,0,-1])
|
||||
cylinder(d = bushing_id, h = bushing_len + 2);
|
||||
translate([ 0, 0, -1 ]) cylinder(d = bushing_id, h = bushing_len + 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// located with the shaft in +z, face on the XY plane
|
||||
// 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");
|
||||
bom_item(printable = false, label = "NEMA-17 stepper motor");
|
||||
face = 42.3;
|
||||
screw_pitch = 31 / 2;
|
||||
color(stock_color)
|
||||
render()
|
||||
difference() {
|
||||
color(stock_color) render() difference() {
|
||||
union() {
|
||||
translate([-face/2, -face/2, -depth])
|
||||
cube([face, face, depth]);
|
||||
translate([0,0,-1]) {
|
||||
cylinder(d=22, h=2+1);
|
||||
cylinder(d=5, h=22+1);
|
||||
translate([ -face / 2, -face / 2, -depth ]) cube([ face, face, depth ]);
|
||||
translate([ 0, 0, -1 ]) {
|
||||
cylinder(d = 22, h = 2 + 1);
|
||||
cylinder(d = 5, h = 22 + 1);
|
||||
}
|
||||
}
|
||||
translate([1.25, -5, 4])
|
||||
cube([10, 10, 20]);
|
||||
translate([ 1.25, -5, 4 ]) cube([ 10, 10, 20 ]);
|
||||
|
||||
// screw holes
|
||||
for (x = [-screw_pitch, screw_pitch],
|
||||
y = [-screw_pitch, screw_pitch]) {
|
||||
translate([x,y,-10])
|
||||
cylinder(d=5,h=20);
|
||||
for (x = [ -screw_pitch, screw_pitch ], y = [ -screw_pitch, screw_pitch ]) {
|
||||
translate([ x, y, -10 ]) cylinder(d = 5, h = 20);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// belts and pulleys
|
||||
belt_pitch = 2; // 2mm tooth width for GT2 = 2mm pitch
|
||||
belt_width = 6;
|
||||
belt_thickness = 1.38;
|
||||
belt_pld = 0.254; // distance between line of fixed length and tips of gear teeth
|
||||
belt_pld =
|
||||
0.254; // distance between line of fixed length and tips of gear teeth
|
||||
belt_backing = 0.63 - belt_pld;
|
||||
tooth_height = 0.75;
|
||||
|
||||
pulley_od = 13;
|
||||
pulley_clearance_rad = pulley_od / 2 + 2.5;
|
||||
|
||||
module pulley(teeth, lrim, urim, belt_width, shaft=5, toothed=true, od = 0) {
|
||||
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",
|
||||
")"
|
||||
));
|
||||
module pulley(teeth, lrim, urim, belt_width, shaft = 5, toothed = true,
|
||||
od = 0) {
|
||||
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", ")"));
|
||||
nominal_rad = belt_pitch * teeth / TAU;
|
||||
inner_rad = nominal_rad - belt_pld;
|
||||
outer_rad = (od > 0) ? od / 2 : nominal_rad + belt_backing;
|
||||
outer_rad = (od > 0) ? od / 2 : nominal_rad + belt_backing;
|
||||
minor_rad = inner_rad - tooth_height;
|
||||
mid_rad = inner_rad - tooth_height / 2;
|
||||
idler_rad = nominal_rad - belt_backing;
|
||||
|
||||
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]
|
||||
]
|
||||
];
|
||||
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([each [0:1:teeth]]);
|
||||
|
||||
//echo(tooth_points);
|
||||
// echo(tooth_points);
|
||||
|
||||
colorize(stock_color)
|
||||
render()
|
||||
difference() {
|
||||
colorize(stock_color) render() difference() {
|
||||
union() {
|
||||
cylinder(r=outer_rad, h=lrim);
|
||||
translate([0,0,lrim])
|
||||
if (toothed) {
|
||||
cylinder(r = outer_rad, h = lrim);
|
||||
translate([ 0, 0, lrim ]) if (toothed) {
|
||||
linear_extrude(belt_width)
|
||||
polygon(tooth_points, convexity = teeth * 2 + 4);
|
||||
} else {
|
||||
polygon(tooth_points, convexity = teeth * 2 + 4);
|
||||
}
|
||||
else {
|
||||
cylinder(r = idler_rad, h = belt_width);
|
||||
}
|
||||
|
||||
translate([0,0,lrim + belt_width])
|
||||
cylinder(r=outer_rad, h=urim);
|
||||
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);
|
||||
translate([ 0, 0, -1 ])
|
||||
cylinder(d = shaft, h = belt_width + lrim + urim + 2);
|
||||
}
|
||||
}
|
||||
|
||||
idler_zmargin = [ 6.4 / 2 + 1.05, 6.4 / 2 + 1.05 ];
|
||||
|
||||
module idler(height=0, toothed=false) {
|
||||
module idler(height = 0, toothed = false) {
|
||||
// pulley(20, 1.05, 1.05, 6.4, toothed=toothed, od=18);
|
||||
translate([0,0, height-idler_zmargin[0]])
|
||||
pulley(16, 1.05, 1.05, 6.4, shaft=3, toothed=toothed, od=13);
|
||||
translate([ 0, 0, height - idler_zmargin[0] ])
|
||||
pulley(16, 1.05, 1.05, 6.4, shaft = 3, toothed = toothed, od = 13);
|
||||
}
|
||||
|
||||
active_pulley_zmargin = [ 9.5, 4.5 ];
|
||||
|
||||
module active_pulley(height=0) {
|
||||
translate([0,0,-active_pulley_zmargin[0] + height])
|
||||
pulley(16,6,1,7, od=13);
|
||||
module active_pulley(height = 0) {
|
||||
translate([ 0, 0, -active_pulley_zmargin[0] + height ])
|
||||
pulley(16, 6, 1, 7, od = 13);
|
||||
}
|
||||
|
||||
// required distance between centers of pulley and idler for an S-bend with right angles.
|
||||
// required distance between centers of pulley and idler for an S-bend with
|
||||
// right angles.
|
||||
pulley_sbend_offset = (9.5 + 9.7) / 2 + 0.63;
|
||||
|
||||
//!pulley(12, 6, 2, toothed=false);
|
||||
//! pulley(12, 6, 2, toothed=false);
|
||||
Reference in New Issue
Block a user