From 3d77cb448a4a992c82573ba00ac332c5e1a03e5d Mon Sep 17 00:00:00 2001 From: Jimmy Date: Sun, 3 May 2026 14:56:35 +1200 Subject: [PATCH] chore: add vertical stand OpenSCAD model Co-authored-by: Cursor --- led_bar_vertical_stand.scad | 123 ++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 led_bar_vertical_stand.scad diff --git a/led_bar_vertical_stand.scad b/led_bar_vertical_stand.scad new file mode 100644 index 0000000..0df3973 --- /dev/null +++ b/led_bar_vertical_stand.scad @@ -0,0 +1,123 @@ +// Parametric LED bar vertical stand socket +// For a bar nominally 14 x 17 mm, 2 m long. +// This part is intended to be screwed to an MDF base. + +// ------------------------- +// User parameters +// ------------------------- +bar_w = 14; // Bar width (mm) +bar_d = 17; // Bar depth (mm) +clearance = 0.4; // Total clearance added to each axis (mm) + +socket_height = 36; // Height of printed socket body (mm) +wall = 3.2; // Socket wall thickness (mm) +base_thickness = 5; // Printed bottom plate thickness (mm) + +// USB cable/connector side opening +usb_notch_enable = true; +usb_notch_w = 11; +usb_notch_h = 9; +usb_notch_from_bottom = 6; +usb_notch_side = "right"; // "right" or "left" + +// Mounting ears for MDF screws +ear_enable = true; +ear_len = 16; +ear_w = 16; +ear_thickness = base_thickness; +screw_hole_d = 4.2; // M4 clearance. Use 3.4 for M3. +screw_hole_edge = 5.5; // Hole center offset from ear outer corner + +// Optional clamp lip at top to reduce wobble +top_lip_enable = true; +top_lip_depth = 2.0; // Intrudes into opening on each side +top_lip_height = 3.0; + +$fn = 48; + +// ------------------------- +// Derived +// ------------------------- +inner_w = bar_w + clearance; +inner_d = bar_d + clearance; + +outer_w = inner_w + wall * 2; +outer_d = inner_d + wall * 2; +outer_h = socket_height; + +module screw_hole() { + cylinder(h = ear_thickness + 0.2, d = screw_hole_d); +} + +module mounting_ear(sign_y = 1) { + translate([outer_w / 2, sign_y * (outer_d / 2), 0]) + cube([ear_len, ear_w, ear_thickness], center = false); +} + +module top_lip() { + if (top_lip_enable) { + // Front and back lips at the top of the socket. + translate([wall, wall, outer_h - top_lip_height]) + cube([top_lip_depth, inner_d, top_lip_height]); + + translate([outer_w - wall - top_lip_depth, wall, outer_h - top_lip_height]) + cube([top_lip_depth, inner_d, top_lip_height]); + } +} + +difference() { + union() { + // Main body + cube([outer_w, outer_d, outer_h], center = false); + + // Base plate under socket for stiffness + translate([0, 0, -base_thickness]) + cube([outer_w, outer_d, base_thickness], center = false); + + // Mounting ears + if (ear_enable) { + translate([0, 0, -ear_thickness]) { + mounting_ear(1); + mounting_ear(-1); + } + } + + top_lip(); + } + + // Main bar cavity + translate([wall, wall, 0]) + cube([inner_w, inner_d, outer_h + 0.2], center = false); + + // USB side notch + if (usb_notch_enable) { + if (usb_notch_side == "right") { + translate([outer_w - wall - 0.1, (outer_d - usb_notch_w) / 2, usb_notch_from_bottom]) + cube([wall + 0.3, usb_notch_w, usb_notch_h], center = false); + } else { + translate([-0.2, (outer_d - usb_notch_w) / 2, usb_notch_from_bottom]) + cube([wall + 0.3, usb_notch_w, usb_notch_h], center = false); + } + } + + // Screw holes in ears + if (ear_enable) { + // Upper ear hole + translate([ + outer_w / 2 + ear_len - screw_hole_edge, + outer_d / 2 + ear_w - screw_hole_edge, + -ear_thickness - 0.05 + ]) screw_hole(); + + // Lower ear hole + translate([ + outer_w / 2 + ear_len - screw_hole_edge, + -outer_d / 2 + screw_hole_edge, + -ear_thickness - 0.05 + ]) screw_hole(); + } +} + +// Print orientation helper: +// Keep the base/ears on the bed. +// If fit is tight, increase clearance to 0.5 or 0.6.