Work on the single-lamp design (TODO: Needs a BOM pass)

This commit is contained in:
Matt McWilliams 2025-03-12 15:20:21 -04:00
parent 0b4ff27f06
commit bceedf24b7
2 changed files with 99 additions and 57 deletions

View File

@ -43,8 +43,7 @@
@online{spudic-device, @online{spudic-device,
author={Hrvoje Spudić}, author={Hrvoje Spudić},
title={DIY 16mm optical sound recorder, v2: title={DIY 16mm optical sound recorder, v2: The device.},
The device.},
url={https://hrvojespudic.net/optical-sound-2-pt-2}, url={https://hrvojespudic.net/optical-sound-2-pt-2},
urldate={2025-02-24} urldate={2025-02-24}
} }

View File

@ -1,19 +1,24 @@
//include <./lamp.scad>; //include <./lamp.scad>;
//include <./box_laser.scad>; //include <./box_laser.scad>;
include <./common/common.scad>; use <./common/common.scad>;
include <./common/motors.scad>; include <./common/motors.scad>;
include <./common/2020_tslot.scad>; include <./common/2020_tslot.scad>;
include <./takeup/takeup.scad>; include <./takeup/takeup.scad>;
use <./sprocketed_roller/scad/sprocketed_roller.scad>; use <./sprocketed_roller/scad/sprocketed_roller.scad>;
use <./filmless.scad>; use <./filmless.scad>;
$fn = 100;
FrameX = 400; FrameX = 400;
FrameY = 260; FrameY = 260;
FrameZ = -16; FrameZ = -16;
SprocketBaseD = 19.05; //8 frames
SprocketBaseH = 2.7;
FrameC = (SprocketBaseD * PI) / 8;
IN = 25.4; IN = 25.4;
Film16mmStandard = 10.26; Film16mmStandard = 10.26;
@ -112,7 +117,7 @@ LampRailsOffsetZ = 1 / 2;
LampGateCarrierThreadedSpacingX = 30; LampGateCarrierThreadedSpacingX = 30;
LampCarrierX = 40; LampCarrierX = 40;
LampSingleX = 70; LampSingleX = 84;
LEDWidthX = 20; LEDWidthX = 20;
GateCarrierX = 37; GateCarrierX = 37;
@ -362,24 +367,23 @@ module lamp_bolts_voids (pos = [0, 0, 0], H = 10, Pad = 0) {
} }
} }
module lamp_post (pos = [0, 0, 0]) { module lamp_post (pos = [0, 0, 0], H = 20) {
$fn = 40; $fn = 40;
H = 20;
translate(pos) difference () { translate(pos) difference () {
cylinder(r = R(8), h = H, center = true); cylinder(r = R(8), h = H, center = true);
cylinder(r = R(4.4), h = H + 1, center = true); cylinder(r = R(4.4), h = H + 1, center = true);
} }
} }
module lamp_posts (pos = [0, 0, 0], H = 10) { module lamp_posts (pos = [0, 0, 0], H = 20) {
X = LampBoltX/2; X = LampBoltX / 2;
Y = LampBoltY/2; Y = LampBoltY / 2;
$fn = 30; $fn = 30;
translate(pos) { translate(pos) {
lamp_post([X, Y, 0]); lamp_post([X, Y, 0], H);
lamp_post([-X, Y, 0]); lamp_post([-X, Y, 0], H);
lamp_post([X, -Y, 0]); lamp_post([X, -Y, 0], H);
lamp_post([-X, -Y, 0]); lamp_post([-X, -Y, 0], H);
} }
} }
@ -483,6 +487,7 @@ module gate_carrier (pos = [0, 0, 0], rot = [0, 0, 0]) {
SidesX = 2; SidesX = 2;
SidesY = -1.2; SidesY = -1.2;
SpringRail = 4.5; SpringRail = 4.5;
TabX = 6;
translate(pos) rotate(rot) { translate(pos) rotate(rot) {
difference () { difference () {
union () { union () {
@ -529,6 +534,8 @@ module gate_carrier (pos = [0, 0, 0], rot = [0, 0, 0]) {
} }
//registration tabs //registration tabs
translate([(GateCarrierX / 2) - (TabX / 2), 8.5, (-GateCarrierZ / 2) + (4 / 2)]) cube([TabX - 0.4, 20, 2], center = true);
translate([(-GateCarrierX / 2) + (TabX / 2), 8.5, (-GateCarrierZ / 2) + (4 / 2)]) cube([TabX - 0.4, 20, 2], center = true);
} }
} }
@ -601,6 +608,7 @@ module picture_gate (pos = [0, 0, 0], rot = [0, 0, 0], Type = "full", Width = 2)
} }
} }
/*
module lamp_dual (pos = [0, 0, 0]) { module lamp_dual (pos = [0, 0, 0]) {
Z = 10; Z = 10;
WallZ = Z; WallZ = Z;
@ -636,44 +644,50 @@ module lamp_dual (pos = [0, 0, 0]) {
translate([0, 10.6+7, Z]) cube([5.5, 34, 18], center = true); translate([0, 10.6+7, Z]) cube([5.5, 34, 18], center = true);
translate([0, 5, Z]) cube([3, 20, 18], center = true); translate([0, 5, Z]) cube([3, 20, 18], center = true);
} }
} }*/
module lamp_single (pos = [0, 0, 0]) { module lamp_single (pos = [0, 0, 0]) {
Height = 20 + 5;
BaseZ = 2;
Z = 12; Z = 12;
WallZ = Z; WallZ = Z;
GateZ = Z; GateZ = Z;
PostsZ = Z - 1; PostsZ = (Height / 2) + 1;
TabX = 6;
TabsOffsetY = 6;
translate(pos) { translate(pos) {
intersection () { intersection () {
difference () { difference () {
union () { union () {
rounded_cube([LampSingleX, 70, 2], d = 4, center = true); //base
translate([0, -15, 20 / 2]) cube([70, 10, 22], center = true); rounded_cube([LampSingleX, 74, BaseZ], d = 4, center = true, $fn = 30);
translate([0, 0, 20 / 2]) difference() {
rounded_cube([70, 70, 22], d = 4, center = true); translate([0, -12, Height / 2]) cube([LampSingleX, 10, BaseZ + Height], center = true);
rounded_cube([70 - 5, 70 - 10, 22 + 1], d = 4, center = true); translate([0, 0, Height / 2]) difference() {
rounded_cube([LampSingleX, 74, BaseZ + Height], d = 4, center = true, $fn = 30);
translate([0, 2, 0]) rounded_cube([LampSingleX - 7, 70 - 10, BaseZ + Height + 1], d = 4, center = true, $fn = 30);
} }
lamp_posts([0, 14.75, PostsZ]); lamp_posts([0, 14.75, PostsZ], Height);
//translate([-18, 1, 20 / 2]) cube([4.75, 32, 21], center = true); //translate([-18, 1, 20 / 2]) cube([4.75, 32, 21], center = true);
} }
//void for gate carrier, front //void for gate carrier, front
translate([0, 1, 9.99]) cube([25, 32, 22], center = true); translate([0, 1, Height / 2 ]) cube([25, 32, BaseZ + Height + 1], center = true);
//void for gate carrier, bottom //void for gate carrier, bottom
translate([0, -4, 0]) cube([GateCarrierX + 0.25, 12, 50], center = true); translate([0, -4, 0]) cube([GateCarrierX + 0.25, 12, 55], center = true);
//void for lamp slide //void for lamp slide
translate([0, 10, 0]) cube([LEDWidthX + 0.25, 40, 50], center = true); translate([0, 10, 0]) cube([LEDWidthX + 0.25, 40, 55], center = true);
//void for gate //void for gate
translate([0, -4, 0]) cube([LEDWidthX + 0.25, 32, 50], center = true); translate([0, -4, 0]) cube([LEDWidthX + 0.25, 32, 55], center = true);
translate([0, -48, 0]) cylinder(r = R(60), h = 4 + 1, center = true, $fn = 200); translate([0, -48, 0]) cylinder(r = R(60), h = 4 + 1, center = true, $fn = 200);
lamp_bolts_voids([0, 14.75, -2], 50, 0.2); lamp_bolts_voids([0, 14.75, -2], 50, 0.2);
translate([LampGateCarrierThreadedSpacingX / 2, 31, 9 + LampRailsOffsetZ]) rotate([90, 0, 0]) { translate([LampGateCarrierThreadedSpacingX / 2, 32.5, 9 + LampRailsOffsetZ]) rotate([90, 0, 0]) {
cylinder(r = R(4.25), h = 20, center = true, $fn = 40); cylinder(r = R(4.25), h = 20, center = true, $fn = 40);
rotate([0, 0, 30]) m4_nut(); rotate([0, 0, 30]) m4_nut();
} }
translate([-LampGateCarrierThreadedSpacingX / 2, 31, 9 + LampRailsOffsetZ]) rotate([90, 0, 0]) { translate([-LampGateCarrierThreadedSpacingX / 2, 32.5, 9 + LampRailsOffsetZ]) rotate([90, 0, 0]) {
cylinder(r = R(4.25), h = 20, center = true, $fn = 40); cylinder(r = R(4.25), h = 20, center = true, $fn = 40);
rotate([0, 0, 30]) m4_nut(); rotate([0, 0, 30]) m4_nut();
} }
@ -683,23 +697,38 @@ module lamp_single (pos = [0, 0, 0]) {
cube([LEDWidthX + 0.25, 20, 2.8], center = true); cube([LEDWidthX + 0.25, 20, 2.8], center = true);
translate([((LEDWidthX + 0.25) / 2) - (3.5 / 2), 0, (5.5 / 2) - (1.5 / 2)]) cube([3.5, 20, 6.8], center = true); translate([((LEDWidthX + 0.25) / 2) - (3.5 / 2), 0, (5.5 / 2) - (1.5 / 2)]) cube([3.5, 20, 6.8], center = true);
translate([((-LEDWidthX - 0.25) / 2) + (3.5 / 2), 0, (5.5 / 2) - (1.5 / 2)]) cube([3.5, 20, 6.8], center = true); translate([((-LEDWidthX - 0.25) / 2) + (3.5 / 2), 0, (5.5 / 2) - (1.5 / 2)]) cube([3.5, 20, 6.8], center = true);
} }
//voids for gate carrier tabs
translate([(GateCarrierX / 2) - (TabX / 2), TabsOffsetY, 0]) cube([TabX, 20, 2.8], center = true);
translate([(-GateCarrierX / 2) + (TabX / 2), TabsOffsetY, 0]) cube([TabX, 20, 2.8], center = true);
//DC power jack void
translate([-LampSingleX / 2, 13, 12]) rotate([0, 90, 0]) cylinder(r = R(11), h = 20, center = true, $fn = 80);
} }
translate([0, 66.5, 0]) cylinder(r = R(170), h = 100, center = true, $fn = 500); translate([0, 66.5, 0]) cylinder(r = R(170), h = 100, center = true, $fn = 500);
} }
translate([0, 26.5, 3.8]) difference () {
translate([0, 1, -1]) cube([LEDWidthX - 6.75, 8, 4], center = true); translate([0, 26.5, 3.8 + 0.4]) difference () {
translate([0, 2, -1]) cube([LEDWidthX - 6.75, 10, 4], center = true);
m4_nut(); m4_nut();
cylinder(r = R(4), h = 20, $fn = 40, center = true); cylinder(r = R(4), h = 20, $fn = 40, center = true);
} }
translate([LampGateCarrierThreadedSpacingX / 2, 12, (11 / 2) - (2 / 2)]) difference() { difference () {
translate([-0.7, 0, 0]) cube([(GateCarrierX - LEDWidthX) / 2, 20, 11], center = true); union () {
translate([0, 0, 10.2 / 2]) rotate([90, 0, 0]) cylinder(r = R(4.1), h = 20 + 1, center = true, $fn = 40); translate([LampGateCarrierThreadedSpacingX / 2, 12, (11 / 2) - (2 / 2)]) difference() {
} translate([0.375, 0, 0]) cube([(GateCarrierX - LEDWidthX) / 2 + 2, 20, 11], center = true);
translate([-LampGateCarrierThreadedSpacingX / 2, 12, (11 / 2) - (2 / 2)]) difference() { translate([0, 0, 10.2 / 2]) rotate([90, 0, 0]) cylinder(r = R(4.1), h = 20 + 1, center = true, $fn = 40);
translate([0.7, 0, 0]) cube([(GateCarrierX - LEDWidthX) / 2, 20, 11], center = true); }
translate([0, 0, 10.2 / 2]) rotate([90, 0, 0]) cylinder(r = R(4.1), h = 20 + 1, center = true, $fn = 40); translate([-LampGateCarrierThreadedSpacingX / 2, 12, (11 / 2) - (2 / 2)]) difference() {
translate([-0.375, 0, 0]) cube([(GateCarrierX - LEDWidthX) / 2 + 2, 20, 11], center = true);
translate([0, 0, 10.2 / 2]) rotate([90, 0, 0]) cylinder(r = R(4.1), h = 20 + 1, center = true, $fn = 40);
}
}
//voids for gate carrier tabs
translate([(GateCarrierX / 2) - (TabX / 2), TabsOffsetY, 0]) cube([TabX, 20, 2.8], center = true);
translate([(-GateCarrierX / 2) + (TabX / 2), TabsOffsetY, 0]) cube([TabX, 20, 2.8], center = true);
} }
} }
} }
@ -715,18 +744,20 @@ module lamp_single_assembly (pos = [0, 0, 0]) {
module lamp_cover (pos = [0, 0, 0]) { module lamp_cover (pos = [0, 0, 0]) {
RollerVoidY = -17.5; RollerVoidY = -17.5;
RollerShelfD = 44.75; RollerShelfD = 44.75;
echo(LampY + 15);
translate(pos) { translate(pos) {
difference () { difference () {
union () { union () {
intersection () { intersection () {
rounded_cube([LampSingleX, 70, 2], d = 4, center = true); translate([0, 0.25, 0]) rounded_cube([LampSingleX, 74, 2], d = 4, center = true, $fn = 30);
translate([0, 66.5, 0]) cylinder(r = R(170), h = 100, center = true, $fn = 500); translate([0, 66.75, 0]) cylinder(r = R(170), h = 100, center = true, $fn = 500);
} }
translate([0, -17, -1]) cube([15, 2, 3], center = true); //over hangs
translate([0, -16, -3.4]) cube([20.25, 2, 6], center = true);
} }
lamp_bolts_voids([0, 15, 0]); lamp_bolts_voids([0, 15, 0]);
translate([0, -23, 0]) cube([40, 10, 10], center = true); translate([0, -23, 0]) cube([40, 10, 10], center = true);
translate([0, (-42.39 / 2) + RollerVoidY, 0]) cylinder(r = R(RollerShelfD), h = 10, center = true, $fn = 240); translate([0, (-42.39 / 2) + RollerVoidY, 0]) cylinder(r = R(RollerShelfD), h = 20, center = true, $fn = 240);
} }
} }
} }
@ -802,6 +833,9 @@ module panel (pos = [0, 0, 0]) {
//voids for motor pad //voids for motor pad
translate([0, RollerY + 7.4, SprocketedRollerZ]) cube([27, 43, 6], center = true); translate([0, RollerY + 7.4, SprocketedRollerZ]) cube([27, 43, 6], center = true);
panel_bearing_void([0, RollerY, 2.5]); panel_bearing_void([0, RollerY, 2.5]);
//lamp bolt void
translate([0, 46.75, 0]) cylinder(r = R(4.25), h = 20, center = true);
} }
difference () { difference () {
union () { union () {
@ -1246,6 +1280,7 @@ module motor_controller_panel (pos = [0, 0, 0]) {
} }
} }
/*
module sprocketed_roller_upright (pos = [0, 0, 0]) { module sprocketed_roller_upright (pos = [0, 0, 0]) {
translate (pos) { translate (pos) {
difference () { difference () {
@ -1254,6 +1289,7 @@ module sprocketed_roller_upright (pos = [0, 0, 0]) {
} }
} }
} }
*/
module sprocketed_roller_invert (pos = [0, 0, 0]) { module sprocketed_roller_invert (pos = [0, 0, 0]) {
D = (FrameC * Sprockets) / PI; D = (FrameC * Sprockets) / PI;
@ -1269,8 +1305,10 @@ module sprocketed_roller_invert (pos = [0, 0, 0]) {
} }
} }
/*
//currently in testing //currently in testing
module sprocketed_roller_upright_solid (pos = [0, 0, 0]) { module sprocketed_roller_upright_solid (pos = [0, 0, 0]) {
$fn = 120;
OverhangD = 42.85; OverhangD = 42.85;
OverhangH = 2.5; OverhangH = 2.5;
ChannelD = 1; ChannelD = 1;
@ -1309,6 +1347,7 @@ module sprocketed_roller_upright_solid (pos = [0, 0, 0]) {
} }
} }
} }
*/
//BOM: 1, M3 hex cap bolt 12mm, N/A, Attaches the sprocketed_roller to the geared motor //BOM: 1, M3 hex cap bolt 12mm, N/A, Attaches the sprocketed_roller to the geared motor
//BOM: 1, 608-RS Ball Bearing, 608-RS, Reduces wobble in the rollers spin //BOM: 1, 608-RS Ball Bearing, 608-RS, Reduces wobble in the rollers spin
@ -1525,9 +1564,8 @@ module debug () {
//sprocketed_roller_upright(); //sprocketed_roller_upright();
//translate([50, 0, 0]) cube([100, 100, 100], center = true); //translate([50, 0, 0]) cube([100, 100, 100], center = true);
} }
//translate([0, RollerY, 18]) rotate([180, 0, 0]) sprocketed_roller_upright_solid();
debug_lamp(); debug_lamp();
//centered_geared_motor([0, RollerY, MotorZ], [180, 0, 90]);
//lamp //lamp
//difference () { //difference () {
//lamp_dual([0, LampY, 0 + 1]); //lamp_dual([0, LampY, 0 + 1]);
@ -1642,7 +1680,7 @@ module debug () {
//motor_controller_panel([0, -75, PanelOffsetZ]); //motor_controller_panel([0, -75, PanelOffsetZ]);
//electronics //electronics
//ESP32_board([0, -90, -25], [180, 0, 0]); ESP32_board([0, -90, -25], [180, 0, 0]);
L298N_module([-32, -85, -9], [180, 0, -90]); L298N_module([-32, -85, -9], [180, 0, -90]);
L298N_module([32, -85, -9], [180, 0, 90]); L298N_module([32, -85, -9], [180, 0, 90]);
electronics_panel([0, -100, -3]); electronics_panel([0, -100, -3]);
@ -1655,13 +1693,16 @@ module debug_lamp () {
//translate([LampGateCarrierThreadedSpacingX / 2, 34, 11 + LampRailsOffsetZ]) rotate([90, 0, 0]) cylinder(r = R(4), h = 130, center = true); //translate([LampGateCarrierThreadedSpacingX / 2, 34, 11 + LampRailsOffsetZ]) rotate([90, 0, 0]) cylinder(r = R(4), h = 130, center = true);
//panel([0, -10, -1.5]); //panel([0, -10, -1.5]);
// //
lamp_single([0, 10.25, 2]); lamp_single([0, 10.25, 1]);
//lamp_cover([0, 10, 24]); lamp_cover([0, 10, 28]);
//translate([0, -30, 3.5]) rotate([0, 0, 10]) sprocketed_roller_invert_solid();
lamp_LEDs([0, 28, 11]);
gate_carrier([0, 1.6 + 0.25, 10.75]);
picture_gate([0, -6.2, 11], Type = "full"); //standard translate([0, RollerY - 10, 2.75]) sprocketed_roller_invert_solid();
centered_geared_motor([0, RollerY - 10, MotorZ], [180, 0, 90]);
lamp_LEDs([0, 28, 10]);
gate_carrier([0, 1.6 + 0.25, 9.75]);
picture_gate([0, -6.2, 10], Type = "full"); //standard
} }
//BOM: 840, 2020 Aluminum extrusion mm,N/A,Top and bottom frame 2x 420mm //BOM: 840, 2020 Aluminum extrusion mm,N/A,Top and bottom frame 2x 420mm
@ -1670,17 +1711,17 @@ module contact_printer () {
//debug module for BOM //debug module for BOM
} }
PART = "lamp_LEDs"; PART = "lamp_cover";
LIBRARY = true; LIBRARY = true;
if (PART == "panel") { if (PART == "panel") {
rotate([180, 0, 0]) panel(); rotate([180, 0, 0]) panel();
} else if (PART == "lamp_dual") { /*} else if (PART == "lamp_dual") {
lamp_dual(); lamp_dual();*/
} else if (PART == "lamp_single") { } else if (PART == "lamp_single") {
lamp_single(); lamp_single();
} else if (PART == "lamp_cover") { } else if (PART == "lamp_cover") {
lamp_cover(); rotate([180, 0, 0]) lamp_cover();
} else if (PART == "takeup_panel_picture"){ } else if (PART == "takeup_panel_picture"){
takeup_panel_picture(); takeup_panel_picture();
} else if (PART == "takeup_panel_picture_motor_mount") { } else if (PART == "takeup_panel_picture_motor_mount") {
@ -1702,11 +1743,13 @@ if (PART == "panel") {
} else if (PART == "super_gate") { } else if (PART == "super_gate") {
rotate([-90, 0, 0]) picture_gate(Type = "super16"); rotate([-90, 0, 0]) picture_gate(Type = "super16");
} else if (PART == "sound_gate") { } else if (PART == "sound_gate") {
rotate([-90, 0, 0]) picture_gate(Type = "sound"); rotate([-90, 0, 0]) picture_gate(Type = "sound");
/*
} else if (PART == "sprocketed_roller") { } else if (PART == "sprocketed_roller") {
rotate([180, 0, 0]) sprocketed_roller_upright(); rotate([180, 0, 0]) sprocketed_roller_upright();
} else if (PART == "sprocketed_roller_solid") { } else if (PART == "sprocketed_roller_solid") {
rotate([180, 0, 0]) sprocketed_roller_upright_solid(); rotate([180, 0, 0]) sprocketed_roller_upright_solid();
*/
} else if (PART == "sprocketed_roller_invert") { } else if (PART == "sprocketed_roller_invert") {
sprocketed_roller_invert(); sprocketed_roller_invert();
} else if (PART == "sprocketed_roller_invert_solid") { } else if (PART == "sprocketed_roller_invert_solid") {
@ -1736,7 +1779,7 @@ if (PART == "panel") {
} else if (PART == "gate_holder") { } else if (PART == "gate_holder") {
gate_holder(); gate_holder();
} else if (PART == "gate_carrier") { } else if (PART == "gate_carrier") {
rotate([-90, 0, 0]) gate_carrier(); rotate([0, 0, 0]) gate_carrier();
} else if (PART == "filter_carrier") { } else if (PART == "filter_carrier") {
rotate([-90, 0, 0]) filter_carrier(); rotate([-90, 0, 0]) filter_carrier();
} else if (PART == "lamp_LEDs") { } else if (PART == "lamp_LEDs") {