include
include
include
include
// 80 35 15
// screw holes on back plate
// 42.5 47.5
// back plate height from profile 47, thickness 10
// full h 67
back_plate_s = [80, 10, 67];
bps = back_plate_s;
// dist bitw back plate and back screw holder 26
bp_bsh_dist = 26;
// openscad y is scanner z, and wise versa
back_screw_holder_s = [80, 15, 35];
bshs = back_screw_holder_s;
// for base part mounted on profiles
base_wall_thickness = 10;
bwt = base_wall_thickness;
side_wall_s = [bwt, 65, 55];
sws = side_wall_s;
limit_switch_pcb_s = [40, 17, 1.6];
ls_pcb_s = limit_switch_pcb_s;
carriage_s = [80, 50, 32];
// scanner coords
carriage_top_y_offset = 56;
carriage_z_pos = 240;
module profile_20x20x50()
{
scale([1, 1, 10])
translate([-0.06, -61, -10])
import("Modular profile 20x20 - 973094/files/Profilo_20x20_L50.stl");
}
module calibration_template()
{
zo = 5;
cs = carriage_s;
// TODO: create a global var for this
lhs = laser_holder_size();
top_s = [bshs[0] + bwt * 2, sws[1], wt * 2];
cut_s = [main_frame_width_x, sws[1] * 2, wt + $tiny_padding * 2];
// decrease if there are some reflections
adjustment_z = -0;
translate([0, carriage_z_pos + carriage_s[1] - 5, lhs[2] / 2])
translate([0, top_s[1] / 2, cut_s[2] / 2 + bshs[2] + bwt + wt])
// arranged: should switch from triangles to surface
// by rotating by 180 around scanner z axis
translate([0, 0, adjustment_z])
union()
{
// centered
rotate([0, 180, 0])
{
color("green", 0.3)
translate([-125, 0, zo])
translate([85, -50, -5.8])
rotate([-90, 0, 0])
rotate([0, 90, 0])
import("calibration_template.stl");
}
{
color("blue", 0.3)
translate([-125, 0, zo])
translate([85, -54, -5.8])
rotate([-90, 0, 0])
rotate([0, 90, 0])
import("calibration_template.stl");
}
color("blue")
{
x_offsets = [-30, 0, 30];
y_offsets = [0, 4];
for (xo = x_offsets, yo = y_offsets)
{
translate([xo, -cs[1] + 0.45 + yo, 0])
cylinder($fn = dToFn(m3), d = m3, h = 100, center = true);
}
}
}
}
module calibration_template_holder()
{
cs = carriage_s;
calibration_template_holder_s = [cs[0], cs[1], 8];
cths = calibration_template_holder_s;
yo = cs[1] / 2 + carriage_z_pos;
//zo = -cs[2] / 2 - 20 + carriage_top_y_offset;// + cs[2];
zo = - 20 + carriage_top_y_offset + cths[2] / 2;
difference()
{
translate([0, yo, zo])
{
color("orange", 0.5)
cube(cths, center = true);
top_cube_s = [cths[0], 13, 10.5];
tcs = top_cube_s;
color("red", 0.5)
translate([-tcs[0] / 2, -3, 4])
cube(tcs);
}
//color("red")
translate([0, 0, cths[2] / 2])
carriage_screw_holes();
}
}
module calibration_template_holder_to_print()
{
difference()
{
calibration_template_holder();
calibration_template();
}
}
// hot inserts for m4 are not needed;
// d_padding - diameter delta. can be set to 0
// if cutting a thread with a screw is needed, and
// to 0.5 for just a screw hole
module m4_screw_hole(hole_side, d_padding = 0.5)
{
screw_hole(
m = m4 + 0.2,
id = m4 + 0.5,
il = 15,
hd = m4_head_diameter + 1,
hh = m4_head_height,
hs = hole_side);
}
module base_side_screw_holes()
{
// right x offset
rxo = bshs[0] / 2 + bwt - m4_head_height;
lxo = -rxo;
// back y offset
byo = sws[1] * 1 / 8;
fyo = sws[1] * 7 / 8;
zo = -20 / 2;
translate([lxo, byo, zo])
m4_screw_hole(hole_side_left);
translate([lxo, fyo, zo])
m4_screw_hole(hole_side_left);
translate([rxo, byo, zo])
m4_screw_hole(hole_side_right);
translate([rxo, fyo, zo])
m4_screw_hole(hole_side_right);
}
limit_switch_pcb_screw_hole_d = 3.5;
lspshd = limit_switch_pcb_screw_hole_d;
// dist betw holes 19 14
// dist betw hole side and short qpcb side = 1-1.1,
// and 1.3 for long pcb side
ls_pcb_h_delta_long = 1.3;
ls_pcb_h_delta_short = 1.1;
ls_pcb_h_delta_btw_holes = 19;
// 56
// w 80 d 50 h 32
module carriage_screw_holes(d_padding)
{
cs = carriage_s;
yo = cs[1] / 2 + carriage_z_pos;
zo = -cs[2] / 2 - 20 + carriage_top_y_offset;
// scanner coords
distance_between_holes_x = 60;
distance_between_holes_z = 30;
dbhx = distance_between_holes_x;
dbhz = distance_between_holes_z;
translate([0, yo, zo])
{
for (xo = [-dbhx / 2, dbhx / 2], yo = [-dbhz / 2, dbhz / 2])
{
translate([xo, yo, cs[2] / 2])
m4_screw_hole(hole_side_top, d_padding = d_padding);
}
}
}
module carriage()
{
// carriage_top_z_offset
cs = carriage_s;
yo = cs[1] / 2 + carriage_z_pos;
zo = -cs[2] / 2 - 20 + carriage_top_y_offset;
difference()
{
translate([0, yo, zo])
{
color("grey", 0.5)
cube(carriage_s, center = true);
}
//color("red")
carriage_screw_holes();
}
}
// limit switch designed by makerbot.com
// instructions: www.bigtree-tech.com
// license: GPLv3
module limit_switch()
{
translate([0, -ls_pcb_s[1] / 2, 0])
union()
{
limit_switch_size = [13, 6.5, 6.5];
lss = limit_switch_size;
// pcb
color("red", 0.7)
translate([0, 0, -ls_pcb_s[2] / 2])
cube(ls_pcb_s, center = true);
// switch itself
// 6.5
lss_xo = lss[0] / 2 - ls_pcb_s[0] / 2 + 6.5;
lss_yo = -lss[1] / 2 + ls_pcb_s[1] / 2;
lss_zo = -lss[2] / 2 - ls_pcb_s[2] / 2;
color("black", 0.7)
translate([lss_xo, lss_yo, lss_zo])
cube(lss, center = true);
}
d = lspshd;
x_delta = ls_pcb_h_delta_short;
y_delta = ls_pcb_h_delta_long;
xd = d / 2 - ls_pcb_s[0] / 2 + x_delta;
yd = -d / 2 - y_delta;
// screw holes
color("green", 0.4)
union()
{
translate([xd, yd, 0])
cylinder($fn = dToFn(d), d = d, h = 4, center = true);
translate([xd + ls_pcb_h_delta_btw_holes, yd, 0])
cylinder($fn = dToFn(d), d = d, h = 4, center = true);
}
// holes to cut
color("blue", 0.4)
{
m3_id = m3_hole_insert_diameter;
m3_h = m3_hole_insert_height;
translate([xd, yd, m3_h / 2])
cylinder($fn = dToFn(m3_id), d = m3_id, h = m3_h, center = true);
translate([xd + ls_pcb_h_delta_btw_holes, yd, m3_h / 2])
cylinder($fn = dToFn(m3_id), d = m3_id, h = m3_h, center = true);
}
}
module base()
{
// base
color("orange", 0.4)
{
// left wall
translate([-sws[0] / 2 - bshs[0] / 2, sws[1] / 2, sws[2] / 2 - 20])
cube(sws, center = true);
// right wall
translate([sws[0] / 2 + bshs[0] / 2, sws[1] / 2, sws[2] / 2 - 20])
cube(sws, center = true);
// top wall
top_s = [bshs[0] + bwt * 2, sws[1], bwt];
translate([0, top_s[1] / 2, top_s[2] / 2 + bshs[2]])
cube(top_s, center = true);
}
}
module stand()
{
// back plate/motor holder
color("black", 0.5)
translate([0, -bps[1] / 2, bps[2] / 2 - 20])
cube(bps, center = true);
// back screw holder
color("black", 0.5)
translate([0, bshs[1] / 2 + bp_bsh_dist, bshs[2] / 2])
cube(bshs, center = true);
// profiles base
color("grey")
{
translate([-(bshs[0] - 20) / 2, 0, -20 / 2])
rotate([-90, 0, 0])
profile_20x20x50();
translate([(bshs[0] - 20) / 2, 0, -20 / 2])
rotate([-90, 0, 0])
profile_20x20x50();
}
}
module stand_top_m3_holes()
{
m3_id = m3_hole_insert_diameter;
m3_h = m3_hole_insert_height;
rxo = bshs[0] / 2 + bwt / 2;
lxo = -rxo;
for (xo = [rxo, lxo], yo = [sws[1] * 1 / 6, sws[1] * 3 / 6, sws[1] * 5 / 6])
{
translate([xo, yo, -20 + sws[2] + bwt + $tiny_padding])
cylinder($fn = dToFn(m3_id), d = m3_id, h = m3_h * 2, center = true);
}
}
module stand_top_m3_screw_holes()
{
m3_id = m3_hole_insert_diameter;
m3_h = m3_hole_insert_height;
rxo = bshs[0] / 2 + bwt / 2;
lxo = -rxo;
for (xo = [rxo, lxo], yo = [sws[1] * 1 / 6, sws[1] * 3 / 6, sws[1] * 5 / 6])
{
translate([xo, yo, -20 + sws[2] + bwt + $tiny_padding])
//cylinder($fn = dToFn(m3_id), d = m3_id, h = m3_h * 2, center = true);
scale([1, 1, 2])
screw_hole(
m = m3,
id = m3_hole_insert_diameter,
il = m3_hole_insert_height * 2,
hd = m3_head_diameter,
hh = m3_head_height,
hs = hole_side_top);
}
}
module base_to_print()
{
difference()
{
base();
translate([0, sws[1], -20 + sws[2]])
limit_switch();
base_side_screw_holes();
stand_top_m3_holes();
}
}
module scanner_side_hole_cutters()
{
id = 4;
side_offsets = [
back_bottom_side_hole_offset + [0, 0, 0],
back_top_side_hole_offset + [0, 0, 0],
top_side_hole_offset + [0, -id, -id],
front_bottom_side_hole_offset + [0, -id * 2, 0],
front_top_side_hole_offset + [0, -id * 2, 0]
];
// left x offset
lxo = -main_frame_width_x / 2;
rxo = -lxo;
color("red")
//translate([0, 0, 0])
translate([0, wt, 0])
for (so = side_offsets)
{
translate(so + [lxo, 0, 0])
screw_hole(
m = m2,
id = 4,
il = m2_hole_insert_height * 2,
hd = m2_head_diameter,
hh = m2_head_height,
hs = hole_side_left);
translate(so + [rxo, 0, 0])
screw_hole(
m = m2,
id = 4,
il = m2_hole_insert_height * 2,
hd = m2_head_diameter,
hh = m2_head_height,
hs = hole_side_right);
}
}
module scanner_holder()
{
top_s = [bshs[0] + bwt * 2, sws[1], wt * 2];
cut_s = [main_frame_width_x, sws[1] * 2, wt + $tiny_padding * 2];
difference()
{
color("green", 0.3)
translate([0, top_s[1] / 2, top_s[2] / 2 + bshs[2] + bwt])
cube(top_s, center = true);
color("red", 0.3)
translate([0, top_s[1] / 2, cut_s[2] / 2 + bshs[2] + bwt + wt])
cube(cut_s, center = true);
}
}
module scanner_holder_to_print()
{
difference()
{
scanner_holder();
stand_top_m3_screw_holes();
}
}
module visualize_stand()
{
carriage();
calibration_template();
calibration_template_holder();
*calibration_template_holder_to_print();
stand();
union()
{
base();
translate([0, sws[1], -20 + sws[2]])
limit_switch();
base_side_screw_holes();
stand_top_m3_holes();
}
translate([0, -back_wall_offset + wt, -20 + sws[2] + bwt + wt])
translate([0, 0, laser_holder_size()[2] / 2 + wt])
{
scanner_side_hole_cutters();
color("yellow", 0.2)
body_to_print();
color("green", 0.3)
visualize_range();
visualize_xz_range();
}
//stand_top_m3_holes();
//stand_top_m3_screw_holes();
color("grey", 0.6)
base_to_print();
//scanner_holder();
scanner_holder_to_print();
}
visualize_stand();