hpgl_xy/cad/pen_holder.scad

127 lines
3.9 KiB
OpenSCAD

use <threads.scad>
// Body parameters
length_above = 25;
top_diameter = 11.6; // Original: 11.6 mm
pinch_length = 8;
pinch_gap = 1;
pinch_diameter_difference = 0.5;
pinch_minimum_diameter = 7;
screw_outer_diameter = 12;
screw_inner_diameter = 8.5;
screw_start_height = 9;
screw_pitch = ThreadPitch(screw_outer_diameter);
// Tolerances for threads
thread_gap = 0.3;
// Pen hole
pen_hole_diameter = 6.1;
nut_bottom_diameter = 15;
nut_top_diameter = 10;
nut_knurl_height = 10; // > screw_thread_length
nut_knurl_size = 0.5;
nut_knurl_count = 36;
nut_thread_extend = 1;
hook_width_shrink = 0.3; // Shrink original size
hook_squeeze = 0.25;
$fn = 48;
$eps = 0.1;
screw_thread_length = length_above - pinch_length - screw_start_height;
module holder() {
difference() {
union() {
// Base shape
rotate_extrude()
polygon([
[0, -4.8],
[9.25 / 2, -4.8],
[9.55 / 2, -4.8],
[9.55 / 2, -hook_squeeze],
[top_diameter / 2, (top_diameter - 9.55) / 2 - hook_squeeze], // 45° draft
[top_diameter / 2, screw_start_height - nut_thread_extend],
[screw_inner_diameter / 2, screw_start_height - nut_thread_extend],
[screw_inner_diameter / 2, length_above - pinch_length],
[pinch_minimum_diameter / 2 + pinch_diameter_difference / 4, length_above],
[0, length_above]
]);
// Retention hooks
intersection() {
rotate_extrude()
polygon([
[9.55 / 2, -4.8],
[11.3 / 2, (11.3 - 9.55) / 2 - 4.8],
[11.3 / 2, 2.4 - 4.8],
[9.55 / 2 + 0.3, 2.4 - 4.8],
[9.55 / 2, 2.4 - 0.3 - 4.8]
]);
cube([20, 4.5 - hook_width_shrink, length_above + 4.8], true);
}
// Outer thread
translate([0, 0, screw_start_height - nut_thread_extend])
ScrewThread(screw_outer_diameter - thread_gap / 2, screw_thread_length + nut_thread_extend, pitch = screw_pitch);
}
// Pen hole
union() {
translate([0, 0, -4.8 - $eps])
cylinder(d = pen_hole_diameter, h = length_above + 4.8 - pinch_length + 2 * $eps);
translate([0, 0, length_above - pinch_length])
cylinder(h = pinch_length + $eps, d1 = pen_hole_diameter, d2 = pen_hole_diameter - pinch_diameter_difference / 2);
}
for(angle = [0, 90]) {
translate([0, 0, length_above + $eps])
rotate([-90, 0, angle])
linear_extrude(screw_outer_diameter + $eps, center = true)
polygon([
[pinch_gap / 2, 0],
[0, pinch_length + $eps],
[-pinch_gap / 2, 0]
]);
}
}
}
module nut() {
ScrewHole(screw_outer_diameter + thread_gap / 2, screw_thread_length + nut_thread_extend, pitch=screw_pitch)
rotate_extrude()
polygon([
[screw_inner_diameter / 2, 0],
[nut_bottom_diameter / 2, 0],
[nut_bottom_diameter / 2, nut_knurl_height],
[nut_top_diameter / 2, screw_thread_length + pinch_length],
[pinch_minimum_diameter / 2, screw_thread_length + pinch_length],
[screw_outer_diameter / 2, screw_thread_length],
[screw_inner_diameter / 2, screw_thread_length],
]);
for(i = [0:nut_knurl_count - 1]) {
rotate([0, 0, i * 360 / nut_knurl_count])
translate([-nut_knurl_size / 2, nut_bottom_diameter / 2 - nut_knurl_size / 2, 0])
cube([nut_knurl_size, nut_knurl_size, nut_knurl_height]);
}
}
// nut();
holder();
//difference() {
// union() {
// holder();
// translate([0, 0, screw_start_height])
// nut();
// }
// cube([100, 100, 100]);
//}