cad/outdoor/headlampv2.scad

110 lines
3.1 KiB
OpenSCAD
Raw Normal View History

2024-10-15 16:34:48 -07:00
// Headlamp bracket to mount lamp to nylon strap v1
// requires tweaking of plateScale when changing strap width
// v2 TODO:
// autoscale plate geometry with strapwidth, light cant
// headcurve is janky
// downward light angle
lCant = 20;
// clipin angle
clipRot = -30;
// clip length:
clipLength = 29;
// light diameter, testing at 0.25 below measured for tightness?
lDiam = 20.75;
// clip tightness, use 0.8 (tight) to 0.99 (no retention)
clippiness = 0.85;
// plate thick
plateThick = 7;
// plate scale - how many times cliplength, affected by strap and cant
// 2.7 seems right for 25mm strap, 1.9 for 20mm strap
plateScale = 1.5;
// strap width
strapWide = 21;
// strap thickness try 3mm
strapThick = 2.1;
// head curve, puts slight curve in head side
hcRad = 400;
hcDepth = 4.8;
minkRad = 2;
$fn = 20;
// mechanical interface facets should be high when printing
interfaceFacets = 35;
// lop off several things, each gets comment
difference(){
minkowski(){
// union of plate and clip
union(){
//clip
// translate so back hits yz plane
translate([ (1.2 * lDiam / 2), -5, 0]){
// rotate for cant
rotate([lCant, 0, 0]){
// rotate clip entry
rotate([0, 0, clipRot]){
color("Green"){
difference(){
// outer clip diameter account mink
cylinder(d = 1.2 * lDiam, 2 * clipLength, center = true);
// minus light diam account mink
cylinder(d = lDiam + minkRad, 99, center = true, $fn = interfaceFacets);
// minus clip entry account mink, the cube y dimension coefficient is clip clippiness, try 0.8-0.95
translate([44, 0, 0]){
cube([88, clippiness * (lDiam + minkRad), 99], center = true);
}
} // end diff
}
} // rot clip
} // rot cant
} // trans in xy
// begin plate:
rotate([0, -90, 0]){
linear_extrude(plateThick - minkRad - plateThick / 2, scale = 1.15){
// this polygon adjusts to cant angle and clip length
polygon([ [0, 0], [clipLength * cos(lCant), -1 * clipLength * sin(lCant)], [plateScale * clipLength, strapWide + 7] , [0, strapWide + 7] ]);
}
}
} // un
// this does the fillets
sphere(r = minkRad);
}
// cut off below xy plane
translate([0, 0, -22]){
cube([99, 99, 44], center = true);
}
// cut off back of plate channel for strap
translate([-43.5 - minkRad, strapWide / 2 + 8, 0]){
cube([88, strapWide, 222], center = true);
}
// add top slot
translate([-2, strapWide / 2 + 8, (plateScale + 1) / 1.95 * clipLength * cos(lCant)]){
rotate([0, 45, 0]){
cube([16, strapWide, strapThick], center = true);
}
}
// add bottom slot
translate([-2, strapWide / 2 + 8, strapWide / 2]){
rotate([0, -45, 0]){
cube([16, strapWide, strapThick], center = true);
}
}
// head curve
translate([-1 * hcRad - plateThick + hcDepth, 0, (strapWide / 2 + (plateScale + 1) / 1.95 * clipLength * cos(lCant)) / 2 ]){
rotate([90, 0, 0]){
cylinder(r = hcRad, 99, center = true, $fn = 300);
}
}
} // plane diff