diff --git a/app/data/cfg.json b/app/data/cfg.json index 17e7839..a64f5d5 100644 --- a/app/data/cfg.json +++ b/app/data/cfg.json @@ -1,5 +1,5 @@ { - "version": "1.8.19", + "version": "1.8.20", "ext_port": 1111, "profiles": { "mcopy": { diff --git a/app/package-lock.json b/app/package-lock.json index 7519c91..cae6115 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,6 +1,6 @@ { "name": "mcopy-app", - "version": "1.8.19", + "version": "1.8.20", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/app/package.json b/app/package.json index dca2a27..bb208c5 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "mcopy-app", - "version": "1.8.19", + "version": "1.8.20", "description": "GUI for the mcopy small gauge film optical printer platform", "main": "main.js", "scripts": { diff --git a/data/cfg.json b/data/cfg.json index 17e7839..a64f5d5 100644 --- a/data/cfg.json +++ b/data/cfg.json @@ -1,5 +1,5 @@ { - "version": "1.8.19", + "version": "1.8.20", "ext_port": 1111, "profiles": { "mcopy": { diff --git a/package-lock.json b/package-lock.json index 902fc40..6a24a1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mcopy", - "version": "1.8.19", + "version": "1.8.20", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mcopy", - "version": "1.8.19", + "version": "1.8.20", "license": "MIT", "dependencies": { "arduino": "file:app/lib/arduino", diff --git a/package.json b/package.json index 172bfd1..b271654 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mcopy", - "version": "1.8.19", + "version": "1.8.20", "description": "Small gauge film optical printer platform", "main": "build.js", "directories": { diff --git a/processing/mcopy/cfg.json b/processing/mcopy/cfg.json index 17e7839..a64f5d5 100644 --- a/processing/mcopy/cfg.json +++ b/processing/mcopy/cfg.json @@ -1,5 +1,5 @@ { - "version": "1.8.19", + "version": "1.8.20", "ext_port": 1111, "profiles": { "mcopy": { diff --git a/scad/mcopy_lens_assembly.scad b/scad/mcopy_lens_assembly.scad new file mode 100644 index 0000000..e37651c --- /dev/null +++ b/scad/mcopy_lens_assembly.scad @@ -0,0 +1,389 @@ +// +// JK lens assembly +// +include <./common.scad>; +include <./bellows.scad>; +include <./knurledFinishLib_v2.scad>; + +PART = ""; + +LinearBearingOuterDiameter = 15; +LinearBearingHeight = 24; +LinearBearingBoreDiameter = 8; + +ThreadDiameter = 8; +LinearMotionDiameter = 8; + +TNutDiameter1 = 22; +TNutDiameter2 = 10.2; +TNutInnerDiameter = 8; +TNutHeight1 = 3.5; +TNutHeight2 = 15; +TNutOffset = 1.5; + +RodLength = 150; + +ZOffset = 120; +XOffset = 38; +XWidth = 50; +FrontOffset = 0; +BackOffset = 15; + +LinearMotionX = 22; +LinearMotionY = 20; +LinearMotionZ = 14; + +XPosition = 0; +ZPosition = 0; + +module linearBearing (padD = 0, padH = 0) { + difference () { + cylinder(r = R(LinearBearingOuterDiameter + padD), h = LinearBearingHeight + padH, center = true, $fn = 100); + cylinder(r = R(LinearBearingBoreDiameter), h = LinearBearingHeight + padH + 1, center = true, $fn = 60); + } +} + +module threadedRod (H = 40, pad = 0) { + color("green") cylinder(r = R(ThreadDiameter + pad), h = H, center = true, $fn = 60); +} + +module linearMotionRod (H = 40, pad = 0) { + color("blue") cylinder(r = R(LinearMotionDiameter + pad), h = H, center = true, $fn = 60); +} + +module TNut (padD = 0, padH = 0) { + color("red") difference () { + union () { + translate([0, 0, -(TNutHeight2 / 2) + (TNutHeight1 / 2) + TNutOffset]) cylinder(r = R(TNutDiameter1 + padD), h = TNutHeight1, center = true, $fn = 100); + cylinder(r = R(TNutDiameter2), h = TNutHeight2 + padH, center = true, $fn = 80); + } + cylinder(r = R(TNutInnerDiameter), h = TNutHeight2 + 1, center = true, $fn = 60); + } +} + +module m3Bolt (bolt = 20) { + cylinder(r = 3.1 / 2, h = bolt, center = true, $fn = 40); +} + +module m4Bolt (bolt = 10) { + cylinder(r = R(4.25), h = bolt, center = true, $fn = 40); +} + +module m3BoltNut (bolt = 20, nut = 3.5) { + m3Bolt(bolt); + + translate([0, 0, nut]) color("red") { + cylinder(r = 8 / 2, h = 2.5, center = true, $fn = 6); + translate([-4, 0, 0]) cube([8, 6.9, 2.5], center = true); + } +} + +module m4BoltNut (bolt = 10, nut = 3.5) { + m4Bolt(bolt); + + translate([0, 0, nut]) color("red") { + m4_nut(); + translate([-10, 0, 0]) cube([20, 6.9, 3.5], center = true); + } +} + +module lensAssemblyBellowsBoard (magnets = false) { + //bottom + difference () { + union () { + rotate([0, 0, 90]) bellows_camera_board(magnets = magnets); + translate([0, -XOffset, FrontOffset]) rotate([0, 90, 0]) cylinder(r = R(22), h = XWidth, center = true, $fn = 80); + } + rotate([-90, 0, 0]) { + translate([-(XWidth/2) + 2.5, -FrontOffset, -XOffset]) rotate([0, 90, 0]) TNut(0.3, 0.3); + //m3s + // -centered + translate([-(XWidth/2) + 2.5 + 5, -FrontOffset - 8, -XOffset]) rotate([0, -90, 0]) rotate([0, 0, 90]) m3BoltNut(); + // -top no nut + translate([-(XWidth/2) + 2.5 + 5, -FrontOffset, -XOffset + 8]) rotate([0, -90, 0]) m3Bolt(); + // -bottom no nut + translate([-(XWidth/2) + 2.5 + 5, -FrontOffset, -XOffset - 8]) rotate([0, -90, 0]) m3Bolt(); + translate([(XWidth/2) - 2.5, -FrontOffset, -XOffset]) rotate([0, -90, 0]) TNut(0.3, 0.3); + //m3s + // -center + translate([(XWidth/2) - 2.5 - 5, -FrontOffset - 8, -XOffset]) rotate([0, 90, 0]) rotate([0, 0, 90]) m3BoltNut(); + // -top no nut + translate([(XWidth/2) - 2.5 - 5, -FrontOffset, -XOffset + 8]) rotate([0, 90, 0]) m3Bolt(); + // -bottom no nut + translate([(XWidth/2) - 2.5 - 5, -FrontOffset, -XOffset - 8]) rotate([0, 90, 0]) m3Bolt(); + } + rotate([-90, 0, 0]) translate([0, -FrontOffset, -XOffset]) rotate([0, 90, 0]) threadedRod(RodLength, 0.5); + translate([0, -XOffset, -10.5]) cube([100,30, 15], center = true); + } + + //top + difference () { + translate([0, XOffset, FrontOffset]) rotate([0, 90, 0]) cylinder(r = R(25), h = 24, center = true, $fn = 80); + rotate([-90, 0, 0]) { + translate([0, -FrontOffset, XOffset]) rotate([0, 90, 0]) linearBearing(0.25); + } + translate([0, XOffset, -10.5]) cube([24 + 1,30, 15], center = true); + rotate([-90, 0, 0]) translate([0, -FrontOffset, XOffset]) rotate([0, 90, 0]) linearMotionRod(RodLength); + } +} + +module topLinearAttachmentBlock () { + cube([LinearMotionX, LinearMotionY + 2, LinearMotionZ], center = true); +} + +module lensAssemblyThreadedZ () { + Z = 90; + difference () { + union () { + //main cylinder + rounded_cube([22, 22, Z], d = 8, $fn = 30, center = true); + //top linear motion rod attachment block + translate([0, -BackOffset, (Z/2) - (LinearMotionZ/2)]) topLinearAttachmentBlock(); + //bottom threaded rod block + translate([0, -BackOffset, -XOffset]) rotate([0, 90, 0]) cylinder(r = R(22), h = 22, center = true, $fn = 80); + } + //------ + //threaded rod void + threadedRod(Z + 20, 0.5); + //board nut void + translate([0, -10, 0]) rotate([0, 90, 0]) cylinder(r = R(12), h = 30, center = true, $fn = 40); + //T nuts + //top + translate([0, 0, (Z / 2) - 4]) rotate([180, 0, 0]) TNut(0.3, 0.3); + //bottom + translate([0, 0, -(Z / 2) + 4]) TNut(0.3, 0.3); + + //---- + //T nut M3 bolts + //top + translate([0, 0, (Z / 2) - 4]) { + translate([-8, 0, 0]) rotate([180, 0, 0]) m3BoltNut(); + translate([8, 0, 0]) rotate([0, 0, 180]) rotate([180, 0, 0]) m3BoltNut(); + translate([0, 8, 0]) rotate([0, 0, -90]) rotate([180, 0, 0]) m3BoltNut(); + } + //bottom + translate([0, 0, -(Z / 2) + 4]) { + translate([-8, 0, 0]) m3BoltNut(); + translate([8, 0, 0]) rotate([0, 0, 180]) m3BoltNut(); + translate([0, 8, 0]) rotate([0, 0, -90]) m3BoltNut(); + } + + //------ + //top linear motion rod voids + //top gap to close + translate([0, -(LinearMotionY/2) - 9, (Z/2) - (LinearMotionZ/2)]) cube([LinearMotionX + 1, LinearMotionY, 2], center = true); + //rod + translate([0, -BackOffset, (Z/2) - (LinearMotionZ/2)]) rotate([0, 90, 0]) cylinder(r = R(LinearMotionDiameter)+.2, h = LinearMotionX + 1, center = true, $fn = 60); + //m4 bolt top + translate([0, -BackOffset - 8 + 2, (Z/2) - (LinearMotionZ/2)]) m4Bolt(LinearMotionZ + 1); + //m4 nut top + translate([0, -BackOffset - 8 + 2, (Z/2) - (LinearMotionZ/2) - 6]) m4_nut(); + //------ + //bottom threaded rod void + translate([0, -BackOffset, -XOffset]) rotate([0, 90, 0]) threadedRod(22 + 1, 0.5); + //flatten bottom + translate([0, -BackOffset, -(Z / 2) - 11]) cube([23, 22, 22], center = true); + } +} + +module lensAssemblyLinearZ () { + Z = 90; + + difference () { + union () { + //main cylinder + rounded_cube([22, 22, Z], d = 8, $fn = 30, center = true); + //top + translate([0, -BackOffset, (Z / 2) - (LinearMotionZ/2)]) topLinearAttachmentBlock(); + //bottom + translate([0, -BackOffset, -XOffset]) rotate([0, 90, 0]) cylinder(r = R(22), h = 22, center = true, $fn = 80); + } + //x linear motion rod void + translate([9, -BackOffset, (Z / 2) - (LinearMotionZ/2)]) rotate([0, 90, 0]) linearMotionRod(50, 0.3); + //z linear motion rod + linearMotionRod(250, 0.6); + //top gap to close + translate([0, -(LinearMotionY/2) - 9, (Z/2) - (LinearMotionZ/2)]) cube([LinearMotionX + 1, LinearMotionY, 2], center = true); + //m4 bolt top + translate([0, -BackOffset - 8 + 2, (Z/2) - (LinearMotionZ/2)]) m4Bolt(LinearMotionZ + 1); + //m4 nut top + translate([0, -BackOffset - 8 + 2, (Z/2) - (LinearMotionZ/2) - 6]) m4_nut(); + //flatten bottom + translate([0, -BackOffset, -(Z / 2) - 11]) cube([23, 22, 22], center = true); + //z linear bearing + translate([0, 0, -(Z / 2) + (LinearBearingHeight / 2) - 2 ]) { + linearBearing(0.25, 0.3); + } + + //z linear bearing + translate([0, 0, (Z / 2) - (LinearBearingHeight / 2) + 2]) { + linearBearing(0.25, 0.3); + } + //x threaded rod + translate([0, -BackOffset, -XOffset]) rotate([0, 90, 0]) threadedRod(50, 0.5); + } +} + +module m5_nut_bolt () { + cylinder(r = R(4.95), h = 30, center = true, $fn = 30); + translate([0, 0, 20/2]) rotate([0, 0, 30]) m5_nut(); +} + +module lensAssemblyBaseZ () { + H = 22 + 12 + 12; + TOP_X = 74; + BOTTOM_X = 88; + Z_OFFSET = (12/2)+(22/2); + RAILS = 160; + RAIL_D = 30; //with clearance + BOTTOM_CORNER_ADJUST_X = 4; + translate([0, 0, Z_OFFSET]) difference () { + translate([0, 6, -(24 / 2)]) cube([150, 45 + 12, H], center = true); + translate([ZOffset/2, 0, 5]) linearMotionRod(22 + 1, 0.2); + translate([-ZOffset/2, 0, 0]) threadedRod(50, 0.5); + translate([ZOffset/2+10, 0, 3]) rotate([0, 90, 0]) m4BoltNut(20, -1); + //shelf void + translate([0, 12, -17]) cube([160 + 1, 45 + 0.1, 12], center = true); + //top corner voids + translate([(150 / 2) + (TOP_X / 2), 6 + (45 + 12) - 20, -(24 / 2) + 12]) cube([150, 45 + 12, H], center = true); + translate([-(150 / 2) - (TOP_X / 2), 6 + (45 + 12) - 20, -(24 / 2) + 12]) cube([150, 45 + 12, H], center = true); + //bottom corner voids + translate([(150 / 2) + (BOTTOM_X / 2), 6, -(24 / 2) - 22 - 12]) cube([150, 45 + 12 + 1, H], center = true); + translate([-(150 / 2) - (BOTTOM_X / 2), 6, -(24 / 2) - 22 - 12]) cube([150, 45 + 12 + 1, H], center = true); + //additional corner off right side + translate([-(150 / 2) - (BOTTOM_X / 2) + BOTTOM_CORNER_ADJUST_X, 6, -(24 / 2) - 22 - 12]) cube([150, 45 + 12 + 1, H], center = true); + + //bottom bolts + translate([25, 25, -18 - Z_OFFSET]) m5_nut_bolt(); + translate([-25, 25, -18 - Z_OFFSET]) m5_nut_bolt(); + translate([25, -5, -18 - Z_OFFSET]) m5_nut_bolt(); + translate([-25, -5, -18 - Z_OFFSET]) m5_nut_bolt(); + + //top bolts + translate([25, 25, 17.5 - Z_OFFSET]) { + rotate([180, 0, 0]) m5_nut_bolt(); + translate([0, 0, 10]) rotate([0, 0, 30]) cylinder(r = R(20), h = 20, center = true, $fn = 6); + } + translate([-25, 25, 17.5 - Z_OFFSET]) { + rotate([180, 0, 0]) m5_nut_bolt(); + translate([0, 0, 10]) rotate([0, 0, 30]) cylinder(r = R(20), h = 20, center = true, $fn = 6); + } + translate([25, -5, 17.5 - Z_OFFSET]) { + rotate([180, 0, 0]) m5_nut_bolt(); + translate([0, 0, 10]) rotate([0, 0, 30]) cylinder(r = R(20), h = 20, center = true, $fn = 6); + } + translate([-25, -5, 17.5 - Z_OFFSET]) { + rotate([180, 0, 0]) m5_nut_bolt(); + translate([0, 0, 10]) rotate([0, 0, 30]) cylinder(r = R(20), h = 20, center = true, $fn = 6); + } + + //rails void + translate([RAILS / 2, 0, -Z_OFFSET -6.5-5.75]) rotate([90, 0, 0]) cylinder(r = R(RAIL_D), h = 100, center = true, $fn = 80); + translate([-RAILS / 2, 0, -Z_OFFSET -6.5-5.75]) rotate([90, 0, 0]) cylinder(r = R(RAIL_D), h = 100, center = true, $fn = 80); + } + + //debug + + //translate([0, 12, 0]) color("green") cube([160, 45, 12], center = true); + //translate([RAILS / 2, 0, -6.5-5.75]) rotate([90, 0, 0]) cylinder(r = R(RAIL_D), h = 100, center = true, $fn = 80); + //translate([-RAILS / 2, 0, -6.5-5.75]) rotate([90, 0, 0]) cylinder(r = R(RAIL_D), h = 100, center = true, $fn = 80); +} + +module lensAssemblyTopZ () { + difference () { + rounded_cube([150, 22, 15], d = 8, $fn = 30, center = true); + translate([ZOffset/2, 0, 0]) linearMotionRod(22 + 1, 0.2); + translate([-ZOffset/2, 0, 0]) threadedRod(50, 0.5); + translate([ZOffset/2+10, 0, 0]) rotate([0, 90, 0]) m4BoltNut(20, -1); + } +} + +module lensAssemblyThreadedCollar (H = 8, pad = 0) { + difference () { + union () { + cylinder(r = R(26), h = H, center = true, $fn = 80); + } + threadedRod(H*2, 0.1 + pad); + translate([8.5, 0, 0]) rotate([0, 90, 0]) m3BoltNut(10, -1); + } +} + +module lensAssemblyThreadedKnob () { + H = 8; + D1 = 38.7; + difference () { + union () { + translate([0, 0, -H/2]) knurled_cyl(H, D1, 2, 2, .3, 0, 0); + translate([0, 0, H]) lensAssemblyThreadedCollar(H); + } + translate([0, 0, H]) threadedRod(H*2, 0.1); + } +} + +module debug () { + translate([0, 0, ZPosition]) { + translate([-ZOffset/2, BackOffset, 0]) lensAssemblyThreadedZ(); + translate([ZOffset/2, BackOffset, 0]) lensAssemblyLinearZ(); + + translate([ZOffset/2, BackOffset, (90 / 2) - (LinearBearingHeight / 2) + 2]) color("green") linearBearing(); + translate([ZOffset/2, BackOffset, -(90 / 2) + (LinearBearingHeight / 2) - 2]) color("green") linearBearing(); + + translate([-ZOffset/2, BackOffset, 40]) rotate([180, 0, 0]) TNut(); + translate([-ZOffset/2, BackOffset, -40]) TNut(); + + //X axis + translate([0, -FrontOffset, -XOffset]) rotate([0, 90, 0]) threadedRod(RodLength); + //translate([-(ZOffset/2) - 24, -FrontOffset, -XOffset]) rotate([0, 90, 0]) lensAssemblyThreadedKnob(); + translate([-(ZOffset/2) + 16, -FrontOffset, -XOffset]) rotate([0, 90, 0]) lensAssemblyThreadedCollar(); + translate([0, -FrontOffset, XOffset]) rotate([0, 90, 0]) linearMotionRod(RodLength); + + translate([XPosition, 0, 0]) { + rotate([90, 0, 0]) lensAssemblyBellowsBoard(); + translate([0, 0, 40]) rotate([0, 90, 0]) color("green") linearBearing(); + translate([-22.5, 0, -XOffset]) rotate([0, 90, 0]) TNut(); + translate([22.5, 0, -XOffset]) rotate([0, -90, 0]) TNut(); + } + } + + //Z axis + translate([-ZOffset/2, BackOffset, 0]) threadedRod(RodLength + 20); + //translate([-ZOffset/2, BackOffset, -((RodLength + 20)/2)-8]) lensAssemblyThreadedKnob(); + translate([-ZOffset/2, BackOffset, -((RodLength + 20)/2)+31]) lensAssemblyThreadedCollar(); + translate([ZOffset/2, BackOffset, 0]) linearMotionRod(RodLength); + + translate([0, BackOffset, -70]) lensAssemblyBaseZ(); + + translate([0, 130, 0]) rotate([90, 0, 0]) bellows_camera_board(); + translate([0, 130/2, 0]) color("blue") { + difference () { + cube([70, 130-10, 70], center = true); + cube([40, 130 + 1, 40], center = true); + } + } +} + +PART = "lens_assembly_bellows_board_magnetic"; + +if (PART == "lens_assembly_camera_bellows_board") { + bellows_camera_board(); +} else if (PART == "lens_assembly_camera_bellows_board_magnetic") { + bellows_camera_board(magnets = true); +} else if (PART == "lens_assembly_bellows_board") { + lensAssemblyBellowsBoard(); +} else if (PART == "lens_assembly_bellows_board_magnetic") { + lensAssemblyBellowsBoard(magnets = true); +} else if (PART == "lens_assembly_threaded_z") { + lensAssemblyThreadedZ(); +} else if (PART == "lens_assembly_linear_z") { + lensAssemblyLinearZ(); +} else if (PART == "lens_assembly_base_z") { + lensAssemblyBaseZ(); +} else if (PART == "lens_assembly_top_z") { + lensAssemblyTopZ(); +} else if (PART == "lens_assembly_threaded_knob") { + lensAssemblyThreadedKnob(); +} else if (PART == "lens_assembly_threaded_collar") { + lensAssemblyThreadedCollar(6, 0.2); +} else { + debug(); +}