diff --git a/JUQS-collar.scad b/JUQS-collar.scad index b8e2b0d..ddde711 100644 --- a/JUQS-collar.scad +++ b/JUQS-collar.scad @@ -1,173 +1,181 @@ -$fn = 100; +$fn = 360; collar_r = 34.7/2; collar_h = 8.7; // short collar: 8.7, full: 18 -collar_inner_corner_r = 9/2; //should roughly match shaft for best feel -collar_inner_r = 13.2/2; //inner radius at bottom of official collar is 13.2 +shaft_r = 9/2; //should roughly match shaft for best feel +//inner radius at bottom of official collar is 13.2 -max_throw_circle = 10; +cardinal_throw = 10; max_throw_square = 14; grommet_dist = 6.8; //distance the grommet sits below this component grommet_depth = 6.4; //thickness of grommet (when compressed) pivot_depth = grommet_dist + grommet_depth / 2; +VERSION = "V1A"; -module rotate_about_pt(rotation, pt) { - translate(pt) - rotate(rotation) - translate(-pt) - children(); +CIR = "CIR"; +SQR = "SQR"; +OCT = "OCT"; +OCTR = "OCTR"; +OCTN = "OCTN"; +OCTNR = "OCTNR"; + +rotate([0,0,0]){ + /* + * OCTNR corner test (seems to also match OCTN, nice!) + * shaft(shaft_r, pivot_depth, [cardinal_throw+1.95,0,45]); + */ + juqs(model = OCTNR, ver = VERSION); } -module collar (full = false, bezel = 1) { - h = 8.7; - r = 34.7/2; - if(full) { - h = 18; - } - union() { - cylinder(h=h - bezel, r=r); - translate([0,0,h - bezel]) { - cylinder(h=bezel, r1 = r, r2= r - bezel); - } - } -} - -module base (size = [37.16, 37.1, 2.8], r = 8) { - w = size.x; - l = size.y; - h = size.z; - corner_offset = [w/2 - r, l/2 - r]; - hull() { - translate([corner_offset.x, corner_offset.y, 0]) { - cylinder(h=h, r=r); +module juqs(model, ver) { + rotate([0,0,0]) { + difference() { + difference() { + union() { + base(); + collar(collar_h); }; - translate([-corner_offset.x, corner_offset.y, 0]) { - cylinder(h=h, r=r); - }; - translate([corner_offset.x, -corner_offset.y, 0]) { - cylinder(h=h, r=r); - }; - translate([-corner_offset.x, -corner_offset.y, 0]) { - cylinder(h=h, r=r); + if(model == CIR) + cir_hollow(cardinal_throw, shaft_r, pivot_depth); + if(model == SQR) + sqr_hollow(max_throw_square, shaft_r, pivot_depth); + if(model == OCT) + oct_hollow(cardinal_throw, shaft_r, pivot_depth); + if(model == OCTR) + octr_hollow(cardinal_throw, shaft_r, pivot_depth); + if(model == OCTN) + octn_hollow(cardinal_throw, shaft_r, pivot_depth); + if(model == OCTNR) + octnr_hollow(cardinal_throw, shaft_r, pivot_depth); + }; + translate([0, -11, -0.1]) { + modtext = str("JUQS-",model); + font = "Open Sans:style=Bold"; + fontsize = 3.75; + mirror([1,0,0]) { + linear_extrude(0.7){ + text(modtext, font=font, size=fontsize, halign = "center"); + translate([0, -5, 0]) + text(ver, font=font, size=fontsize, halign = "center"); + } }; + }; }; + }; }; -module ci_pivot (throw, shaft_r, depth) { +module shaft(r, depth, rotation) { + translate([0,0,-pivot_depth]){ + rotate(rotation) + cylinder(h = 100, r = shaft_r); + } +}; + +module base (size = [37.16, 37.1, 2.8], r = 8) { + w = size.x; + l = size.y; + h = size.z; + corner_offset = [w/2 - r, l/2 - r]; + hull() { + translate([corner_offset.x, corner_offset.y, 0]) + cylinder(h=h, r=r); + translate([-corner_offset.x, corner_offset.y, 0]) + cylinder(h=h, r=r); + translate([corner_offset.x, -corner_offset.y, 0]) + cylinder(h=h, r=r); + translate([-corner_offset.x, -corner_offset.y, 0]) + cylinder(h=h, r=r); + }; +}; + +// use h=18 for full collar +module collar (h = 8.7, r = (34.7/2), bezel = 1) { + union() { + cylinder(h=h - bezel, r=r); + translate([0,0,h - bezel]) { + cylinder(h=bezel, r1 = r, r2= r - bezel); + } + } +} + +module ci_pivot (throw, shaft_r) { h = 50; top_r = h * tan(throw) + shaft_r; cylinder(h = h, r1 = shaft_r, r2 = top_r); } module sq_pivot (throw, shaft_r, depth, sharpness = 1, throw_extend = 0) { - h = 50; - corner_r = shaft_r / sharpness; - corner_offset = corner_r * (sharpness - 1); - translate([0,0,-depth]) { - hull() { - translate([corner_offset,0,0]){ - rotate([0,throw,0]){ - ci_pivot(throw = throw_extend, shaft_r = corner_r, depth = depth); - } - } - translate([-corner_offset,0,0]){ - rotate([0,-throw,0]){ - ci_pivot(throw = throw_extend, shaft_r = corner_r, depth = depth); - } - } - rotate([0,0,90]){ - translate([corner_offset,0,0]){ - rotate([0,throw,0]){ - ci_pivot(throw = throw_extend, shaft_r = corner_r, depth = depth); - } - } - translate([-corner_offset,0,0]){ - rotate([0,-throw,0]){ - ci_pivot(throw = throw_extend, shaft_r = corner_r, depth = depth); - } - } - } - }; - } + h = 50; + shaft_r = shaft_r / sharpness; + corner_offset = shaft_r * (sharpness - 1); + translate([0,0,-depth]) { + hull() { + translate([corner_offset,0,0]) + rotate([0,throw,0]) + ci_pivot(throw = throw_extend, shaft_r = shaft_r); + translate([-corner_offset,0,0]) + rotate([0,-throw,0]) + ci_pivot(throw = throw_extend, shaft_r = shaft_r); + rotate([0,0,90]) { + translate([corner_offset,0,0]) + rotate([0,throw,0]) + ci_pivot(throw = throw_extend, shaft_r = shaft_r); + translate([-corner_offset,0,0]) + rotate([0,-throw,0]) + ci_pivot(throw = throw_extend, shaft_r = shaft_r); + } + }; + } } -module sq_hollow (corner_r, slope) { - rotate([0,0,45]) { - sq_pivot(slope, corner_r, pivot_depth); - } +module cir_hollow(slope, shaft_r, depth) { + translate([0,0,-depth]) + ci_pivot(slope, shaft_r); +} + +module sqr_hollow (slope, shaft_r, depth) { + rotate([0,0,45]) + sq_pivot(slope, shaft_r, depth); }; -module oct_hollow (corner_r, slope) { - hull(){ - rotate([0,0,45]) { - sq_pivot(slope, corner_r, pivot_depth); - } - sq_pivot(slope, corner_r, pivot_depth); - } -}; - -module soct_hollow (corner_r, slope) { - hull(){ - rotate([0,0,45]) { - sq_pivot(slope + 2, corner_r, pivot_depth, 4); - } - sq_pivot(slope, corner_r, pivot_depth, 4); - } -}; - -module roct_hollow (corner_r, slope) { - union(){ - rotate([0,0,45]) { - sq_pivot(slope, corner_r, pivot_depth); - } - sq_pivot(slope, corner_r, pivot_depth); - } -}; - -module nroct_hollow (corner_r, slope) { - //diag_r = corner_r * 1.075; - union(){ - rotate([0,0,45]) { - sq_pivot(slope + 1, corner_r, pivot_depth, 1, 1); - } - sq_pivot(slope, corner_r, pivot_depth); - } -}; - -translate([0,0,-pivot_depth]){ - rotate([0,0,0]){ - cylinder(h = 100, r = collar_inner_corner_r); +module oct_hollow (slope, shaft_r, depth) { + hull() { + rotate([0,0,45]) + sq_pivot(slope, shaft_r, depth); + sq_pivot(slope, shaft_r, depth); } -} +}; -rotate([0,0,0]) { -difference() { -difference() { -union() { - base(); - collar(false); +module octn_hollow (slope, shaft_r, depth) { + hull(){ + rotate([0,0,45]) + sq_pivot(slope + 3, shaft_r, depth, 3); + sq_pivot(slope, shaft_r, depth, 3); + } }; -//sq_hollow(collar_inner_corner_r, max_throw_square); -//oct_hollow(collar_inner_corner_r, max_throw_circle); -//soct_hollow(collar_inner_corner_r, max_throw_circle); -//roct_hollow(collar_inner_corner_r, max_throw_circle); -nroct_hollow(collar_inner_corner_r, max_throw_circle); -//ci_pivot(max_throw_circle, collar_inner_corner_r, pivot_depth); + +module octr_hollow (slope, shaft_r, depth) { + union(){ + rotate([0,0,45]) + sq_pivot(slope, shaft_r, depth); + sq_pivot(slope, shaft_r, depth); + } }; + +module octnr_hollow (slope, shaft_r, depth) { + union(){ + rotate([0,0,45]) + sq_pivot(slope + 1, shaft_r, depth, 1, 1); + sq_pivot(slope, shaft_r, depth); + } }; -/* -translate([0, -13, -0.1]) { -font = "Open Sans:style=Bold"; - mirror([1,0,0]) { -linear_extrude(0.6) - //text("QJ-SQR-V2", font=font, size=3.5, halign = "center");h = 8.7; - //text("QJ-OCT-V2", font=font, size=3.5, halign = "center"); - //text("QJ-OCS-V2", font=font, size=3.5, halign = "center"); - //text("QJ-OCR-V2", font=font, size=3.5, halign = "center"); - text("QJ-OCR-V2", font=font, size=3.5, halign = "center"); -} -} -*/ + +module rotate_about_pt(rotation, pt) { + translate(pt) + rotate(rotation) + translate(-pt) + children(); }; + diff --git a/renders/JUQS-OCTNR-V1A.stl b/renders/JUQS-OCTNR-V1A.stl new file mode 100644 index 0000000..dd75dac Binary files /dev/null and b/renders/JUQS-OCTNR-V1A.stl differ