Compare commits
43 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
cc5654d7d7 | ||
|
9989f13edf | ||
|
d46913ce4f | ||
|
b9f676a753 | ||
|
1a649060bd | ||
|
68fd04f6d5 | ||
|
ddc4150ed7 | ||
|
ed7e55808a | ||
|
3eff5fc2e0 | ||
|
744ebc2935 | ||
|
99a5570e24 | ||
|
b70911dc13 | ||
|
50d62b4170 | ||
|
7e126c94ca | ||
|
2d20fb130a | ||
|
738c7914e2 | ||
|
7596bcacf4 | ||
|
943deededf | ||
|
c8f16f4cdb | ||
|
a30aff9613 | ||
|
c0d9067b74 | ||
|
7e8f03df2e | ||
|
f173284709 | ||
|
6850953e71 | ||
|
2f60f568ff | ||
|
0206b2e868 | ||
|
38e2a22a11 | ||
|
4f68353f70 | ||
|
fbaae66d27 | ||
|
f8d17c6f16 | ||
|
97a6a65158 | ||
|
42fccc1afb | ||
|
662db2bd41 | ||
|
76aa613093 | ||
|
0e2778e13d | ||
|
50e23e5f81 | ||
|
59eeb2c5d4 | ||
|
7ea4dbe6cb | ||
|
0d062c24fa | ||
|
95b6771811 | ||
|
ed46cbb147 | ||
|
14ba135169 | ||
|
1ac5a6f6cb |
84
CHANGELOG.md
@@ -3,6 +3,88 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v20.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.3.1...v20.4.0 "diff with v20.3.1")
|
||||
* 2022-04-01 [`d46913c`](https://github.com/nophead/NopSCADlib/commit/d46913ce4f64656889fd29dccc0709d84d4d9c49 "show commit") [C.P.](# "Chris Palmer") Printed `screw_knob()` is now fully customisable by passing a parameter
|
||||
list, constructed by `screw_knob(),` in place of the screw.
|
||||
|
||||
* Screws can still be passed for backwards compatibility.
|
||||
|
||||
#### [v20.3.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.3.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.3.0...v20.3.1 "diff with v20.3.0")
|
||||
* 2022-04-01 [`b9f676a`](https://github.com/nophead/NopSCADlib/commit/b9f676a75369d666540f79abe0392e209e20d0f0 "show commit") [C.P.](# "Chris Palmer") Documented `insert_hole_length()`.
|
||||
|
||||
### [v20.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.2.0...v20.3.0 "diff with v20.2.0")
|
||||
* 2022-03-17 [`ddc4150`](https://github.com/nophead/NopSCADlib/commit/ddc4150ed73c8300bc3ef4326a91cd4ec54ed9e3 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2022-03-16 [`7e126c9`](https://github.com/nophead/NopSCADlib/commit/7e126c94cadd120d686eaad8459723e0c1dfc0b2 "show commit") [M.](# "Mozza") Add A23 cell
|
||||
|
||||
### [v20.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.1.2...v20.2.0 "diff with v20.1.2")
|
||||
* 2022-03-17 [`744ebc2`](https://github.com/nophead/NopSCADlib/commit/744ebc293594e2d049220bba7325f3a22f40a71a "show commit") [C.P.](# "Chris Palmer") Added functions for generating twisted cable paths and calculating its radius.
|
||||
Top row of cable bundles reversed to match a twisted cable.
|
||||
|
||||
#### [v20.1.2](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.1.1...v20.1.2 "diff with v20.1.1")
|
||||
* 2022-03-17 [`99a5570`](https://github.com/nophead/NopSCADlib/commit/99a5570e248be32747bead61e17feaa3bde13f9b "show commit") [C.P.](# "Chris Palmer") Fixed ziptie bug for small wires and corners made sharper.
|
||||
|
||||
* 2022-03-17 [`b70911d`](https://github.com/nophead/NopSCADlib/commit/b70911dc132727f24798e92be06a87ab37f2917e "show commit") [C.P.](# "Chris Palmer") Image odd pixel changes due to move to summer computer.
|
||||
|
||||
* 2022-03-01 [`2d20fb1`](https://github.com/nophead/NopSCADlib/commit/2d20fb130a260b1f7358ea9fbb9fca2b5a18a65b "show commit") [C.P.](# "Chris Palmer") Removed dead code in `spiral_paths()`.
|
||||
|
||||
#### [v20.1.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.1.0...v20.1.1 "diff with v20.1.0")
|
||||
* 2022-02-25 [`943deed`](https://github.com/nophead/NopSCADlib/commit/943deededfe2b258f23ca64001ae7c010ed626bc "show commit") [C.P.](# "Chris Palmer") Updated the readme.
|
||||
|
||||
* 2022-02-24 [`c0d9067`](https://github.com/nophead/NopSCADlib/commit/c0d9067b740fc5ea4a41e696c88613a284685118 "show commit") [M.B.](# "Martin Budden") Fixed typos.
|
||||
|
||||
* 2022-02-25 [`a30aff9`](https://github.com/nophead/NopSCADlib/commit/a30aff9613f51092bbad7052bfe1194a61557efc "show commit") [C.P.](# "Chris Palmer") Fixed missing brackets for sheets with chamfered corners.
|
||||
|
||||
### [v20.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.0.1...v20.1.0 "diff with v20.0.1")
|
||||
* 2022-02-23 [`f173284`](https://github.com/nophead/NopSCADlib/commit/f173284709acdbd32de21f0d27cb3ab10b42eb2a "show commit") [C.P.](# "Chris Palmer") Can now inhibit exploded lines for issue [#220](https://github.com/nophead/NopSCADlib/issues/220 "show issue").
|
||||
|
||||
#### [v20.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.0.0...v20.0.1 "diff with v20.0.0")
|
||||
* 2022-02-23 [`0206b2e`](https://github.com/nophead/NopSCADlib/commit/0206b2e868119b3b5fdea6111839bf5055eae438 "show commit") [C.P.](# "Chris Palmer") Updated images.
|
||||
|
||||
* 2022-02-03 [`1ac5a6f`](https://github.com/nophead/NopSCADlib/commit/1ac5a6f6cbe518646f19c4372a2393eb2e020a18 "show commit") [M.B.](# "Martin Budden") Made hard washers slightly lighter.
|
||||
This means they can be distinguished from bolts when viewed from directly
|
||||
above.
|
||||
|
||||
## [v20.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v19.21.0...v20.0.0 "diff with v19.21.0")
|
||||
* 2022-02-23 [`f8d17c6`](https://github.com/nophead/NopSCADlib/commit/f8d17c6f1615b9ff9b615ad2947c4b0119bf7597 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2022-02-22 [`662db2b`](https://github.com/nophead/NopSCADlib/commit/662db2bd4103dbeb4265c148d5f7e31c98d5dae2 "show commit") [M.B.](# "Martin Budden") Improved stepper motor naming convention.
|
||||
|
||||
### [v19.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.20.0...v19.21.0 "diff with v19.20.0")
|
||||
* 2022-02-23 [`42fccc1`](https://github.com/nophead/NopSCADlib/commit/42fccc1afbf28ef6a94f0480d1306e5bc2e48e46 "show commit") [C.P.](# "Chris Palmer") Added `bezier_join()`.
|
||||
Moved `path_length()` from `sweep.scad` to `maths.scad`.
|
||||
|
||||
### [v19.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.9.1...v19.20.0 "diff with v19.9.1")
|
||||
* 2022-02-15 [`0e2778e`](https://github.com/nophead/NopSCADlib/commit/0e2778e13de2e68fc21a7b4c706aada27a17842c "show commit") [C.P.](# "Chris Palmer") Cables can now have a list of wire colours.
|
||||
Added a constructor for cables.
|
||||
|
||||
* 2022-02-15 [`50e23e5`](https://github.com/nophead/NopSCADlib/commit/50e23e5f818077e3661e25852dc959c34e6c8b4a "show commit") [C.P.](# "Chris Palmer") Added silkscreen text to PCBs.
|
||||
|
||||
#### [v19.9.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.9.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.9.0...v19.9.1 "diff with v19.9.0")
|
||||
* 2022-02-15 [`59eeb2c`](https://github.com/nophead/NopSCADlib/commit/59eeb2c5d4c7cf9da1f219c2b01fabcf450085f3 "show commit") [C.P.](# "Chris Palmer") Trimmed the ribbon clamp tape.
|
||||
|
||||
* 2022-02-15 [`7ea4dbe`](https://github.com/nophead/NopSCADlib/commit/7ea4dbe6cbbc23256d23f7aea87e8aac8d1000a9 "show commit") [C.P.](# "Chris Palmer") Fixed double application of `r2sides()` in `rounded_path()`.
|
||||
Added check for radius too big for corner in `rounded_path()`.
|
||||
Spiral paths can now have 0 twists.
|
||||
|
||||
### [v19.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.8.1...v19.9.0 "diff with v19.8.1")
|
||||
* 2022-02-11 [`95b6771`](https://github.com/nophead/NopSCADlib/commit/95b6771811fd48af46b5c2d426c42c04cd8e5af3 "show commit") [C.P.](# "Chris Palmer") Added printed cable clips.
|
||||
|
||||
* 2022-02-11 [`ed46cbb`](https://github.com/nophead/NopSCADlib/commit/ed46cbb1470587d4fa3ee4e0e8e0513c82693b1b "show commit") [C.P.](# "Chris Palmer") Fixed `cable_bundle()` bugs and added test.
|
||||
Added `cable_bundle_positions()`.
|
||||
Can now mark cables as ribbon to force a flat layout.
|
||||
|
||||
#### [v19.8.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.8.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.8.0...v19.8.1 "diff with v19.8.0")
|
||||
* 2022-02-09 [`2a2b7d8`](https://github.com/nophead/NopSCADlib/commit/2a2b7d8bd60f0ea8ad2c428593e7aea1dfa06e9c "show commit") [C.P.](# "Chris Palmer") Added a second example project.
|
||||
|
||||
### [v19.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.7.0...v19.8.0 "diff with v19.7.0")
|
||||
* 2022-02-09 [`055b4e7`](https://github.com/nophead/NopSCADlib/commit/055b4e7102ffcc39dc376330636efa79739a6555 "show commit") [C.P.](# "Chris Palmer") Added SOT23 and SOT223 SMD packages.
|
||||
`smd_capacitors` can now have a value.
|
||||
Wire links can now have zero length to create a vertical wire.
|
||||
|
||||
* 2022-02-09 [`00d6efc`](https://github.com/nophead/NopSCADlib/commit/00d6efc3154bbd5597a3336bc8bdaf550e42f56a "show commit") [C.P.](# "Chris Palmer") Added veroboard constructor.
|
||||
Documented `solder_meniscus` and made it parametric.
|
||||
|
||||
### [v19.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.6.0...v19.7.0 "diff with v19.6.0")
|
||||
* 2022-02-08 [`1f55097`](https://github.com/nophead/NopSCADlib/commit/1f55097bdd3e4d0164a48dd7ebb3fc5370250ac4 "show commit") [C.P.](# "Chris Palmer") Support for twisted cables.
|
||||
Sweep now distbutes twists in proportion to segments lengths.
|
||||
@@ -335,8 +417,6 @@ Fixed `M6_cs_cap_screw` and `M4_grub_screw` socket sizes.
|
||||
#### [v15.21.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.21.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.21.0...v15.21.1 "diff with v15.21.0")
|
||||
* 2021-08-09 [`be53547`](https://github.com/nophead/NopSCADlib/commit/be53547728834d8e786ad4cb5637c768320a3105 "show commit") [M.B.](# "Martin Budden") Fixed display of BLDC prop shaft when thread length `=` 0.
|
||||
|
||||
* 2021-07-04 [`ba7d7d3`](https://github.com/nophead/NopSCADlib/commit/ba7d7d32adf554d163143c0ae1707565340bb35b "show commit") [C.P.](# "Chris Palmer") Updated chnagelog.
|
||||
|
||||
### [v15.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.20.0...v15.21.0 "diff with v15.20.0")
|
||||
* 2021-07-01 [`df35e14`](https://github.com/nophead/NopSCADlib/commit/df35e14fc71794c3826d6c99ce3cab93a4cfa5fe "show commit") [M.B.](# "Martin Budden") Improved handling of pcb plating colour.
|
||||
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 979 KiB After Width: | Height: | Size: 985 KiB |
70
libtest.scad
@@ -51,6 +51,7 @@ use <tests/blowers.scad>
|
||||
use <tests/box_sections.scad>
|
||||
use <tests/bulldogs.scad>
|
||||
use <tests/buttons.scad>
|
||||
use <tests/cable_clip.scad>
|
||||
use <tests/cable_strips.scad>
|
||||
use <tests/cameras.scad>
|
||||
use <tests/camera_housing.scad>
|
||||
@@ -154,19 +155,46 @@ translate([x5 + 50, cable_grommets_y])
|
||||
translate([x5 + 95, cable_grommets_y])
|
||||
press_fits();
|
||||
|
||||
translate([x5, cable_grommets_y + 60])
|
||||
fixing_blocks_y = cable_grommets_y + 60;
|
||||
translate([x5, fixing_blocks_y])
|
||||
fixing_blocks();
|
||||
|
||||
translate([x5, cable_grommets_y + 90])
|
||||
corner_blocks_y = fixing_blocks_y + 30;
|
||||
translate([x5, corner_blocks_y])
|
||||
corner_blocks();
|
||||
|
||||
translate([x5, cable_grommets_y + 160])
|
||||
feet();
|
||||
|
||||
translate([x5 + 70, cable_grommets_y + 160])
|
||||
screw_knobs_y = corner_blocks_y + 70;
|
||||
translate([x5, screw_knobs_y])
|
||||
screw_knobs();
|
||||
|
||||
translate([x5, cable_grommets_y + 470]) {
|
||||
knobs_y = screw_knobs_y + 40;
|
||||
translate([640, knobs_y])
|
||||
printed_pulley_test();
|
||||
|
||||
translate([x5, knobs_y])
|
||||
knobs();
|
||||
|
||||
clips_y = knobs_y + 50;
|
||||
translate([x5, clips_y])
|
||||
cable_clips();
|
||||
|
||||
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();
|
||||
|
||||
pocket_y = handle_y + 70;
|
||||
translate([x5 + 65, pocket_y])
|
||||
pocket_handles();
|
||||
|
||||
hinge_y = pocket_y + 100;
|
||||
translate([x5, hinge_y]) {
|
||||
door_hinges()
|
||||
door_latches();
|
||||
|
||||
@@ -174,29 +202,14 @@ translate([x5, cable_grommets_y + 470]) {
|
||||
flat_hinges();
|
||||
}
|
||||
|
||||
translate([x5, cable_grommets_y + 380])
|
||||
no_explode() socket_boxes();
|
||||
pbox_y = hinge_y + 70;
|
||||
translate([900, pbox_y])
|
||||
printed_boxes();
|
||||
|
||||
translate([640, cable_grommets_y + 200])
|
||||
printed_pulley_test();
|
||||
|
||||
translate([x5, cable_grommets_y + 200])
|
||||
knobs();
|
||||
|
||||
translate([x5 + 60, cable_grommets_y + 250])
|
||||
strap_handles();
|
||||
|
||||
translate([x5, cable_grommets_y + 300])
|
||||
handle();
|
||||
|
||||
translate([950, 600])
|
||||
box_y = pbox_y + 150;
|
||||
translate([950, box_y])
|
||||
box_test();
|
||||
|
||||
translate([900, 750])
|
||||
pocket_handles();
|
||||
|
||||
translate([900, 850])
|
||||
printed_boxes();
|
||||
|
||||
translate([950, 1400])
|
||||
rotate(-90)
|
||||
@@ -427,6 +440,9 @@ translate([x2, extrusions_y])
|
||||
translate([400, transformers_y])
|
||||
transformers();
|
||||
|
||||
translate([x4 + 50, transformers_y])
|
||||
no_explode() socket_boxes();
|
||||
|
||||
|
||||
belts_y = 0;
|
||||
rails_y = belts_y + 200;
|
||||
|
117
printed/cable_clip.scad
Normal file
@@ -0,0 +1,117 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2022
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Cable clips to order. Can be for one or two cables of different sizes.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
use <../utils/fillet.scad>
|
||||
|
||||
wall = 2;
|
||||
|
||||
function cable_clip_width(screw) = max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw))); //! Width given the `screw`.
|
||||
function cable_clip_height(cable) = cable_height(cable) + wall; //! Height given the `cable`.
|
||||
function cable_clip_extent(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) + wall; //! How far it extends from the screw.
|
||||
function cable_clip_offset(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) / 2; //! The offset of the cable from the screw
|
||||
|
||||
module single_cable_clip(screw, cable, h = 0) {
|
||||
screw_dia = 2 * screw_clearance_radius(screw);
|
||||
height = cable_clip_width(screw);
|
||||
depth = h ? h : cable_height(cable) + wall;
|
||||
w = cable_width(cable);
|
||||
width = wall + w + wall + screw_dia + wall;
|
||||
hole_x = wall + w + wall + screw_dia / 2;
|
||||
rad = min(wall + cable_wire_size(cable) / 2, depth / 2);
|
||||
r = extrusion_width - eps;
|
||||
translate([-hole_x, 0]) difference() {
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
hull() {
|
||||
rounded_square([width, 1], r, center = false);
|
||||
|
||||
translate([width - 1, 0])
|
||||
rounded_square([1, depth], r, center = false);
|
||||
|
||||
translate([rad, depth - rad])
|
||||
circle(r = rad);
|
||||
}
|
||||
|
||||
translate([wall + cable_width(cable) / 2, 0]) {
|
||||
hull() {
|
||||
for(p = cable_bundle_positions(cable))
|
||||
translate(p)
|
||||
circle(d = cable_wire_size(cable));
|
||||
|
||||
square([w, eps], center = true);
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
translate([side * w / 2, 0])
|
||||
hflip(side < 0)
|
||||
fillet(r = r, h = 0);
|
||||
}
|
||||
}
|
||||
|
||||
translate([hole_x, depth / 2, height / 2])
|
||||
rotate([90,0,0])
|
||||
teardrop_plus(h = depth + 1, r = screw_dia / 2, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module double_cable_clip(screw, cable1, cable2) {
|
||||
h = max(cable_clip_height(cable1), cable_clip_height(cable2));
|
||||
union() {
|
||||
single_cable_clip(screw, cable1, h);
|
||||
|
||||
mirror([1,0,0]) single_cable_clip(screw, cable2, h);
|
||||
}
|
||||
}
|
||||
|
||||
module cable_clip(screw, cable1, cable2 = 0) { //! Create the STL for a single cable or two cable clip
|
||||
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20);
|
||||
function cable_str(cable) = str("_", cable_wires(cable), "_", round(cable_wire_size(cable) * 10));
|
||||
|
||||
if(cable2) {
|
||||
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)));
|
||||
|
||||
double_cable_clip(screw, cable1, cable2);
|
||||
}
|
||||
else {
|
||||
stl(str(clip_str(screw), cable_str(cable1)));
|
||||
|
||||
single_cable_clip(screw, cable1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0) { //! Cable clip with the fasteners
|
||||
height = max(cable_clip_height(cable1), cable2 ? cable_clip_height(cable2) : 0);
|
||||
|
||||
stl_colour(pp1_colour) render()
|
||||
translate([0, cable_clip_width(screw) / 2]) rotate([90, 0, 0])
|
||||
cable_clip(screw, cable1, cable2);
|
||||
|
||||
translate_z(height)
|
||||
screw_and_washer(screw, screw_length(screw, height + thickness, 2, nyloc = true));
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
}
|
@@ -31,7 +31,7 @@
|
||||
//! Star washers can be omitted by setting `star_washers` to false.
|
||||
//!
|
||||
//! A 2screw_block is a thinner version with two screws and two mating surfaces. It can be used as an alternative to fixing blocks when
|
||||
//! high lateral rigity is not required.
|
||||
//! high lateral rigidity is not required.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
@@ -20,7 +20,7 @@
|
||||
//
|
||||
//! Parametric knobs for potentiometers and encoders.
|
||||
//!
|
||||
//! A knob can be constructed by specififying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
//! A knob can be constructed by specifying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
//! An optional skirt and / or a pointer can be specified.
|
||||
//!
|
||||
//! The STL includes a support membrane that needs to be cut out and a thread needs to be tapped for the grub screw.
|
||||
|
@@ -20,7 +20,7 @@
|
||||
//
|
||||
//! Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
//!
|
||||
//! * When `ways` is a scalar number the slot is sized for one rubbon cable and a PP strip.
|
||||
//! * When `ways` is a scalar number the slot is sized for one ribbon cable and a PP strip.
|
||||
//! * When `ways` is a two element vector the second element indicates the number of cables and the slot is size for just the cables.
|
||||
//
|
||||
include <../core.scad>
|
||||
@@ -105,7 +105,7 @@ assembly(let(screw_d = screw_radius(screw) * 2)str("ribbon_clamp_", str_ways(way
|
||||
|
||||
module ribbon_clamp_fastened_assembly(ways, thickness, screw = screw) { //! Clamp with fasteners in place
|
||||
tape_l = floor(ribbon_clamp_slot(ways));
|
||||
tape_width = 25;
|
||||
tape_width = ribbon_clamp_width(screw) + 2;
|
||||
tape_thickness = 0.5;
|
||||
|
||||
vitamin(str(": Tape self amalgamating silicone ",tape_l," x 25mm"));
|
||||
|
@@ -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);
|
||||
|
194
readme.md
@@ -23,30 +23,31 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
<th align="left"> Vitamins A-H </th><th align="left"> Vitamins I-Q </th><th align="left"> Vitamins R-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
|
||||
<tr><td> <a href = "#7_segments">7_segments</a> </td><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#BOM">BOM</a> </td></tr>
|
||||
<tr><td> <a href = "#Axials">Axials</a> </td><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#BLDC_motors">BLDC_motors</a> </td><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Catenary">Catenary</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Camera_housing">Camera_housing</a> </td><td> <a href = "#Core_xy">Core_xy</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LED_meters">LED_meters</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Box_sections">Box_sections</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Servo_motors">Servo_motors</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Knob">Knob</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#BLDC_motors">BLDC_motors</a> </td><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_clip">Cable_clip</a> </td><td> <a href = "#Catenary">Catenary</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Core_xy">Core_xy</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LED_meters">LED_meters</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Camera_housing">Camera_housing</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Box_sections">Box_sections</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Servo_motors">Servo_motors</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#Knob">Knob</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td></td><td></td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
@@ -233,8 +234,9 @@ exposing enough information to make a battery box.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 6 | `battery_contact(bcontact, false)` | Battery negative contact |
|
||||
| 6 | `battery_contact(bcontact, true)` | Battery positive contact |
|
||||
| 7 | `battery_contact(bcontact, false)` | Battery negative contact |
|
||||
| 7 | `battery_contact(bcontact, true)` | Battery positive contact |
|
||||
| 1 | `battery(A23CELL)` | Cell A23 12v |
|
||||
| 1 | `battery(AACELL)` | Cell AA |
|
||||
| 1 | `battery(AAACELL)` | Cell AAA |
|
||||
| 1 | `battery(CCELL)` | Cell C |
|
||||
@@ -1510,6 +1512,7 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `insert_boss_radius(type, wall)` | Compute the outer radius of an insert boss |
|
||||
| `insert_hole_length(type)` | Length of the insert rounded to layer height |
|
||||
| `insert_nose_length(type, d)` | The length before the second ring. |
|
||||
|
||||
### Modules
|
||||
@@ -2400,6 +2403,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `usb_Ax2(cutout = false)` | Draw USB type A dual socket |
|
||||
| `usb_B(cutout = false)` | Draw USB B connector |
|
||||
| `usb_C(cutout = false)` | Draw USB C connector |
|
||||
| `usb_miniA(cutout = false)` | Draw USB mini A connector |
|
||||
| `usb_uA(cutout = false)` | Draw USB micro A connector |
|
||||
| `vero_pin(cropped = false)` | Draw a vero pin |
|
||||
|
||||
@@ -2550,6 +2554,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `usb_Ax2(cutout = false)` | Draw USB type A dual socket |
|
||||
| `usb_B(cutout = false)` | Draw USB B connector |
|
||||
| `usb_C(cutout = false)` | Draw USB C connector |
|
||||
| `usb_miniA(cutout = false)` | Draw USB mini A connector |
|
||||
| `usb_uA(cutout = false)` | Draw USB micro A connector |
|
||||
| `vero_pin(cropped = false)` | Draw a vero pin |
|
||||
|
||||
@@ -3899,15 +3904,15 @@ NEMA stepper motor model.
|
||||
| ---:|:--- |:---|
|
||||
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
|
||||
| 20 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
|
||||
| 1 | `NEMA(NEMA14)` | Stepper motor NEMA14 x 36mm |
|
||||
| 1 | `NEMA(NEMA16)` | Stepper motor NEMA16 x 19.2mm |
|
||||
| 1 | `NEMA(NEMA17P)` | Stepper motor NEMA17 x 26.5mm |
|
||||
| 1 | `NEMA(NEMA17S)` | Stepper motor NEMA17 x 34mm |
|
||||
| 1 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
|
||||
| 1 | `NEMA(NEMA17)` | Stepper motor NEMA17 x 47mm |
|
||||
| 1 | `NEMA(NEMA23)` | Stepper motor NEMA22 x 51.2mm |
|
||||
| 1 | `NEMA(NEMA8)` | Stepper motor NEMA8 x 30mm |
|
||||
| 1 | `NEMA(NEMA8BH)` | Stepper motor NEMA8 x 30mm |
|
||||
| 1 | `NEMA(NEMA14_36)` | Stepper motor NEMA14 x 36mm |
|
||||
| 1 | `NEMA(NEMA16_19)` | Stepper motor NEMA16 x 19.2mm |
|
||||
| 1 | `NEMA(NEMA17_27)` | Stepper motor NEMA17 x 26.5mm |
|
||||
| 1 | `NEMA(NEMA17_34)` | Stepper motor NEMA17 x 34mm |
|
||||
| 1 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm |
|
||||
| 1 | `NEMA(NEMA17_47)` | Stepper motor NEMA17 x 47mm |
|
||||
| 1 | `NEMA(NEMA23_51)` | Stepper motor NEMA22 x 51.2mm |
|
||||
| 1 | `NEMA(NEMA8_30)` | Stepper motor NEMA8 x 30mm |
|
||||
| 1 | `NEMA(NEMA8_30BH)` | Stepper motor NEMA8 x 30mm |
|
||||
| 16 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 20 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
|
||||
@@ -4381,7 +4386,7 @@ If a washer is given a child, usually a screw or a nut, then it is placed on its
|
||||
---
|
||||
<a name="Wire"></a>
|
||||
## Wire
|
||||
Just a BOM entry at the moment and cable bundle size functions for holes, plus cable ties.
|
||||
Utilities for adding wires to the BOM and optionally drawing them and cable bundle size functions for holes, plus cable ties.
|
||||
|
||||
[vitamins/wire.scad](vitamins/wire.scad) Implementation.
|
||||
|
||||
@@ -4390,17 +4395,25 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_bundle(cable)` | Arrangement of a bundle in a flat cable clip |
|
||||
| `cable(wires, size, colours, ribbon = false, tlen = 25)` | Cable constructor |
|
||||
| `cable_bundle(cable)` | Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip |
|
||||
| `cable_bundle_positions(cable)` | Positions of wires in a bundle to go through a cable strip |
|
||||
| `cable_height(cable)` | Height in flat clip |
|
||||
| `cable_is_ribbon(cable)` | Is a ribbon cable? |
|
||||
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
||||
| `cable_tlen(cable)` | Twisted cable twist length |
|
||||
| `cable_twisted_radius(cable)` | Approximate radius of a cable when twisted |
|
||||
| `cable_width(cable)` | Width in flat clip |
|
||||
| `cable_wire_colours(cable)` | Individual wire colours |
|
||||
| `cable_wire_size(cable)` | Size of each wire in a bundle |
|
||||
| `cable_wires(cable)` | Number of wires in a bundle |
|
||||
| `twisted_cable(cable, path, irot = 0, frot = 0)` | Return the paths for a twisted cable, `irot` is the initial rotation and frot the final rotation |
|
||||
| `wire_hole_radius(cable)` | Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `cable(cable, paths)` | Draw a cable, given a list of paths |
|
||||
| `cable_tie(cable_r, thickness)` | A ziptie threaded around cable radius `cable_r` and through a panel with specified `thickness`. |
|
||||
| `cable_tie_holes(cable_r, h = 100)` | Holes to thread a ziptie through a panel to make a cable tie. |
|
||||
| `mouse_hole(cable, h = 100, teardrop = false)` | A mouse hole to allow a panel to go over a wire bundle. |
|
||||
@@ -4412,13 +4425,13 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | | Wire black 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire blue 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire brown 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire green 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire orange 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire red 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire yellow 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire black 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire blue 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire brown 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire green 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire orange 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire red 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire yellow 7/0.2mm strands, length 60mm |
|
||||
| 1 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
|
||||
|
||||
@@ -4684,6 +4697,51 @@ fixing_blocks along the sides.
|
||||
| 12 | fixing_block_M30_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Cable_clip"></a>
|
||||
## Cable_clip
|
||||
Cable clips to order. Can be for one or two cables of different sizes.
|
||||
|
||||
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
|
||||
|
||||
[tests/cable_clip.scad](tests/cable_clip.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip_extent(screw, cable)` | How far it extends from the screw. |
|
||||
| `cable_clip_height(cable)` | Height given the `cable`. |
|
||||
| `cable_clip_offset(screw, cable)` | The offset of the cable from the screw |
|
||||
| `cable_clip_width(screw)` | Width given the `screw`. |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip(screw, cable1, cable2 = 0)` | Create the STL for a single cable or two cable clip |
|
||||
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0)` | Cable clip with the fasteners |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 5 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||
| 3 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||
| 10 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | cable_clip_30_10_13.stl |
|
||||
| 1 | cable_clip_30_1_14_2_14.stl |
|
||||
| 1 | cable_clip_30_1_60.stl |
|
||||
| 1 | cable_clip_30_3_14_4_14.stl |
|
||||
| 1 | cable_clip_30_5_14_6_14.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -4840,7 +4898,7 @@ This allows the block and one set of fasteners to be on one assembly and the oth
|
||||
Star washers can be omitted by setting `star_washers` to false.
|
||||
|
||||
A 2screw_block is a thinner version with two screws and two mating surfaces. It can be used as an alternative to fixing blocks when
|
||||
high lateral rigity is not required.
|
||||
high lateral rigidity is not required.
|
||||
|
||||
[printed/corner_block.scad](printed/corner_block.scad) Implementation.
|
||||
|
||||
@@ -5399,7 +5457,7 @@ Printed handle that can be printed without needing support material due to its t
|
||||
## Knob
|
||||
Parametric knobs for potentiometers and encoders.
|
||||
|
||||
A knob can be constructed by specififying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
A knob can be constructed by specifying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
An optional skirt and / or a pointer can be specified.
|
||||
|
||||
The STL includes a support membrane that needs to be cut out and a thread needs to be tapped for the grub screw.
|
||||
@@ -5797,7 +5855,7 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
||||
## Ribbon_clamp
|
||||
Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
|
||||
* When `ways` is a scalar number the slot is sized for one rubbon cable and a PP strip.
|
||||
* When `ways` is a scalar number the slot is sized for one ribbon cable and a PP strip.
|
||||
* When `ways` is a two element vector the second element indicates the number of cables and the slot is size for just the cables.
|
||||
|
||||
[printed/ribbon_clamp.scad](printed/ribbon_clamp.scad) Implementation.
|
||||
@@ -5862,11 +5920,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 |
|
||||
|
||||

|
||||
|
||||
@@ -5875,18 +5952,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 |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -6080,6 +6163,10 @@ Annotation used in this documentation
|
||||
## Bezier
|
||||
Bezier curves and function to get and adjust the length or minimum z point.
|
||||
|
||||
`bezier_join()` joins two paths with a Bezier curve that starts tangential to the end of `path1` and ends tangential to the end of `path2`.
|
||||
To do this the outer control points are the path ends and the inner two control points are along the tangents to the path ends.
|
||||
The only degree of freedom is how far along those tangents, which are the `d` and optional `d2` parameters.
|
||||
|
||||
[utils/bezier.scad](utils/bezier.scad) Implementation.
|
||||
|
||||
[tests/bezier.scad](tests/bezier.scad) Code for this example.
|
||||
@@ -6090,6 +6177,7 @@ Bezier curves and function to get and adjust the length or minimum z point.
|
||||
| `adjust_bezier_length(v, l, eps = 0.001, r1 = 1.0, r2 = 1.5, l1, l2)` | Adjust Bezier control points `v` to get the required curve length `l` |
|
||||
| `adjust_bezier_z(v, z, eps = 0.001, r1 = 1, r2 = 1.5, z1, z2)` | Adjust Bezier control points `v` to get the required minimum `z` |
|
||||
| `bezier(t, v)` | Returns a point at distance `t` [0 - 1] along the curve with control points `v` |
|
||||
| `bezier_join(path1, path2, d, d2 = undef)` | Join two paths with a Bezier curve, control points are the path ends are `d` and `d2` from the ends in the same direction. |
|
||||
| `bezier_length(v, delta = 0.01, t = 0, length = 0)` | Calculate the length of a Bezier curve from control points `v` |
|
||||
| `bezier_min_z(v, steps = 100, z = inf, i = 0)` | Calculate the minimum z coordinate of a Bezier curve from control points `v` |
|
||||
| `bezier_path(v, steps = 100)` | Returns a Bezier path from control points `v` with `steps` segments |
|
||||
@@ -6187,7 +6275,7 @@ allows flexible positioning of the motors.
|
||||
| 2 | `pulley(GT2x20ob_pulley)` | Pulley GT2OB 20 teeth |
|
||||
| 8 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
||||
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||
| 2 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
|
||||
| 2 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -6380,6 +6468,7 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `map(v, func)` | make a new vector where the func function argument is applied to each element of the vector v |
|
||||
| `mapi(v, func)` | make a new vector where the func function argument is applied to each element of the vector v. The func will get the index number as first argument, and the element as second argument. |
|
||||
| `nearly_zero(x)` | True if x is close to zero |
|
||||
| `path_length(path, i = 0, length = 0)` | Calculated the length along a path |
|
||||
| `quadratic_real_roots(a, b, c)` | Returns real roots of a quadratic equation, biggest first. Returns empty list if no real roots |
|
||||
| `radians(degrees)` | Convert radians to degrees |
|
||||
| `reduce(v, func, unity)` | reduce a vector v to a single entity by applying the func function recursively to the reduced value so far and the next element, starting with unity as the initial reduced value |
|
||||
@@ -6600,7 +6689,6 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
||||
| `cap(facets, segment = 0, end)` | Create the mesh for an end cap |
|
||||
| `circle_points(r = 1, z = 0, dir = -1)` | Generate the points of a circle, setting z makes a single turn spiral |
|
||||
| `helical_twist_per_segment(r, pitch, sides)` | Calculate the twist around Z that rotate_from_to() introduces |
|
||||
| `path_length(path, i = 0, length = 0)` | Calculated the length along a path |
|
||||
| `rectangle_points(w, h)` | Generate the points of a rectangle |
|
||||
| `rounded_path(path)` | Convert a rounded_path, consisting of a start coordinate, vertex / radius pairs and then an end coordinate, to a path of points for sweep. |
|
||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||
@@ -6732,7 +6820,7 @@ The `pose()` module allows assembly views in the readme to be posed differently
|
||||
|:--- |:--- |
|
||||
| `assembly(name, big = undef, ngb = false)` | Name an assembly that will appear on the BOM, there needs to a module named `<name>_assembly` to make it. `big` can force big or small assembly diagrams. |
|
||||
| `dxf(name)` | Name a dxf that will appear on the BOM, there needs to a module named `<name>_dxf` to make it |
|
||||
| `explode(d, explode_children = false, offset = [0,0,0])` | Explode children by specified Z distance or vector `d`, option to explode grand children |
|
||||
| `explode(d, explode_children = false, offset = [0,0,0], show_line = true)` | Explode children by specified Z distance or vector `d`, option to explode grand children |
|
||||
| `hidden()` | Make item invisible, except on the BOM |
|
||||
| `no_explode()` | Prevent children being exploded |
|
||||
| `no_pose()` | Force children not to be posed even if parent is |
|
||||
@@ -6752,7 +6840,7 @@ The `pose()` module allows assembly views in the readme to be posed differently
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 1 | `widget(3)` | Rivit like thing for 3mm sheets |
|
||||
| 1 | `widget(3)` | Rivet like thing for 3mm sheets |
|
||||
| 1 | `screw(M3_cap_screw, 8)` | Screw M3 cap x 8mm |
|
||||
| 1 | `sheet(PMMA3, 20, 20, 1)` | Sheet acrylic 20mm x 20mm x 3mm |
|
||||
| 1 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
|
@@ -162,6 +162,6 @@ if __name__ == '__main__':
|
||||
|
||||
# Print commits excluding merges
|
||||
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U..ated chang.*log.*', c.comment):
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U..ated ch.*log.*', c.comment):
|
||||
print('* %s [`%s`](%s "show commit") %s %s\n' % (c.date, c.hash[:7], url + '/commit/' + c.hash, initials(c.author), fixup_comment(c.comment, url)), file = file)
|
||||
do_cmd(('codespell -w -L od ' + filename).split())
|
||||
|
@@ -422,7 +422,7 @@ def views(target, do_assemblies = None):
|
||||
times.add_time(html_name, t)
|
||||
times.print_times(pngs + [html_name])
|
||||
#
|
||||
# Make the printme.html by replacing empty spans that invisbly mark the page breaks by page break divs.
|
||||
# Make the printme.html by replacing empty spans that invisibly mark the page breaks by page break divs.
|
||||
#
|
||||
with open(html_name, 'rt') as src:
|
||||
lines = src.readlines()
|
||||
|
@@ -32,7 +32,7 @@ height = 10;
|
||||
insert = screw_insert(screw);
|
||||
|
||||
module widget(thickness) {
|
||||
vitamin(str("widget(", thickness, "): Rivit like thing for ", thickness, "mm sheets"));
|
||||
vitamin(str("widget(", thickness, "): Rivet like thing for ", thickness, "mm sheets"));
|
||||
t = 1;
|
||||
color("silver") {
|
||||
cylinder(d = 3, h = thickness + 2 * eps, center = true);
|
||||
@@ -85,7 +85,7 @@ assembly("widget_top") {
|
||||
module widget_assembly()
|
||||
assembly("widget") {
|
||||
|
||||
widget_base_assembly(); // Note this is not exloded because it is sub-assembly
|
||||
widget_base_assembly(); // Note this is not exploded because it is sub-assembly
|
||||
|
||||
translate_z(height) {
|
||||
translate_z(sheet_thickness(sheet))
|
||||
|
@@ -85,15 +85,18 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 8, 105, 180, "usb_Ax2"],
|
||||
[ 7, 85, 180, "molex_usb_Ax1"],
|
||||
[ 8.5,125, 180, "molex_usb_Ax2"],
|
||||
[ 3, 140, 180, "usb_uA"],
|
||||
[ 8, 155, 180, "usb_B"],
|
||||
[ 3, 138, 180, "usb_uA"],
|
||||
[ 4.6,148, 180, "usb_miniA"],
|
||||
[ 3.7,158, 180, "usb_C"],
|
||||
[ 8, 170, 180, "usb_B"],
|
||||
[ 6, 184, 180, "uSD", [12, 11.5, 1.4]],
|
||||
[ 8, 196, 180, "jack"],
|
||||
[ 6, 206, 180, "barrel_jack"],
|
||||
[ 5, 220, 180, "hdmi"],
|
||||
[ 3, 235, 180, "mini_hdmi"],
|
||||
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 218, 0, "buzzer"],
|
||||
[ 8, 190, 180, "jack"],
|
||||
[ 6, 200, 180, "barrel_jack"],
|
||||
[ 5, 218, 180, "hdmi"],
|
||||
[ 3, 235, 180, "mini_hdmi"],
|
||||
[ 6, 175, 180, "uSD", [12, 11.5, 1.4]],
|
||||
|
||||
[ 65, 9, 0, "link", inch(0.4)],
|
||||
[ 65, 12, 0, "ax_res", res1_8, 1000],
|
||||
|
@@ -77,6 +77,17 @@ module beziers() {
|
||||
|
||||
translate(control_points[1] - [0, 0, 2])
|
||||
label(str("bezier_length = ", length, ", bezier_min_z = ", bezier_min_z(curve)), valign = "top");
|
||||
|
||||
path1 = [[20, 20, 0], [40, 20, 0]];
|
||||
path2 = [[70, 40, -5], [60, 40, 0]];
|
||||
|
||||
color("green")
|
||||
for(p = concat(path1, path2))
|
||||
translate(p)
|
||||
sphere(1);
|
||||
|
||||
color("orange")
|
||||
sweep(bezier_join(path1, path2, 10), circle_points(0.5, $fn = 64));
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
59
tests/cable_clip.scad
Normal file
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2022
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
include <../core.scad>
|
||||
use <../printed/cable_clip.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
|
||||
|
||||
sheet_thickness = 3;
|
||||
|
||||
cables = [
|
||||
for(i = [1 : 6]) [i, 1.4], [1, 6], 0, [10, inch(0.05), true], 0
|
||||
];
|
||||
|
||||
screw = M3_dome_screw;
|
||||
|
||||
|
||||
module cable_clips() {
|
||||
for(i = [0 : ceil(len(cables) / 2) - 1])
|
||||
translate([i * 25, 0]) {
|
||||
cable1 = cables[2 * i];
|
||||
cable2 = cables[2 * i + 1];
|
||||
|
||||
if($preview) {
|
||||
cable_clip_assembly(screw, sheet_thickness, cable1, cable2);
|
||||
|
||||
for(j = [0 : 1])
|
||||
let(cable = cables[2 * i + j])
|
||||
if(cable)
|
||||
let(positions = cable_bundle_positions(cable))
|
||||
for(i = [0 : len(positions) - 1])
|
||||
let(p = positions[i])
|
||||
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable), 0, p.y])
|
||||
rotate([90, 0, 0])
|
||||
color([grey(20), "blue", "red", "orange", "yellow", "green", "brown", "purple", "grey", "white"][i])
|
||||
cylinder(d = cable_wire_size(cable), h = 30, center = true);
|
||||
}
|
||||
else
|
||||
cable_clip(screw, cable1, cable2);
|
||||
}
|
||||
}
|
||||
|
||||
cable_clips();
|
@@ -55,7 +55,7 @@ module coreXY_belts_test() {
|
||||
translate([coreXYPosBL.x + separation.x/2, coreXYPosTR.y + upper_drive_pulley_offset.y, separation.z/2]) {
|
||||
// add the upper drive pulley stepper motor
|
||||
translate([coreXY_drive_pulley_x_alignment(coreXY_type) + upper_drive_pulley_offset.x, 0, -pulley_height(coreXY_drive_pulley(coreXY_type))])
|
||||
NEMA(NEMA17M);
|
||||
NEMA(NEMA17_40);
|
||||
|
||||
// add the screws for the upper drive offset idler pulleys if required
|
||||
if (upper_drive_pulley_offset.x > 0) {
|
||||
@@ -78,7 +78,7 @@ module coreXY_belts_test() {
|
||||
translate([coreXYPosTR.x - separation.x/2, coreXYPosTR.y + lower_drive_pulley_offset.y, -separation.z/2]) {
|
||||
// add the lower drive pulley stepper motor
|
||||
translate([-coreXY_drive_pulley_x_alignment(coreXY_type) + lower_drive_pulley_offset.x, 0, -pulley_height(coreXY_drive_pulley(coreXY_type))])
|
||||
NEMA(NEMA17M);
|
||||
NEMA(NEMA17_40);
|
||||
|
||||
// add the screws for the lower drive offset idler pulleys if required
|
||||
if (lower_drive_pulley_offset.x < 0) {
|
||||
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
BIN
tests/png/cable_clip.png
Normal file
After Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 152 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 113 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 181 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 218 KiB |
@@ -17,20 +17,26 @@
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
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();
|
||||
|
@@ -24,7 +24,7 @@ use <../utils/layout.scad>
|
||||
module stepper_motors()
|
||||
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = false) let(m = stepper_motors[$i]) {
|
||||
rotate(180)
|
||||
NEMA(m, 0, in([NEMA17P, NEMA17M, NEMA17M8, NEMA8, NEMA8BH], m));
|
||||
NEMA(m, 0, in([NEMA17_27, NEMA17_40, NEMA17_40L280, NEMA8_30, NEMA8_30BH], m));
|
||||
|
||||
translate_z(4)
|
||||
NEMA_screws(m, M3_pan_screw, n = $i - 2, earth = $i > 6 ? undef : $i - 3);
|
||||
|
@@ -17,21 +17,30 @@
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/sweep.scad>
|
||||
use <../utils/bezier.scad>
|
||||
|
||||
use <../vitamins/wire.scad>
|
||||
|
||||
bundle = [7, 1.4];
|
||||
twist_len = 25; // [5 : 50]
|
||||
wires = 7; // [1 : 7]
|
||||
irot = -60; // [-90 : 0]
|
||||
|
||||
/* [Hidden] */
|
||||
wire_d = 1.4;
|
||||
bundle = cable(wires, wire_d);
|
||||
bundle_r = cable_radius(bundle);
|
||||
|
||||
thickness = 2;
|
||||
w = 50;
|
||||
w = 60;
|
||||
d = 20;
|
||||
h = 40;
|
||||
wire_l = 90;
|
||||
h = 10;
|
||||
wire_l = 60;
|
||||
mouse_y = 10;
|
||||
cable_pitch = 7;
|
||||
|
||||
module wires() {
|
||||
translate_z(bundle_r)
|
||||
translate([0, mouse_y, bundle_r])
|
||||
rotate([0, 90, 0]) {
|
||||
n = cable_wires(bundle);
|
||||
d = cable_wire_size(bundle);
|
||||
@@ -47,6 +56,7 @@ module wires() {
|
||||
translate([bundle_r - d / 2, 0]) {
|
||||
colour = ["black", "brown", "red", "orange", "yellow", "blue", "purple"][i];
|
||||
wire(colour, 7, wire_l);
|
||||
|
||||
color(colour)
|
||||
cylinder(d = d, h = wire_l, center = true);
|
||||
}
|
||||
@@ -58,24 +68,49 @@ module wires() {
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(thickness)
|
||||
difference() {
|
||||
translate([-w / 2, 0])
|
||||
square([w, h]);
|
||||
square([w, h]);
|
||||
|
||||
mouse_hole(bundle, 0, true);
|
||||
translate([mouse_y, 0])
|
||||
mouse_hole(bundle, 0, true);
|
||||
|
||||
for(i = [1 : 6])
|
||||
let(cable = cable(i, wire_d), bundle = cable_bundle(cable))
|
||||
translate([mouse_y + cable_pitch * i - bundle.x / 2, -eps])
|
||||
square([bundle.x, bundle.y]);
|
||||
}
|
||||
|
||||
translate_z(-thickness)
|
||||
linear_extrude(thickness)
|
||||
difference() {
|
||||
translate([thickness -d, -w / 2])
|
||||
translate([thickness -d, 0])
|
||||
square([d, w]);
|
||||
|
||||
translate([-15, 0])
|
||||
translate([-15, mouse_y])
|
||||
cable_tie_holes(bundle_r, 0);
|
||||
}
|
||||
}
|
||||
translate([-15, 0])
|
||||
|
||||
translate([-15, mouse_y])
|
||||
cable_tie(bundle_r, thickness);
|
||||
|
||||
for(i = [1 : 6]) let(cable = cable(i, wire_d, [grey(10), "blue", "red", "orange", "yellow", "green"], tlen = twist_len))
|
||||
translate([0, mouse_y + cable_pitch * i]) {
|
||||
tr = cable_twisted_radius(cable);
|
||||
bend_r = 5;
|
||||
x = -d + thickness - bend_r;
|
||||
path = [
|
||||
[-5, 0, tr],
|
||||
[x, 0, tr],
|
||||
bend_r, [x, 0, -25]
|
||||
];
|
||||
rpath = rounded_path(path);
|
||||
tpaths = twisted_cable(cable, rpath, irot = irot, frot = -irot);
|
||||
positions = cable_bundle_positions(cable);
|
||||
|
||||
ends = [for(p = positions) [[30, p.x, p.y], [0, p.x, p.y]]];
|
||||
paths = [for(i = [0 : len(tpaths) - 1]) bezier_join(ends[i], tpaths[i], 1.3, 3)];
|
||||
cable(cable, paths, $fn = 32);
|
||||
}
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -16,14 +16,23 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
wire_r = 5; // [1 : 20]
|
||||
t = 0; // [0 : 3]
|
||||
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/zipties.scad>
|
||||
|
||||
module zipties()
|
||||
layout([for(z = zipties) 9], 10)
|
||||
ziptie(zipties[$i], 5);
|
||||
layout([for(z = zipties) 9], 2 * wire_r) {
|
||||
ziptie(zipties[$i], wire_r, t);
|
||||
|
||||
if(t)
|
||||
color(grey(20))
|
||||
cylinder(r = wire_r, h = 10, center = true);
|
||||
|
||||
}
|
||||
|
||||
if($preview)
|
||||
zipties();
|
||||
|
@@ -19,8 +19,13 @@
|
||||
|
||||
//
|
||||
//! Bezier curves and function to get and adjust the length or minimum z point.
|
||||
//!
|
||||
//! `bezier_join()` joins two paths with a Bezier curve that starts tangential to the end of `path1` and ends tangential to the end of `path2`.
|
||||
//! To do this the outer control points are the path ends and the inner two control points are along the tangents to the path ends.
|
||||
//! The only degree of freedom is how far along those tangents, which are the `d` and optional `d2` parameters.
|
||||
//
|
||||
include <../global_defs.scad>
|
||||
include <maths.scad>
|
||||
|
||||
function bezier(t, v) = //! Returns a point at distance `t` [0 - 1] along the curve with control points `v`
|
||||
(len(v) > 2) ? bezier(t, [for (i = [0 : len(v) - 2]) v[i] * (1 - t) + v[i + 1] * (t)])
|
||||
@@ -55,3 +60,16 @@ function adjust_bezier_z(v, z, eps = 0.001, r1 = 1, r2 = 1.5, z1, z2) = //! Adju
|
||||
: let(r = r1 + (z - z1) * (r2 - r1) / (z2 - z1))
|
||||
abs(r - r1) < abs(r - r2) ? adjust_bezier_z(v, z, eps, r, r1, undef, z1)
|
||||
: adjust_bezier_z(v, z, eps, r, r2, undef, z2);
|
||||
|
||||
function bezier_join(path1, path2, d, d2 = undef) = let( //! Join two paths with a Bezier curve, control points are the path ends are `d` and `d2` from the ends in the same direction.
|
||||
d2 = is_undef(d2) ? d : d2,
|
||||
l = len(path1),
|
||||
p0 = path1[l - 1],
|
||||
p1 = p0 + unit(p0 - path1[l - 2]) * d,
|
||||
p3 = path2[0],
|
||||
p2 = p3 + unit(path2[0] - path2[1]) * d2,
|
||||
v = [p0, p1, p2, p3],
|
||||
segs = path_length(v) / $fs,
|
||||
path = [for(i = [1 : segs - 1], t = i / segs) bezier(t, v)],
|
||||
len = len(path)
|
||||
) concat(path1, path, path2);
|
||||
|
@@ -49,17 +49,18 @@ function show_supports() = !$preview || exploded(); //! True if
|
||||
module no_explode() //! Prevent children being exploded
|
||||
let($exploded_parent = true) children();
|
||||
|
||||
module explode(d, explode_children = false, offset = [0,0,0]) { //! Explode children by specified Z distance or vector `d`, option to explode grand children
|
||||
module explode(d, explode_children = false, offset = [0,0,0], show_line = true) { //! Explode children by specified Z distance or vector `d`, option to explode grand children
|
||||
v = is_list(d) ? d : [0, 0, d];
|
||||
o = is_list(offset) ? offset : [0, 0, offset];
|
||||
if(exploded() && norm(v)) {
|
||||
translate(o) // Draw the line first in case the child is transparent
|
||||
color("yellow") hull() {
|
||||
sphere(0.2);
|
||||
|
||||
translate(v * exploded())
|
||||
if(show_line)
|
||||
translate(o) // Draw the line first in case the child is transparent
|
||||
color("yellow") hull() {
|
||||
sphere(0.2);
|
||||
}
|
||||
|
||||
translate(v * exploded())
|
||||
sphere(0.2);
|
||||
}
|
||||
|
||||
translate(v * exploded())
|
||||
let($exploded_parent = explode_children ? undef : true)
|
||||
|
@@ -187,3 +187,7 @@ function cubic_real_roots(a, b, c, d) = //! Returns real roots of cubic equation
|
||||
) roots == 1 ? [x] :
|
||||
roots == 2 ? [3 * q /p + inflection, -3 * q / p / 2 + inflection] :
|
||||
[for(i = [0 : roots - 1]) 2 * sqrt(-p / 3) * cos(acos(3 * q * sqrt(-3 / p) / p / 2) - i * 120) + inflection];
|
||||
|
||||
function path_length(path, i = 0, length = 0) = //! Calculated the length along a path
|
||||
i >= len(path) - 1 ? length
|
||||
: path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
|
||||
|
@@ -177,10 +177,6 @@ module sweep(path, profile, loop = false, twist = 0, convexity = 1) { //! Draw a
|
||||
polyhedron(points = mesh[0], faces = mesh[1], convexity = convexity);
|
||||
}
|
||||
|
||||
function path_length(path, i = 0, length = 0) = //! Calculated the length along a path
|
||||
i >= len(path) - 1 ? length
|
||||
: path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
|
||||
|
||||
function circle_points(r = 1, z = 0, dir = -1) = //! Generate the points of a circle, setting z makes a single turn spiral
|
||||
let(sides = r2sides(r))
|
||||
[for(i = [0 : sides - 1]) let(a = dir * i * 360 / sides) [r * cos(a), r * sin(a), z * i / sides]];
|
||||
@@ -215,12 +211,16 @@ function rounded_path(path) = //! Convert a rounded_path, consisting of a start
|
||||
p0 - p1, // Calculate vectors between vertices
|
||||
v2 = p2 - p1,
|
||||
a = angle_between(v1, -v2), // Angle turned through
|
||||
arc_start = p1 + unit(v1) * r * tan(a / 2), // Calc the start position
|
||||
d = r * tan(a / 2), // Distance from vertex to tangents
|
||||
room = min(norm(v1), norm(v2)), // Maximum distance
|
||||
arc_start = assert(d <= room,
|
||||
str("Can't fit radius ", r, " into corner at vertex path[", i, "] = ", p1, " only room for radius ", room / tan(a / 2)))
|
||||
p1 + unit(v1) * d, // Calc the start position
|
||||
z_axis = unit(cross(v1, v2)), // z_axis is perpendicular to both vectors
|
||||
centre = arc_start + unit(cross(z_axis, v1)) * r, // Arc center is a radius away, and perpendicular to v1 and the z_axis.
|
||||
x_axis = arc_start - centre, // Make the x_axis along the radius to the start point, includes radius a scale factor
|
||||
y_axis = cross(x_axis, z_axis), // y_axis perpendicular to the other two
|
||||
sides = r2sides(ceil(r2sides(r) * a / 360)) // Sides needed to make the arc
|
||||
sides = ceil(r2sides(r) * a / 360) // Sides needed to make the arc
|
||||
)
|
||||
for(j = [0 : sides], t = a * j / sides) // For each vertex in the arc
|
||||
cos(t) * x_axis + sin(t) * y_axis + centre, // Circular arc in the tiled xy plane.
|
||||
@@ -240,9 +240,8 @@ function segmented_path(path, min_segment) = [ //! Add points to a path to enfo
|
||||
];
|
||||
|
||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which sprial around the given path. Use for making twisted cables
|
||||
segment = path_length(path) / twists / r2sides(2 * r),
|
||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists),
|
||||
initial = [r, 0, 0, 1] * rotate(start_angle)
|
||||
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
|
||||
) [for(i = [0 : n - 1]) let(initial = [r, 0, 0, 1] * rotate(start_angle + i * 360 / n)) [for(t = transforms) initial * t]];
|
||||
|
||||
function rounded_path_vertices(path) = [path[0], for(i = [1 : 2 : len(path) - 1]) path[i]]; //! Show the unrounded version of a rounded_path for debug
|
||||
|
@@ -44,7 +44,8 @@ AACELL = ["AACELL", "Cell AA", 50.5, 14.5
|
||||
AAACELL = ["AAACELL", "Cell AAA", 44.5, 10.5, 8, 3.8, 0.8, "grey", [], 0, bcontact];
|
||||
CCELL = ["CCELL", "Cell C", 50, 26.2, 20, 7.5, 1.5, "brown", [], 0, bcontact];
|
||||
DCELL = ["DCELL", "Cell D", 61.5, 34.2, 22, 8.2, 2.4, "brown", [], 0, bcontact];
|
||||
A23CELL = ["A23CELL", "Cell A23 12v", 28.5, 10.3, 5.2,5.2, 1.0, "silver", [], 0, bcontact];
|
||||
|
||||
batteries = [AAACELL, AACELL, CCELL, DCELL, LUMINTOP, S25R18650];
|
||||
batteries = [AAACELL, AACELL, CCELL, DCELL, LUMINTOP, S25R18650, A23CELL];
|
||||
|
||||
use <battery.scad>
|
||||
|
@@ -33,7 +33,7 @@ function insert_ring1_h(type) = type[6]; //! Height of the top and mi
|
||||
function insert_ring2_d(type) = type[7]; //! Diameter of the middle ring
|
||||
function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring
|
||||
|
||||
function insert_hole_length(type) = round_to_layer(insert_length(type));
|
||||
function insert_hole_length(type) = round_to_layer(insert_length(type)); //! Length of the insert rounded to layer height
|
||||
|
||||
function insert_nose_length(type, d) = let( //! The length before the second ring.
|
||||
length = insert_length(type),
|
||||
|
@@ -485,6 +485,50 @@ module usb_uA(cutout = false) { //! Draw USB micro A connector
|
||||
}
|
||||
}
|
||||
|
||||
module usb_miniA(cutout = false) { //! Draw USB mini A connector
|
||||
l = 9.2;
|
||||
iw1 = 7.0;
|
||||
iw2 = 6.0;
|
||||
ih1 = 1.05;
|
||||
ih2 = 1.0;
|
||||
h = 4.0;
|
||||
t = 0.4;
|
||||
|
||||
module D() {
|
||||
hull() {
|
||||
translate([-iw1 / 2, h - t - ih1])
|
||||
square([iw1, ih1]);
|
||||
|
||||
translate([-iw2 / 2, t + ih2])
|
||||
square([iw2, eps]);
|
||||
|
||||
}
|
||||
translate([-iw2 / 2, t])
|
||||
square([iw2, ih2]);
|
||||
}
|
||||
|
||||
if(cutout)
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(100)
|
||||
offset(2 * panel_clearance)
|
||||
D();
|
||||
else
|
||||
color("silver") rotate([90, 0, 90]) {
|
||||
linear_extrude(l, center = true)
|
||||
difference() {
|
||||
offset(t)
|
||||
D();
|
||||
|
||||
D();
|
||||
}
|
||||
|
||||
translate_z(-l / 2)
|
||||
linear_extrude(1)
|
||||
offset(t)
|
||||
D();
|
||||
}
|
||||
}
|
||||
|
||||
module usb_C(cutout = false) { //! Draw USB C connector
|
||||
l = 7.35;
|
||||
w = 8.94;
|
||||
@@ -1046,6 +1090,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "usb_A")) usb_Ax1(cutouts);
|
||||
if(show(comp, "usb_Ax2")) usb_Ax2(cutouts);
|
||||
if(show(comp, "usb_uA")) usb_uA(cutouts);
|
||||
if(show(comp, "usb_miniA")) usb_miniA(cutouts);
|
||||
if(show(comp, "usb_B")) usb_B(cutouts);
|
||||
if(show(comp, "usb_C")) usb_C(cutouts);
|
||||
if(show(comp, "jack")) jack(cutouts);
|
||||
@@ -1091,6 +1136,8 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "smd_sot")) smd_sot(comp[4], comp[5]);
|
||||
if(show(comp, "vero_pin")) vero_pin(param(4, false));
|
||||
if(show(comp, "terminal")) terminal_block(comp[5], comp[4]);
|
||||
if(show(comp, "text")) color("white") linear_extrude(eps) resize([comp[4], comp[5]]) text(comp[6], font = param(7, "Liberation Mono"), valign = "center", halign = "center");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -885,7 +885,7 @@ ArduinoNano = let(l = 43.18, w = 17.78, pitch = inch(0.6), pins = 15, poffset =
|
||||
[l / 2 + poffset, w / 2 - pitch / 2, 0, "-2p54joiner", pins, 1],
|
||||
[l / 2 + poffset, w / 2 + pitch / 2, 0, "-2p54joiner", pins, 1],
|
||||
[l / 2 + poffset + inch(0.75), w / 2, 0, "2p54header", 2, 3, false, undef, false, false],
|
||||
[1.75, w / 2, 180, "usb_uA" ],
|
||||
[3.1, w / 2, 180, "usb_miniA" ],
|
||||
[l / 2 - inch(0.25), w / 2, 45, "chip", 7, 7, 1.3],
|
||||
[l / 2 + poffset + inch(0.15), w / 2, 0, "chip", 3.5, 6, 1.8, silver ], // mock button
|
||||
[l / 2 + poffset + inch(0.15), w / 2, 0, "chip", 1.3, 2.6, 2.6, grey(90) ], // mock button
|
||||
|
@@ -52,7 +52,7 @@ module corner(r) {
|
||||
if(r < 0)
|
||||
translate([-r, r])
|
||||
rotate(45)
|
||||
square(-r * sqrt(2), -r * sqrt(2), center = true);
|
||||
square([-r * sqrt(2), -r * sqrt(2)], center = true);
|
||||
else
|
||||
translate([0.5, -0.5])
|
||||
square(1, center = true);
|
||||
|
@@ -153,7 +153,7 @@ module smd_sot(type, value) { //! Draw an SMD transistor
|
||||
ls = smd_sot_lead_size(type);
|
||||
|
||||
r = ls.z;
|
||||
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]]);
|
||||
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]], $fn = 32);
|
||||
|
||||
color(grey(20))
|
||||
hull()
|
||||
|
@@ -21,20 +21,20 @@
|
||||
// NEMA stepper motor model
|
||||
//
|
||||
|
||||
// corner body boss boss shaft cap thread black end shaft shaft
|
||||
// side, length, radius, radius, radius, depth, shaft, length, holes, heights, dia, caps, conn, length2, bore
|
||||
NEMA8 = ["NEMA8", 20, 30, 30/2, 20, 7.5, 1.6, 4, 6, 16, [8, 8], 2, true, true, 0, 0];
|
||||
NEMA8BH = ["NEMA8BH", 20, 30, 30/2, 20, 7.5, 1.6, 5, 12, 16, [8, 8], 2, true, true, 7, 2.8];
|
||||
NEMA17 = ["NEMA17", 42.3, 47, 53.6/2, 25, 11, 2, 5, 24, 31, [11.5, 9], 3, false, false, 0, 0];
|
||||
NEMA17M = ["NEMA17M", 42.3, 40, 53.6/2, 25, 11, 2, 5, 20, 31, [12.5, 11], 3, false, false, 0, 0];
|
||||
NEMA17M8= ["NEMA17M8", 42.3, 40, 53.6/2, 25, 11, 2, 8, [280, 8, 4], 31, [12.5, 11], 3, false, false, 0, 0];
|
||||
NEMA17S = ["NEMA17S", 42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31, [8, 8], 3, false, false, 0, 0];
|
||||
NEMA17P = ["NEMA17P", 42.3, 26.5, 53.6/2, 25, 11, 2, 5, 26.5, 31, [10, 8], 3, false, false, 0, 0];
|
||||
NEMA16 = ["NEMA16", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5, 12, 31, [8, 8], 3, false, false, 0, 0];
|
||||
NEMA14 = ["NEMA14", 35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26, [8, 8], 3, false, false, 0, 0];
|
||||
NEMA23 = ["NEMA23", 56.4, 51.2, 75.7/2, 35, 38.1/2, 1.6, 6.35, 24, 47.1, [8, 8], 3, false, false, 0, 0];
|
||||
// corner body boss boss shaft cap thread black end shaft shaft
|
||||
// side, length, radius, radius, radius, depth, shaft, length, holes, heights, dia, caps, conn, length2, bore
|
||||
NEMA8_30 = ["NEMA8_30", 20, 30, 30/2, 20, 7.5, 1.6, 4, 6, 16, [8, 8], 2, true, true, 0, 0];
|
||||
NEMA8_30BH = ["NEMA8_30BH", 20, 30, 30/2, 20, 7.5, 1.6, 5, 12, 16, [8, 8], 2, true, true, 7, 2.8];
|
||||
NEMA17_47 = ["NEMA17_47", 42.3, 47, 53.6/2, 25, 11, 2, 5, 24, 31, [11.5, 9], 3, false, false, 0, 0];
|
||||
NEMA17_40 = ["NEMA17_40", 42.3, 40, 53.6/2, 25, 11, 2, 5, 20, 31, [12.5, 11], 3, false, false, 0, 0];
|
||||
NEMA17_40L280 = ["NEMA17_40L280", 42.3, 40, 53.6/2, 25, 11, 2, 8, [280, 8, 4], 31, [12.5, 11], 3, false, false, 0, 0];
|
||||
NEMA17_34 = ["NEMA17_34", 42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31, [8, 8], 3, false, false, 0, 0];
|
||||
NEMA17_27 = ["NEMA17_27", 42.3, 26.5, 53.6/2, 25, 11, 2, 5, 26.5, 31, [10, 8], 3, false, false, 0, 0];
|
||||
NEMA16_19 = ["NEMA16_19", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5, 12, 31, [8, 8], 3, false, false, 0, 0];
|
||||
NEMA14_36 = ["NEMA14_36", 35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26, [8, 8], 3, false, false, 0, 0];
|
||||
NEMA23_51 = ["NEMA23_51", 56.4, 51.2, 75.7/2, 35, 38.1/2, 1.6, 6.35, 24, 47.1, [8, 8], 3, false, false, 0, 0];
|
||||
|
||||
stepper_motors = [NEMA8, NEMA8BH, NEMA14, NEMA16, NEMA17P, NEMA17S, NEMA17M, NEMA17, NEMA23];
|
||||
stepper_motors = [NEMA8_30, NEMA8_30BH, NEMA14_36, NEMA16_19, NEMA17_27, NEMA17_34, NEMA17_40, NEMA17_47, NEMA23_51];
|
||||
small_steppers = [];
|
||||
|
||||
use <stepper_motor.scad>
|
||||
|
@@ -26,7 +26,7 @@ include <../utils/core/core.scad>
|
||||
include <../utils/sweep.scad>
|
||||
|
||||
soft_washer_colour = grey(20);
|
||||
hard_washer_colour = grey(80);
|
||||
hard_washer_colour = grey(85);
|
||||
star_washer_colour = brass;
|
||||
|
||||
function washer_size(type) = type[1]; //! Nominal size
|
||||
|
@@ -18,9 +18,11 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! Just a BOM entry at the moment and cable bundle size functions for holes, plus cable ties.
|
||||
//! Utilities for adding wires to the BOM and optionally drawing them and cable bundle size functions for holes, plus cable ties.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/sweep.scad>
|
||||
use <../utils/maths.scad>
|
||||
include <zipties.scad>
|
||||
|
||||
module wire(colour, strands, length, strand = 0.2) //! Add stranded wire to the BOM
|
||||
@@ -34,17 +36,61 @@ module ribbon_cable(ways, length) //! Add ribbon cable to the
|
||||
//
|
||||
function cable_wires(cable) = cable[0]; //! Number of wires in a bundle
|
||||
function cable_wire_size(cable) = cable[1]; //! Size of each wire in a bundle
|
||||
function cable_is_ribbon(cable) = len(cable) > 2 && cable[2]; //! Is a ribbon cable?
|
||||
function cable_wire_colours(cable) = assert(len(cable[3]) >= cable_wires(cable)) cable[3]; //! Individual wire colours
|
||||
function cable_tlen(cable) = cable[4]; //! Twisted cable twist length
|
||||
function cable(wires, size, colours, ribbon = false, tlen = 25) = [wires, size, ribbon, colours, tlen]; //! Cable constructor
|
||||
|
||||
// numbers from http://mathworld.wolfram.com/CirclePacking.html
|
||||
function cable_radius(cable) = [0, 1, 2, 2.15, 2.41, 2.7, 3, 3, 3.3][cable_wires(cable)] * cable_wire_size(cable) / 2; //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
|
||||
|
||||
function wire_hole_radius(cable) = ceil(4 * cable_radius(cable) + 1) / 4; //! Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size
|
||||
|
||||
function cable_bundle(cable) = //! Arrangement of a bundle in a flat cable clip
|
||||
[[0,0], [1,1], [2,1], [2, 0.5 + sin(60)], [2,2], [3, 0.5 + sin(60)], [3,2]][cable_wires(cable)];
|
||||
function cable_bundle(cable) = //! Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip
|
||||
(cable_is_ribbon(cable) ? [cable_wires(cable), 1] :
|
||||
[[0,0], [1,1], [2,1], [2, 1 + sin(60)], [2,2], [3, 1 + sin(60)], [3,2]][cable_wires(cable)]) * cable_wire_size(cable);
|
||||
|
||||
function cable_width(cable) = cable_bundle(cable)[0] * cable_wire_size(cable); //! Width in flat clip
|
||||
function cable_height(cable) = cable_bundle(cable)[1] * cable_wire_size(cable); //! Height in flat clip
|
||||
function cable_bundle_positions(cable) = let( //! Positions of wires in a bundle to go through a cable strip
|
||||
wires = cable_wires(cable),
|
||||
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : ceil(wires / 2),
|
||||
top = wires - bottom
|
||||
)
|
||||
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
|
||||
for(i = [top - 1 : -1 : 0]) [i - (top - 1) / 2, top == bottom ? 1.5 : 0.5 + sin(60)]
|
||||
] * cable_wire_size(cable);
|
||||
|
||||
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip
|
||||
function cable_height(cable) = cable_bundle(cable).y; //! Height in flat clip
|
||||
|
||||
function cable_twisted_radius(cable) = let( //! Approximate radius of a cable when twisted
|
||||
tlen = cable_tlen(cable), // Twist length
|
||||
a = cable_wire_size(cable) / 2, // Ellipse minor axis
|
||||
R = cable_radius(cable) - a, // Radius of wire centres when not twisted
|
||||
angle = atan2(tlen, 2 * PI * R), // Slope angle of the spiral
|
||||
b = a / sin(angle), // Ellipse major axis
|
||||
grad = tan(180 / cable_wires(cable)), // Gradient at contact point between elipses
|
||||
x = a^2 / sqrt(a^2 + (b / grad)^2), // Contact point of the ellipse tangent
|
||||
y = b * sqrt(1 - x^2 / a^2)
|
||||
) R ? x + y / grad + a : a; // Where the tangent meets the X axis plus radius
|
||||
|
||||
function twisted_cable(cable, path, irot = 0, frot = 0) = let( //! Return the paths for a twisted cable, `irot` is the initial rotation and frot the final rotation
|
||||
tlen = cable_tlen(cable), // Twist length
|
||||
r = cable_wire_size(cable) / 2,
|
||||
pitch = cable_twisted_radius(cable) - r,
|
||||
wires = cable_wires(cable),
|
||||
bottom = wires > 4 ? 3 : 2,
|
||||
irot = irot + 90 - 180 * (bottom - 1) / wires
|
||||
)
|
||||
spiral_paths(path, wires, pitch, round(path_length(path) / tlen) - frot / 360, irot);
|
||||
|
||||
module cable(cable, paths) { //! Draw a cable, given a list of paths
|
||||
wires = cable_wires(cable);
|
||||
assert(len(paths) == wires);
|
||||
r = cable_wire_size(cable) / 2;
|
||||
for(i = [0 : wires - 1])
|
||||
color(cable_wire_colours(cable)[i])
|
||||
sweep(paths[i], circle_points(r), convexity = 5);
|
||||
}
|
||||
|
||||
module mouse_hole(cable, h = 100, teardrop = false) { //! A mouse hole to allow a panel to go over a wire bundle.
|
||||
r = wire_hole_radius(cable);
|
||||
|
@@ -33,17 +33,16 @@ function ziptie_tail(type) = type[5]; //! The length without teeth
|
||||
module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t`
|
||||
{
|
||||
latch = ziptie_latch(type);
|
||||
lx = latch.x / 2;
|
||||
zt = ziptie_thickness(type);
|
||||
cr = zt; // sharp corner radius
|
||||
lx = min(latch.x / 2, r + zt / 2);
|
||||
right_bulge = (r > lx - zt / 2) || !t;
|
||||
cr = zt / 2; // sharp corner radius
|
||||
z = r + t - cr;
|
||||
x = r - cr;
|
||||
inside_corners = t ? [ [0, 0, r], [-x, z, cr], [x, z, cr] ] : [];
|
||||
outside_corners = t ? [ [0, 0, r + zt], [-x, z, cr + zt], [x, z, cr + zt] ] : [];
|
||||
x1 = lx - zt / 2;
|
||||
x2 = x1 + x1 * zt / r;
|
||||
inside_path = concat([ [0, 0, r], [x1, -r, eps] ], inside_corners);
|
||||
outside_path = concat([ [0, 0, r + zt], [x2, -r - zt, eps] ], outside_corners);
|
||||
outside_path = concat([ if(right_bulge) [0, 0, r + zt], [x2, -r - zt, eps] ], outside_corners);
|
||||
|
||||
tangents = rounded_polygon_tangents(outside_path);
|
||||
length = ceil(rounded_polygon_length(outside_path, tangents) + ziptie_tail(type) + latch.z + 1);
|
||||
@@ -56,7 +55,9 @@ module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radiu
|
||||
linear_extrude(width, center = true)
|
||||
difference() {
|
||||
rounded_polygon(outside_path, tangents);
|
||||
rounded_polygon(inside_path);
|
||||
|
||||
offset(-zt)
|
||||
rounded_polygon(outside_path, tangents);
|
||||
}
|
||||
|
||||
translate([lx, -r])
|
||||
|