diff --git a/scad/common b/scad/common index 87a68d0..b499c28 160000 --- a/scad/common +++ b/scad/common @@ -1 +1 @@ -Subproject commit 87a68d07fa3a29f923187073193def5bf0805c94 +Subproject commit b499c2810117b5ca57014d5cb4219cf68b4c5c0f diff --git a/scad/mcopy_projector.scad b/scad/mcopy_projector.scad index c80e836..1aa6167 100644 --- a/scad/mcopy_projector.scad +++ b/scad/mcopy_projector.scad @@ -1,21 +1,253 @@ include <./common/common.scad>; +include <./common/motors.scad>; -PART = "debug"; +PanelX = 89; +PanelY = 125; +PanelZ = 6; + +BearingOuterDiameter = 21.6; +BearingInnerDiameter = 8.05; + +FrameBoltX = (-PanelX / 2) + 8.6; +FrameBoltY = 92.8 / 2; +FrameBoltD = 9; + +KeyDistance = 57.4; +KeyVoidD = BearingInnerDiameter + 0.3; +KeyVoidD2 = 14.2; +KeyWidth = 2.25; + +StepperMountZ = 20; + +GateBoltX = (-PanelX / 2) + 54; +GateBoltY = 105 / 2; + +NubVoidD = 5.5; +NubVoidX = 3.5; +NubX = (-PanelX / 2) + 66; module debug () { - cube(); + difference () { + panel(); + //translate([45, 0, 0]) cube([89, 200, 50], center = true); + } + //NEMA17([0, KeyDistance / 2, -50]); + //NEMA17([0, -KeyDistance / 2, -50]); + //gate_key([0, KeyDistance / 2, -14], [0, 0, 45]); + gate_key([0, -KeyDistance / 2, -14], [0, 0, 45]); +} + + +module bearing_void (pos = [0, 0, 0], width= 8) { + fuzz = 0.3; + translate (pos) { + difference () { + cylinder(r = R(BearingOuterDiameter) + fuzz, h = width, center = true, $fn = 90); + } + } +} + +module key_void (pos = [0, 0, 0]) { + translate(pos) { + cylinder(r = R(KeyVoidD), h = 6 + 1, center = true, $fn = 50); + translate([0, 0, -2]) cylinder(r = R(KeyVoidD2), h = 6, center = true, $fn = 50); + } +} + +module front_bolt_void (pos = [0, 0, 0]) { + translate(pos) { + cylinder(r = R(FrameBoltD), h = PanelZ + 1, center = true, $fn = 50); + } +} + +module bolt_void (pos = [0, 0, 0], H = StepperMountZ + 1) { + translate(pos) { + cylinder(r = R(3.5), h = H, center = true, $fn = 30); + } +} + +module bolt_and_cap_void (pos = [0, 0, 0], cap = 10, bolt = 10) { + translate(pos) { + cylinder(r = R(6.25), h = cap, center = true, $fn = 30); + translate([0, 0, -(cap / 2) - (bolt / 2)]) cylinder(r = R(3.5), h = bolt, center = true, $fn = 30); + } +} + +module stepper_block_bolt_voids (pos = [0, 0, 0]) { + BoltX = NEMA17BoltSpacing / 2; + BoltY = NEMA17BoltSpacing / 2; + translate(pos) { + bolt_and_cap_void([BoltX, BoltY, 0]); + bolt_and_cap_void([-BoltX, BoltY, 0]); + bolt_and_cap_void([BoltX, -BoltY, 0]); + bolt_and_cap_void([-BoltX, -BoltY, 0]); + } +} + +module panel_bolt_voids (pos = [0, 0, 0]) { + translate(pos) { + stepper_block_bolt_voids([0, KeyDistance / 2, 0]); + stepper_block_bolt_voids([0, -KeyDistance / 2, 0]); + } +} + +module LED_void (pos = [0, 0, 0], rot = [0, 0, 0], flip = false) { + LEDVoidD = 5; + LightVoidD = 2.5; + translate(pos) rotate(rot) { + rotate([0, 90, 0]) { + cylinder(r = R(LightVoidD), h = 80, center = true, $fn = 40); + if (flip) { + translate([0, 0, -37.5]) cylinder(r = R(LEDVoidD), h = 80, center = true, $fn = 40); + translate([0, 0, 65]) cylinder(r = R(LEDVoidD), h = 80, center = true, $fn = 40); + } else { + translate([0, 0, 37.5]) cylinder(r = R(LEDVoidD), h = 80, center = true, $fn = 40); + translate([0, 0, -65]) cylinder(r = R(LEDVoidD), h = 80, center = true, $fn = 40); + } + } + } +} + +module LED_prop (pos = [0, 0, 0], rot = [0, 0, 0], H = 15, flip = false) { + translate(pos) rotate(rot) { + if (flip) { + translate([-13, 0, 0]) cube([40, 7, H], center = true); + } else { + translate([13, 0, 0]) cube([40, 7, H], center = true); + } + } +} + +module nub_void (pos = [0, 0, 0]) { + translate(pos) { + translate([NubVoidX / 2, 0, 0]) cylinder(r = R(NubVoidD), h = PanelZ + 1, center = true, $fn = 50); + translate([-NubVoidX / 2, 0, 0]) cylinder(r = R(NubVoidD), h = PanelZ + 1, center = true, $fn = 50); + cube([NubVoidX, NubVoidD, PanelZ + 1], center = true); + } +} + +module stepper_mount_block (pos = [0, 0, 0]) { + BoltX = NEMA17BoltSpacing / 2; + BoltY = NEMA17BoltSpacing / 2; + H = StepperMountZ; + InnerD = 30; + + translate(pos) { + difference () { + union () { + cube([NEMA17OuterWidth, NEMA17OuterWidth, H], center = true); + LED_prop([0, 19, -4.5 + 7.5], [0, 0, 45], flip = true); + LED_prop([0, -19, -4.5 + 10.5], [0, 0, 45], H = 9, flip = false); + } + //corners + for (i = [0 : 3]) { + rotate([0, 0, (i * 90) + 45]) translate([29.7, 0, 0]) cube([5.5, 5.5, H + 1], center = true); + } + cylinder(r = R(InnerD), h = H + 1, center = true, $fn = 120); + bolt_void([BoltX, BoltY, 0]); + bolt_void([-BoltX, BoltY, 0]); + bolt_void([BoltX, -BoltY, 0]); + bolt_void([-BoltX, -BoltY, 0]); + // + LED_void([0, 19, -4.5], [0, 0, 45]); + LED_void([0, -19, 1.5], [0, 0, 45], true); + } + } +} + +module stepper_mount (pos = [0, 0, 0]) { + //NEMA17BoltSpacing = 31; + translate(pos) { + stepper_mount_block([0, KeyDistance / 2, 0]); + stepper_mount_block([0, -KeyDistance / 2, 0]); + } +} + +module octagon(size, height) { + intersection() { + cube([size, size, height], true); + rotate([0,0,45]) { + cube([size, size, height], true); + } + } +} + +module octagon_void (pos = [0, 0, 0], D = 25, H = 5.01) { + translate(pos) { + difference () { + cylinder(r = R(D + 10), h = H, center = true); + octagon(D, H + 1); + } + } +} + +module gate_bolt_and_nut_void (pos = [0, 0, 0]) { + translate(pos) { + cylinder(r = R(5), h = PanelZ + 1, center = true, $fn = 40); + } +} + +module gate_key (pos = [0, 0, 0], rot = [0, 0, 0]) { + translate(pos) rotate(rot) { + difference () { + union () { + cylinder(r = R(29), h = 12, center = true, $fn = 120); + translate([0, 0, 1]) cylinder(r = R(11), h = 12, center = true, $fn = 60); + translate([0, 0, (13 / 2) + (10 / 2)]) cylinder(r = R(BearingInnerDiameter - 0.3), h = 10, center = true, $fn = 60); + } + scale([1.02, 1.02, 1]) NEMA17_motor_shaft([0, 0, -5]); + octagon_void([0, 0, 3.5]); + //normalization flat + translate([0, 27, -3.5]) cube([29, 29, 10], center = true); + //key + rotate ([0, 0, 45]) { + translate([0, (10 / 2) + (KeyWidth / 2), (13 / 2) + (10 / 2) + 6]) cube([10, 10, 10], center = true); + translate([0, -(10 / 2) - (KeyWidth / 2), (13 / 2) + (10 / 2) + 6]) cube([10, 10, 10], center = true); + } + } + } +} + +module panel (pos = [0, 0, 0], rot = [0, 0, 0]) { + translate(pos) rotate(rot) { + difference () { + union () { + cube([PanelX, PanelY, PanelZ], center = true); + translate([0, KeyDistance / 2, -(10 / 2) + (PanelZ / 2)]) cylinder(r = R(31), h = 10, center = true, $fn = 90); + translate([0, -KeyDistance / 2, -(10 / 2) + (PanelZ / 2)]) cylinder(r = R(31), h = 10, center = true, $fn = 90);; + } + //front bolts + front_bolt_void([FrameBoltX, FrameBoltY, 0]); + front_bolt_void([FrameBoltX, -FrameBoltY, 0]); + //key + bearing voids + bearing_void([0, KeyDistance / 2, (PanelZ / 2) - (8 / 2) - 2], 8.01); + bearing_void([0, -KeyDistance / 2, (PanelZ / 2) - (8 / 2) - 2], 8.01); + + key_void([0, KeyDistance / 2, 0]); + key_void([0, -KeyDistance / 2, 0]); + panel_bolt_voids([0, 0, -1]); + + // + gate_bolt_and_nut_void([GateBoltX, GateBoltY, 0]); + gate_bolt_and_nut_void([GateBoltX, -GateBoltY, 0]); + + // + nub_void([NubX, 0, 0]); + } + stepper_mount([0, 0, -(StepperMountZ / 2) - (PanelZ / 2)]); + } } module projector () { } -module key () { - -} +PART = "panel"; -if (PART == "projector") { - +if (PART == "gate_key") { + gate_key(); +} else if (PART == "panel") { + panel(); } else { debug(); } \ No newline at end of file