Files
William Miceli b2f0310686 Complete
2026-05-23 21:32:02 -04:00

139 lines
5.7 KiB
OpenSCAD
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ================================================================
Cable Grommet for Sheet Metal — TPU Print
================================================================
Protects cable insulation from sharp drilled-hole edges.
The grommet body fits inside the drilled hole while the two
flanges seat flush against each face of the sheet metal,
creating a smooth, rounded channel for the cable.
INSTALLATION:
Squeeze / fold the grommet (TPU flexibility makes this easy)
and press it through the hole until both flanges snap flat
against the sheet metal on each side.
TIPS FOR TPU PRINTING:
- 34 perimeters / walls for durability
- 2040% infill
- No supports needed (prints flat on bottom flange)
- Slow print speed recommended (≤ 30 mm/s) for clean bridges
================================================================ */
// ================================================================
// USER PARAMETERS — edit these to match your application
// ================================================================
// Diameter of the hole drilled in the sheet metal (mm)
hole_diameter = 13;
// Thickness of the sheet metal (mm)
sheet_thickness = 1;
// Thickness of the grommet body wall (mm)
// This directly sets how large the cable hole is:
// cable hole = hole_diameter - 2 x wall_thickness
// Decrease to widen the cable hole; increase to narrow it.
wall_thickness = 2.0;
// How far each flange lip extends beyond the hole edge (mm)
// Larger value = more grip on the sheet metal.
flange_lips_overhang = 2.0;
// Thickness of each flange lip (mm)
flange_lips_thickness = 2.0;
// Chamfer radius at each cable entry/exit (mm)
// This is the most important feature for insulation protection.
// The chamfer creates a smooth funnel so the cable never contacts
// a sharp edge even under vibration or flex.
cable_chamfer = 0;
// ================================================================
// RENDERING QUALITY
// ================================================================
$fn = 128;
// ================================================================
// DERIVED VALUES (do not edit below this line)
// ================================================================
_body_d = hole_diameter;
_flange_d = hole_diameter + (2 * flange_lips_overhang);
_cable_d = _body_d - (2 * wall_thickness);
_body_len = sheet_thickness;
_total_h = (2 * flange_lips_thickness) + _body_len;
// Sanity-check echoes (visible in OpenSCAD console)
echo(str("=== Cable Grommet Summary ==="));
echo(str(" Body outer diameter : ", _body_d, " mm"));
echo(str(" Flange diameter : ", _flange_d, " mm"));
echo(str(" Cable hole diameter : ", _cable_d, " mm"));
echo(str(" Wall thickness : ", wall_thickness, " mm"));
echo(str(" Total height : ", _total_h, " mm"));
if (wall_thickness < 1.5) {
echo(" WARNING: Wall thickness is thin — consider increasing wall_thickness.");
}
if (_cable_d <= 0) {
echo(" ERROR: wall_thickness is too large — cable hole is zero or negative.");
}
if (cable_chamfer > flange_lips_thickness) {
echo(" WARNING: cable_chamfer is larger than flange_lips_thickness — chamfer will be clipped.");
}
// ================================================================
// MODULE
// ================================================================
module grommet() {
difference() {
// ── OUTER SHELL ──────────────────────────────────────────
union() {
// Bottom flange
// Wider at the sheet metal face, narrower at the outer (free) face.
cylinder(d1 = _flange_d - 1.5, d2 = _flange_d, h = flange_lips_thickness);
// Body — the section that lives inside the drilled hole
translate([0, 0, flange_lips_thickness])
cylinder(d = _body_d, h = _body_len);
// Top flange
// Wider at the sheet metal face, narrower at the outer (free) face.
translate([0, 0, flange_lips_thickness + _body_len])
cylinder(d1 = _flange_d, d2 = _flange_d - 1.5, h = flange_lips_thickness);
}
// ── CABLE BORE ────────────────────────────────────────────
// Straight through-hole for the cable
translate([0, 0, -0.01])
cylinder(d = _cable_d, h = _total_h + 0.02);
// ── BOTTOM ENTRY CHAMFER ──────────────────────────────────
// Smooth funnel on the side the cable enters from.
translate([0, 0, -0.01])
cylinder(
d1 = _cable_d + (2 * cable_chamfer),
d2 = _cable_d,
h = cable_chamfer + 0.01
);
// ── TOP EXIT CHAMFER ──────────────────────────────────────
// Mirror chamfer on the other side — equally important when
// the cable flexes back toward the sheet metal.
translate([0, 0, _total_h - cable_chamfer + 0.01])
cylinder(
d1 = _cable_d,
d2 = _cable_d + (2 * cable_chamfer),
h = cable_chamfer + 0.01
);
}
}
// ================================================================
// RENDER
// ================================================================
grommet();