mcopy/scad/mcopy_rails.scad

275 lines
11 KiB
OpenSCAD
Raw Normal View History

2023-08-21 03:55:27 +00:00
/**
* Optical Printer Rails
*
* Camera Drive = +X
* Lens Drive = -X
**/
2023-07-05 19:17:56 +00:00
2023-08-21 03:55:27 +00:00
use <2020_profile.scad>
//include <jk_rails.scad>
include <./common/common.scad>
include <./common/motors.scad>
include <./common/rods.scad>
2023-08-23 04:14:47 +00:00
RailSpacing = 100; //160
2023-07-05 19:17:56 +00:00
ThreadedRodSpacing = 50;
2023-08-21 23:39:08 +00:00
RailEndX = RailSpacing + 40;
2023-08-21 03:55:27 +00:00
TNutVoid = 17;
2023-08-21 23:39:08 +00:00
BoltSpacingX = 110;
2023-08-21 03:55:27 +00:00
module rail_debug (H = 175) {
color("lime") linear_extrude(height=H) {
2020_profile();
}
}
module m3_bolt_void (pos = [0, 0, 0], BoltH = 20, CapH = 3) {
D = 3.25;
CapD = 6;
translate(pos) {
translate([0, 0, CapH / 2]) cylinder(r = R(CapD), h = CapH, center = true, $fn = 40);
translate([0, 0, -BoltH / 2]) cylinder(r = R(D), h = BoltH + 0.01, center = true, $fn = 40);
}
}
2023-07-05 19:17:56 +00:00
2023-08-21 03:55:27 +00:00
module bolt_voids_2020 (pos = [0, 0, 0]) {
translate(pos) {
//translate([0, -25, 0]) rotate([90, 0, 0]) m3_bolt_void(CapH = 6);
2023-08-23 04:14:47 +00:00
translate([0, 20, 0]) rotate([-90, 0, 0]) m3_bolt_void(CapH = 20);
2023-08-21 03:55:27 +00:00
translate([-16, 0, 0]) rotate([0, -90, 0]) m3_bolt_void(CapH = 6, BoltH = 10);
}
}
module bolt_voids_motor (pos = [0, 0, 0]) {
Corner = NEMA17BoltSpacing / 2;
translate(pos) {
2023-08-23 04:14:47 +00:00
translate([Corner, Corner, 0]) m3_bolt_void(CapH = 30, BoltH = 40);
translate([Corner, -Corner, 0]) m3_bolt_void(CapH = 30, BoltH = 40);
translate([-Corner, Corner, 0]) m3_bolt_void(CapH = 30, BoltH = 40);
translate([-Corner, -Corner, 0]) m3_bolt_void(CapH = 30, BoltH = 40);
2023-08-21 03:55:27 +00:00
}
2023-07-05 19:17:56 +00:00
}
2023-08-21 03:55:27 +00:00
module T_nut_void (pos = [0, 0, 0], rot = [0, 0, 0]) {
translate(pos) rotate(rot) {
cylinder(r = R(TNutDiameter2 + 0.1), h = TNutVoid + .01, center = true, $fn = 60);
translate([0, 0, -(TNutVoid / 2) + (6 / 2)]) cylinder(r = R(TNutDiameter1 + 0.1), h = 6.01, center = true, $fn = 60);
translate([8, 0, 0]) cylinder(r = R(3), h = 10, center = true, $fn = 30);
translate([-8, 0, 0]) cylinder(r = R(3), h = 10, center = true, $fn = 30);
translate([0, 8, 0]) cylinder(r = R(3), h = 10, center = true, $fn = 30);
translate([0, -8, 0]) cylinder(r = R(3), h = 10, center = true, $fn = 30);
}
2023-07-05 19:17:56 +00:00
}
2023-08-21 03:55:27 +00:00
module bearing_void (pos = [0, 0, 0], Width = 8, Hole = true, Fuzz = 0.1) {
$fn = 80;
innerD = 8.05;
outerD = 22.1 - .4;
color("blue") translate (pos) difference () {
cylinder(r = R(outerD) + Fuzz, h = Width, center = true);
if (Hole) cylinder(r = R(innerD) - Fuzz, h = Width + 1, center = true);
}
2023-07-05 19:17:56 +00:00
}
2023-08-21 03:55:27 +00:00
module rail_end (pos = [0, 0, 0], rot = [90, 0, 0], Motors = true) {
2023-08-23 04:14:47 +00:00
Z = 95;
RailVoid = 20.4;
2023-08-21 03:55:27 +00:00
translate(pos) rotate(rot) difference () {
difference () {
2023-08-23 04:14:47 +00:00
translate([0, -10, 20]) rounded_cube([RailEndX, Z, 80], d = 10, center = true, $fn = 50);
translate([0, 10, 50]) rotate([0, 90, 0]) rounded_cube([60, Z, RailEndX + 1], d = 10, center = true, $fn = 50);
2023-08-21 03:55:27 +00:00
}
//rails
2023-08-23 04:14:47 +00:00
translate([-RailSpacing / 2, 0, 5]) cube([RailVoid, RailVoid, 40], center = true);
translate([RailSpacing / 2, 0, 5]) cube([RailVoid, RailVoid, 40], center = true);
2023-08-21 03:55:27 +00:00
//rails bolts
bolt_voids_2020([-RailSpacing / 2, 0, 0]);
rotate([0, 180, 0]) bolt_voids_2020([-RailSpacing / 2, 0, 0]);
if (Motors) {
//camera drive motor
translate([ThreadedRodSpacing / 2, 0, 0]) {
cylinder(r = R(NEMA17PadD + 0.5), h = 60, center = true, $fn = 100);
2023-08-23 04:14:47 +00:00
bolt_voids_motor([0, 0, 16 - 21]);
2023-08-21 03:55:27 +00:00
}
//lens drive motor
translate([-ThreadedRodSpacing / 2, 0, 0]) {
cylinder(r = R(NEMA17PadD + 0.5), h = 60, center = true, $fn = 100);
2023-08-23 04:14:47 +00:00
bolt_voids_motor([0, 0, 16 - 21]);
2023-08-21 03:55:27 +00:00
}
} else {
translate([-ThreadedRodSpacing / 2, 0, 0]) cylinder(r = R(LinearBearingOuterDiameter + 0.5), h = 60, center = true, $fn = 100);
translate([-ThreadedRodSpacing / 2, 0, 0]) cylinder(r = R(LinearBearingOuterDiameter + 0.5), h = 60, center = true, $fn = 100);
}
//linear motion rod
translate([0, 0, 5]) cylinder(r = R(ThreadDiameter), h = 40, center = true, $fn = 50);
//mounting bolts
2023-08-21 23:39:08 +00:00
translate([BoltSpacingX / 2, 0, 40]) rotate([90, 0, 0]) cylinder(r = R(10), h = 150, center = true, $fn = 40);
translate([-BoltSpacingX / 2, 0, 40]) rotate([90, 0, 0]) cylinder(r = R(10), h = 150, center = true, $fn = 40);
2023-08-21 03:55:27 +00:00
}
2023-07-05 19:17:56 +00:00
}
2023-08-23 04:14:47 +00:00
module sled (pos = [0, 0, 0], rot = [90, 0, 0], Length = 60) {
2023-08-21 03:55:27 +00:00
X = RailEndX;
2023-08-23 04:14:47 +00:00
Y = 60;
2023-08-21 03:55:27 +00:00
Z = Length;
translate(pos) rotate(rot) difference () {
2023-08-23 04:14:47 +00:00
translate([0, 7.5, 0]) rounded_cube([X, Y, Z], d = 10, center = true, $fn = 50);
2023-08-21 03:55:27 +00:00
//extrusion rails
2023-08-23 04:14:47 +00:00
translate([-RailSpacing / 2, 0, 0]) cube([21, 22, Z + 1], center = true);
translate([RailSpacing / 2, 0, 0]) cube([21, 22, Z + 1], center = true);
//void for bearing roller
translate([-RailSpacing / 2, -20, 0]) cube([13, 22, Z + 1], center = true);
translate([RailSpacing / 2, -20, 0]) cube([13, 22, Z + 1], center = true);
2023-08-21 03:55:27 +00:00
//linear motion rod void
cylinder(r = R(LinearMotionDiameter + 1), h = Z + 1, center = true, $fn = 60);
//linear motion rod bearing voids
translate([0, 0, (Length / 2) - (LinearBearingHeight / 2) + 0.01]) cylinder(r = R(LinearBearingOuterDiameter + 0.2), h = LinearBearingHeight, center = true, $fn = 100);
translate([0, 0, -(Length / 2) + (LinearBearingHeight / 2) - 0.01]) cylinder(r = R(LinearBearingOuterDiameter + 0.2), h = LinearBearingHeight, center = true, $fn = 100);
//threaded rod voids
2023-08-23 04:14:47 +00:00
translate([ThreadedRodSpacing / 2, 0, 0]) cylinder(r = R(ThreadDiameter + 2), h = Z + 1, center = true, $fn = 60);
translate([-ThreadedRodSpacing / 2, 0, 0]) cylinder(r = R(ThreadDiameter + 2), h = Z + 1, center = true, $fn = 60);
2023-08-21 03:55:27 +00:00
2023-07-05 19:17:56 +00:00
}
}
2023-08-21 03:55:27 +00:00
module camera_sled (pos = [0, 0, 0], rot = [0, 0, 0]) {
translate(pos) sled(Length = 110);
}
2023-08-23 04:14:47 +00:00
module sled_bearing_void (pos = [0, 0, 0], rot = [0, 0, 0]) {
translate(pos) rotate(rot) {
cylinder(r = R(27), h = 11, center = true, $fn = 120);
cylinder(r = R(8.3), h = 16, center = true, $fn = 80);
translate([0, -10, 0]) cube([8.3, 20, 16 ], center = true, $fn = 60);
cylinder(r = R(5.2), h = 40, center = true, $fn = 60);
translate([0, 0, 28]) cylinder(r = R(8.3), h = 30, center = true, $fn = 60);
}
}
module lens_sled_m3_bolt_voids (pos = [0, 0, 0], rot = [0, 0, 0]) {
D = 16;
translate(pos) rotate(rot) {
translate([0, 0, D]) m3_bolt_void(CapH = 10);
translate([0, 0, -D]) rotate([0, 180, 0]) m3_bolt_void(CapH = 10);
translate([D, 0, 0]) rotate([0, 90, 0]) m3_bolt_void(CapH = 10);
translate([-D, 0, 0]) rotate([0, -90, 0]) m3_bolt_void(CapH = 10);
}
}
2023-08-21 03:55:27 +00:00
module lens_sled (pos = [0, 0, 0], rot = [90, 0, 0]) {
2023-08-23 04:14:47 +00:00
Y = 40;
2023-08-21 03:55:27 +00:00
LensDriveX = -ThreadedRodSpacing / 2;
2023-08-23 04:14:47 +00:00
RailVoid = 20.4;
2023-08-21 03:55:27 +00:00
translate(pos) rotate(rot) {
difference () {
2023-08-23 04:14:47 +00:00
union () {
sled(rot = [0, 0, 0], Length = Y);
translate([(RailEndX / 2) - (Y / 2), (60 / 2) + (40 / 2) - 5, 0]) cube([Y, 30, Y], center = true);
translate([-(RailEndX / 2) + (Y / 2), (60 / 2) + (40 / 2) - 5, 0]) cube([Y, 30, Y], center = true);
}
2023-08-21 03:55:27 +00:00
T_nut_void ([LensDriveX, 0, (Y / 2) - (TNutVoid / 2) + 0.01], [180, 0, 0]);
T_nut_void ([LensDriveX, 0, -(Y / 2) + (TNutVoid / 2) - 0.01]);
//camera drive passthrough
translate([-LensDriveX, 0, 0]) cylinder(r = R(ThreadDiameter + 1), h = Y + 1, center = true, $fn = 60);
//
2023-08-23 04:14:47 +00:00
sled_bearing_void([RailSpacing / 2, 21.5, 0], [0, 90, 0]);
sled_bearing_void([-RailSpacing / 2, 21.5, 0], [0, -90, 0]);
//lens carriage frame
translate([RailSpacing / 2, 53.5, 0]) cube([RailVoid, 32, RailVoid], center = true);
translate([-RailSpacing / 2, 53.5, 0]) cube([RailVoid, 32, RailVoid], center = true);
//
lens_sled_m3_bolt_voids([(RailEndX / 2) - (Y / 2), (60 / 2) + (40 / 2) - 5, 0]);
lens_sled_m3_bolt_voids([(-RailEndX / 2) + (Y / 2), (60 / 2) + (40 / 2) - 5, 0]);
2023-08-21 03:55:27 +00:00
}
//debug
//translate([-ThreadedRodSpacing / 2, 0, -(Y / 2) + 8.4]) T_nut();
//translate([-ThreadedRodSpacing / 2, 0, (Y / 2) - 7.5]) rotate([180, 0, 0]) T_nut();
}
}
2023-08-23 04:14:47 +00:00
module bearing_roller (pos = [0, 0, 0], rot = [0, 0, 0]) {
2023-08-21 03:55:27 +00:00
A = 5.75;
D1 = 25.4;
D2 = 24;
2023-08-23 04:14:47 +00:00
translate(pos) rotate(rot) difference () {
2023-08-21 03:55:27 +00:00
union () {
cylinder(r = R(D2), h = 10, center = true, $fn = 100);
cylinder(r = R(D1), h = A, center = true, $fn = 100);
translate([0, 0, (A / 2) + (1 / 2)]) cylinder(r1 = R(D1), r2 = R(D2), h = 1, center = true, $fn = 100);
translate([0, 0, -(A / 2) - (1 / 2)]) cylinder(r2 = R(D1), r1 = R(D2), h = 1, center = true, $fn = 100);
}
translate([0, 0, 1]) bearing_void(Hole = false, Fuzz = 0.3, Width = 9.01);
cylinder(r = R(19.5), h = 10 + 1, center = true, $fn = 100);
}
}
2023-08-23 04:14:47 +00:00
module bearing_roller_inner (pos = [0, 0, 0], rot = [0, 0, 0]) {
translate(pos) rotate(rot) difference () {
union () {
cylinder(r = R(7.8), h = 15, center = true, $fn = 60);
translate([0, 0, 4.5]) cylinder(r = R(11), h = 1, center = true, $fn = 80);
}
cylinder(r = R(5.25), h = 20 + 1, center = true, $fn = 60);
}
}
module debug () {
//translate([50 , -90 - 10, 22]) rotate([0, 90, 0]) bearing_void();
rail_end();
//camera_sled([0, -90, 0]);
difference () {
lens_sled([0, -90, 0]);
translate([ 50 + (RailSpacing / 2), -90, 0]) cube([100, 100, 100], center = true);
//translate([ -50 - (RailSpacing / 2), -90, 0]) cube([100, 100, 100], center = true);
}
//color("green") translate([RailSpacing / 2, -90 + 15, 20]) rotate([0, 0, 0]) linear_extrude(height=100) 2020_profile();
//difference () {
//intersection() {
//lens_sled([0, -90, 0]);
//translate([-30, -90 + 30 - 1, 10]) cube([90, 60, 45], center = true);
//translate([150, -90, 50]) cube([200, 100, 100], center = true);
//}
2023-08-21 03:55:27 +00:00
2023-08-23 04:14:47 +00:00
translate([RailSpacing / 2, -90, 21.5]) rotate([0, 90, 0]) {
bearing_roller();
bearing_roller_inner();
}
//bearing_roller();
2023-08-21 03:55:27 +00:00
2023-08-23 04:14:47 +00:00
//debug
//translate([-RailSpacing / 2, 0, 0]) rotate([90, 0, 0]) rail_debug(175);
color("green") translate([RailSpacing / 2, 0, 0]) rotate([90, 0, 0]) linear_extrude(height=175) 2020_profile();
2023-08-21 03:55:27 +00:00
2023-08-23 04:14:47 +00:00
//translate([ThreadedRodSpacing / 2, 40, 0]) rotate([90, 0, 0]) color("blue") NEMA17();
//translate([-ThreadedRodSpacing / 2, 40, 0]) rotate([90, 0, 0]) color("blue") NEMA17();
}
2023-08-23 04:14:47 +00:00
PART = "lens_sled";
if (PART == "rail_end") {
rail_end();
2023-08-23 04:14:47 +00:00
} else if (PART == "lens_sled") {
lens_sled();
} else if (PART == "bearing_roller") {
bearing_roller();
} else if (PART == "bearing_roller_inner") {
rotate([180, 0, 0]) bearing_roller_inner();
} else {
debug();
}