diff --git a/libtest.png b/libtest.png
index b5a069a..a3906a8 100644
Binary files a/libtest.png and b/libtest.png differ
diff --git a/libtest.scad b/libtest.scad
index 2d2fffa..3c89fdc 100644
--- a/libtest.scad
+++ b/libtest.scad
@@ -163,14 +163,11 @@ corner_blocks_y = fixing_blocks_y + 30;
translate([x5, corner_blocks_y])
corner_blocks();
-feet_y = corner_blocks_y + 70;
-translate([x5, feet_y])
- feet();
-
-translate([x5 + 70, feet_y])
+screw_knobs_y = corner_blocks_y + 70;
+translate([x5, screw_knobs_y])
screw_knobs();
-knobs_y = feet_y + 40;
+knobs_y = screw_knobs_y + 40;
translate([640, knobs_y])
printed_pulley_test();
@@ -185,6 +182,9 @@ strap_y = clips_y + 50;
translate([x5 + 60, strap_y])
strap_handles();
+translate([x6, strap_y])
+ feet();
+
handle_y = strap_y + 50;
translate([x5, handle_y])
handle();
diff --git a/printed/screw_knob.scad b/printed/screw_knob.scad
index 3396ecd..1c57a9b 100644
--- a/printed/screw_knob.scad
+++ b/printed/screw_knob.scad
@@ -23,49 +23,93 @@
include <../core.scad>
use <../utils/hanging_hole.scad>
-knob_wall = 2;
+function screw_knob_screw(type) = type[0]; //! The hex screw
+function screw_knob_wall(type) = type[1]; //! Wall thickness
+function screw_knob_stem_h(type) = type[2]; //! The stem height below the flange
+function screw_knob_flange_t(type) = type[3]; //! The thickness of the flange
+function screw_knob_flange_r(type) = type[4]; //! The flange outside radius
+function screw_knob_solid(type) = type[5]; //! Is the flange solid or just a wall
+function screw_knob_waves(type) = type[6]; //! Number of waves around the flange edge
+function screw_knob_wave_amp(type) = type[7]; //! Wave amplitude
+function screw_knob_fluted(type) = type[8]; //! Fluted instead of sine wave
+
+function screw_knob(screw, wall = 2, stem_h = 6, flange_t = 4, flange_r = 9, solid = true, waves = 5, wave_amp = 2, fluted = false) = //! Constructor
+ [screw, wall, stem_h, flange_t, flange_r, solid, waves, wave_amp, fluted];
+
function knob_nut_trap_depth(screw) = round_to_layer(screw_head_height(screw));
-knob_stem_h = 6;
-knob_thickness = 4;
-knob_r = 8;
-knob_wave = 1;
-knob_waves = 5;
-knob_height = knob_stem_h + knob_thickness;
-function knob_height() = knob_height;
+function knob_height(type) = screw_knob_stem_h(type) + screw_knob_flange_t(type); //! Total height of the knob
-module screw_knob(screw) { //! Generate the STL for a knob to fit the specified hex screw
- knob_stem_r = nut_trap_radius(screw_nut(screw)) + knob_wall;
+module screw_knob(type) { //! Generate the STL for a knob to fit the specified hex screw
+ type = !is_list(type[0]) ? screw_knob(type) : type; // Allow just the screw to be specified for backwards compatability
+ screw = screw_knob_screw(type);
+ wall = screw_knob_wall(type);
+ trap_r = nut_trap_radius(screw_nut(screw));
+ stem_r = trap_r + wall;
+ amp = screw_knob_wave_amp(type);
+ flange_r = max(screw_knob_flange_r(type), stem_r + amp);
+ flange_t = screw_knob_flange_t(type);
+ knob_h = knob_height(type);
+ waves = screw_knob_waves(type);
- function wave(a) = knob_r + sin(a * knob_waves) * knob_wave;
+ function wave(a) = flange_r - amp / 2 + sin(a * waves) * amp / 2;
+ points = [for(a = [0 : 359]) wave(a) * [sin(a), cos(a)]];
+ solid = screw_knob_solid(type);
+
+ module shape()
+ if(screw_knob_fluted(type))
+ difference() {
+ circle(flange_r, $fn = 360);
+
+ c = flange_r * sin(90 / waves); // Flute half chord
+ d = flange_r - flange_r * cos(90 / waves); // Distance from chord to perimeter
+ b = amp - d; // Distance from chord to flute bottom
+ flute_r = (b^2 + c^2) / b / 2;
+ for(i = [0 : waves - 1])
+ rotate(360 * i / waves)
+ translate([0, flange_r - amp + flute_r])
+ circle(flute_r, $fn = 360);
+ }
+ else
+ polygon(points);
stl(str("screw_knob_M", screw_radius(screw) * 20))
union() {
render() difference() {
- cylinder(r = knob_stem_r, h = knob_thickness + knob_stem_h);
+ cylinder(r = stem_r, h = knob_h);
hanging_hole(knob_nut_trap_depth(screw), screw_clearance_radius(screw))
rotate(45)
- circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
+ circle(r = trap_r, $fn = 6);
}
- linear_extrude(knob_thickness, convexity = 3)
- difference() {
- polygon(points = [for(a = [0 : 359]) [wave(a) * sin(a), wave(a) * cos(a)]]);
+ for(i = [0 : 1])
+ linear_extrude(i ? flange_t : round_to_layer(wall), convexity = 3)
+ difference() {
+ shape();
- circle(knob_stem_r - eps);
- }
+ if(i && ! solid)
+ offset(-wall)
+ shape();
+
+ circle(stem_r - eps);
+ }
}
}
//! Place the screw through the printed part
-module screw_knob_assembly(screw, length) //! Assembly with the screw in place
-assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length), ngb = true) {
- translate_z(knob_height)
- vflip()
- stl_colour(pp1_colour) screw_knob(screw);
+module screw_knob_assembly(type, length) { //! Assembly with the screw in place
+ type = !is_list(type[0]) ? screw_knob(type) : type;
+ screw = screw_knob_screw(type);
+ knob_h = knob_height(type);
- translate_z(knob_height - knob_nut_trap_depth(screw))
- rotate(-45)
- screw(screw, length);
+ assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length), ngb = true) {
+ translate_z(knob_h)
+ vflip()
+ stl_colour(pp1_colour) screw_knob(type);
+
+ translate_z(knob_h - knob_nut_trap_depth(screw))
+ rotate(-45)
+ screw(screw, length);
+ }
}
module screw_knob_M30_stl() screw_knob(M3_hex_screw);
diff --git a/readme.md b/readme.md
index cfa9870..919de9b 100644
--- a/readme.md
+++ b/readme.md
@@ -5918,11 +5918,30 @@ Knob with embedded hex head screw.
[tests/screw_knob.scad](tests/screw_knob.scad) Code for this example.
+### Properties
+| Function | Description |
+|:--- |:--- |
+| `screw_knob_flange_r(type)` | The flange outside radius |
+| `screw_knob_flange_t(type)` | The thickness of the flange |
+| `screw_knob_fluted(type)` | Fluted instead of sine wave |
+| `screw_knob_screw(type)` | The hex screw |
+| `screw_knob_solid(type)` | Is the flange solid or just a wall |
+| `screw_knob_stem_h(type)` | The stem height below the flange |
+| `screw_knob_wall(type)` | Wall thickness |
+| `screw_knob_wave_amp(type)` | Wave amplitude |
+| `screw_knob_waves(type)` | Number of waves around the flange edge |
+
+### Functions
+| Function | Description |
+|:--- |:--- |
+| `knob_height(type)` | Total height of the knob |
+| `screw_knob(screw, wall = 2, stem_h = 6, flange_t = 4, flange_r = 9, solid = true, waves = 5, wave_amp = 2, fluted = false)` | Constructor |
+
### Modules
| Module | Description |
|:--- |:--- |
-| `screw_knob(screw)` | Generate the STL for a knob to fit the specified hex screw |
-| `screw_knob_assembly(screw, length)` | Assembly with the screw in place |
+| `screw_knob(type)` | Generate the STL for a knob to fit the specified hex screw |
+| `screw_knob_assembly(type, length)` | Assembly with the screw in place |

@@ -5931,18 +5950,24 @@ Knob with embedded hex head screw.
| ---:|:--- |:---|
| 1 | `screw(M3_hex_screw, 16)` | Screw M3 hex x 16mm |
| 1 | `screw(M4_hex_screw, 16)` | Screw M4 hex x 16mm |
+| 1 | `screw(M5_hex_screw, 16)` | Screw M5 hex x 16mm |
+| 1 | `screw(M6_hex_screw, 16)` | Screw M6 hex x 16mm |
### Printed
| Qty | Filename |
| ---:|:--- |
| 1 | screw_knob_M30.stl |
| 1 | screw_knob_M40.stl |
+| 1 | screw_knob_M50.stl |
+| 1 | screw_knob_M60.stl |
### Assemblies
| Qty | Name |
| ---:|:--- |
| 1 | screw_knob_M30_16_assembly |
| 1 | screw_knob_M40_16_assembly |
+| 1 | screw_knob_M50_16_assembly |
+| 1 | screw_knob_M60_16_assembly |
Top
diff --git a/tests/png/screw_knob.png b/tests/png/screw_knob.png
index 1e6364d..3c980aa 100644
Binary files a/tests/png/screw_knob.png and b/tests/png/screw_knob.png differ
diff --git a/tests/screw_knob.scad b/tests/screw_knob.scad
index 0eeb83d..7b48df5 100644
--- a/tests/screw_knob.scad
+++ b/tests/screw_knob.scad
@@ -17,20 +17,26 @@
// If not, see .
//
include <../core.scad>
+use <../utils/layout.scad>
use <../printed/screw_knob.scad>
-screws = [M3_hex_screw, M4_hex_screw];
+knobs = [
+ M3_hex_screw,
+ M4_hex_screw,
+ screw_knob(M5_hex_screw, flange_r = 12, flange_t = 6, stem_h = 2, waves = 6),
+ screw_knob(M6_hex_screw, flange_r = 15, flange_t = 6, solid = false, stem_h = 2, waves = 6, wall = 1.6, fluted = true),
+];
-module do_screw_knob(screw)
+module do_screw_knob(knob) {
if($preview)
- screw_knob_assembly(screw, 16);
+ screw_knob_assembly(knob, 16);
else
- screw_knob(screw);
+ screw_knob(knob);
+}
module screw_knobs()
- for(i = [0 : len(screws) - 1])
- translate([i * 30, 0])
- do_screw_knob(screws[i]);
+ layout([for(k = knobs) 2 * screw_knob_flange_r(k)], 10)
+ do_screw_knob(knobs[$i]);
screw_knobs();