Files
ids_mount/camera_side_mount.scad
2025-11-25 15:45:34 +02:00

124 lines
5.7 KiB
OpenSCAD

// Camera side mount with modular inserts - LASER CUT VERSION
// Base plate with tripod hole + two camera mount inserts with notch/tab joints
// 24mm width faces front when assembled
// RENDER MODE - Change this to switch between views
render_mode = "flat"; // Options: "assembly" or "flat"
// ASSEMBLY ADJUSTMENT - Manual Z position offset for camera inserts
insert_z_offset = 15; // mm - adjust vertical position of camera inserts (positive = higher)
// Parameters - Camera hole spacing: rotated 90° CW
hole_spacing_x = 25; // mm (horizontal distance between hole centers)
hole_spacing_y = 24; // mm (vertical distance between hole centers)
bottom_hole_clearance = 3; // mm (clearance from base plate to bottom hole center when standing)
hole_edge_margin_x = 3; // mm (side margin)
hole_edge_margin_y = bottom_hole_clearance; // mm (bottom margin = bottom clearance)
mount_width = hole_spacing_x + 2 * hole_edge_margin_x; // 31mm total width
mount_height = hole_spacing_y + 2 * hole_edge_margin_y; // 30mm total height
material_thickness = 3; // mm (laser cut material thickness)
spacing = 35; // mm (gap between camera inserts)
hole_diameter = 3.2; // mm (M3 clearance hole for camera)
padding = 3; // mm padding on sides (top/bottom/right)
left_margin = 14; // mm left margin for tripod hole center (ensures >10mm edge clearance)
base_thickness = 2; // mm (base plate thickness)
tripod_hole_diameter = 6.35; // mm (1/4" standard tripod screw, radius=3.175mm)
// Notch parameters for joining - wider for better rigidity and alignment
notch_width = 12; // mm width of the notch/slot (wider for stability)
notch_depth = 3; // mm depth of the slot in base plate
tab_height = notch_depth; // Height of the tab on insert
// Total dimensions
mount_area_width = mount_width * 2 + spacing;
total_width = mount_area_width + left_margin + padding; // Left margin + right padding
// Height should fit standing inserts (mount_width when rotated) with padding
total_height = mount_width + 2 * padding; // Standing insert is mount_width tall in Y direction
// Base plate module with tripod hole and slots for inserts
module base_plate() {
difference() {
// Base rectangle
cube([total_width, total_height, base_thickness]);
// 1/4" tripod hole on left side (10mm clearance from edge)
translate([left_margin, total_height / 2, -0.5])
cylinder(h = base_thickness + 1, d = tripod_hole_diameter, $fn = 30);
// Slots for inserts - must match material_thickness when insert is rotated
// Centered on Y axis, sized to fit the 3mm thick insert tab perfectly
translate([left_margin + mount_width/2 - material_thickness/2, total_height/2 - notch_width/2, -0.5])
cube([material_thickness, notch_width, base_thickness + 1]);
translate([left_margin + mount_width + spacing + mount_width/2 - material_thickness/2, total_height/2 - notch_width/2, -0.5])
cube([material_thickness, notch_width, base_thickness + 1]);
}
}
// Camera mount insert module (with 4 M3 holes and bottom tab for slot)
module camera_mount_insert() {
difference() {
union() {
// Main insert body
cube([mount_width, mount_height, material_thickness]);
// Tab at bottom center for inserting into base slot
translate([mount_width/2 - notch_width/2, -tab_height, 0])
cube([notch_width, tab_height, material_thickness]);
}
// 4 holes for camera mounting - 25mm x 24mm spacing (rotated 90° CW)
// Bottom-left (3mm from base when standing)
translate([hole_edge_margin_x, hole_edge_margin_y, -0.5])
cylinder(h = material_thickness + 1, d = hole_diameter, $fn = 30);
// Bottom-right (25mm horizontal spacing)
translate([hole_edge_margin_x + hole_spacing_x, hole_edge_margin_y, -0.5])
cylinder(h = material_thickness + 1, d = hole_diameter, $fn = 30);
// Top-left (24mm vertical spacing from bottom)
translate([hole_edge_margin_x, hole_edge_margin_y + hole_spacing_y, -0.5])
cylinder(h = material_thickness + 1, d = hole_diameter, $fn = 30);
// Top-right
translate([hole_edge_margin_x + hole_spacing_x, hole_edge_margin_y + hole_spacing_y, -0.5])
cylinder(h = material_thickness + 1, d = hole_diameter, $fn = 30);
}
}
// Assembly module - shows complete setup with inserts standing vertically
module complete_assembly() {
// Base plate
base_plate();
// First camera mount insert (left) - sits flush on base plate, centered on Y
translate([left_margin + mount_width/2, total_height/2, base_thickness + insert_z_offset])
rotate([90, 0, 90])
translate([-mount_width/2, -mount_width/2, -material_thickness/2])
camera_mount_insert();
// Second camera mount insert (right) - sits flush on base plate, centered on Y
translate([left_margin + mount_width + spacing + mount_width/2, total_height/2, base_thickness + insert_z_offset])
rotate([90, 0, 90])
translate([-mount_width/2, -mount_width/2, -material_thickness/2])
camera_mount_insert();
}
// Render based on mode
if (render_mode == "assembly") {
// Assembly view - shows how parts fit together
complete_assembly();
} else if (render_mode == "flat") {
// Flat layout for laser cutting - all parts laid flat
// Base plate
base_plate();
// First insert - laid flat
translate([total_width + 5, 0, 0])
camera_mount_insert();
// Second insert - laid flat
translate([total_width + 5, mount_height + tab_height + 5, 0])
camera_mount_insert();
}