1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 20:32:35 +02:00

Compare commits

...

93 Commits

Author SHA1 Message Date
Chris Palmer
e949ef4ecb Merge branch 'nerdyjan-master' 2024-10-06 22:59:43 +01:00
Chris Palmer
932c68a2c0 Updated images and readme.
Pipes are now made with tube instead of differencing cylinders.
HTpipeFitting() now uses rotate_extrude and corrected internal shape.
The seal ring is now tube diameter + 13.
2024-10-06 22:59:03 +01:00
Jan Giebels
78e3360900 changed naming of ht_pipes test script 2024-10-06 14:50:10 +02:00
Jan Giebels
178f67f815 added more pipes and some cleanup 2024-10-06 14:46:40 +02:00
Jan Giebels
af1b057f59 added info and description 2024-10-06 02:20:30 +02:00
Jan Giebels
195917a879 added HT pipes to lib 2024-10-06 02:10:08 +02:00
Jan Giebels
9ed6aab6c8 added test script and some more HT pipes 2024-10-06 02:08:22 +02:00
Jan Giebels
c61386caf9 added HT waterpipes 2024-10-05 18:21:18 +02:00
Chris
a90eb42933 Merge pull request #285 from GregoryLand/master
Relative paths for vitamin rod_end includes
2024-10-02 13:15:37 +01:00
Greg Land
549dbc9380 Relative paths for vitamin rod_end includes 2024-10-02 06:56:25 -04:00
Chris Palmer
a483494da9 Updated changelog. 2024-10-02 08:44:05 +01:00
Chris Palmer
afc50ffe5d Removed trailing comma in let() for compatibility with last release. 2024-10-02 08:41:41 +01:00
Chris Palmer
8951b8b60e Merge branch 'jijamik-patch-1' 2024-09-30 12:42:03 +01:00
Chris Palmer
c33d954db6 Updated changelog. 2024-09-30 12:41:14 +01:00
Chris Palmer
8fb7ec0213 Updated images. 2024-09-30 12:39:45 +01:00
Chris Palmer
402fb83690 Merge branch 'patch-1' of https://github.com/jijamik/NopSCADlib into jijamik-patch-1 2024-09-30 02:21:16 +01:00
Chris Palmer
eb0ba21622 Updated changelog. 2024-09-30 01:59:54 +01:00
Chris Palmer
e4b1b686ff Added rd_cm_choke(), rd_coil() and spiral_wrap().
Added 10mm ceramic disc capacitors.
2024-09-30 01:58:04 +01:00
jijamik
f6a371769d Corrected HGH20CA carriage_pitch_x value. 2024-09-25 17:17:24 +02:00
Chris Palmer
6eba75a41d Updated changelog. 2024-09-13 18:25:16 +01:00
Chris Palmer
c484ac2e8d Updated libtest image with new D-connector. 2024-09-13 18:23:45 +01:00
Chris Palmer
f12ac7b569 Updated changelog. 2024-09-13 17:03:40 +01:00
Chris Palmer
cfc3b483e0 Merge branch 'trnila-DCONN37' 2024-09-13 17:00:46 +01:00
Chris Palmer
6da845215b Updated readme. 2024-09-13 16:59:55 +01:00
Daniel Trnka
7fe5aaac22 Added DCONN37 connector 2024-09-10 23:11:04 +02:00
Chris Palmer
983511b906 Updated changelog. 2024-09-02 22:00:01 +01:00
Chris Palmer
4df5d608a2 Merge branch 'allTexas-stage4upstream' 2024-09-02 21:55:18 +01:00
Chris Palmer
4f073f97e8 Added rod_ends.scad to lib.scad and lib_test.scad.
Fixed rod_end colours.
Added new pulleys to the test list and reodered.
Printed pulleys nopw shown in two rows.
Updated images and readme.
2024-09-02 21:50:27 +01:00
Chris Palmer
f03e32cd1e Merge branch 'stage4upstream' of https://github.com/allTexas/NopSCADlib into allTexas-stage4upstream 2024-09-02 15:41:46 +01:00
texas
fe3ce88086 adding test code for weld nuts and rod ends, adding ball bearings to test code list, and updating code for dome screw heads to use an angle to determine inset distance of the lower taper 2024-08-23 14:32:03 -05:00
texas
37fe83e2e0 added chamfer distance variable to taper in the bottom of the dome heads 2024-08-16 16:49:04 -05:00
Chris Palmer
c7803ad935 Merge branch 'stage4upstream' of https://github.com/allTexas/NopSCADlib into allTexas-stage4upstream 2024-08-15 23:13:52 +01:00
Chris Palmer
472df8e369 Updated changelog. 2024-08-15 22:55:43 +01:00
Chris Palmer
bc7f294f99 Added smd_250V_fuse() and rd_box_cap().
Fixed missing value parameters from a lot of the SMD component instantiation examples.
2024-08-15 22:52:32 +01:00
allTexas
e9292d9165 Merge pull request #2 from nophead/master
merging from upstream in prep for pull request
2024-08-14 10:08:21 -05:00
texas
f86dfef919 fixed the calculations for dome screws to now use equations for a scaled sphere cap instead. This allows for larger and smaller sizes than were previously possible, and also eliminates the need for that lift value. Adding M6 and M8 dome screws as a result of this new ability 2024-08-14 10:07:20 -05:00
=
e97f9fdacc adding weld nuts 2024-08-14 10:07:13 -05:00
alex
ba45f85580 adding weld nuts, m4 and m6 for now 2024-08-14 10:06:59 -05:00
alex
90fb9eb01f adding F625 ball bearing 2024-08-14 10:06:16 -05:00
alex
905fc01677 adding rod end bearing and a yellow bed spring 2024-08-14 10:05:45 -05:00
Tex
a695974ac5 updating after maybe breaking debian 2024-08-14 10:04:22 -05:00
Chris Palmer
a974e4fa9d Updated changelog. 2024-07-01 17:50:58 +01:00
Chris Palmer
dc1c3f1d5e Merge branch 'Hermann-SW-master'
Added camera motion example.
2024-07-01 17:47:33 +01:00
Hermann-SW
07866f7284 Add PT_camera to examples and gallery 2024-06-30 14:54:02 +02:00
Chris Palmer
ad74378e7e Updated changelog. 2024-06-30 12:32:03 +01:00
Chris Palmer
53d1ea93cd Can now specify a rotation angle for a geared_stepper's shaft. 2024-06-30 12:30:29 +01:00
Chris Palmer
7eaca85e96 Updated changelog. 2024-06-12 21:25:13 +01:00
Chris Palmer
b00709da82 Image edge pixel changes due to new PC. 2024-06-12 21:23:32 +01:00
Chris Palmer
c76be23867 Fixed thread bug on threaded inserts revealed by latest OpenSCAD snapshot. 2024-06-12 21:18:11 +01:00
Chris Palmer
f6f348b76e Fixed rocker slot height. 2024-06-12 21:15:44 +01:00
Chris
11a1f65158 Updated changelog. 2024-05-08 00:29:33 +01:00
Chris
870b396574 Revoved strailing comma in let() in splines.scad. 2024-05-08 00:22:19 +01:00
Chris Palmer
00c19b08f1 Updated changelog. 2024-04-21 15:45:15 +01:00
Chris Palmer
22bbb85899 Merge branch 'vshcryabets-pcb/rcwl0516' 2024-04-21 15:41:13 +01:00
Chris Palmer
c1fdb2e701 Dpdated images and readme. 2024-04-21 15:40:51 +01:00
Chris Palmer
728d5d32a9 Merge branch 'pcb/rcwl0516' of https://github.com/vshcryabets/NopSCADlib into vshcryabets-pcb/rcwl0516 2024-04-21 15:20:59 +01:00
Chris Palmer
771ba04e18 Updated changelog. 2024-04-21 15:19:33 +01:00
Chris Palmer
dbf930fd36 Added cubic splines and Catmull Rom splines. 2024-04-21 12:13:31 +01:00
Chris Palmer
97cea65f41 Cable clips can now use inserts or nut traps. 2024-04-21 12:08:40 +01:00
Chris Palmer
c7e912cd77 A optional path can now be specified for tubing. 2024-04-21 10:26:28 +01:00
Chris Palmer
f563645e45 Corrected M2 nut_trap_depth, was too big. 2024-04-21 10:20:36 +01:00
Chris Palmer
2840cc2390 Washer now uses sweep.scad instead of including it, leaking its interface. 2024-04-21 10:18:34 +01:00
Chris Palmer
a5b2018008 Added offset_paths() to sweep.scad.
show_path() now takes an optional radius.
2024-04-21 08:47:44 +01:00
V.Shcriabets
cbe2c085b7 Add RCWL-0516 PCB 2024-04-20 12:59:16 +03:00
Chris Palmer
7a395e475e Updated changelog. 2024-03-14 23:56:12 +00:00
Chris Palmer
7b7348d98f Merge branch 'vshcryabets-update/mt3608-pcb' 2024-03-14 23:54:17 +00:00
Chris Palmer
19dadcb58d Updated images and readme. 2024-03-14 23:53:44 +00:00
Chris Palmer
60a2ef8976 Merge branch 'update/mt3608-pcb' of https://github.com/vshcryabets/NopSCADlib into vshcryabets-update/mt3608-pcb 2024-03-14 23:22:14 +00:00
Chris Palmer
188b3f706d Updated changelog. 2024-03-14 21:41:08 +00:00
Chris Palmer
5579c0d988 Fixed box_shelf_bracket() horizontal holes.
Added a third child to box_shelf_bracket() to allow custom additions.
2024-03-14 21:36:04 +00:00
Chris Palmer
67408f8422 Added d_hole() module. 2024-03-14 21:02:20 +00:00
Chris Palmer
929abbefda Updated front page image. 2024-03-14 21:01:37 +00:00
Chris Palmer
c7727e7106 Added Sellotape to sheets. 2024-03-14 20:58:54 +00:00
Chris Palmer
1dbba5a650 Added camera_lens_height() function. 2024-03-14 20:58:02 +00:00
Chris Palmer
db2a9a8a24 Ziptie test can now show wires with t = 0. 2024-03-14 20:56:20 +00:00
Chris Palmer
6ced9c871c Fixed FOV for ESP32 camera being rotated.
Shortened the ESP32 camera header pins.
2024-03-14 20:51:05 +00:00
Chris Palmer
d6b00fbf57 Removed unused test code. 2024-03-14 20:48:05 +00:00
Chris Palmer
2c996bb7a1 Fixed random error caused by not running bom first. 2024-03-14 20:47:11 +00:00
V.Shkriabets
c565f2912e Update MT3608 pcb module 2024-03-14 19:21:52 +02:00
Chris Palmer
dbd3004021 Updated changelog. 2024-02-19 19:07:26 +00:00
Chris Palmer
fb656c8fad Merge branch 'jeroenrnl-t-tracks' 2024-02-19 19:03:47 +00:00
Chris Palmer
fdb92ec263 Improved layout to fit into front page view. 2024-02-19 19:03:20 +00:00
Chris Palmer
cff4c71909 Merge branch 't-tracks' of https://github.com/jeroenrnl/NopSCADlib into jeroenrnl-t-tracks 2024-02-19 16:28:24 +00:00
Chris Palmer
db917ef2bc Updated changelog. 2024-02-19 16:15:34 +00:00
Chris Palmer
a2d98f9d3a Merge branch 'jeroenrnl-threaded_inserts' 2024-02-19 16:13:26 +00:00
Chris Palmer
30c67e742b Updated the front page image. 2024-02-19 16:10:19 +00:00
Chris Palmer
2506e5aa31 Merge branch 'threaded_inserts' of https://github.com/jeroenrnl/NopSCADlib into jeroenrnl-threaded_inserts 2024-02-19 15:00:48 +00:00
Chris Palmer
1f313aa4ac Updated changelog. 2024-02-19 00:06:35 +00:00
Chris Palmer
63a4271c4c Updated libtest image. 2024-02-18 23:56:47 +00:00
Chris Palmer
0edf3a2f75 Cable clips can now handle up to 9 wires, have the nut and bolt flipped or use an insert.
cable_radius() now handles cables with up to 20 wires.
cable_bundle() and cable_bundle_positions() now handle bundles up to 9 wires.
Added cable_merge().
2024-02-18 23:51:30 +00:00
Jeroen Roos
f6404b939f Added T-Tracks and accessories 2024-02-18 22:10:01 +01:00
Jeroen Roos
efb1153e22 Add threaded inserts 2024-02-15 22:01:36 +01:00
Chris Palmer
a3b27a736e Changelog updated. 2024-02-10 12:22:37 +00:00
100 changed files with 2503 additions and 358 deletions

View File

@@ -3,6 +3,141 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
#### [v21.28.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.28.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.28.1...v21.28.2 "diff with v21.28.1")
* 2024-10-02 [`afc50ff`](https://github.com/nophead/NopSCADlib/commit/afc50ffe5d01ee586b55630e0d34e44720f6b68a "show commit") [C.P.](# "Chris Palmer") Removed trailing comma in `let()` for compatibility with last release.
#### [v21.28.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.28.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.28.0...v21.28.1 "diff with v21.28.0")
* 2024-09-30 [`8fb7ec0`](https://github.com/nophead/NopSCADlib/commit/8fb7ec02138f30c5f4b2a72c723ea01d753aeb61 "show commit") [C.P.](# "Chris Palmer") Updated images.
* 2024-09-25 [`f6a3717`](https://github.com/nophead/NopSCADlib/commit/f6a371769d2850037dc15c94366d14c126efe4ba "show commit") [J.](# "jijamik") Corrected HGH20CA `carriage_pitch_x` value.
### [v21.28.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.28.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.27.1...v21.28.0 "diff with v21.27.1")
* 2024-09-30 [`e4b1b68`](https://github.com/nophead/NopSCADlib/commit/e4b1b686ff12a415c6109f311c6c36104d8a7b0c "show commit") [C.P.](# "Chris Palmer") Added `rd_cm_choke(),` `rd_coil()` and `spiral_wrap()`.
Added 10mm ceramic disc capacitors.
#### [v21.27.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.27.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.27.0...v21.27.1 "diff with v21.27.0")
* 2024-09-13 [`c484ac2`](https://github.com/nophead/NopSCADlib/commit/c484ac2e8dbc8e9f9cb5051ce963250839a2705d "show commit") [C.P.](# "Chris Palmer") Updated libtest image with new D-connector.
### [v21.27.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.27.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.26.0...v21.27.0 "diff with v21.26.0")
* 2024-09-13 [`6da8452`](https://github.com/nophead/NopSCADlib/commit/6da845215bd2a4c3b7dc8a022579947cef27b8b8 "show commit") [C.P.](# "Chris Palmer") Updated readme.
* 2024-09-10 [`7fe5aaa`](https://github.com/nophead/NopSCADlib/commit/7fe5aaac22283c453b2c2e5a2239b65ddd4320c1 "show commit") [D.T.](# "Daniel Trnka") Added DCONN37 connector
### [v21.26.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.26.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.25.0...v21.26.0 "diff with v21.25.0")
* 2024-09-02 [`4f073f9`](https://github.com/nophead/NopSCADlib/commit/4f073f97e815e5c0b469a07d20526f7e2b88d79d "show commit") [C.P.](# "Chris Palmer") Added `rod_ends.scad` to `lib.scad` and `lib_test.scad`.
Fixed `rod_end` colours.
Added new pulleys to the test list and reodered.
Printed pulleys nopw shown in two rows.
Updated images and readme.
* 2024-08-23 [`fe3ce88`](https://github.com/nophead/NopSCADlib/commit/fe3ce88086de8480a88b69b7f7d2e6376b03caa6 "show commit") [T.](# "texas") adding test code for weld nuts and rod ends, adding ball bearings to test code list, and updating code for dome screw heads to use an angle to determine inset distance of the lower taper
* 2024-08-16 [`37fe83e`](https://github.com/nophead/NopSCADlib/commit/37fe83e2e08b6a0bd23042e37fbe89122d78516c "show commit") [T.](# "texas") added chamfer distance variable to taper in the bottom of the dome heads
* 2024-08-14 [`f86dfef`](https://github.com/nophead/NopSCADlib/commit/f86dfef919731f9731ca39f70ebd07b2c7204dfa "show commit") [T.](# "texas") fixed the calculations for dome screws to now use equations for a scaled sphere cap instead. This allows for larger and smaller sizes than were previously possible, and also eliminates the need for that lift value. Adding M6 and M8 dome screws as a result of this new ability
* 2024-08-14 [`e97f9fd`](https://github.com/nophead/NopSCADlib/commit/e97f9fdacc87bbc31cb9f0f3474132bc09f5ed91 "show commit") [=.](# "=") adding weld nuts
* 2024-08-13 [`ba45f85`](https://github.com/nophead/NopSCADlib/commit/ba45f8558007c7efe6bfd17bebacf285293ba4ad "show commit") [A.](# "alex") adding weld nuts, m4 and m6 for now
* 2024-03-18 [`90fb9eb`](https://github.com/nophead/NopSCADlib/commit/90fb9eb01f8721cb48589e59a14b3770da250cd5 "show commit") [A.](# "alex") adding F625 ball bearing
* 2024-03-13 [`905fc01`](https://github.com/nophead/NopSCADlib/commit/905fc016778d6a78774c05236425463fa2aa3323 "show commit") [A.](# "alex") adding rod end bearing and a yellow bed spring
* 2024-03-04 [`a695974`](https://github.com/nophead/NopSCADlib/commit/a695974ac562b88ed08cc3ea54a2a4e07f638c5f "show commit") [T.](# "Tex") updating after maybe breaking debian
### [v21.25.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.25.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.24.1...v21.25.0 "diff with v21.24.1")
* 2024-08-15 [`bc7f294`](https://github.com/nophead/NopSCADlib/commit/bc7f294f995d8aa8ba500a1ef666c8fb50f94fd3 "show commit") [C.P.](# "Chris Palmer") Added `smd_250V_fuse()` and `rd_box_cap()`.
Fixed missing value parameters from a lot of the SMD component instantiation examples.
#### [v21.24.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.24.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.24.0...v21.24.1 "diff with v21.24.0")
* 2024-06-30 [`07866f7`](https://github.com/nophead/NopSCADlib/commit/07866f72845c9e08c90e371c92315bab54f003c6 "show commit") [H.](# "Hermann-SW") Add `PT_camera` to examples and gallery
### [v21.24.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.24.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.23.2...v21.24.0 "diff with v21.23.2")
* 2024-06-30 [`53d1ea9`](https://github.com/nophead/NopSCADlib/commit/53d1ea93cd339d3fb6e085be9314d7ec0b547796 "show commit") [C.P.](# "Chris Palmer") Can now specify a rotation angle for a `geared_stepper's` shaft.
#### [v21.23.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.23.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.23.1...v21.23.2 "diff with v21.23.1")
* 2024-06-12 [`b00709d`](https://github.com/nophead/NopSCADlib/commit/b00709da820e1241422b6e156b0c61157c18d63d "show commit") [C.P.](# "Chris Palmer") Image edge pixel changes due to new PC.
* 2024-06-12 [`c76be23`](https://github.com/nophead/NopSCADlib/commit/c76be2386715b80bbbc9a71c99214df7f3c71bc7 "show commit") [C.P.](# "Chris Palmer") Fixed thread bug on threaded inserts revealed by latest OpenSCAD snapshot.
* 2024-06-12 [`f6f348b`](https://github.com/nophead/NopSCADlib/commit/f6f348b76e7986927a571e1c07c3f866bcbeeafe "show commit") [C.P.](# "Chris Palmer") Fixed rocker slot height.
#### [v21.23.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.23.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.23.0...v21.23.1 "diff with v21.23.0")
* 2024-05-08 [`870b396`](https://github.com/nophead/NopSCADlib/commit/870b396574935603305462f1fea88564c909aad8 "show commit") [C.](# "Chris") Revoved strailing comma in `let()` in `splines.scad`.
### [v21.23.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.23.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.22.0...v21.23.0 "diff with v21.22.0")
* 2024-04-21 [`c1fdb2e`](https://github.com/nophead/NopSCADlib/commit/c1fdb2e701672b2404e34f224e77f21fb2ff34da "show commit") [C.P.](# "Chris Palmer") Dpdated images and readme.
* 2024-04-20 [`cbe2c08`](https://github.com/nophead/NopSCADlib/commit/cbe2c085b72d0e5d9f0c6485d5fa7df0e172a4cc "show commit") [V.](# "V.Shcriabets") Add RCWL-0516 PCB
### [v21.22.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.22.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.21.0...v21.22.0 "diff with v21.21.0")
* 2024-04-21 [`dbf930f`](https://github.com/nophead/NopSCADlib/commit/dbf930fd366c28aa9e581d9fe01e3654b882923a "show commit") [C.P.](# "Chris Palmer") Added cubic splines and Catmull Rom splines.
### [v21.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.20.0...v21.21.0 "diff with v21.20.0")
* 2024-04-21 [`97cea65`](https://github.com/nophead/NopSCADlib/commit/97cea65f41714acd31a3a3b968d8c133ce1a91d2 "show commit") [C.P.](# "Chris Palmer") Cable clips can now use inserts or nut traps.
### [v21.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.19.2...v21.20.0 "diff with v21.19.2")
* 2024-04-21 [`c7e912c`](https://github.com/nophead/NopSCADlib/commit/c7e912cd77e189ef729f94956245f1c6a9f72012 "show commit") [C.P.](# "Chris Palmer") A optional path can now be specified for tubing.
#### [v21.19.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.19.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.19.1...v21.19.2 "diff with v21.19.1")
* 2024-04-21 [`f563645`](https://github.com/nophead/NopSCADlib/commit/f563645e45817a4f89ef3cb1be9d932310c485c6 "show commit") [C.P.](# "Chris Palmer") Corrected M2 `nut_trap_depth,` was too big.
#### [v21.19.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.19.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.19.0...v21.19.1 "diff with v21.19.0")
* 2024-04-21 [`2840cc2`](https://github.com/nophead/NopSCADlib/commit/2840cc2390a8e776add8ca3ef715abfc8d15dadc "show commit") [C.P.](# "Chris Palmer") Washer now uses `sweep.scad` instead of including it, leaking its interface.
### [v21.19.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.19.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.18.0...v21.19.0 "diff with v21.18.0")
* 2024-04-21 [`a5b2018`](https://github.com/nophead/NopSCADlib/commit/a5b20180083ba8d3014bc298cf0e28c20e6be437 "show commit") [C.P.](# "Chris Palmer") Added `offset_paths()` to `sweep.scad`.
`show_path()` now takes an optional radius.
### [v21.18.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.18.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.17.0...v21.18.0 "diff with v21.17.0")
* 2024-03-14 [`19dadcb`](https://github.com/nophead/NopSCADlib/commit/19dadcb58db0dd7408726c69d46cf2b7b26c764b "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2024-03-14 [`c565f29`](https://github.com/nophead/NopSCADlib/commit/c565f2912e7319575fc6ec3262699b73305c46b4 "show commit") [V.](# "V.Shkriabets") Update MT3608 pcb module
### [v21.17.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.17.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.16.1...v21.17.0 "diff with v21.16.1")
* 2024-03-14 [`5579c0d`](https://github.com/nophead/NopSCADlib/commit/5579c0d988c6d7983d3884afa7e42fdb283109a8 "show commit") [C.P.](# "Chris Palmer") Fixed `box_shelf_bracket()` horizontal holes.
Added a third child to `box_shelf_bracket()` to allow custom additions.
* 2024-03-14 [`67408f8`](https://github.com/nophead/NopSCADlib/commit/67408f8422918416c617ec7389dbc09b2c62a2ae "show commit") [C.P.](# "Chris Palmer") Added `d_hole()` module.
* 2024-03-14 [`929abbe`](https://github.com/nophead/NopSCADlib/commit/929abbefda2c380b121c775371f197860c6c3aff "show commit") [C.P.](# "Chris Palmer") Updated front page image.
* 2024-03-14 [`c7727e7`](https://github.com/nophead/NopSCADlib/commit/c7727e7106e3829a6b5f6c501b1a082d540a4a68 "show commit") [C.P.](# "Chris Palmer") Added Sellotape to sheets.
* 2024-03-14 [`1dbba5a`](https://github.com/nophead/NopSCADlib/commit/1dbba5a650f8dac2d05a5668008e61a5ec22ea4f "show commit") [C.P.](# "Chris Palmer") Added `camera_lens_height()` function.
#### [v21.16.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.16.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.16.0...v21.16.1 "diff with v21.16.0")
* 2024-03-14 [`db2a9a8`](https://github.com/nophead/NopSCADlib/commit/db2a9a8a24966f098d4c0c8157de98a885b79a85 "show commit") [C.P.](# "Chris Palmer") Ziptie test can now show wires with t `=` 0.
* 2024-03-14 [`6ced9c8`](https://github.com/nophead/NopSCADlib/commit/6ced9c871c5a637dbe8494836a4233e1f6cd4971 "show commit") [C.P.](# "Chris Palmer") Fixed FOV for ESP32 camera being rotated.
Shortened the ESP32 camera header pins.
* 2024-03-14 [`d6b00fb`](https://github.com/nophead/NopSCADlib/commit/d6b00fbf5719239adc5e8b66f863c003a50806d3 "show commit") [C.P.](# "Chris Palmer") Removed unused test code.
* 2024-03-14 [`2c996bb`](https://github.com/nophead/NopSCADlib/commit/2c996bb7a143a85c21833a69f56f2f47afabe072 "show commit") [C.P.](# "Chris Palmer") Fixed random error caused by not running bom first.
### [v21.16.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.16.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.15.0...v21.16.0 "diff with v21.15.0")
* 2024-02-19 [`fdb92ec`](https://github.com/nophead/NopSCADlib/commit/fdb92ec263d60a42e04f06abfeec5e1648a12b6b "show commit") [C.P.](# "Chris Palmer") Improved layout to fit into front page view.
* 2024-02-18 [`f6404b9`](https://github.com/nophead/NopSCADlib/commit/f6404b939f714b3121dc6e9737cc24f3b9c64ebb "show commit") [J.R.](# "Jeroen Roos") Added T-Tracks and accessories
### [v21.15.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.15.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.14.0...v21.15.0 "diff with v21.14.0")
* 2024-02-19 [`30c67e7`](https://github.com/nophead/NopSCADlib/commit/30c67e742bb3603fa41b41e1a144989947e58ad7 "show commit") [C.P.](# "Chris Palmer") Updated the front page image.
* 2024-02-12 [`efb1153`](https://github.com/nophead/NopSCADlib/commit/efb1153e2245fa67193cd7b49ac0926239c3b703 "show commit") [J.R.](# "Jeroen Roos") Add threaded inserts
### [v21.14.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.14.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.13.1...v21.14.0 "diff with v21.13.1")
* 2024-02-18 [`63a4271`](https://github.com/nophead/NopSCADlib/commit/63a4271c4c1bc97e93e67e8178515be1cfda9e43 "show commit") [C.P.](# "Chris Palmer") Updated libtest image.
* 2024-02-18 [`0edf3a2`](https://github.com/nophead/NopSCADlib/commit/0edf3a2f75d729aa663836878d278226e7bd8094 "show commit") [C.P.](# "Chris Palmer") Cable clips can now handle up to 9 wires, have the nut and bolt flipped or use an insert.
`cable_radius()` now handles cables with up to 20 wires.
`cable_bundle()` and `cable_bundle_positions()` now handle bundles up to 9 wires.
Added `cable_merge()`.
#### [v21.13.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.13.0...v21.13.1 "diff with v21.13.0")
* 2024-02-10 [`8540e04`](https://github.com/nophead/NopSCADlib/commit/8540e04a10d83be4ff454fa8999614e5137dd0ab "show commit") [C.P.](# "Chris Palmer") Metal hex pillars now chamfered.
### [v21.13.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.12.0...v21.13.0 "diff with v21.12.0")
* 2024-02-10 [`7947810`](https://github.com/nophead/NopSCADlib/commit/79478104d6b3a8673ae405606d2576ad98c4e90e "show commit") [C.P.](# "Chris Palmer") Dome option added to nut to draw acorn nuts.
Chamfers added to nuts and hex head screws when manifold is used.

View File

@@ -0,0 +1,54 @@
include <../../vitamins/geared_steppers.scad>
include <../../core.scad>
include <../../vitamins/cameras.scad>
use <../../vitamins/pcb.scad>
module ptc(ang2) {
rotate([180,0,0])
union(){
geared_stepper(28BYJ_48,ang2);
rotate([90,0,180-ang2])
translate([9.8,-16.5,1.7])
rotate([0,0,90])
camera(cameras[0]);
}
}
module pt(ang,ang2) {
rotate([180,0,0]) geared_stepper(28BYJ_48,ang);
rotate([0,0,ang]) rotate([270,0,0]) translate([0,-29.0,-1.5]) ptc(ang2);
}
deg=90;
c=90;
if($t<0.125){
a=180+$t/0.125*deg;
pt(a,c);
}else if ($t<0.25){
a=180+deg-($t-0.125)/0.125*deg;
pt(a,c);
}else if ($t<0.375){
b=c+($t-0.25)/0.125*deg;
pt(180,b);
}else if ($t<0.5){
b=c+deg-($t-0.375)/0.125*deg;
pt(180,b);
}
else if($t<0.625){
a=180+($t-0.5)/0.125*deg;
b=c+deg-90+($t-0.5)/0.125*deg;
pt(a,b);
}else if ($t<0.75){
a=180+deg-($t-0.625)/0.125*deg;
b=c+deg-($t-0.625)/0.125*deg;
pt(a,b);
}else if ($t<0.875){
a=180-($t-0.75)/0.125*deg;
b=c-($t-0.75)/0.125*deg;
pt(a,b);
}else{
a=90+($t-0.875)/0.125*deg;
b=c+deg-180+($t-0.875)/0.125*deg;
pt(a,b);
}

BIN
gallery/PT_camera.anim.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -106,6 +106,10 @@ A base and shroud to make PSU safe to sit on a desk
![](PSU_tube.png)
## PT_camera
Two 28BYJ_48 geared stepper motors and a Raspberry v1 camera, combined with [4 drops of superglue](https://forums.raspberrypi.com/viewtopic.php?p=1810000#p1810000). Script [PT_camera.scad](../examples/PT_camera/PT_camera.scad) nicely demonstrates new 2nd optional arg (motor shaft angle) of ```geared_stepper()```.
![](PT_camera.anim.gif)
## PotBox
Potentiometer box with course and fine controls and three 4mm binding posts

View File

@@ -58,6 +58,7 @@ include <vitamins/pulleys.scad>
include <vitamins/ring_terminals.scad>
include <vitamins/rails.scad>
include <vitamins/rod.scad>
include <vitamins/rod_ends.scad>
include <vitamins/servo_motors.scad>
include <vitamins/shaft_couplings.scad>
include <vitamins/sheets.scad>
@@ -97,6 +98,7 @@ use <utils/hanging_hole.scad>
use <utils/fillet.scad>
use <utils/rounded_polygon.scad>
use <utils/rounded_triangle.scad>
use <utils/splines.scad>
use <utils/layout.scad>
use <utils/round.scad>
use <utils/offset.scad>
@@ -104,3 +106,4 @@ use <utils/pcb_utils.scad>
use <utils/sector.scad>
use <utils/thread.scad>
use <vitamins/photo_interrupter.scad>
use <vitamins/ht_pipes.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 KiB

After

Width:  |  Height:  |  Size: 1010 KiB

View File

@@ -98,6 +98,7 @@ use <tests/rails.scad>
use <tests/ring_terminals.scad>
use <tests/rockers.scad>
use <tests/rod.scad>
use <tests/rod_ends.scad>
use <tests/SBR_rails.scad>
use <tests/screws.scad>
use <tests/sealing_strip.scad>
@@ -112,6 +113,7 @@ use <tests/stepper_motors.scad>
use <tests/Swiss_clips.scad>
use <tests/toggles.scad>
use <tests/transformers.scad>
use <tests/ttracks.scad>
use <tests/tubings.scad>
use <tests/veroboard.scad>
use <tests/washers.scad>
@@ -177,7 +179,7 @@ translate([x5, screw_knobs_y])
screw_knobs();
knobs_y = screw_knobs_y + 40;
translate([640, knobs_y])
translate([660, knobs_y])
printed_pulley_test();
translate([x5, knobs_y])
@@ -220,15 +222,12 @@ translate([950, box_y])
box_test();
translate([950, 1525])
rotate(-90)
bbox_test();
inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 140;
washers_y = nuts_y + 160;
screws_y = washers_y + 120;
circlips_y = screws_y + 180;
threaded_inserts_y = screws_y + 180;
circlips_y = threaded_inserts_y + 30;
springs_y = circlips_y + 20;
o_rings_y = springs_y;
sealing_strip_y = springs_y + 20;
@@ -246,6 +245,10 @@ fans_y = displays_y + 110;
transformers_y = fans_y + 120;
psus_y = transformers_y + 190;
ttracks_y = pcbs_y + 150;
translate([840, ttracks_y])
ttracks();
translate([x0 + 35, inserts_y])
inserts();
@@ -258,6 +261,9 @@ translate([x0, nuts_y])
translate([x0, washers_y])
washers();
translate([x0, threaded_inserts_y])
threaded_inserts();
translate([x0, screws_y])
screws();
@@ -288,6 +294,9 @@ translate([x0, pulleys_y])
translate([x0, leadnuts_y])
leadnuts();
translate([x0 + 170, leadnuts_y])
rod_ends();
translate([x0 + 120, leadnuts_y])
leadnuthousings();
@@ -301,7 +310,7 @@ translate([x0, linear_bearings_y]) {
translate([x0, steppers_y])
stepper_motors();
translate([x0 + 400, steppers_y])
translate([x0 + 450, steppers_y])
gear_motors();
translate([x0, sheets_y])
@@ -397,15 +406,15 @@ translate([x2, components_y])
components();
veroboard_y = 0;
d_connectors_y = veroboard_y + 110;
iecs_y = d_connectors_y + 80;
d_connectors_y = veroboard_y + 120;
iecs_y = d_connectors_y + 70;
modules_y = iecs_y + 60;
ssrs_y = modules_y + 80;
blowers_y = ssrs_y + 60;
hot_ends_y = blowers_y + 100;
batteries_y = hot_ends_y + 55;
panel_meters_y = batteries_y + 70;
extrusions_y = panel_meters_y + 100;
extrusions_y = panel_meters_y + 130;
translate([x3, veroboard_y])
veroboard_test();
@@ -416,10 +425,10 @@ translate([x3 + 50, veroboard_y + 20])
translate([x3 + 160, ssrs_y])
pcb_mounts();
translate([x3 + 145, veroboard_y + 16])
translate([x3 + 145, veroboard_y])
cameras();
translate([x3 + 145, d_connectors_y - 10])
translate([x3 + 145, veroboard_y + 45])
camera_housings();
translate([x3, d_connectors_y])
@@ -467,6 +476,9 @@ translate([370, transformers_y])
translate([x4, transformers_y])
no_explode() socket_boxes();
translate([950, transformers_y + 110])
rotate(-90)
bbox_test();
belts_y = 0;
rails_y = belts_y + 200;

View File

@@ -494,7 +494,8 @@ module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = un
for(p = screw_positions)
multmatrix(p)
translate_z(thickness)
children();
let($horizontal = true)
children();
r = box_boss_r(type);
inset = box_intrusion(type) - r + (r + insert_boss_radius(insert, w) + bezel_clearance / 2) / sqrt(2);
@@ -503,10 +504,11 @@ module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = un
for(x = [-1, 1], y = [-1, 1])
translate([x * (box_width(type) / 2 - inset), y * (box_depth(type) / 2 - inset)])
rotate(45 * x * (2 + y))
children();
let($horizontal = false)
children();
}
module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts
module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts, third child is 3D additions.
w = is_undef(wall) ? box_wall(type) : wall;
insert = box_shelf_insert(type);
lip = 2 * insert_boss_radius(insert, w);
@@ -561,9 +563,13 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
children(0);
}
hflip()
hflip() {
box_shelf_screw_positions(type, screw_positions, 0, w)
boss();
if($children > 2)
children(2);
}
}
if($children > 1)
hflip()
@@ -571,7 +577,7 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
hflip()
box_shelf_screw_positions(type, screw_positions, 0, w)
insert_hole(insert, counterbore = 1, horizontal = true);
insert_hole(insert, counterbore = 1, horizontal = $horizontal);
}
}

View File

@@ -18,100 +18,137 @@
//
//
//! Cable clips to order. Can be for one or two cables of different sizes.
//! Cable clips to order. Can be for one or two cables of different sizes. Can use an insert and a screw from below or a screw and nut, nyloc or plain, either way up.
//
include <../core.scad>
use <../vitamins/wire.scad>
use <../utils/fillet.scad>
use <../vitamins/insert.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
function cable_clip_insert(screw, insert = true) = //! Insert type for clip, given screw.
is_list(insert) ? insert : insert ? screw_insert(screw, true) : false;
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;
function cable_clip_width(screw, insert = false, nut = false) = //! Width given the `screw` and possibly insert or nut.
let(insert = cable_clip_insert(screw, insert))
insert ? 2 * (insert_hole_radius(insert) + wall) :
nut ? 2 * (nut_radius(screw_nut(screw)) + wall) :
max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw)));
function cable_clip_height(cable, screw = false, insert = false, nut = false) = //! Height given the `cable`.
let(insert = cable_clip_insert(screw, insert))
max(cable_height(cable) + wall, insert ? insert_hole_length(insert) + 1 : 0, nut ? nut_trap_depth(screw_nut(screw)) + wall : 0);
function cable_clip_extent(screw, cable, insert = false, nut = false) = cable_clip_width(screw, insert, nut) / 2 + cable_width(cable) + wall; //! How far it extends from the screw.
function cable_clip_offset(screw, cable, insert = false, nut = false) = cable_clip_width(screw, insert, nut) / 2 + cable_width(cable) / 2; //! The offset of the cable from the screw.
module single_cable_clip(screw, cable, h = 0, insert = false, nut = false) {
insert = cable_clip_insert(screw, insert);
height = cable_clip_width(screw, insert, nut);
depth = h ? h : cable_clip_height(cable, screw, insert, nut);
w = cable_width(cable);
width = wall + w + wall + screw_dia + wall;
hole_x = wall + w + wall + screw_dia / 2;
width = wall + w + height;
hole_x = wall + w + height / 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]) {
the_nut = screw_nut(screw);
translate([-hole_x, 0])
difference() {
linear_extrude(height)
difference() {
hull() {
for(p = cable_bundle_positions(cable))
translate(p)
circle(d = cable_wire_size(cable));
rounded_square([width, 1], r, center = false);
square([w, eps], center = true);
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);
}
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);
}
translate([hole_x, depth, height / 2])
rotate([90, 0, 0])
if(insert)
insert_hole(insert, 10, horizontal = true);
else
if(nut) {
translate_z(depth - wall - nut_trap_depth(the_nut))
nut_trap(screw, the_nut, horizontal = true);
nut_trap(screw, the_nut, horizontal = true);
}
else
teardrop_plus(h = 2 * depth + 1, r = screw_clearance_radius(screw), center = true);
}
}
module double_cable_clip(screw, cable1, cable2) {
h = max(cable_clip_height(cable1), cable_clip_height(cable2));
module double_cable_clip(screw, cable1, cable2, insert = false, nut = false) {
h = max(cable_clip_height(cable1, screw, insert, nut), cable_clip_height(cable2, screw, insert, nut));
union() {
single_cable_clip(screw, cable1, h);
single_cable_clip(screw, cable1, h, insert, nut);
mirror([1,0,0]) single_cable_clip(screw, cable2, h);
mirror([1,0,0]) single_cable_clip(screw, cable2, h, insert, nut);
}
}
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);
module cable_clip(screw, cable1, cable2 = 0, insert = false, nut = false) { //! Create the STL for a single cable or two cable clip
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20, insert ? "I" : nut ? "N" : "");
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);
}
assert(!(insert && nut), "insert and nut mutually exclusive");
if(cable2)
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)))
double_cable_clip(screw, cable1, cable2, insert, nut);
else
stl(str(clip_str(screw), cable_str(cable1)))
single_cable_clip(screw, cable1, h = 0, insert = insert, nut = nut);
}
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);
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false, nut = false, nyloc = true) { //! Cable clip with the fasteners
flip = flip || insert || nut; // Screw must be below if using an insert or nut
insert = cable_clip_insert(screw, insert);
height = max(cable_clip_height(cable1, screw, insert, nut), cable2 ? cable_clip_height(cable2, screw, insert, nut) : 0);
stl_colour(pp1_colour) render()
translate([0, cable_clip_width(screw) / 2]) rotate([90, 0, 0])
cable_clip(screw, cable1, cable2);
translate([0, cable_clip_width(screw, insert, nut) / 2])
rotate([90, 0, 0])
cable_clip(screw, cable1, cable2, insert, nut);
the_nut = screw_nut(screw);
screw_len = nut ? screw_length(screw, thickness + wall, nyloc ? 1 : 2, nyloc = nyloc, nut = !nyloc)
: screw_length(screw, thickness + height, 2, nut = !nyloc && !insert, nyloc = !insert && nyloc, insert = insert);
translate_z(height)
screw_and_washer(screw, screw_length(screw, height + thickness, 2, nyloc = true));
if(flip)
if(insert)
insert(insert);
else
if(nut)
translate_z(-height + wall)
nut(the_nut, nyloc);
else
nut_and_washer(the_nut, nyloc);
else
screw_and_washer(screw, screw_len);
translate_z(-thickness)
vflip()
nut_and_washer(screw_nut(screw), true);
if(flip)
screw_and_washer(screw, screw_len, insert || !nyloc);
else
nut_and_washer(the_nut, nyloc);
}

View File

@@ -383,9 +383,3 @@ module camera_housing(cam) {
rotate(90)
camera_bracket(cam);
}
cam = rpi_camera_v2;
if($preview)
camera_fastened_assembly(cam, 3);
else
camera_housing(cam);

558
readme.md
View File

@@ -26,30 +26,31 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
<tr><td> <a href = "#axials">Axials</a> </td><td> <a href = "#jack">Jack</a> </td><td> <a href = "#ring_terminals">Ring_terminals</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 = "#bldc_motors">BLDC_motors</a> </td><td> <a href = "#ldrs">LDRs</a> </td><td> <a href = "#rockers">Rockers</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 = "#ball_bearings">Ball_bearings</a> </td><td> <a href = "#led_meters">LED_meters</a> </td><td> <a href = "#rod">Rod</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 = "#batteries">Batteries</a> </td><td> <a href = "#leds">LEDs</a> </td><td> <a href = "#sbr_rails">SBR_rails</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 = "#bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#leadnuts">Leadnuts</a> </td><td> <a href = "#sk_brackets">SK_brackets</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 = "#belts">Belts</a> </td><td> <a href = "#light_strips">Light_strips</a> </td><td> <a href = "#smds">SMDs</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 = "#blowers">Blowers</a> </td><td> <a href = "#linear_bearings">Linear_bearings</a> </td><td> <a href = "#ssrs">SSRs</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 = "#box_sections">Box_sections</a> </td><td> <a href = "#magnets">Magnets</a> </td><td> <a href = "#screws">Screws</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 = "#bulldogs">Bulldogs</a> </td><td> <a href = "#mains_sockets">Mains_sockets</a> </td><td> <a href = "#sealing_strip">Sealing_strip</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 = "#buttons">Buttons</a> </td><td> <a href = "#microswitches">Microswitches</a> </td><td> <a href = "#servo_motors">Servo_motors</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 = "#cable_strips">Cable_strips</a> </td><td> <a href = "#microview">Microview</a> </td><td> <a href = "#shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#flat_hinge">Flat_hinge</a> </td><td> <a href = "#pcb_utils">PCB_utils</a> </td><td></td></tr>
<tr><td> <a href = "#cameras">Cameras</a> </td><td> <a href = "#modules">Modules</a> </td><td> <a href = "#sheets">Sheets</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 = "#nuts">Nuts</a> </td><td> <a href = "#spades">Spades</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 = "#o_ring">O_ring</a> </td><td> <a href = "#spools">Spools</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 = "#opengrab">Opengrab</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#led_bezel">LED_bezel</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 = "#pcb">PCB</a> </td><td> <a href = "#stepper_motors">Stepper_motors</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 = "#pcbs">PCBs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</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 = "#psus">PSUs</a> </td><td> <a href = "#terminals">Terminals</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 = "#panel_meters">Panel_meters</a> </td><td> <a href = "#toggles">Toggles</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 = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#transformers">Transformers</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 = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#tubings">Tubings</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</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 = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</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 = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</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 = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</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 = "#hot_ends">Hot_ends</a> </td><td></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 = "#hygrometer">Hygrometer</a> </td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#batteries">Batteries</a> </td><td> <a href = "#leds">LEDs</a> </td><td> <a href = "#rod_ends">Rod_ends</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 = "#bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#leadnuts">Leadnuts</a> </td><td> <a href = "#sbr_rails">SBR_rails</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 = "#belts">Belts</a> </td><td> <a href = "#light_strips">Light_strips</a> </td><td> <a href = "#sk_brackets">SK_brackets</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 = "#blowers">Blowers</a> </td><td> <a href = "#linear_bearings">Linear_bearings</a> </td><td> <a href = "#smds">SMDs</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 = "#box_sections">Box_sections</a> </td><td> <a href = "#magnets">Magnets</a> </td><td> <a href = "#ssrs">SSRs</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 = "#bulldogs">Bulldogs</a> </td><td> <a href = "#mains_sockets">Mains_sockets</a> </td><td> <a href = "#screws">Screws</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 = "#buttons">Buttons</a> </td><td> <a href = "#microswitches">Microswitches</a> </td><td> <a href = "#sealing_strip">Sealing_strip</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 = "#cable_strips">Cable_strips</a> </td><td> <a href = "#microview">Microview</a> </td><td> <a href = "#servo_motors">Servo_motors</a> </td><td> <a href = "#flat_hinge">Flat_hinge</a> </td><td> <a href = "#pcb_utils">PCB_utils</a> </td><td></td></tr>
<tr><td> <a href = "#cameras">Cameras</a> </td><td> <a href = "#modules">Modules</a> </td><td> <a href = "#shaft_couplings">Shaft_couplings</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 = "#nuts">Nuts</a> </td><td> <a href = "#sheets">Sheets</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 = "#o_ring">O_ring</a> </td><td> <a href = "#spades">Spades</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 = "#opengrab">Opengrab</a> </td><td> <a href = "#spools">Spools</a> </td><td> <a href = "#led_bezel">LED_bezel</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 = "#pcb">PCB</a> </td><td> <a href = "#springs">Springs</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 = "#pcbs">PCBs</a> </td><td> <a href = "#stepper_motors">Stepper_motors</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 = "#psus">PSUs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#splines">Splines</a> </td><td></td></tr>
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#terminals">Terminals</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 = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#toggles">Toggles</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 = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#transformers">Transformers</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 = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#ttracks">Ttracks</a> </td><td> <a href = "#ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</a> </td><td> <a href = "#tubings">Tubings</a> </td><td> <a href = "#ssr_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</a> </td><td> <a href = "#variacs">Variacs</a> </td><td> <a href = "#screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</a> </td><td> <a href = "#veroboard">Veroboard</a> </td><td> <a href = "#socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#ht_pipes">HT_pipes</a> </td><td></td><td> <a href = "#washers">Washers</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#hygrometer">Hygrometer</a> </td><td></td><td> <a href = "#zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
</table>
---
@@ -233,13 +234,16 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
| 1 | `ball_bearing(BB686)` | Ball bearing 686ZZ 6mm x 13mm x 5mm |
| 1 | `ball_bearing(BB696)` | Ball bearing 696ZZ 6mm x 16mm x 5mm |
| 1 | `ball_bearing(BBF623)` | Ball bearing F623-2RS 3mm x 10mm x 4mm |
| 1 | `ball_bearing(BBF625)` | Ball bearing F625ZZ 5mm x 16mm x 5mm |
| 1 | `ball_bearing(BBF693)` | Ball bearing F693ZZ 3mm x 8mm x 3mm |
| 1 | `ball_bearing(BBF695)` | Ball bearing F695ZZ 5mm x 13mm x 4mm |
| 1 | `ball_bearing(BBMR63)` | Ball bearing MR63ZZ 3mm x 6mm x 2.5mm |
| 1 | `ball_bearing(BBMR83)` | Ball bearing MR83ZZ 3mm x 8mm x 3mm |
| 1 | `ball_bearing(BBMR85)` | Ball bearing MR85ZZ 5mm x 8mm x 2.5mm |
| 1 | `ball_bearing(BBMR93)` | Ball bearing MR93ZZ 3mm x 9mm x 4mm |
| 1 | `ball_bearing(BBMR95)` | Ball bearing MR95ZZ 5mm x 9mm x 3mm |
| 1 | `ball_bearing(BBSMR95)` | Ball bearing SMR95ZZ 5mm x 9mm x 2.5mm |
| 7 | ` bearing_ball(3)` | Steel ball 3mm |
| 8 | ` bearing_ball(3)` | Steel ball 3mm |
<a href="#top">Top</a>
@@ -779,6 +783,11 @@ PCB cameras.
| `camera_lens_offset(type)` | Offset of the lens center from the PCB centre |
| `camera_pcb(type)` | The PCB part of the camera |
### Functions
| Function | Description |
|:--- |:--- |
| `camera_lens_height(type)` | The height of the lens stack |
### Modules
| Module | Description |
|:--- |:--- |
@@ -982,6 +991,7 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
| Module | Description |
|:--- |:--- |
| `d_connector_holes(type)` | Place children at the screw hole positions |
| `d_hole(type, h = 0, center = true, clearance = 0.2)` | Make a hole to clear the back of d-connector |
| `d_pillar()` | Draw a pillar for a D-connector |
| `d_plug(type, socket = false, pcb = false, idc = false)` | Draw specified D plug, which can be IDC, PCB or plain solder bucket |
| `d_plug_D(length, width, rad)` | D plug D shape |
@@ -996,9 +1006,11 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
| 1 | `d_socket(DCONN15, idc = true)` | D-type 15 way IDC socket |
| 1 | `d_plug(DCONN25, pcb = true)` | D-type 25 way PCB mount plug |
| 1 | `d_socket(DCONN25, pcb = true)` | D-type 25 way PCB mount socket |
| 1 | `d_plug(DCONN37)` | D-type 37 way plug |
| 1 | `d_socket(DCONN37)` | D-type 37 way socket |
| 1 | `d_plug(DCONN9)` | D-type 9 way plug |
| 1 | `d_socket(DCONN9)` | D-type 9 way socket |
| 6 | `d_pillar()` | D-type connector pillar |
| 8 | `d_pillar()` | D-type connector pillar |
<a href="#top">Top</a>
@@ -1453,7 +1465,7 @@ Geared tin can steppers
### Modules
| Module | Description |
|:--- |:--- |
| `geared_stepper(type)` | Draw the specified geared stepper |
| `geared_stepper(type, angle = 0)` | Draw the specified geared stepper with optional shaft angle. |
| `geared_stepper_screw_positions(type)` | Place children at the screw positions |
![geared_steppers](tests/png/geared_steppers.png)
@@ -1579,6 +1591,99 @@ Needs updating as mostly obsolete versions.
| 4 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
<a href="#top">Top</a>
---
<a name="ht_pipes"></a>
## HT_pipes
Parametric PVC HT water pipes commonly found in hardware stores around germany. Great for building weather proof cases for IoT things.
[vitamins/ht_pipes.scad](vitamins/ht_pipes.scad) Object definitions.
[vitamins/ht_pipe.scad](vitamins/ht_pipe.scad) Implementation.
[tests/HT_pipes.scad](tests/HT_pipes.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| `pipe_length(type)` | Pipe length |
| `pipe_od(type)` | Outside diameter |
| `pipe_td(type)` | T-Pipe diameter |
| `pipe_wall(type)` | Wall thickness |
### Modules
| Module | Description |
|:--- |:--- |
| `ht_cap(type)` | Draw specified cap |
| `ht_pipe(type)` | Draw specified pipe |
| `ht_tpipe(type)` | Draw specified T-pipe |
![ht_pipes](tests/png/ht_pipes.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `ht_cap(HT_110_cap)` | PVC Waterpipe - HT 110 cap |
| 1 | `ht_pipe(HT_110_pipe_1000)` | PVC Waterpipe - HT 110 pipe 1000 mm |
| 1 | `ht_pipe(HT_110_pipe_150)` | PVC Waterpipe - HT 110 pipe 150 mm |
| 1 | `ht_pipe(HT_110_pipe_1500)` | PVC Waterpipe - HT 110 pipe 1500 mm |
| 1 | `ht_pipe(HT_110_pipe_2000)` | PVC Waterpipe - HT 110 pipe 2000 mm |
| 1 | `ht_pipe(HT_110_pipe_250)` | PVC Waterpipe - HT 110 pipe 250 mm |
| 1 | `ht_pipe(HT_110_pipe_500)` | PVC Waterpipe - HT 110 pipe 500 mm |
| 1 | `ht_cap(HT_125_cap)` | PVC Waterpipe - HT 125 cap |
| 1 | `ht_pipe(HT_125_pipe_1000)` | PVC Waterpipe - HT 125 pipe 1000 mm |
| 1 | `ht_pipe(HT_125_pipe_150)` | PVC Waterpipe - HT 125 pipe 150 mm |
| 1 | `ht_pipe(HT_125_pipe_1500)` | PVC Waterpipe - HT 125 pipe 1500 mm |
| 1 | `ht_pipe(HT_125_pipe_2000)` | PVC Waterpipe - HT 125 pipe 2000 mm |
| 1 | `ht_pipe(HT_125_pipe_250)` | PVC Waterpipe - HT 125 pipe 250 mm |
| 1 | `ht_pipe(HT_125_pipe_500)` | PVC Waterpipe - HT 125 pipe 500 mm |
| 1 | `ht_cap(HT_160_cap)` | PVC Waterpipe - HT 160 cap |
| 1 | `ht_pipe(HT_160_pipe_1000)` | PVC Waterpipe - HT 160 pipe 1000 mm |
| 1 | `ht_pipe(HT_160_pipe_150)` | PVC Waterpipe - HT 160 pipe 150 mm |
| 1 | `ht_pipe(HT_160_pipe_1500)` | PVC Waterpipe - HT 160 pipe 1500 mm |
| 1 | `ht_pipe(HT_160_pipe_2000)` | PVC Waterpipe - HT 160 pipe 2000 mm |
| 1 | `ht_pipe(HT_160_pipe_250)` | PVC Waterpipe - HT 160 pipe 250 mm |
| 1 | `ht_pipe(HT_160_pipe_500)` | PVC Waterpipe - HT 160 pipe 500 mm |
| 1 | `ht_cap(HT_32_cap)` | PVC Waterpipe - HT 32 cap |
| 1 | `ht_pipe(HT_32_pipe_1000)` | PVC Waterpipe - HT 32 pipe 1000 mm |
| 1 | `ht_pipe(HT_32_pipe_150)` | PVC Waterpipe - HT 32 pipe 150 mm |
| 1 | `ht_pipe(HT_32_pipe_1500)` | PVC Waterpipe - HT 32 pipe 1500 mm |
| 1 | `ht_pipe(HT_32_pipe_2000)` | PVC Waterpipe - HT 32 pipe 2000 mm |
| 1 | `ht_pipe(HT_32_pipe_250)` | PVC Waterpipe - HT 32 pipe 250 mm |
| 1 | `ht_pipe(HT_32_pipe_500)` | PVC Waterpipe - HT 32 pipe 500 mm |
| 1 | `ht_cap(HT_40_cap)` | PVC Waterpipe - HT 40 cap |
| 1 | `ht_pipe(HT_40_pipe_1000)` | PVC Waterpipe - HT 40 pipe 1000 mm |
| 1 | `ht_pipe(HT_40_pipe_150)` | PVC Waterpipe - HT 40 pipe 150 mm |
| 1 | `ht_pipe(HT_40_pipe_1500)` | PVC Waterpipe - HT 40 pipe 1500 mm |
| 1 | `ht_pipe(HT_40_pipe_2000)` | PVC Waterpipe - HT 40 pipe 2000 mm |
| 1 | `ht_pipe(HT_40_pipe_250)` | PVC Waterpipe - HT 40 pipe 250 mm |
| 1 | `ht_pipe(HT_40_pipe_500)` | PVC Waterpipe - HT 40 pipe 500 mm |
| 1 | `ht_tpipe(HT_50_tpipe)` | PVC Waterpipe - HT 50 T pipe |
| 1 | `ht_cap(HT_50_cap)` | PVC Waterpipe - HT 50 cap |
| 1 | `ht_pipe(HT_50_pipe_1000)` | PVC Waterpipe - HT 50 pipe 1000 mm |
| 1 | `ht_pipe(HT_50_pipe_150)` | PVC Waterpipe - HT 50 pipe 150 mm |
| 1 | `ht_pipe(HT_50_pipe_1500)` | PVC Waterpipe - HT 50 pipe 1500 mm |
| 1 | `ht_pipe(HT_50_pipe_2000)` | PVC Waterpipe - HT 50 pipe 2000 mm |
| 1 | `ht_pipe(HT_50_pipe_250)` | PVC Waterpipe - HT 50 pipe 250 mm |
| 1 | `ht_pipe(HT_50_pipe_500)` | PVC Waterpipe - HT 50 pipe 500 mm |
| 1 | `ht_tpipe(HT_50_40_tpipe)` | PVC Waterpipe - HT 50/40 T pipe |
| 1 | `ht_cap(HT_75_cap)` | PVC Waterpipe - HT 75 cap |
| 1 | `ht_pipe(HT_75_pipe_1000)` | PVC Waterpipe - HT 75 pipe 1000 mm |
| 1 | `ht_pipe(HT_75_pipe_150)` | PVC Waterpipe - HT 75 pipe 150 mm |
| 1 | `ht_pipe(HT_75_pipe_1500)` | PVC Waterpipe - HT 75 pipe 1500 mm |
| 1 | `ht_pipe(HT_75_pipe_2000)` | PVC Waterpipe - HT 75 pipe 2000 mm |
| 1 | `ht_pipe(HT_75_pipe_250)` | PVC Waterpipe - HT 75 pipe 250 mm |
| 1 | `ht_pipe(HT_75_pipe_500)` | PVC Waterpipe - HT 75 pipe 500 mm |
| 1 | `ht_cap(HT_90_cap)` | PVC Waterpipe - HT 90 cap |
| 1 | `ht_pipe(HT_90_pipe_1000)` | PVC Waterpipe - HT 90 pipe 1000 mm |
| 1 | `ht_pipe(HT_90_pipe_150)` | PVC Waterpipe - HT 90 pipe 150 mm |
| 1 | `ht_pipe(HT_90_pipe_1500)` | PVC Waterpipe - HT 90 pipe 1500 mm |
| 1 | `ht_pipe(HT_90_pipe_2000)` | PVC Waterpipe - HT 90 pipe 2000 mm |
| 1 | `ht_pipe(HT_90_pipe_250)` | PVC Waterpipe - HT 90 pipe 250 mm |
| 1 | `ht_pipe(HT_90_pipe_500)` | PVC Waterpipe - HT 90 pipe 500 mm |
<a href="#top">Top</a>
---
@@ -1703,6 +1808,8 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
| `insert_ring2_d(type)` | Diameter of the middle ring |
| `insert_ring3_d(type)` | Diameter of the bottom ring |
| `insert_screw_diameter(type)` | Screw size |
| `threaded_insert_chamfer(type)` | Size of the chamfer for threaded inserts |
| `threaded_insert_pitch(type)` | Pitch of the outer thread for threaded inserts |
### Functions
| Function | Description |
@@ -1718,6 +1825,7 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
| `insert_boss(type, z, wall = 2 * extrusion_width)` | Make a boss to take an insert |
| `insert_hole(type, counterbore = 0, horizontal = false)` | Make a hole to take an insert, `counterbore` is the extra length for the screw |
| `insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, flying = true)` | Make a flying insert lug, see [ssr_shroud](#Ssr_shroud) |
| `threaded_insert(type)` | Draw specified threaded insert, for use in wood |
![inserts](tests/png/inserts.png)
@@ -1732,6 +1840,14 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
| 1 | `insert(CNCKM4)` | Heatfit insert M4 x 4mm |
| 1 | `insert(F1BM4)` | Heatfit insert M4 x 8.2mm |
| 2 | `insert(CNCKM5)` | Heatfit insert M5 x 5.8mm |
| 1 | `threaded_insert(M10x25)` | Threaded insert M10 x 25mm |
| 1 | `threaded_insert(M12x30)` | Threaded insert M12 x 30mm |
| 1 | `threaded_insert(M16x30)` | Threaded insert M16 x 30mm |
| 1 | `threaded_insert(M3x8)` | Threaded insert M3 x 8mm |
| 1 | `threaded_insert(M4x10)` | Threaded insert M4 x 10mm |
| 1 | `threaded_insert(M5x12)` | Threaded insert M5 x 12mm |
| 1 | `threaded_insert(M6x15)` | Threaded insert M6 x 15mm |
| 1 | `threaded_insert(M8x18)` | Threaded insert M8 x 18mm |
<a href="#top">Top</a>
@@ -2357,6 +2473,8 @@ If a nut is given a child then it gets placed on its top surface.
| `nut_square_width(type)` | Width of the square nut |
| `nut_trap_depth(type)` | Depth of nut trap |
| `nut_washer(type)` | Corresponding washer |
| `nut_weld_base_r(type)` | Weld nut base radius |
| `nut_weld_base_t(type)` | Weld nut base thickness |
### Functions
| Function | Description |
@@ -2376,7 +2494,9 @@ If a nut is given a child then it gets placed on its top surface.
| `nut_and_washer(type, nyloc)` | Draw nut with corresponding washer |
| `nut_square(type, brass = false, nylon = false)` | Draw specified square nut |
| `nut_trap(screw, nut, depth = 0, horizontal = false, supported = false, h = 200)` | Make a nut trap |
| `sliding_ball_t_nut(size, w, h, r)` | Draw a sliding ball t nut |
| `sliding_t_nut(type)` | Draw a sliding T nut, T nut with a spring loaded ball or a hammer nut. |
| `weld_nut(type)` | draw a weld nut |
| `wingnut(type)` | Draw a wingnut |
![nuts](tests/png/nuts.png)
@@ -2419,6 +2539,8 @@ If a nut is given a child then it gets placed on its top surface.
| 1 | `nut(M8_nut, nyloc = true)` | Nut M8 x 6.5mm nyloc |
| 1 | `nut(M8nS_thin_nut)` | Nut M8nS 13 x 4mm |
| 1 | `washer(M6_washer)` | Washer M6 x 12.5mm x 1.5mm |
| 1 | `weld nut(M4_weld_nut)` | Weld Nut M4 |
| 1 | `weld nut(M6_weld_nut)` | Weld Nut M6 |
| 1 | `wingnut(M4_wingnut)` | Wingnut M4 |
@@ -2651,6 +2773,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `potentiometer(BTT_encoder)` | BTT_encoder |
| 1 | `box_header(2p54header, 4, 2)` | Box header 4 x 2 |
| 1 | `box_header(2p54header, 4, 2, right_angle = true)` | Box header 4 x 2 right angle |
| 1 | `rd_disc(10mm_disc, "1nF Y2")` | Ceramic capacitor, 10mm_disc 1nF Y2 |
| 1 | `rd_disc(6p4mm_disc, "100n")` | Ceramic capacitor, 6p4mm_disc 100n |
| 1 | `rd_cm_choke(ATX_CM_CHOKE ,"3.5mH")` | Common mode choke 3.5mH |
| 1 | `rd_xtal(ACT1100, "40MHz")` | Crystal ACT1100 40MHz |
| 1 | `rd_xtal(ACT1700, "80MHz")` | Crystal ACT1700 80MHz |
| 1 | `rd_xtal(C_002RX, "60KHz")` | Crystal C_002RX 60KHz |
@@ -2658,14 +2783,15 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `rd_xtal(HC49_4H, "10MHz")` | Crystal HC49_4H 10MHz |
| 1 | `d_plug(DCONN9, pcb = true)` | D-type 9 way PCB mount plug |
| 1 | `dil_socket(12, 15.24)` | DIL socket 24 x 0.6" |
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
| 1 | `smd_diode(DO214AC, "SS34")` | DO214AC package SS34 |
| 2 | `ax_diode(DO_41, "1N4007")` | Diode 1N4007 |
| 2 | `ax_diode(DO_35, "1N4148")` | Diode 1N4148 |
| 1 | `rd_electrolytic(ECAP8x12, "220uF35V")` | Electolytic capacitor ECAP8x12 220uF35V |
| 1 | `hdmi(hdmi_full)` | HDMI socket |
| 1 | `pdip(24, 27C32, w = 15.24)` | IC 27C32 PDIP24 |
| 1 | `pdip(8, NE555)` | IC NE555 PDIP8 |
| 1 | `idc_transition(2p54header, 5)` | IDC transition header 5 x 2 |
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
| 1 | `smd_inductor(IND2525 ,"4R7")` | IND2525 package 4R7 |
| 1 | `jst_xh_header(jst_ph_header, 2)` | JST PH connector 2 way |
| 1 | `jst_xh_header(jst_xh_header, 2)` | JST XH connector 2 way |
| 1 | `jst_xh_header(jst_zh_header, 2)` | JST ZH connector 2 way |
@@ -2685,41 +2811,44 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `pin_socket(2p54header, 4, 1)` | Pin socket 4 x 1 |
| 1 | `pin_socket(2p54header, 6, 1)` | Pin socket 6 x 1 |
| 2 | `pin_socket(2p54header, 8, 1)` | Pin socket 8 x 1 |
| 1 | `rd_coil(IND16x10 ,"4.7uH")` | Radial inductor 16x10 4.7uH |
| 1 | `rd_transistor(TO92, "78L05")` | Regulator TO92 78L05 |
| 1 | `rd_module(HF33F, "012-HSL-3F")` | Relay HF33F / 012-HSL-3F |
| 1 | `ax_res(res1_2, 10, tol = 10)` | Resistor 10 Ohms 10% 0.5W |
| 1 | `ax_res(res1_4, 100, tol = 2)` | Resistor 100 Ohms 2% 0.25W |
| 1 | `ax_res(res1_8, 1000)` | Resistor 1000 Ohms 5% 0.125W |
| 1 | `ax_res(res1_4, 10000)` | Resistor 10000 Ohms 5% 0.25W |
| 1 | `ax_res(res1_2, 100000)` | Resistor 100000 Ohms 5% 0.5W |
| 1 | `ax_res(res1_8, 1e+6, tol = 1)` | Resistor 1e+6 Ohms 1% 0.125W |
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 10V |
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 16V |
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 10nF |
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 10nF |
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 10nF |
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 100nF |
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 1uF |
| 1 | `smd_qfp(QFP50P1200X1200X160_64N)` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
| 1 | `smd_led(LED0603, "orange")` | SMD LED 0603 orange |
| 1 | `smd_led(LED0805, "red")` | SMD LED 0805 red |
| 1 | `smd_led(LED1206, "blue")` | SMD LED 1306 blue |
| 1 | `smd_tant(TANT_A, value = "105e")` | SMD Tantalum capacitor package A ,1uF, 2.5V |
| 1 | `smd_tant(TANT_B, value = "106A")` | SMD Tantalum capacitor package B ,10uF, 10V |
| 1 | `smd_tant(TANT_C, value = "107C")` | SMD Tantalum capacitor package C ,100uF, 16V |
| 1 | `smd_capacitor(CAP0402, value = "10nF")` | SMD capacitor 0402 10nF |
| 1 | `smd_capacitor(CAP0502, value = "10nF")` | SMD capacitor 0502 10nF |
| 1 | `smd_capacitor(CAP0603, value = "10nF")` | SMD capacitor 0603 10nF |
| 1 | `smd_capacitor(CAP0805, value = "100nF")` | SMD capacitor 0805 100nF |
| 1 | `smd_capacitor(CAP1206, value = "1uF")` | SMD capacitor 1206 1uF |
| 1 | `smd_qfp(QFP50P1200X1200X160_64N, "ATSAM4S4BA")` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
| 1 | `smd_resistor(L2012C, 1u)` | SMD choke 0805 1u |
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
| 1 | `smd_250V_fuse(OMT250, "2A 250V")` | SMD fuse: OMT250 2A 250V |
| 1 | `smd_resistor(RES0402, 1)` | SMD resistor 0402 1 0.0625W |
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
| 1 | `smd_resistor(RES1206, 1M)` | SMD resistor 1206 1M 0.25W |
| 1 | `smd_soic(SOIC14)` | SOIC14 package 74HC00 |
| 1 | `smd_soic(SOIC16)` | SOIC16 package ICL323 |
| 1 | `smd_soic(SOIC18)` | SOIC18 package PIC18F88 |
| 1 | `smd_soic(SOIC8)` | SOIC8 package M34063 |
| 1 | `smd_sot(SOT223)` | SOT223 package LM117 |
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
| 1 | `smd_soic(SOIC14, "74HC00")` | SOIC14 package 74HC00 |
| 1 | `smd_soic(SOIC16, "ICL323")` | SOIC16 package ICL323 |
| 1 | `smd_soic(SOIC18, "PIC18F88")` | SOIC18 package PIC18F88 |
| 1 | `smd_soic(SOIC8, "M34063")` | SOIC8 package M34063 |
| 1 | `smd_sot(SOT223, "LM117")` | SOT223 package LM117 |
| 1 | `smd_sot(SOT23, "2N7000")` | SOT23 package 2N7000 |
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
| 1 | `square_button(button_6mm)` | Square button 6mm |
| 1 | `smd_pot(TC33X1)` | TC33X1 package 10K |
| 1 | `smd_pot(TC33X1, "10K")` | TC33X1 package 10K |
| 1 | `pcb(TMC2130)` | TMC2130 |
| 1 | `green_terminal(gt_5p08, 2)` | Terminal block 2 way 0.2" |
| 2 | `green_terminal(gt_6p35, 2)` | Terminal block 2 way 0.25" |
@@ -2732,11 +2861,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `terminal_35(4)` | Terminal block 4 way 3.5mm |
| 1 | `pcb(test_pcb)` | Test PCB |
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
| 1 | `rd_disc(ERZV07D471, "471")` | Varistor, ERZV07D471 471 |
| 2 | `vero_pin()` | Vero board pin |
| 1 | `wire_link(0.8, 5.08, h = 10.16)` | Wire link 0.8mm x 0.2" |
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
| 1 | `wire_link(0.8, 10.16, h = 0.75, sleeve = [1.5, "red"])` | Wire link 0.8mm x 0.4" with red sleeving |
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
| 1 | `rd_boxc(BOXC18x5x11, "X2 rated film capacitor", "0.1uF 250V" )` | X2 rated film capacitor 0.1uF 250V |
| 1 | `rd_boxc(BOXC18x10x16, "X2 rated film capacitor", "0.47uF 250V" )` | X2 rated film capacitor 0.47uF 250V |
<a href="#top">Top</a>
@@ -2867,6 +2999,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `pcb(Melzi)` | Melzi electronics - not shown |
| 6 | | Micro SD card |
| 1 | | Micro SD card - not shown |
| 1 | `pcb(RCWL-0516)` | Microwave Radar Sensor |
| 1 | `molex_254(2)` | Molex KK header 2 way - not shown |
| 1 | `molex_254(3)` | Molex KK header 3 way - not shown |
| 20 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
@@ -2894,8 +3027,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 8 | `screw(M2_cap_screw, 20)` | Screw M2 cap x 20mm |
| 4 | `screw(M2_cap_screw, 25)` | Screw M2 cap x 25mm |
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
| 4 | `screw(M2p5_cap_screw, 25)` | Screw M2.5 cap x 25mm |
| 4 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
| 12 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
| 4 | `screw(M2p5_dome_screw, 25)` | Screw M2.5 dome x 25mm |
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
@@ -2903,8 +3035,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 19 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
| 13 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
| 4 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
| 8 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
| 3 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
| 11 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
| 4 | `screw(M4_cap_screw, 20)` | Screw M4 cap x 20mm |
| 4 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
| 1 | `pcb(XIAO)` | Seeeduino XIAO |
@@ -2924,24 +3055,24 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Qty | Filename |
| ---:|:--- |
| 4 | pcb_spacer20100.stl |
| 4 | pcb_spacer20140.stl |
| 4 | pcb_spacer20150.stl |
| 4 | pcb_spacer2070.stl |
| 4 | pcb_spacer2080.stl |
| 4 | pcb_spacer2090.stl |
| 2 | pcb_spacer25100.stl |
| 4 | pcb_spacer25130.stl |
| 4 | pcb_spacer25160.stl |
| 2 | pcb_spacer25110.stl |
| 4 | pcb_spacer25140.stl |
| 4 | pcb_spacer25170.stl |
| 4 | pcb_spacer25180_2.stl |
| 4 | pcb_spacer25180.stl |
| 4 | pcb_spacer25190_2.stl |
| 4 | pcb_spacer25230.stl |
| 4 | pcb_spacer25200_2.stl |
| 4 | pcb_spacer25240.stl |
| 4 | pcb_spacer25250.stl |
| 4 | pcb_spacer25260.stl |
| 4 | pcb_spacer2580.stl |
| 4 | pcb_spacer30120.stl |
| 4 | pcb_spacer30200.stl |
| 4 | pcb_spacer30130.stl |
| 4 | pcb_spacer30210.stl |
| 3 | pcb_spacer30220.stl |
| 4 | pcb_spacer30220.stl |
| 3 | pcb_spacer30230.stl |
| 10 | pcb_spacer3050.stl |
| 9 | pcb_spacer3060.stl |
| 9 | pcb_spacer3070.stl |
@@ -3349,9 +3480,14 @@ Timing belt pulleys, both toothed and plain with internal bearings for idlers.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `pulley(GT2x16_pulley_9)` | Pulley GT2 16 teeth |
| 1 | `pulley(GT2x16_pulley)` | Pulley GT2 16 teeth |
| 1 | `pulley(GT2x20_pulley_9)` | Pulley GT2 20 teeth |
| 1 | `pulley(GT2x80_pulley)` | Pulley GT2 80 teeth |
| 1 | `pulley(GT2x16_toothed_idler)` | Pulley GT2 idler 16 teeth |
| 1 | `pulley(GT2x16_toothed_idler_9)` | Pulley GT2 idler 16 teeth |
| 1 | `pulley(GT2x20_toothed_idler)` | Pulley GT2 idler 20 teeth |
| 1 | `pulley(GT2x20_toothed_idler_9)` | Pulley GT2 idler 20 teeth |
| 1 | `pulley(GT2x20_plain_idler)` | Pulley GT2 idler smooth 12mm |
| 1 | `pulley(GT2x16_plain_idler)` | Pulley GT2 idler smooth 9.63mm |
| 1 | `pulley(GT2x16x7_plain_idler)` | Pulley GT2 idler smooth 9.63mm |
@@ -3363,8 +3499,9 @@ Timing belt pulleys, both toothed and plain with internal bearings for idlers.
| 1 | `screw(M3_grub_screw, 3)` | Screw M3 grub x 3mm |
| 2 | `screw(M3_grub_screw, 4.5)` | Screw M3 grub x 4.5mm |
| 2 | `screw(M3_grub_screw, 4)` | Screw M3 grub x 4mm |
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
| 1 | `screw(M4_grub_screw, 6)` | Screw M4 grub x 6mm |
| 6 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
| 3 | `screw(M4_grub_screw, 6)` | Screw M4 grub x 6mm |
| 2 | `screw(M5_grub_screw, 6)` | Screw M5 grub x 6mm |
<a href="#top">Top</a>
@@ -3383,6 +3520,20 @@ Radial components for PCBs.
### Properties
| Function | Description |
|:--- |:--- |
| `rd_boxc_colours(type)` | Case colour and resin fill colour |
| `rd_boxc_leads(type)` | Lead pitch, diameter and length |
| `rd_boxc_size(type)` | Overall size and corner radius |
| `rd_boxc_skirt(type)` | Skirt slot, thickness, height |
| `rd_boxc_z(type)` | Height of inner base above PCB. |
| `rd_cm_choke_core(type)` | Core OD, ID, width, corner radius |
| `rd_cm_choke_csep(type)` | Central separator thickness in slot, total thickness, height |
| `rd_cm_choke_seam(type)` | Overlapping semicircular seams to join the two halves of the core width and thickness |
| `rd_cm_choke_slot(type)` | Slot to hold central separator width, height, thickness |
| `rd_cm_choke_wire(type)` | Wire positions, length and diameter |
| `rd_coil_colour(type)` | Core colour |
| `rd_coil_size(type)` | OD, ID, height, coil height |
| `rd_coil_turns(type)` | Number of turns |
| `rd_coil_wire(type)` | Wire pitch, diameter and length |
| `rd_disc_colours(type)` | Colours of body and text |
| `rd_disc_kind(type)` | Capacitor, etc |
| `rd_disc_lead_d(type)` | Lead diameter and sleeve diameter |
@@ -3412,6 +3563,9 @@ Radial components for PCBs.
### Modules
| Module | Description |
|:--- |:--- |
| `rd_box_cap(type, kind, value)` | Draw radial boxed film capacitor |
| `rd_cm_choke(type, value)` | Draw specified common mode choke. |
| `rd_coil(type, value, pitch = undef)` | Draw the specified vertical coil |
| `rd_disc(type, value, pitch = undef, z = 0, tail = 3)` | Draw a radial disc component |
| `rd_electrolytic(type, value, pitch = undef, z = 0, tail = 3)` | Draw a radial electrolytic capcacitor |
| `rd_module(type, value)` | Draw a PCB mounted potted module, e.g. PSU or relay |
@@ -3423,7 +3577,9 @@ Radial components for PCBs.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `rd_disc(10mm_disc, "1nF Y2")` | Ceramic capacitor, 10mm_disc 1nF Y2 |
| 1 | `rd_disc(6p4mm_disc, "10nF")` | Ceramic capacitor, 6p4mm_disc 10nF |
| 1 | `rd_cm_choke(ATX_CM_CHOKE ,"3.5mH")` | Common mode choke 3.5mH |
| 1 | `rd_xtal(ACT1100, "ACT1100")` | Crystal ACT1100 ACT1100 |
| 1 | `rd_xtal(ACT1700, "ACT1700")` | Crystal ACT1700 ACT1700 |
| 1 | `rd_xtal(C_002RX, "C_002RX")` | Crystal C_002RX C_002RX |
@@ -3433,10 +3589,13 @@ Radial components for PCBs.
| 1 | `rd_module(LDE10_20B, "12V 900ma")` | PSU LDE10_20B / 12V 900ma |
| 1 | `rd_module(VCE03, "12V 250ma")` | PSU VCE03 / 12V 250ma |
| 2 | `pcb(PERF70x50)` | Perfboard 70 x 50mm |
| 1 | `rd_coil(IND16x10 ,"4.7uH")` | Radial inductor 16x10 4.7uH |
| 1 | `rd_module(HF33F, "012-HSL3F")` | Relay HF33F / 012-HSL3F |
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
| 1 | `rd_transistor(TO92, "BC337")` | Transistor TO92 BC337 |
| 1 | `rd_disc(ERZV07D471, "470V")` | Varistor, ERZV07D471 470V |
| 1 | `rd_boxc(BOXC18x5x11, "X2 rated film capacitor", "0.1uF 250V" )` | X2 rated film capacitor 0.1uF 250V |
| 1 | `rd_boxc(BOXC18x10x16, "X2 rated film capacitor", "0.47uF 250V" )` | X2 rated film capacitor 0.47uF 250V |
<a href="#top">Top</a>
@@ -3692,6 +3851,48 @@ These items are symmetrical, so by default the origin is in the centre but it ca
| 1 | `studding(8, 80)` | Threaded rod M8 x 80mm |
<a href="#top">Top</a>
---
<a name="rod_ends"></a>
## Rod_ends
A rod end, sometimes called a spherical bearing or rod-end eye, is a component used in mechanical systems to create a flexible connection between two parts.
[vitamins/rod_ends.scad](vitamins/rod_ends.scad) Object definitions.
[vitamins/rod_end.scad](vitamins/rod_end.scad) Implementation.
[tests/rod_ends.scad](tests/rod_ends.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| `rod_end_bearing_bore(type)` | radius of the bore hole in the bearing |
| `rod_end_bearing_od(type)` | Outer diameter of the bearing |
| `rod_end_bearing_rim(type)` | Outer rim thickness guesstimate |
| `rod_end_bearing_shield_colour(type)` | Shield colour, "silver" for metal |
| `rod_end_bearing_width(type)` | Width |
| `rod_end_bore_width(type)` | Width |
| `rod_end_overall_length(type)` | overall length of the rod end |
| `rod_end_screw_length(type)` | length of the screw from eye center, not the bore |
| `rod_end_screw_radius(type)` | radius of the screw end, not the bore |
| `rod_end_sphere_radius(type)` | radius of the rod end sphere |
| `rod_end_sphere_seg_width(type)` | the width of the pivoting part, effectively a (sphere - sphereCaps - center bore) |
| `rod_end_thread_length(type)` | length of the threads |
### Modules
| Module | Description |
|:--- |:--- |
| `rod_end_bearing(type)` | Draw a rod end bearing |
![rod_ends](tests/png/rod_ends.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `Rod End Bearing(RE_m5_bearing, 33)` | Rod End Bearing 5 x 33mm |
<a href="#top">Top</a>
---
@@ -3825,11 +4026,13 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
| 1 | `screw(M5_pan_screw, 30)` | Screw M5 pan x 30mm |
| 1 | `screw(M6_cap_screw, 30)` | Screw M6 cap x 30mm |
| 1 | `screw(M6_cs_cap_screw, 30)` | Screw M6 cs cap x 30mm |
| 1 | `screw(M6_dome_screw, 30)` | Screw M6 dome x 30mm |
| 1 | `screw(M6_grub_screw, 12)` | Screw M6 grub x 12mm |
| 1 | `screw(M6_hex_screw, 30)` | Screw M6 hex x 30mm |
| 1 | `screw(M6_pan_screw, 30)` | Screw M6 pan x 30mm |
| 1 | `screw(M8_cap_screw, 35)` | Screw M8 cap x 35mm |
| 1 | `screw(M8_cs_cap_screw, 35)` | Screw M8 cs cap x 35mm |
| 1 | `screw(M8_dome_screw, 35)` | Screw M8 dome x 35mm |
| 1 | `screw(M8_hex_screw, 30)` | Screw M8 hex x 30mm |
| 1 | `screw(No2_screw, 10)` | Screw No2 pan wood x 10mm |
| 1 | `screw(No4_screw, 10)` | Screw No4 pan wood x 10mm |
@@ -4022,6 +4225,7 @@ When woven sheets (e.g. carbon fibre) are rendered it is necessary to specify th
| 1 | `sheet(Spring08, 30, 30, 2)` | Bi-metal saw blade 30mm x 30mm x 0.8mm |
| 1 | `sheet(Cardboard, 30, 30, 2)` | Corrugated cardboard 30mm x 30mm x 5mm |
| 1 | `sheet(Foam20, 30, 30, 2)` | Foam sponge 30mm x 30mm x 20mm |
| 1 | `sheet(Sellotape, 30, 30, 2)` | Sellotape tape 30mm x 30mm x 0.05mm |
| 1 | `sheet(DiBond, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 3mm |
| 1 | `sheet(DiBond6, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 6mm |
| 1 | `sheet(MDF10, 30, 30, 2)` | Sheet MDF 30mm x 30mm x 10mm |
@@ -4130,6 +4334,10 @@ E.g. 475A is 4.7uF 10V on the parts list.
### Properties
| Function | Description |
|:--- |:--- |
| `smd_250V_fuse_base(type)` | Base length |
| `smd_250V_fuse_size(type)` | Bounding box of the body |
| `smd_250V_fuse_step(type)` | End cutout length, width and height |
| `smd_250V_fuse_z(type)` | Height of body above the PCB surface |
| `smd_cap_end_cap(type)` | End cap width |
| `smd_cap_size(type)` | Body length, width |
| `smd_coax_base_r(type)` | Corner radius of the base |
@@ -4194,6 +4402,7 @@ E.g. 475A is 4.7uF 10V on the parts list.
### Modules
| Module | Description |
|:--- |:--- |
| `smd_250V_fuse(type, value)` | Draw an SMD mains fuse |
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
| `smd_coax(type)` | Draw an SMD coaxial connector |
| `smd_diode(type, value)` | Draw an SMD diode |
@@ -4211,37 +4420,39 @@ E.g. 475A is 4.7uF 10V on the parts list.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 6.3V |
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 10V |
| 1 | `smd_inductor(CDRH104 ,"10R")` | CDRH104 package 10R |
| 1 | `smd_diode(DO214AC, "SS34")` | DO214AC package SS34 |
| 1 | `smd_inductor(IND2525 ,"4R7")` | IND2525 package 4R7 |
| 1 | `smd_led(LED0603, "green")` | SMD LED 0603 green |
| 1 | `smd_led(LED0805, "blue")` | SMD LED 0805 blue |
| 1 | `smd_led(LED1206, "red")` | SMD LED 1306 red |
| 1 | `smd_tant(TANT_A, value = "105e")` | SMD Tantalum capacitor package A ,1uF, 2.5V |
| 1 | `smd_tant(TANT_B, value = "106J")` | SMD Tantalum capacitor package B ,10uF, 6.3V |
| 1 | `smd_tant(TANT_C, value = "107A")` | SMD Tantalum capacitor package C ,100uF, 10V |
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 |
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 |
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
| 1 | `smd_capacitor(CAP1210)` | SMD capacitor 1210 |
| 1 | `smd_qfp(QFP50P1200X1200X160_64N)` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
| 1 | `smd_qfp(QFP50P1200X1200X160_64N, "ATSAM4S4BA")` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
| 1 | `smd_resistor(L2012C, 10u)` | SMD choke 0805 10u |
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
| 1 | `smd_250V_fuse(OMT250, "2A 250V")` | SMD fuse: OMT250 2A 250V |
| 1 | `smd_resistor(RES0402, 1R0)` | SMD resistor 0402 1R0 0.0625W |
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
| 1 | `smd_soic(SOIC14)` | SOIC14 package SOIC14 |
| 1 | `smd_soic(SOIC16)` | SOIC16 package SOIC16 |
| 1 | `smd_soic(SOIC18)` | SOIC18 package SOIC18 |
| 1 | `smd_soic(SOIC8)` | SOIC8 package SOIC8 |
| 1 | `smd_sot(SOT223)` | SOT223 package FZT851 |
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
| 1 | `smd_soic(SOT23_6)` | SOT23_6 package SOT23_6 |
| 1 | `smd_pot(TC33X1)` | TC33X1 package 10K |
| 1 | `smd_soic(TSOT23_8)` | TSOT23_8 package TSOT23_8 |
| 1 | `smd_soic(SOIC14, "SOIC14")` | SOIC14 package SOIC14 |
| 1 | `smd_soic(SOIC16, "SOIC16")` | SOIC16 package SOIC16 |
| 1 | `smd_soic(SOIC18, "SOIC18")` | SOIC18 package SOIC18 |
| 1 | `smd_soic(SOIC8, "SOIC8")` | SOIC8 package SOIC8 |
| 1 | `smd_sot(SOT223, "FZT851")` | SOT223 package FZT851 |
| 1 | `smd_sot(SOT23, "2N7000")` | SOT23 package 2N7000 |
| 1 | `smd_soic(SOT23_6, "SOT23_6")` | SOT23_6 package SOT23_6 |
| 1 | `smd_pot(TC33X1, "10K")` | TC33X1 package 10K |
| 1 | `smd_soic(TSOT23_8, "TSOT23_8")` | TSOT23_8 package TSOT23_8 |
<a href="#top">Top</a>
@@ -4366,6 +4577,7 @@ By default springs have their origin at the bottom but can be centered.
| ---:|:--- |:---|
| 1 | `comp_spring(batt_spring)` | Spring 5 - 6mm spiral OD, 0.5mm gauge x 8mm long, closed end |
| 1 | `comp_spring(peg_spring)` | Spring 6.4mm OD, 0.9mm gauge x 15.5mm long, closed end |
| 1 | `comp_spring(yellow_bed_spring)` | Spring 8mm OD, 0.9mm gauge x 20mm long, closed end |
<a href="#top">Top</a>
@@ -4465,18 +4677,19 @@ NEMA stepper motor model.
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
| 20 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
| 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 |
| 25 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
| 1 | `NEMA(NEMA14_36)` | Stepper motor NEMA14 x 36mm (5x21 shaft) |
| 1 | `NEMA(NEMA16_19)` | Stepper motor NEMA16 x 19.2mm (5x12 shaft) |
| 1 | `NEMA(NEMA17_27)` | Stepper motor NEMA17 x 26.5mm (5x26.5 shaft) |
| 1 | `NEMA(NEMA17_34)` | Stepper motor NEMA17 x 34mm (5x24 shaft) |
| 1 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm (5x20 shaft) |
| 1 | `NEMA(NEMA17_47)` | Stepper motor NEMA17 x 47mm (5x24 shaft) |
| 1 | `NEMA(NEMA17_47L80)` | Stepper motor NEMA17 x 47mm (5x80 shaft) |
| 1 | `NEMA(NEMA23_51)` | Stepper motor NEMA22 x 51.2mm (6.35x24 shaft) |
| 1 | `NEMA(NEMA8_30)` | Stepper motor NEMA8 x 30mm (4x6 shaft) |
| 1 | `NEMA(NEMA8_30BH)` | Stepper motor NEMA8 x 30mm (5x12 shaft) |
| 21 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 25 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
<a href="#top">Top</a>
@@ -4673,12 +4886,86 @@ Iron core transformers. The grey shaded area is the keep out region where the te
| 1 | `transformer(SMALLTX)` | Transformer Small mains |
<a href="#top">Top</a>
---
<a name="ttracks"></a>
## Ttracks
T-Tracks used in woodworking jigs
[vitamins/ttracks.scad](vitamins/ttracks.scad) Object definitions.
[vitamins/ttrack.scad](vitamins/ttrack.scad) Implementation.
[tests/ttracks.scad](tests/ttracks.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| `t_insert_description(type)` | Description of this t-track insert |
| `t_insert_height(type)` | Height of t-track insert |
| `t_insert_thread(type)` | M thread for this the screw hole in this insert |
| `t_insert_top_thickness(type)` | Top thickness for t-track insert |
| `t_insert_top_width(type)` | Top Width of t-track insert |
| `t_insert_width(type)` | Width of t-track insert |
| `tbolt_description(type)` | Description of this t-track bolt |
| `tbolt_head_length(type)` | Head length for t-track bolt |
| `tbolt_head_thickness(type)` | Head thickness for t-track bolt |
| `tbolt_head_width(type)` | Head width for t-track bolt |
| `tbolt_thread(type)` | M thread for this bolt |
| `ttrack_fixture(type)` | Fixture, such as T-bolt or Miter insert used with this track |
| `ttrack_height(type)` | Height of track section |
| `ttrack_opening(type)` | Width of the opening |
| `ttrack_screw(type)` | Screw used to fasten track |
| `ttrack_screw_pitch(type)` | Distance between screws |
| `ttrack_slot_height(type)` | Height of the slot |
| `ttrack_slot_width(type)` | Width of the slot |
| `ttrack_top_thickness(type)` | Thickness of the top layer |
| `ttrack_width(type)` | Width of track section |
### Functions
| Function | Description |
|:--- |:--- |
| `ttrack_holes(type, length)` | Number of holes in a rail given its `length` |
### Modules
| Module | Description |
|:--- |:--- |
| `ttrack(type, length, colour = "LightSlateGray")` | Draw the specified rail |
| `ttrack_hole_positions(type, length)` | Position children over screw holes |
| `ttrack_place_bolt(type, pos, bolt = undef)` | Place a T-Bolt relative to the centre of the track |
| `ttrack_place_insert(type, pos, insert = undef)` | Place a T-Insert relative to the centre of the track |
![ttracks](tests/png/ttracks.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 3 | `screw(M3_cs_cap_screw, 15)` | Screw M3 cs cap x 15mm |
| 3 | `screw(M4_cs_cap_screw, 15)` | Screw M4 cs cap x 15mm |
| 2 | `screw(M6_hex_screw, 15)` | Screw M6 hex x 15mm |
| 1 | `ttrack(ttrack_mitre_30mm, 120)` | T-Track ttrack_mitre_30mm x 120mm |
| 1 | `ttrack(ttrack_mitre_30mm, 200)` | T-Track ttrack_mitre_30mm x 200mm |
| 1 | `ttrack(ttrack_mitre_36mm, 120)` | T-Track ttrack_mitre_36mm x 120mm |
| 1 | `ttrack(ttrack_universal_19mm, 120)` | T-Track ttrack_universal_19mm x 120mm |
| 1 | `ttrack(ttrack_universal_19mm, 200)` | T-Track ttrack_universal_19mm x 200mm |
| 1 | `ttrack(ttrack_universal_19mm_A, 120, colour="red")` | T-Track ttrack_universal_19mm_A x 120mm |
| 1 | `ttrack(ttrack_universal_19mm_B, 120, colour="blue")` | T-Track ttrack_universal_19mm_B x 120mm |
| 1 | `T-Track Bolt M6` | M6 x 30mm |
| 1 | `T-Track Bolt M6 with small head` | M6 x 30mm |
| 3 | `T-Track Bolt M8` | M8 x 30mm |
| 1 | `ttrack_insert(TTrack_insert_Miter30_M6, 30, 1)` | T-Track insert, Miter track 30mm, M6 thread, M30mm, with 1 M6 |
| 1 | `ttrack_insert(TTrack_insert_Miter30_M6, 30, 1, colour="red")` | T-Track insert, Miter track 30mm, M6 thread, M30mm, with 1 M6 |
| 1 | `ttrack_insert(TTrack_insert_Miter30_M6, 60, 2, colour="red")` | T-Track insert, Miter track 30mm, M6 thread, M60mm, with 2 M6 |
| 1 | `ttrack_insert(TTrack_insert_Miter30_M8, 30, 1, colour="red")` | T-Track insert, Miter track 30mm, M8 thread, M30mm, with 1 M8 |
<a href="#top">Top</a>
---
<a name="tubings"></a>
## Tubings
Tubing and sleeving. The internal diameter can be forced to stretch it over something.
Tubing and sleeving. The internal diameter can be forced to stretch it over something. A path can be specified, otherwise it is just straight with the specified length.
[vitamins/tubings.scad](vitamins/tubings.scad) Object definitions.
@@ -4703,7 +4990,7 @@ Tubing and sleeving. The internal diameter can be forced to stretch it over some
### Modules
| Module | Description |
|:--- |:--- |
| `tubing(type, length = 15, forced_id = 0, center = true)` | Draw specified tubing with optional forced internal diameter |
| `tubing(type, length = 15, forced_id = 0, center = true, path = [])` | Draw specified tubing with optional forced internal diameter and optional path. |
![tubings](tests/png/tubings.png)
@@ -4968,6 +5255,7 @@ Utilities for adding wires to the BOM and optionally drawing them and cable bund
| `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_merge(cable1, cable2)` | Combine the wires of two cables |
| `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 |
@@ -5113,7 +5401,7 @@ The top bezel can have an optional child, which is subtracted to allow modificat
| `box_right(type)` | Default right side, can be overridden to customise |
| `box_right_blank(type, sheet = false)` | Generates a 2D template for the right sheet, `sheet` can be set to override the type |
| `box_shelf_blank(type, sheet = false, wall = undef)` | Generates a 2D template for a shelf sheet |
| `box_shelf_bracket(type, screw_positions, wall = undef)` | Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts |
| `box_shelf_bracket(type, screw_positions, wall = undef)` | Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts, third child is 3D additions. |
| `box_shelf_bracket_section(type, rows, cols, x, y)` | Generates sections of the shelf bracket to allow it to be bigger than the printer |
| `box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = undef, top_screws = true)` | Place children at the shelf screw positions |
| `box_top(type)` | Default top, can be overridden to customise |
@@ -5271,7 +5559,7 @@ fixing_blocks along the sides.
---
<a name="cable_clip"></a>
## Cable_clip
Cable clips to order. Can be for one or two cables of different sizes.
Cable clips to order. Can be for one or two cables of different sizes. Can use an insert and a screw from below or a screw and nut, nyloc or plain, either way up.
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
@@ -5280,35 +5568,41 @@ Cable clips to order. Can be for one or two cables of different sizes.
### 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`. |
| `cable_clip_extent(screw, cable, insert = false, nut = false)` | How far it extends from the screw. |
| `cable_clip_height(cable, screw = false, insert = false, nut = false)` | Height given the `cable`. |
| `cable_clip_insert(screw, insert = true)` | Insert type for clip, given screw. |
| `cable_clip_offset(screw, cable, insert = false, nut = false)` | The offset of the cable from the screw. |
| `cable_clip_width(screw, insert = false, nut = false)` | Width given the `screw` and possibly insert or nut. |
### 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 |
| `cable_clip(screw, cable1, cable2 = 0, insert = false, nut = false)` | Create the STL for a single cable or two cable clip |
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false, nut = false, nyloc = true)` | Cable clip with the fasteners |
![cable_clip](tests/png/cable_clip.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 2 | `insert(CNCKM3)` | Heatfit insert M3 x 3mm |
| 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, 10)` | Screw M3 dome x 10mm |
| 1 | `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 |
| 11 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 2 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
### Printed
| Qty | Filename |
| ---:|:--- |
| 1 | cable_clip_30_10_13.stl |
| 1 | cable_clip_30I_10_13.stl |
| 1 | cable_clip_30I_5_14_6_14.stl |
| 1 | cable_clip_30N_7_14_8_14.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 |
| 1 | cable_clip_30_9_14.stl |
<a href="#top">Top</a>
@@ -5388,7 +5682,8 @@ Housings for PCB cameras.
| 1 | `camera(rpi_camera_v1)` | Raspberry Pi camera V1 |
| 1 | `camera(rpi_camera_v2)` | Raspberry Pi camera V2 |
| 1 | `camera(rpi_camera)` | Raspberry Pi focusable camera |
| 7 | `screw(M2_cap_screw, 10)` | Screw M2 cap x 10mm |
| 3 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
| 4 | `screw(M2_cap_screw, 10)` | Screw M2 cap x 10mm |
| 4 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
| 4 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
@@ -6391,8 +6686,9 @@ Creative Commons - Attribution - Share Alike license (see <https://creativecommo
| 1 | `screw(M3_grub_screw, 3)` | Screw M3 grub x 3mm |
| 2 | `screw(M3_grub_screw, 4.5)` | Screw M3 grub x 4.5mm |
| 2 | `screw(M3_grub_screw, 4)` | Screw M3 grub x 4mm |
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
| 1 | `screw(M4_grub_screw, 6)` | Screw M4 grub x 6mm |
| 6 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
| 3 | `screw(M4_grub_screw, 6)` | Screw M4 grub x 6mm |
| 2 | `screw(M5_grub_screw, 6)` | Screw M5 grub x 6mm |
### Printed
| Qty | Filename |
@@ -6400,12 +6696,17 @@ Creative Commons - Attribution - Share Alike license (see <https://creativecommo
| 1 | printed_pulley_GT2x12_pulley.stl |
| 1 | printed_pulley_GT2x16_plain_idler.stl |
| 1 | printed_pulley_GT2x16_pulley.stl |
| 1 | printed_pulley_GT2x16_pulley_9.stl |
| 1 | printed_pulley_GT2x16_toothed_idler.stl |
| 1 | printed_pulley_GT2x16_toothed_idler_9.stl |
| 1 | printed_pulley_GT2x16x7_plain_idler.stl |
| 1 | printed_pulley_GT2x20_plain_idler.stl |
| 1 | printed_pulley_GT2x20_pulley_9.stl |
| 1 | printed_pulley_GT2x20_toothed_idler.stl |
| 1 | printed_pulley_GT2x20_toothed_idler_9.stl |
| 1 | printed_pulley_GT2x20ob_pulley.stl |
| 1 | printed_pulley_GT2x20um_pulley.stl |
| 1 | printed_pulley_GT2x80_pulley.stl |
| 1 | printed_pulley_T2p5x16_pulley.stl |
| 1 | printed_pulley_T5x10_pulley.stl |
@@ -6414,13 +6715,18 @@ Creative Commons - Attribution - Share Alike license (see <https://creativecommo
| ---:|:--- |
| 1 | printed_pulley_GT2x12_pulley_assembly |
| 1 | printed_pulley_GT2x16_plain_idler_assembly |
| 1 | printed_pulley_GT2x16_pulley_9_assembly |
| 1 | printed_pulley_GT2x16_pulley_assembly |
| 1 | printed_pulley_GT2x16_toothed_idler_9_assembly |
| 1 | printed_pulley_GT2x16_toothed_idler_assembly |
| 1 | printed_pulley_GT2x16x7_plain_idler_assembly |
| 1 | printed_pulley_GT2x20_plain_idler_assembly |
| 1 | printed_pulley_GT2x20_pulley_9_assembly |
| 1 | printed_pulley_GT2x20_toothed_idler_9_assembly |
| 1 | printed_pulley_GT2x20_toothed_idler_assembly |
| 1 | printed_pulley_GT2x20ob_pulley_assembly |
| 1 | printed_pulley_GT2x20um_pulley_assembly |
| 1 | printed_pulley_GT2x80_pulley_assembly |
| 1 | printed_pulley_T2p5x16_pulley_assembly |
| 1 | printed_pulley_T5x10_pulley_assembly |
@@ -6917,7 +7223,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(NEMA17_40)` | Stepper motor NEMA17 x 40mm |
| 2 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm (5x20 shaft) |
<a href="#top">Top</a>
@@ -7319,6 +7625,32 @@ A sector of a circle between two angles.
![sector](tests/png/sector.png)
<a href="#top">Top</a>
---
<a name="splines"></a>
## Splines
Cubic splines that interpolate between a list of 2D points passing through all of them.
Translated from the Python version at <https://community.alteryx.com/t5/Engine-Works/Creating-a-Cubic-Spline-in-Python-and-Alteryx/ba-p/581173>.
Note the x values of the points must be strictly increasing.
Catmull-Rom splines are well behaved but the ends points are control points and the curve only goes from the second point to the penultimate point.
Coded from <https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline#Code_example_in_Python>.
No restrictions on points and they can be 3D.
[utils/splines.scad](utils/splines.scad) Implementation.
[tests/splines.scad](tests/splines.scad) Code for this example.
### Functions
| Function | Description |
|:--- |:--- |
| `catmull_rom_spline(points, n, alpha = 0.5)` | Interpolate n new points between the specified points with a Catmull-Rom spline, alpha = 0.5 for centripetal, 0 for uniform and 1 for chordal. |
| `cubic_spline(points, N = 100)` | Interpolate the list of points given to produce N points on a cubic spline that passes through points given. |
![splines](tests/png/splines.png)
<a href="#top">Top</a>
---
@@ -7351,18 +7683,20 @@ 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 |
| `offset_paths(path, offsets, twists = 0)` | Create new paths offset from the original, optionally spiralling around it |
| `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 |
| `segmented_path(path, min_segment)` | Add points to a path to enforce a minimum segment length |
| `skin_faces(points, npoints, facets, loop, offset = 0)` | Create the mesh for the swept volume without end caps |
| `spiral_paths(path, n, r, twists, start_angle)` | Create a new paths which spiral around the given path. Use for making twisted cables |
| `spiral_wrap(path, profile, pitch, turns)` | Create a path that spirals around the specified profile with the given pitch. |
| `sweep(path, profile, loop = false, twist = 0)` | Generate the point list and face list of the swept volume |
### Modules
| Module | Description |
|:--- |:--- |
| `show_path(path)` | Show a path using a chain of hulls for debugging, duplicate points are highlighted. |
| `show_path(path, r = 0.1)` | Show a path using a chain of hulls for debugging, duplicate points are highlighted. |
| `sweep(path, profile, loop = false, twist = 0, convexity = 1)` | Draw a polyhedron that is the swept volume |
![sweep](tests/png/sweep.png)

View File

@@ -169,6 +169,9 @@ 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 ch.*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) \
and not re.match(r'Changelog updated.*', 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())

View File

@@ -63,5 +63,5 @@ def source_dirs(bom_dir):
else:
if dir.endswith('/printed'):
lib_dirs.add(dir)
dirs.remove(source_dir)
dirs.discard(source_dir)
return [source_dir] + sorted(dirs) + sorted(lib_dirs)

37
tests/HT_pipes.scad Normal file
View File

@@ -0,0 +1,37 @@
//
// NopSCADlib Copyright Jan Giebels 2024
//
// 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 <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/ht_pipes.scad>
module ht_pipes()
color("grey")
layout([for(p = ht_pipes) 40 + pipe_od(p)]) let(p = ht_pipes[$i], len = pipe_length(p)) {
if(len <= 34)
translate_z(len)
ht_cap(p);
if(len >= 101)
ht_pipe(p);
if(len == 100)
ht_tpipe(p);
}
if($preview)
ht_pipes();

View File

@@ -61,7 +61,7 @@ test_pcb = ["test_pcb", "Test PCB",
// components
[
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 90, "trimpot10", true],
[ 20, -18, 90, "trimpot10", true],
[ 19, 2, 90, "smd_led", LED1206, "blue"],
[ 16, 2, 90, "smd_led", LED0805, "red"],
[ 13, 2, 90, "smd_led", LED0603, "orange"],
@@ -82,6 +82,7 @@ test_pcb = ["test_pcb", "Test PCB",
[ 32, 3, -90, "smd_diode",DO214AC, "SS34"],
[ 26, 2, -90, "smd_pot", TC33X1, "10K"],
[ 26, 6, -90, "smd_coax",U_FL_R_SMT_1],
[ 8, 23, 0, "smd_250V_fuse", OMT250, "2A 250V"],
[ 26, 10, -90, "smd_sot", SOT23, "2N7000"],
[ 28, 16, -90, "smd_sot", SOT223, "LM117"],
@@ -116,8 +117,8 @@ test_pcb = ["test_pcb", "Test PCB",
[ 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"],
[ 25, 205, 0, "buzzer", 4.5, 8.5],
[ 25, 220, 0, "buzzer"],
[ 45, 1, 0, "link", inch(0.4), 0.75, undef, undef, [1.5, "red"]], // Sleeved link
[ 45, 3, 0, "link", inch(0.4)], // Flat link
@@ -130,6 +131,11 @@ test_pcb = ["test_pcb", "Test PCB",
[ 35, 17, 0, "vero_pin", true],
[ 35, 8, 180, "rd_transistor", TO92, "78L05", undef, undef, "Regulator"],
[ 35, 13, 180, "rd_transistor", E_LINE, "ZTX853"],
[ 25, 190, 0, "rd_electrolytic", ECAP8x11, "220uF35V"],
[ 25, 180, 90, "rd_disc", ERZV07D471, "471"],
[ 25, 170, 90, "rd_disc", 6p4mm_disc, "100n"],
[ 30, 170, 90, "rd_disc", 10mm_disc, "1nF Y2"],
[ 90, 135, -90, "rd_module", HF33F, "012-HSL-3F"],
[ 35, 3, 0, "link", 0, 5], // Vertical wire
[ 60, 3, 0, "link", inch(0.2), inch(0.4)], // Raised link
@@ -147,6 +153,9 @@ test_pcb = ["test_pcb", "Test PCB",
[ 30, 130,-90, "rd_xtal", ACT1100, "40MHz", 0.5 ],
[ 30, 150,-90, "rd_xtal", ACT1700, "80MHz", 0.5 ],
[ 93, 230,-90, "rd_box_cap", BOXC18x10x16, "X2 rated film capacitor", "0.47uF 250V" ],
[ 93, 210,-90, "rd_box_cap", BOXC18x5x11, "X2 rated film capacitor", "0.1uF 250V" ],
[ 77, 15, -90, "flex"],
[ 95, 15, -90, "flat_flex"],
[ 87, 15, -90, "flat_flex", true],
@@ -179,9 +188,9 @@ test_pcb = ["test_pcb", "Test PCB",
[ 55, 170, 0, "button_4p5mm"],
[ 50, 185, 0, "microswitch", small_microswitch],
[ 52, 200, 0, "pcb", 11, TMC2130 ],
[ 80, 210, 0, "pdip", 24, "27C32", true, inch(0.6) ],
[ 76, 210, 0, "pdip", 24, "27C32", true, inch(0.6) ],
[ 80, 180, 0, "pdip", 8, "NE555" ],
[ 71, 180, 0, "smd_inductor", IND2525, "4R7"],
[ 71, 180, 0, "smd_inductor", IND2525, "4R7"],
[ 87, 166, -90, "smd_soic", SOIC18, "PIC18F88"],
[ 78, 166, -90, "smd_soic", SOIC14, "74HC00"],
@@ -189,14 +198,16 @@ test_pcb = ["test_pcb", "Test PCB",
[ 64, 166, -90, "smd_soic", SOIC8, "M34063"],
[ 70, 150, 0, "chip", 10, 5, 1, grey(20)],
[90, 140, -90, "relay", HF33F, "012-HSL-3F"],
[ 90, 140, -90, "relay", HF33F, "012-HSL-3F"],
[ 52, 206, 0, "2p54socket", 8, 1 ],
[ 52, 194, 0, "2p54socket", 8, 1, false, 0, false, "red" ],
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 50, 240, 0, "potentiometer"],
[ 55, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 60, 240, 0, "potentiometer"],
[ 75, 240, 0, "potentiometer", KY_040_encoder, 8],
[ 40, 235, -90, "rd_cm_choke", ATX_CM_CHOKE, "3.5mH"],
[ 40, 217, 0, "rd_coil", IND16x10, "4.7uH"],
[ 30, 85, -90, "7seg", WT5011BSR, 2],
[ 30, 55, -90, "D_plug", DCONN9],
],

View File

@@ -64,10 +64,15 @@ module smds() {
let(s = smd_soics[$i])
smd_soic(s, s[0]);
translate([0, 39])
translate([0, 36.5])
layout([for(i = smd_250V_fuses) smd_250V_fuse_size(i).x], 1)
let(i = smd_250V_fuses[$i])
smd_250V_fuse(i, "2A 250V");
translate([0, 45])
layout([for(i = smd_inductors) smd_inductor_leads(i).x], 1)
let(i = smd_inductors[$i])
smd_inductor(i, "4R7");
smd_inductor(i, ["4R7", "10R"][$i % 2]);
translate([20, 6])
layout([for(q = smd_qfps) smd_qfp_body_size(q).x], 3)

View File

@@ -20,40 +20,47 @@
include <../core.scad>
use <../printed/cable_clip.scad>
use <../vitamins/wire.scad>
use <../utils/layout.scad>
screw = M3_dome_screw;
sheet_thickness = 3;
cables = [
for(i = [1 : 6]) [i, 1.4], [1, 6], 0, [10, inch(0.05), true], 0
[10, inch(0.05), true], 0, for(i = [1 : 9]) [i, 1.4], 0, [1, 6], 0,
];
screw = M3_dome_screw;
clips = [for(i = [0 : ceil(len(cables) / 2) - 1]) let(c1= cables[2 * i], c2 = cables[2 * i + 1]) [c1, c2]];
function use_insert(i) = in([0, 3], i);
function use_nut(i) = in([4], i);
clip_lengths = [for(i = [0 : len(clips) - 1])
let(c = clips[i], c1 = c.x, c2 = c.y, ins = use_insert(i), nut = use_nut(i))
cable_clip_extent(screw, c1, insert = ins, nut = nut) + (c2 ? cable_clip_extent(screw, c2, insert = ins, nut = nut) : cable_clip_width(screw, insert = ins, nut = nut) / 2)];
module cable_clips() {
for(i = [0 : ceil(len(cables) / 2) - 1])
translate([i * 25, 0]) {
cable1 = cables[2 * i];
cable2 = cables[2 * i + 1];
layout(clip_lengths, 3, true) let(cable1 = clips[$i].x, cable2 = clips[$i].y) {
insert = use_insert($i);
nut = use_nut($i);
translate([cable_clip_extent(screw, cable1, insert = insert, nut = nut) - clip_lengths[$i] / 2, 0]) {
if($preview) {
cable_clip_assembly(screw, sheet_thickness, cable1, cable2);
cable_clip_assembly(screw, sheet_thickness, cable1, cable2, insert = insert, nut = nut, flip = $i == 1);
for(j = [0 : 1])
let(cable = cables[2 * i + j])
let(cable = clips[$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])
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable, insert = insert, nut = nut), 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_clip(screw, cable1, cable2, insert = insert);
}
}
}
cable_clips();

View File

@@ -26,7 +26,7 @@ include <../vitamins/cameras.scad>
use <../vitamins/pcb.scad>
module camera_housings()
layout([for(c = cameras) pcb_length(camera_pcb(c))], 10, false) let(c = cameras[$i])
layout([for(c = cameras) pcb_length(camera_pcb(c))], 15, false) let(c = cameras[$i])
if(pcb_screw(camera_pcb(c)))
camera_fastened_assembly(c, 3);

View File

@@ -22,7 +22,6 @@ use <../utils/layout.scad>
include <../vitamins/inserts.scad>
module inserts() {
for(i = [0: len(inserts) -1])
translate([10 * i, 5])
insert(inserts[i]);
@@ -32,7 +31,6 @@ module inserts() {
insert(short_inserts[i]);
stl_colour(pp1_colour)
translate([len(inserts) * 10, 0]) {
insert_lug(inserts[0], 2, 1);
@@ -42,6 +40,17 @@ module inserts() {
}
}
module threaded_inserts()
for(i = [0: len(threaded_inserts) -1]) {
d = insert_hole_radius(threaded_inserts[i]);
translate([(10 + d) * i, 0])
threaded_insert(threaded_inserts[i]);
}
if($preview)
let($show_threads = true)
let($show_threads = true) {
inserts();
translate([0, 20])
threaded_inserts();
}

View File

@@ -85,6 +85,13 @@ module nuts() {
if(n == M8_nut)
nut_square(M8nS_thin_nut);
}
translate([0,140]) {
if(n==M4_nut)
weld_nut(M4_weld_nut);
if(n==M6_nut)
weld_nut(M6_weld_nut);
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

BIN
tests/png/ht_pipes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 194 KiB

BIN
tests/png/rod_ends.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

BIN
tests/png/splines.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 111 KiB

BIN
tests/png/ttracks.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 222 KiB

View File

@@ -22,9 +22,16 @@ include <../vitamins/pulleys.scad>
include <../printed/printed_pulleys.scad>
use <../utils/layout.scad>
n = len(pulleys) - 1;
half = floor((n - 1) / 2);
split = n - half;
pulleys1 = [for(i = [0 : split - 1]) pulleys[i]];
pulleys2 = [for(i = [split : n - 1]) pulleys[i]];
module printed_pulley_test(show_metal = false) {
layout([for (p = pulleys) pulley_flange_dia(p)]) let(p = pulleys[$i]) {
max_d = max([for(p = concat(pulleys1, pulleys2)) pulley_flange_dia(p)]);
module do_list(list, show_metal) {
layout([for (p = list) max_d]) let(p = list[$i]) {
rotate(-145)
if($preview)
printed_pulley_assembly(p);
@@ -33,12 +40,23 @@ module printed_pulley_test(show_metal = false) {
if(show_metal)
not_on_bom()
translate([0, 20])
translate([0, 60])
rotate(-145)
pulley_assembly(p);
}
}
module printed_pulley_test(show_metal = false) {
translate([0, 10])
do_list(pulleys1, show_metal);
translate([0, -10])
do_list(pulleys2, show_metal);
translate([split * (max_d + 5), 0])
do_list([pulleys[n]], show_metal);
}
if($preview)
printed_pulley_test(true);
else

View File

@@ -21,20 +21,34 @@ include <../vitamins/pcbs.scad>
module radials() {
pcb = PERF70x50;
$solder = pcb_solder(pcb);
pcb(pcb);
translate([0, pcb_width(pcb) + inch(0.2)]) {
pcb(pcb);
pcb_grid(pcb, 10, 12)
rd_module(rd_modules[2], "12V 900ma");
for(i = [0: len(rd_electrolytics) - 1])
for(i = [0 : len(rd_electrolytics) - 1])
pcb_grid(pcb, i * 3, 2)
rotate(-90)
rd_electrolytic(rd_electrolytics[i], "220uF35V", z = 3, pitch = inch(0.2));
for(i = [0 : len(rd_box_caps) - 1])
pcb_grid(pcb, 20, i * 4)
rd_box_cap(rd_box_caps[i], "X2 rated film capacitor", ["0.1uF 250V", "0.47uF 250V"][i]);
for(i = [0 : len(rd_cm_chokes) - 1])
pcb_grid(pcb, 10.5, 2)
rd_cm_choke(rd_cm_chokes[i], "3.5mH");
pcb_grid(pcb, 4, 2.5)
rotate(90)
rd_coil(rd_coils[0], "4.7uH");
}
$solder = pcb_solder(pcb);
for(i = [0 : len(rd_xtals) - 1])
pcb_grid(pcb, [0.5, 1, 1.5, 9, 1][i], [4, 6, 10.5, 10.5, 16][i])
@@ -47,7 +61,6 @@ module radials() {
rotate(-90)
rd_module(rd_modules[1], "12V 250ma");
for(i = [0 : len(rd_discs) - 1])
pcb_grid(pcb, 1 + 2.5 * i, 1) {
disc = rd_discs[i];
@@ -56,7 +69,7 @@ module radials() {
dy = round(pitch.y / inch(0.1)) * inch(0.1);
rotate(90 - atan2(dy, dx))
rd_disc(disc, pitch = norm([dy, dx]), z = 0.5, value = ["10nF", "470V",][i]);
rd_disc(disc, pitch = norm([dy, dx]), z = 0.5, value = ["10nF", "470V", "1nF Y2"][i]);
}
for(i = [0 : len(rd_transistors) - 1])

34
tests/rod_ends.scad Normal file
View File

@@ -0,0 +1,34 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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 <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/rod_ends.scad>
module rod_ends(list = rod_ends) {
diameters = [for(b = list) rod_end_bearing_od(b)];
max = max(diameters);
layout(diameters) let(b = list[$i])
rod_end_bearing(list[$i]);
}
if($preview)
rod_ends();

38
tests/splines.scad Normal file
View File

@@ -0,0 +1,38 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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 <../utils/core/core.scad>
use <../utils/splines.scad>
use <../utils/sweep.scad>
points = [[0, 1.5], [2, 2], [3, 1], [4, -2], [5, 1], [6, 2], [7, 3]];
module splines() {
cm_spline = catmull_rom_spline(points, 100 / len(points), 0.5);
color("green") show_path(cm_spline, 0.01);
cu_spline = cubic_spline(points, 100);
color("blue") show_path(cu_spline, 0.01);
for(p = points)
translate(p) color("red")
cylinder($fn = 64, r = 0.03, h = 0.02, center = true);
}
rotate([70, 0, 315]) splines();

73
tests/ttracks.scad Normal file
View File

@@ -0,0 +1,73 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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 <../utils/core/core.scad>
use <../utils/layout.scad>
use <../utils/maths.scad>
include <../vitamins/ttracks.scad>
module ttracks() {
colours = [ "LightSlateGray", "red", "blue", "LightSlateGray", "LightSlateGray" ];
gap = 8;
widths = [for(t = ttracks) ttrack_width(t)];
translate([0, 60])
layout(widths, gap) {
ttrack(ttracks[$i], 120, colours[$i]);
if($i < len(ttrack_bolts))
translate([0, -80])
ttrack_bolt(ttrack_bolts[$i], 30);
let(i = $i - len(ttrack_bolts))
if(i >= 0 && i < len(ttrack_inserts))
translate([0, -85])
rotate(90)
ttrack_insert(ttrack_inserts[i], 30, colour=colours[i]);
}
x = sumv(widths) + len(ttracks) * gap + ttrack_width(ttrack_universal_19mm) / 2;
translate([x, 20]) {
ttrack_assembly(ttrack_universal_19mm, 200);
ttrack_place_bolt(ttrack_universal_19mm, 50)
ttrack_bolt(ttrack_fixture(ttrack_universal_19mm), 30);
ttrack_place_bolt(ttrack_universal_19mm, -60)
ttrack_bolt(ttrack_fixture(ttrack_universal_19mm), 30);
}
x2 = x + ttrack_width(ttrack_universal_19mm) / 2 + gap + ttrack_width(ttrack_mitre_30mm) / 2;
translate([x2, 20]) {
ttrack_assembly(ttrack_mitre_30mm, 200);
ttrack_place_insert(ttrack_mitre_30mm, 50)
ttrack_insert(ttrack_fixture(ttrack_mitre_30mm), 30, 1, "red");
ttrack_place_insert(ttrack_mitre_30mm, -60) {
ttrack_insert(ttrack_fixture(ttrack_mitre_30mm), 60, 2, "red");
ttrack_insert_hole_positions(ttrack_fixture(ttrack_mitre_30mm), 60, 2)
translate_z(8)
screw(M6_hex_screw, 15);
}
}
}
if($preview)
let($show_threads = true)
ttracks();

View File

@@ -17,7 +17,7 @@
// If not, see <https://www.gnu.org/licenses/>.
//
wire_r = 5; // [1 : 20]
t = 0; // [0 : 3]
t = -1; // [-1 : 3]
include <../utils/core/core.scad>
use <../utils/layout.scad>
@@ -26,9 +26,9 @@ include <../vitamins/zipties.scad>
module zipties()
layout([for(z = zipties) 9], 2 * wire_r) {
ziptie(zipties[$i], wire_r, t);
ziptie(zipties[$i], wire_r, max(t, 0));
if(t)
if(t >= 0)
color(grey(20))
cylinder(r = wire_r, h = 10, center = true);

101
utils/splines.scad Normal file
View File

@@ -0,0 +1,101 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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/>.
//
//
//! Cubic splines that interpolate between a list of 2D points passing through all of them.
//! Translated from the Python version at <https://community.alteryx.com/t5/Engine-Works/Creating-a-Cubic-Spline-in-Python-and-Alteryx/ba-p/581173>.
//! Note the x values of the points must be strictly increasing.
//!
//! Catmull-Rom splines are well behaved but the ends points are control points and the curve only goes from the second point to the penultimate point.
//! Coded from <https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline#Code_example_in_Python>.
//! No restrictions on points and they can be 3D.
//
include <../utils/core/core.scad>
use <maths.scad>
use <sweep.scad>
function cubic_spline(points, N = 100) = let( //! Interpolate the list of points given to produce N points on a cubic spline that passes through points given.
N = N - 1,
n = len(points),
ass1 = assert(n >= 3, "must be at least 3 points")0,
dx = [for(i = [0 : n - 2]) points[i + 1].x - points[i].x], // x deltas
ass2 = assert(min(dx) > 0, "X must strictly increase")0,
//
// A and C are diagonals above and below the main diagonal B, which is all 2's
//
A = [for(i = [0 : n - 3]) dx[i] / (dx[i] + dx[i + 1]), 0],
C = [0, for(i = [0 : n - 3]) dx[i + 1] / (dx[i] + dx[i + 1]), 0],
//
// D are the target values on the right hand side of the equation
//
D = [0, for(i = [1 : n - 2]) 6 * ((points[i + 1].y - points[i].y) / dx[i] - (points[i].y - points[i - 1].y) / dx[i - 1]) / (dx[i] + dx[i - 1]), 0],
//
// Solve the tridiagonal equation using the Thomas algorithm
//
c = [for(i = 1, c = 0; i < n; c = C[i] / (2 - c * A[i - 1]), i = i + 1) c, 0],
d = [for(i = 1, d = 0; i < n; d = (D[i] - d * A[i - 1]) / (2 - c[i - 1] * A[i - 1]), i = i + 1) d, 0],
M = [for(i = n - 2, x = 0; i >= 0; x = d[i] - c[i] * x, i = i - 1) x, 0],
//
// Calculate the coefficients of each cubic curve
//
coefficients = [for(i = [0 : n - 2], dx2 = sqr(dx[i]), j = n - 1 - i)
[(M[j - 1] - M[j]) * dx2 / 6,
M[j] * dx2 / 2,
points[i + 1].y - points[i].y - (M[j - 1] + 2 * M[j]) * dx2 / 6,
points[i].y]
],
//
// Use the coefficients to interpolate between the points
//
x0 = points[0].x,
x1 = points[n - 1].x,
spline = [for(i = 0, j = 0, z = 0, x = x0; i <= N + 1;
x = x0 + (x1 - x0) * i / N,
j = i < N - 1 && x > points[j + 1].x ? j + 1 : j,
z = (x - points[j].x) / dx[j],
i = i + 1,
C = coefficients[j]
) if(i) [x, (((C[0] * z) + C[1]) * z + C[2]) * z + C[3]]
]
) spline;
function tj(ti, pi, pj, alpha = 0.5) = ti + pow(norm(pi - pj), alpha);
function catmull_rom_segment(P0, P1, P2, P3, n, alpha = 0.5, last = false) = let(
t0 = 0,
t1 = tj(t0, P0, P1, alpha),
t2 = tj(t1, P1, P2, alpha),
t3 = tj(t2, P2, P3, alpha),
end = last ? n : n - 1,
points = [for(i = [0 : end], t = t1 + (t2 - t1) * i / n) let(
A1 = (t1 - t) / (t1 - t0) * P0 + (t - t0) / (t1 - t0) * P1,
A2 = (t2 - t) / (t2 - t1) * P1 + (t - t1) / (t2 - t1) * P2,
A3 = (t3 - t) / (t3 - t2) * P2 + (t - t2) / (t3 - t2) * P3,
B1 = (t2 - t) / (t2 - t0) * A1 + (t - t0) / (t2 - t0) * A2,
B2 = (t3 - t) / (t3 - t1) * A2 + (t - t1) / (t3 - t1) * A3
) (t2 - t) / (t2 - t1) * B1 + (t - t1) / (t2 - t1) * B2]
) points;
function catmull_rom_spline(points, n, alpha = 0.5) = let( //! Interpolate n new points between the specified points with a Catmull-Rom spline, alpha = 0.5 for centripetal, 0 for uniform and 1 for chordal.
segs = len(points) - 3
) [for(i = [0 : segs - 1]) each catmull_rom_segment(points[i], points[i + 1], points[i + 2], points[i + 3], n, alpha, last = i == segs - 1)];

View File

@@ -111,7 +111,7 @@ function helical_twist_per_segment(r, pitch, sides) = //! Calculate the twist ar
//
// Generate all the transforms for the profile of the swept volume.
//
function sweep_transforms(path, loop = false, twist = 0) =
function sweep_transforms(path, loop = false, twist = 0, initial_rotation = undef) =
let(len = len(path),
last = len - 1,
@@ -122,7 +122,7 @@ function sweep_transforms(path, loop = false, twist = 0) =
lengths = [for(i = 0, t = 0; i < len; t = t + norm(path[min(i + 1, last)] - path[i]), i = i + 1) t],
length = lengths[last],
rotations = [for(i = 0, rot = fs_frame(tangents);
rotations = [for(i = 0, rot = is_undef(initial_rotation) ? fs_frame(tangents) : rot3_z(initial_rotation);
i < len;
i = i + 1,
rot = i < len ? rotate_from_to(tangents[i - 1], tangents[i]) * rot : undef) rot],
@@ -169,7 +169,7 @@ function sweep(path, profile, loop = false, twist = 0) = //! Generate the point
points = skin_points(profile, path, loop, twist),
skin_faces = skin_faces(points, npoints, facets, loop),
faces = loop ? skin_faces : concat([cap(facets)], skin_faces, [cap(facets, npoints - 1)])
) [points, faces];
) [points, faces];
module sweep(path, profile, loop = false, twist = 0, convexity = 1) { //! Draw a polyhedron that is the swept volume
mesh = sweep(path, profile, loop, twist);
@@ -229,16 +229,20 @@ function rounded_path(path) = //! Convert a rounded_path, consisting of a start
function segmented_path(path, min_segment) = [ //! Add points to a path to enforce a minimum segment length
for(i = [0 : len(path) - 2])
let(delta =
assert(path[i] != path[i + 1], str("Coincident points at path[", i, "] = ", path[i]))
path[i+1] - path[i],
segs = ceil(norm(delta) / min_segment)
)
for(j = [0 : segs - 1])
path[i] + delta * j / segs, // Linear interpolation
path[len(path) - 1]
let(delta =
assert(path[i] != path[i + 1], str("Coincident points at path[", i, "] = ", path[i]))
path[i+1] - path[i],
segs = ceil(norm(delta) / min_segment)
)
for(j = [0 : segs - 1])
path[i] + delta * j / segs, // Linear interpolation
path[len(path) - 1]
];
function offset_paths(path, offsets, twists = 0) = let( //! Create new paths offset from the original, optionally spiralling around it
transforms = sweep_transforms(path, twist = 360 * twists, initial_rotation = 0)
) [for(o = offsets) let(initial = [o.x, o.y, o.z, 1]) [for(t = transforms) initial * t]];
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which spiral around the given path. Use for making twisted cables
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
@@ -246,16 +250,41 @@ function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new p
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
module show_path(path) //! Show a path using a chain of hulls for debugging, duplicate points are highlighted.
module show_path(path, r = 0.1) //! Show a path using a chain of hulls for debugging, duplicate points are highlighted.
for(i = [0 : len(path) - 2]) {
hull($fn = 16) {
translate(path[i])
sphere(0.1);
sphere(r);
translate(path[i + 1])
sphere(0.1);
sphere(r);
}
if(path[i] == path[i + 1])
translate(path[i])
color("red") sphere(1);
color("red") sphere($fn = 16, r * 4);
}
function move_along(j, z, path_S) =
j >= len(path_S) - 1 || z <= path_S[j] ? j : move_along(j + 1, z, path_S);
function spiral_wrap(path, profile, pitch, turns) = //! Create a path that spirals around the specified profile with the given pitch.
let(
transforms = sweep_transforms(path, loop = false, twist = 0),
plen = len(profile),
S = path_length(profile),
profile = [
for(i = 0, s = 0; i < plen; s = s + norm(profile[(i + 1) % plen] - profile[i]), i = i + 1)
let(p = profile[i]) [p.x, p.y, p.z + pitch * s / S, 1]
],
path_len = len(path),
path_S = [for(i = 0, s = 0; i < path_len; s = s + norm(path[(i + 1) % path_len] - path[i]), i = i + 1) s],
n = turns * plen
) [
for(i = 0, j = 0, k = 0, zstep = 0;
i < n;
i = i + 1,
k = i % plen,
zstep = floor(i / plen) * pitch,
j = move_along(j, zstep + profile[k].z, path_S))
if(!i || k) (profile[k] + [0, 0, zstep - path_S[j], 0]) * transforms[j]
];

View File

@@ -47,7 +47,7 @@ thread_colour_factor = 0.8; // 60 degree threads appear too bright due to the an
function thread_profile(h, crest, angle, overlap = 0.1) = //! Create thread profile path
let(base = crest + 2 * (h + overlap) * tan(angle / 2))
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], [crest / 2, h, 0], [base / 2, -overlap, 0]];
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], if(crest) [crest / 2, h, 0], [base / 2, -overlap, 0]];
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or female thread, ends can be tapered, chamfered or square
assert(is_undef(colour) || is_list(colour), "Thread colour must be in [r, g, b] form");

View File

@@ -34,8 +34,9 @@ BBMR93 = ["MR93", 3, 9, 4, "silver", 0.5, 0.5, 0, 0];
BBMR95 = ["MR95", 5, 9, 3, "silver", 0.5, 0.5, 0, 0];
BBF623 = ["F623", 3, 10, 4, "black", 0.6, 0.7, 11.5, 1];
BBF693 = ["F693", 3, 8, 3, "silver", 0.5, 0.7, 9.5, 0.7];
BBF625 = ["F625", 5, 16, 5, "silver", 1.0, 1.0, 18, 1];
BBF695 = ["F695", 5, 13, 4, "silver", 1.0, 1.0, 15, 1];
ball_bearings = [BBF693, BBF623, BBF695, BBMR63, BBMR83, BBMR93, BBSMR95, BB624, BB686, BB696, BB608, BB6200, BB6201, BB6808];
ball_bearings = [BBF625, BBF693, BBF623, BBF695, BBMR63, BBMR83, BBMR85, BBMR93, BBMR95, BBSMR95, BB624, BB686, BB696, BB608, BB6200, BB6201, BB6808];
use <ball_bearing.scad>

View File

@@ -30,6 +30,9 @@ function camera_connector_pos(type) = type[5]; //! The flex connector block for
function camera_connector_size(type)= type[6]; //! The flex connector block for the camera itself's size
function camera_fov(type) = type[7]; //! The field of view of the camera lens
function camera_lens_height(type) = //! The height of the lens stack
let(lenses = camera_lens(type), lens = lenses[len(lenses) - 1][0]) lens.y + lens.z;
module camera_lens(type, offset = 0, show_lens = true) //! Draw the lens stack, with optional offset for making a clearance hole
color(grey(20))
translate(camera_lens_offset(type))

View File

@@ -67,7 +67,8 @@ rpi_camera = ["rpi_camera", "Raspberry Pi focusable camera", rpi_camera_pcb, [0,
[[0, 0, 12], 6],
[[0, 11, 4.3], 14 / 2, [8/2, 11/2, 1]],
],
[0, 18 - 1.5 - 2.5], [8, 5, 1.6]
[0, 18 - 1.5 - 2.5], [8, 5, 1.6],
[54, 41] // FOV
];
esp32_cam_x = 1; // Seems to vary as mine is offset but pictures on the web show it more centered.
@@ -96,7 +97,7 @@ ESP32_module = ["", "", 18, 26, 0.8, 0, 0.7, [1.1, 1.1, 0, gold], grey(18), f
ESP32_CAM_pcb = ["", "", 27, 40, 1.7, 2.5, 0, 0, grey(15), false, [],
[
[27 / 2, 26 / 2, 0, "-pcb", 0, ESP32_module],
for(side = [-1, 1]) [side * inch(0.45) + 27 / 2, -(4.2 + inch(.35)), 0, "-2p54header", 1, 8],
for(side = [-1, 1]) [side * inch(0.45) + 27 / 2, -(4.2 + inch(.35)), 0, "-2p54joiner", 1, 8],
[ 27 / 2, -8, 90, "uSD", [14.85, 14.65, 1.8]],
[ 27 / 2 + 1, 15, 0, "flat_flex", false],
[ 27 / 2 + inch(0.45), 10.5, 0, "block", 3, 3, 0.8, grey(90)],
@@ -151,7 +152,7 @@ ESP32_CAM = ["ESP32_CAM", "ESP32-CAM Camera module", ESP32_CAM_pcb, [esp32_cam_x
[[0, 0, 6.3], 3.5, [1, 1, 0.5]],
],
[1, -4], [15, 2.2, 1],
[54, 41] // FOV
[41, 54] // FOV
];

View File

@@ -80,6 +80,13 @@ module d_plug_D(length, width, rad) { //! D plug D shape
circle(rad);
}
module d_hole(type, h = 0, center = true, clearance = 0.2) { //! Make a hole to clear the back of d-connector
dwall = 0.5 + clearance;
extrude_if(h, center)
d_plug_D(d_lengths(type)[0] + 2 * dwall, d_widths(type)[0] + 2 * dwall, 2.5 + dwall);
}
module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specified D plug, which can be IDC, PCB or plain solder bucket
hole_r = 3.05 / 2;
dwall = 0.5;
@@ -106,7 +113,7 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
// Shell
//
color(d_plug_shell_colour) {
linear_extrude( d_flange_thickness(type))
linear_extrude(d_flange_thickness(type))
difference() {
rounded_square([flange_length, flange_width], 2);

View File

@@ -23,7 +23,8 @@
DCONN9 = ["DCONN9", 30.81, [18, 16.92], 24.99, [9.26, 8.38], 12.55, 10.72, 6.693, 1.12, 9];
DCONN15 = ["DCONN15", 39.14, [26.25, 25.25], 33.32, [9.26, 8.38], 12.55, 10.72, 6.693, 1.12, 15];
DCONN25 = ["DCONN25", 53.04, [40, 38.96], 47.04, [9.26, 8.38], 12.55, 10.72, 6.693, 1.12, 25];
DCONN37 = ["DCONN37", 69.50, [56.42, 55.42], 63.50, [9.26, 8.38], 12.55, 10.72, 6.693, 1.12, 37];
d_connectors = [DCONN9, DCONN15, DCONN25];
d_connectors = [DCONN9, DCONN15, DCONN25, DCONN37];
use <d_connector.scad>

View File

@@ -52,7 +52,7 @@ module geared_stepper_screw_positions(type) //! Place children at the screw posi
motor_colour = "#9BA2AC";
gearbox_colour = "#FFF7EE";
module geared_stepper(type) { //! Draw the specified geared stepper
module geared_stepper(type, angle = 0) { //! Draw the specified geared stepper with optional shaft angle.
vitamin(str("geared_stepper(", type[0], "): Geared stepper - ", type[1]));
radius = gs_diameter(type) / 2;
@@ -125,19 +125,20 @@ module geared_stepper(type) { //! Draw the specified geared stepper
f = gs_shaft_flat(type);
two_flats = f < 0;
vflip()
color(two_flats ? brass : gearbox_colour) {
d = gs_shaft_d(type);
h = gs_shaft_length(type);
linear_extrude(h)
intersection() {
circle(d = d);
rotate(angle)
color(two_flats ? brass : gearbox_colour) {
d = gs_shaft_d(type);
h = gs_shaft_length(type);
linear_extrude(h)
intersection() {
circle(d = d);
translate([0, two_flats ? 0 : (f - d) / 2])
square([d + 1, abs(f)], center = true);
}
translate([0, two_flats ? 0 : (f - d) / 2])
square([d + 1, abs(f)], center = true);
}
cylinder(d = d, h = h - gs_flat_length(type));
}
cylinder(d = d, h = h - gs_flat_length(type));
}
// Wire block
color(bulge_z ? "white" : "skyblue") {

105
vitamins/ht_pipe.scad Normal file
View File

@@ -0,0 +1,105 @@
//
// NopSCADlib Copyright Jan Giebels 2024
// info@ecosensors.cloud
// ecosensors.cloud
//
// 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/>.
//
//
//! Parametric PVC HT water pipes commonly found in hardware stores around germany. Great for building weather proof cases for IoT things.
//
include <../utils/core/core.scad>
use <../utils/tube.scad>
function pipe_od(type) = type[2]; //! Outside diameter
function pipe_wall(type) = type[3]; //! Wall thickness
function pipe_length(type) = type[4]; //! Pipe length
function pipe_td(type) = type[5]; //! T-Pipe diameter
module ht_cap(type) { //! Draw specified cap
vitamin(str("ht_cap(", type[0], "): PVC Waterpipe - ", type[1]));
tube_id = pipe_od(type) - pipe_wall(type) * 2;
cylinder(pipe_wall(type), r = tube_id/2 + pipe_wall(type) + 2.6);
translate_z(-pipe_length(type) - 5)
tube(or = tube_id/2 + pipe_wall(type), ir = tube_id/2, h = pipe_length(type) + 5, center = false);
}
module ht_pipe(type) { //! Draw specified pipe
vitamin(str("ht_pipe(", type[0], "): PVC Waterpipe - ", type[1]));
tube_id = pipe_od(type) - pipe_wall(type) * 2;
tube(h = pipe_length(type), or = tube_id/2 + pipe_wall(type), ir = tube_id/2, tube_id/2);
translate_z(pipe_length(type))
HTpipeFitting(pipe_od(type), tube_id);
}
module ht_tpipe(type) { //! Draw specified T-pipe
vitamin(str("ht_tpipe(", type[0], "): PVC Waterpipe - ", type[1]));
tube_id = pipe_od(type) - pipe_wall(type) * 2;
tube_t_id = pipe_td(type) - pipe_wall(type) * 2;
translate_z(pipe_length(type))
HTpipeFitting(pipe_od(type), tube_id);
render(convexity = 5)
difference() {
tube(h = pipe_length(type), or = tube_id/2 + pipe_wall(type), ir = tube_id/2, center = false);
translate([0, -25, pipe_length(type) - 25]) // Cut the exit hole
rotate([90, 0, 0])
cylinder(h = 50, d = tube_t_id, center = true);
}
or = pipe_od(type) / 2;
translate([0, -or, pipe_length(type) - or])
rotate ([90, 0, 0]) {
HTpipeFitting(pipe_td(type), tube_t_id);
translate_z(-or)
render(convexity = 5)
difference() { // Notch the T tube to meet the internal bore
tube(h = or, or = pipe_td(type) / 2, ir = tube_t_id / 2, center = false);
rotate([-90, 0, 0])
cylinder(h = pipe_td(type), d = tube_id, center = true);
}
}
}
module HTpipeFitting(tube_od, tube_id) {
fitting_height = min(55, tube_od * 0.8);
tube_ir = tube_id / 2;
fit_ir = tube_od / 2;
fit_or = fit_ir + (fit_ir - tube_ir);
rotate_extrude()
polygon([
[tube_ir, 0],
[fit_ir, 10],
[fit_ir, fitting_height + 12 + 3.7],
[fit_or, fitting_height + 12 + 3.7],
[fit_or, fitting_height + 12],
[fit_ir + 6.5, fitting_height + 12],
[fit_ir + 6.5, fitting_height],
[fit_or, fitting_height],
[fit_or, 10],
[fit_ir, 0]
]);
}

101
vitamins/ht_pipes.scad Normal file
View File

@@ -0,0 +1,101 @@
//
// NopSCADlib Copyright Jan Giebels 2024
// info@ecosensors.cloud
// ecosensors.cloud
//
// 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/>.
//
// definition name diameter wall length t-diameter
HT_32_cap = ["HT_32_cap", "HT 32 cap", 32, 2.1, 34];
HT_32_pipe_150 = ["HT_32_pipe_150", "HT 32 pipe 150 mm", 32, 2.1, 150];
HT_32_pipe_250 = ["HT_32_pipe_250", "HT 32 pipe 250 mm", 32, 2.1, 250];
HT_32_pipe_500 = ["HT_32_pipe_500", "HT 32 pipe 500 mm", 32, 2.1, 500];
HT_32_pipe_1000 = ["HT_32_pipe_1000", "HT 32 pipe 1000 mm", 32, 2.1, 1000];
HT_32_pipe_1500 = ["HT_32_pipe_1500", "HT 32 pipe 1500 mm", 32, 2.1, 1500];
HT_32_pipe_2000 = ["HT_32_pipe_2000", "HT 32 pipe 2000 mm", 32, 2.1, 2000];
HT_40_cap = ["HT_40_cap", "HT 40 cap", 40, 2.1, 34];
HT_40_pipe_150 = ["HT_40_pipe_150", "HT 40 pipe 150 mm", 40, 2.1, 150];
HT_40_pipe_250 = ["HT_40_pipe_250", "HT 40 pipe 250 mm", 40, 2.1, 250];
HT_40_pipe_500 = ["HT_40_pipe_500", "HT 40 pipe 500 mm", 40, 2.1, 500];
HT_40_pipe_1000 = ["HT_40_pipe_1000", "HT 40 pipe 1000 mm", 40, 2.1, 1000];
HT_40_pipe_1500 = ["HT_40_pipe_1500", "HT 40 pipe 1500 mm", 40, 2.1, 1500];
HT_40_pipe_2000 = ["HT_40_pipe_2000", "HT 40 pipe 2000 mm", 40, 2.1, 2000];
HT_50_cap = ["HT_50_cap", "HT 50 cap", 50, 2.1, 34];
HT_50_pipe_150 = ["HT_50_pipe_150", "HT 50 pipe 150 mm", 50, 2.1, 150];
HT_50_pipe_250 = ["HT_50_pipe_250", "HT 50 pipe 250 mm", 50, 2.1, 250];
HT_50_pipe_500 = ["HT_50_pipe_500", "HT 50 pipe 500 mm", 50, 2.1, 500];
HT_50_pipe_1000 = ["HT_50_pipe_1000", "HT 50 pipe 1000 mm", 50, 2.1, 1000];
HT_50_pipe_1500 = ["HT_50_pipe_1500", "HT 50 pipe 1500 mm", 50, 2.1, 1500];
HT_50_pipe_2000 = ["HT_50_pipe_2000", "HT 50 pipe 2000 mm", 50, 2.1, 2000];
HT_50_tpipe = ["HT_50_tpipe", "HT 50 T pipe", 50, 2.1, 100, 50];
HT_50_40_tpipe = ["HT_50_40_tpipe", "HT 50/40 T pipe", 50, 2.1, 100, 40];
HT_75_cap = ["HT_75_cap", "HT 75 cap", 75, 2.1, 34];
HT_75_pipe_150 = ["HT_75_pipe_150", "HT 75 pipe 150 mm", 75, 2.1, 150];
HT_75_pipe_250 = ["HT_75_pipe_250", "HT 75 pipe 250 mm", 75, 2.1, 250];
HT_75_pipe_500 = ["HT_75_pipe_500", "HT 75 pipe 500 mm", 75, 2.1, 500];
HT_75_pipe_1000 = ["HT_75_pipe_1000", "HT 75 pipe 1000 mm", 75, 2.1, 1000];
HT_75_pipe_1500 = ["HT_75_pipe_1500", "HT 75 pipe 1500 mm", 75, 2.1, 1500];
HT_75_pipe_2000 = ["HT_75_pipe_2000", "HT 75 pipe 2000 mm", 75, 2.1, 2000];
HT_90_cap = ["HT_90_cap", "HT 90 cap", 90, 2.1, 34];
HT_90_pipe_150 = ["HT_90_pipe_150", "HT 90 pipe 150 mm", 90, 2.1, 150];
HT_90_pipe_250 = ["HT_90_pipe_250", "HT 90 pipe 250 mm", 90, 2.1, 250];
HT_90_pipe_500 = ["HT_90_pipe_500", "HT 90 pipe 500 mm", 90, 2.1, 500];
HT_90_pipe_1000 = ["HT_90_pipe_1000", "HT 90 pipe 1000 mm", 90, 2.1, 1000];
HT_90_pipe_1500 = ["HT_90_pipe_1500", "HT 90 pipe 1500 mm", 90, 2.1, 1500];
HT_90_pipe_2000 = ["HT_90_pipe_2000", "HT 90 pipe 2000 mm", 90, 2.1, 2000];
HT_110_cap = ["HT_110_cap", "HT 110 cap", 110, 2.1, 34];
HT_110_pipe_150 = ["HT_110_pipe_150", "HT 110 pipe 150 mm", 110, 2.1, 150];
HT_110_pipe_250 = ["HT_110_pipe_250", "HT 110 pipe 250 mm", 110, 2.1, 250];
HT_110_pipe_500 = ["HT_110_pipe_500", "HT 110 pipe 500 mm", 110, 2.1, 500];
HT_110_pipe_1000 = ["HT_110_pipe_1000", "HT 110 pipe 1000 mm", 110, 2.1, 1000];
HT_110_pipe_1500 = ["HT_110_pipe_1500", "HT 110 pipe 1500 mm", 110, 2.1, 1500];
HT_110_pipe_2000 = ["HT_110_pipe_2000", "HT 110 pipe 2000 mm", 110, 2.1, 2000];
HT_125_cap = ["HT_125_cap", "HT 125 cap", 125, 2.1, 34];
HT_125_pipe_150 = ["HT_125_pipe_150", "HT 125 pipe 150 mm", 125, 2.1, 150];
HT_125_pipe_250 = ["HT_125_pipe_250", "HT 125 pipe 250 mm", 125, 2.1, 250];
HT_125_pipe_500 = ["HT_125_pipe_500", "HT 125 pipe 500 mm", 125, 2.1, 500];
HT_125_pipe_1000 = ["HT_125_pipe_1000", "HT 125 pipe 1000 mm", 125, 2.1, 1000];
HT_125_pipe_1500 = ["HT_125_pipe_1500", "HT 125 pipe 1500 mm", 125, 2.1, 1500];
HT_125_pipe_2000 = ["HT_125_pipe_2000", "HT 125 pipe 2000 mm", 125, 2.1, 2000];
HT_160_cap = ["HT_160_cap", "HT 160 cap", 160, 2.1, 34];
HT_160_pipe_150 = ["HT_160_pipe_150", "HT 160 pipe 150 mm", 160, 2.1, 150];
HT_160_pipe_250 = ["HT_160_pipe_250", "HT 160 pipe 250 mm", 160, 2.1, 250];
HT_160_pipe_500 = ["HT_160_pipe_500", "HT 160 pipe 500 mm", 160, 2.1, 500];
HT_160_pipe_1000 = ["HT_160_pipe_1000", "HT 160 pipe 1000 mm", 160, 2.1, 1000];
HT_160_pipe_1500 = ["HT_160_pipe_1500", "HT 160 pipe 1500 mm", 160, 2.1, 1500];
HT_160_pipe_2000 = ["HT_160_pipe_2000", "HT 160 pipe 2000 mm", 160, 2.1, 2000];
ht_pipes = [
HT_32_cap, HT_32_pipe_150, HT_32_pipe_250, HT_32_pipe_500, HT_32_pipe_1000, HT_32_pipe_1500, HT_32_pipe_2000,
HT_40_cap, HT_40_pipe_150, HT_40_pipe_250, HT_40_pipe_500, HT_40_pipe_1000, HT_40_pipe_1500, HT_40_pipe_2000,
HT_50_cap, HT_50_pipe_150, HT_50_pipe_250, HT_50_pipe_500, HT_50_pipe_1000, HT_50_pipe_1500, HT_50_pipe_2000,
HT_50_tpipe, HT_50_40_tpipe,
HT_75_cap, HT_75_pipe_150, HT_75_pipe_250, HT_75_pipe_500, HT_75_pipe_1000, HT_75_pipe_1500, HT_75_pipe_2000,
HT_90_cap, HT_90_pipe_150, HT_90_pipe_250, HT_90_pipe_500, HT_90_pipe_1000, HT_90_pipe_1500, HT_90_pipe_2000,
HT_110_cap, HT_110_pipe_150, HT_110_pipe_250, HT_110_pipe_500, HT_110_pipe_1000, HT_110_pipe_1500, HT_110_pipe_2000,
HT_125_cap, HT_125_pipe_150, HT_125_pipe_250, HT_125_pipe_500, HT_125_pipe_1000, HT_125_pipe_1500, HT_125_pipe_2000,
HT_160_cap, HT_160_pipe_150, HT_160_pipe_250, HT_160_pipe_500, HT_160_pipe_1000, HT_160_pipe_1500, HT_160_pipe_2000,
];
use <ht_pipe.scad>

View File

@@ -32,6 +32,9 @@ function insert_barrel_d(type) = type[5]; //! Diameter of the main bar
function insert_ring1_h(type) = type[6]; //! Height of the top and middle rings
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 threaded_insert_pitch(type) = type[9]; //! Pitch of the outer thread for threaded inserts
function threaded_insert_chamfer(type) = type[10]; //! Size of the chamfer for threaded inserts
function insert_hole_length(type) = round_to_layer(insert_length(type)); //! Length of the insert rounded to layer height
@@ -46,6 +49,14 @@ function insert_nose_length(type, d) = let( //! The length before the second rin
module insert(type) { //! Draw specified insert
length = insert_length(type);
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type), " x ", length, "mm"));
base_insert(type);
}
module base_insert(type) {
length = insert_length(type);
ring1_h = insert_ring1_h(type);
chamfer1 = (insert_ring2_d(type) - insert_barrel_d(type)) / 2;
@@ -53,7 +64,6 @@ module insert(type) { //! Draw specified insert
ring2_h = ring1_h + chamfer1;
gap = (length - ring1_h - ring2_h - chamfer2) / 3;
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type), " x ", length, "mm"));
$fn = 64;
thread_d = insert_screw_diameter(type);
explode(20, offset = [0, 0, -length]) translate_z(eps) vflip() {
@@ -186,3 +196,50 @@ module insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, f
}
}
}
module threaded_insert(type) { //! Draw specified threaded insert, for use in wood
d2 = insert_outer_d(type);
d3 = insert_barrel_d(type);
pitch = threaded_insert_pitch(type);
profile = thread_profile((d2 - d3) /2 , 0, 60);
socket = insert_screw_diameter(type) / cos(30) / 2;
length = insert_length(type);
r=insert_barrel_d(type) / 2;
z=threaded_insert_chamfer(type);
thread_l = insert_length(type) - z; // - insert_ring1_h(type);
vitamin(str("threaded_insert(", type[0], "): Threaded insert M", insert_screw_diameter(type), " x ", length, "mm"));
union() {
color(silver)
render() difference() {
base_insert(type);
translate_z(-socket/2 + 0.01)
cylinder(r=socket, $fn = 6, h=socket/2);
// chamfer the end
rotate_extrude(convexity = 3)
polygon([
[r - z, -length],
[r + 0.1, - length],
[r + 0.1, - length + z + 0.1]
]);
}
translate_z(-thread_l/2)
thread(insert_barrel_d(type),
pitch,
thread_l,
profile,
center = true,
top = 1,
bot = -1,
starts = 1,
solid = false,
female = false,
colour = silver);
}
}

View File

@@ -39,8 +39,23 @@ CNCKM3 = [ "CNCKM3", 3.0, 4.6, 4.0, 3, 3.65, 0.7, 4.4, 3.9 ];
CNCKM4 = [ "CNCKM4", 4.0, 6.3, 5.6, 4, 5.15, 1.0, 6.0, 5.55];
CNCKM5 = [ "CNCKM5", 5.8, 7.1, 6.4, 5, 6.0, 1.6, 6.8, 6.33];
// Measurements according to DIN 7965
//
// If you want to add an additional length, it should be sufficient copy one with the same
// M size and change the name (2x) and the first number column (l), all others are dependent
// on the M size.
// l, d2, d5, d, d3, h, d3, d3, P1 (h), z
M3x8 = [ "M3x8", 8, 6, 5, 3, 4.5, 0.5, 4.5, 4.5, 2, 0.6];
M4x10 = [ "M4x10", 10, 8, 6.5, 4, 5.5, 0.5, 5.5, 5.5, 2.5, 0.6];
M5x12 = [ "M5x12", 12, 10, 8.5, 5, 7.5, 0.5, 7.5, 7.5, 3.5, 0.8];
M6x15 = [ "M6x15", 15, 12, 10.5, 6, 9.5, 0.5, 9.5, 9.5, 4, 1];
M8x18 = [ "M8x18", 18, 16, 14.5, 8, 12.5, 0.5, 12.5, 12.5, 5, 1];
M10x25 = [ "M10x25", 25, 18.5, 17, 10, 15, 0.5, 15, 15, 5, 1.6];
M12x30 = [ "M12x30", 30, 22, 20, 12, 18, 0.5, 18, 18, 5, 1.6];
M16x30 = [ "M16x30", 30, 25, 22.5, 16, 20.5, 0.5, 20.5, 20.5, 5, 1.6];
inserts = [ F1BM2, F1BM2p5, F1BM3, F1BM4, CNCKM5 ];
short_inserts = [ F1BM2, CNCKM2p5, CNCKM3, CNCKM4, CNCKM5 ];
threaded_inserts = [ M3x8, M4x10, M5x12, M6x15, M8x18, M10x25, M12x30, M16x30 ];
use <insert.scad>

View File

@@ -41,9 +41,12 @@ function nut_dome(type) = type[8]; //! Dome height and max thread d
function nut_flat_radius(type) = nut_radius(type) * cos(30); //! Radius across the flats
function nut_square_size(type) = type[1]; //! Diameter of the corresponding screw
function nut_square_width(type) = type[2]; //! Width of the square nut
function nut_square_thickness(type) = type[3]; //! Thickness of the square nut
function nut_square_size(type) = type[1]; //! Diameter of the corresponding screw
function nut_square_width(type) = type[2]; //! Width of the square nut
function nut_square_thickness(type) = type[3]; //! Thickness of the square nut
function nut_weld_base_r(type) = type[7] / 2; //! Weld nut base radius
function nut_weld_base_t(type) = type[8]; //! Weld nut base thickness
function nut_dome_height(type) = let(d = nut_dome(type)) d ? d[0] : nut_thickness(type); //! Height of the domed version
function nut_thread_depth(type) = let(d = nut_dome(type)) d ? d[1] : nut_thickness(type); //! Max thread depth in domed version
@@ -190,7 +193,7 @@ module wingnut(type) { //! Draw a wingnut
function t_nut_tab(type) = [type[8], type[9]]; //! Sliding t-nut T dimensions
module sliding_ball_t_nut(size, w, h, r) {
module sliding_ball_t_nut(size, w, h, r) { //! Draw a sliding ball t nut
rad = 0.5;
stem = size.z - h;
ball_d = 4;
@@ -245,6 +248,38 @@ module sliding_t_nut(type) { //! Draw a sliding T nut, T nut with a spring loade
extrusionSlidingNut(size, tab[0], tab[1], tabSizeZ, holeRadius, 0, hammerNut);
}
module weld_nut(type) { //! draw a weld nut
thread_d = nut_size(type);
hole_rad = thread_d / 2;
nut_neck_rad = nut_radius(type);
thickness = nut_thickness(type);
base_rad = nut_weld_base_r(type);
base_thickness = nut_weld_base_t(type);
vitamin(str("weld nut(", type[0], "): Weld Nut M", nut_size(type)));
colour = silver;
explode(-20) {
color(colour) {
rotate_extrude()
polygon([
[hole_rad, -base_thickness],
[base_rad, -base_thickness],
[base_rad, 0],
[hole_rad, 0],
[nut_neck_rad, 0],
[nut_neck_rad, thickness],
[hole_rad, thickness]
]);
}
if(show_threads)
female_metric_thread(thread_d, metric_coarse_pitch(thread_d), thickness, center = false, colour = colour);
}
}
module extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, holeOffset = 0, hammerNut = false) {
// center section
stem_h = size.z - tabSizeZ;

View File

@@ -20,7 +20,7 @@ include <washers.scad>
//
// Nuts
//
M2_nut_trap_depth = 2.5;
M2_nut_trap_depth = 1.75;
M2p5_nut_trap_depth = 2.5;
M3_nut_trap_depth = 3;
M4_nut_trap_depth = 4;
@@ -49,7 +49,11 @@ M6_half_nut = ["M6_half_nut", 6, 11.5, 3, 8, M6_washer, 3,
M8_nut = ["M8_nut", 8, 15, 6.5, 8, M8_washer, M8_nut_depth, 0, [15, 11.35]];
toggle_nut = ["toggle_nut", 6.1, 9.2, 1.5, 1.5, M6_washer, 1.5, inch(1/40)];
M4_wingnut = ["M4_wingnut", 4, 10, 3.75,8, M4_washer, 0, 22, 10, 6, 3];
M4_wingnut = ["M4_wingnut", 4, 10, 3.75,8, M4_washer, 0, 22, 10, 6, 3];
M4_weld_nut = ["M4_weld_nut", 4, 5.3, 6.3, 8, M4_washer, 0, 18, 0.8,]; // Base diameter and thickness
M6_weld_nut = ["M6_weld_nut", 6, 7.7, 7.9, 8, M6_washer, 0, 19.1, 1.2,];
// sx ty1 ty2 hammer
M3_sliding_t_nut = ["M3_sliding_t_nut", 3, 6, 3.0, 4.0, false, 0, 10, 10, 6, false];
M4_sliding_t_nut = ["M4_sliding_t_nut", 4, 6, 3.7, 4.7, false, 0, 11, 10, 6, false];

View File

@@ -1169,6 +1169,9 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
if(show(comp, "rd_module")) rd_module(type = comp[4], value = comp[5]);
if(show(comp, "rd_transistor")) rd_transistor(type = comp[4], value = comp[5], lead_positions = param(6, undef), z = param(7, 5), kind = param(8,"Transistor"));
// type, value, lead positions, z, kind
if(show(comp, "rd_box_cap")) rd_box_cap(type = comp[4], kind = comp[5], value = comp[6]);
if(show(comp, "rd_cm_choke")) rd_cm_choke(type = comp[4], value = comp[5]);
if(show(comp, "rd_coil")) rd_coil(type = comp[4], value = comp[5], pitch = param(6, undef));
if(show(comp, "link")) wire_link(l = comp[4], h = param(5, 1), d = param(6, 0.8), tail = param(7, 3), sleeve = param(8, false));
if(show(comp, "D_plug")) translate_z(d_pcb_offset(comp[4])) d_plug(comp[4], pcb = true);
if(show(comp, "molex_hdr")) molex_254(comp[4], param(5, 0), param(6, undef));
@@ -1177,6 +1180,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
if(show(comp, "jst_zh")) jst_xh_header(jst_zh_header, comp[4], param(5, false), param(6, false), param(7, undef));
if(show(comp, "potentiometer")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
if(show(comp, "smd_250V_fuse")) smd_250V_fuse(comp[4], comp[5]);
if(show(comp, "smd_res")) smd_resistor(comp[4], comp[5]);
if(show(comp, "smd_cap")) smd_capacitor(comp[4], comp[5], param(6, undef));
if(show(comp, "smd_tant")) smd_tant(comp[4], param(5, undef));

View File

@@ -730,7 +730,6 @@ Keyes5p1 = ["Keyes5p1", "Keyes5.1 Arduino Uno expansion board", 68.58, 53.34, 1.
M2p5_pan_screw
];
ExtruderPCB = ["ExtruderPCB", "Extruder connection PCB",
33.02, 24.13, 1.6, 0, 0, 0, "green", true, [],
[[3 * 1.27, 24.13 / 2, 90, "D_plug", DCONN15],
@@ -761,9 +760,15 @@ ZC_A0591 = ["ZC_A0591", "ZC-A0591 ULN2003 driver PCB", 35, 32, 1.6, 0, 2.5, 0, "
], [], [], [], M2p5_pan_screw];
MT3608 = ["MT3608", "MT3608 boost converter module", 37, 17, 1.2, 2, 1.5, [5, 3], "#2140BE", false, [[3.0725, 5.095], [3.0725, -5.095], [-3.0725, 5.095], [-3.0725, -5.095]],
[ [-12.05 , -6.8, 180, "trimpot10"]
]];
MT3608 = ["MT3608", "MT3608 boost converter module", 37, 17, 1.2, 2, 1.5, [5, 3], "#2140BE", false,
[[3.0725, 5.095], [3.0725, -5.095], [-3.0725, 5.095], [-3.0725, -5.095]],
[[-12.05 , -6.8, 180, "trimpot10"],
[-24.05 , 13.8, 90, "smd_soic", SOT23_6, "B628"],
[-12.3, -14.4, 0, "smd_diode",DO214AC, "SS34"],
[-28.5, 13.2, 90,"smd_cap", CAP1206, 0.5],
[-20, 13.2, 90,"smd_cap", CAP1206, 0.5],
[-24.05 , -11.8, 180, "smd_inductor", CDRH104, "220"]]
];
HW803_1WAY_RELAY = [
"HW803_1WAY_RELAY", "HW-803 5V 1 way relay module",
@@ -1197,6 +1202,27 @@ ESP_12F = pcb("ESP_12F", "ESP-12F ESP8266 WiFi module", [24, 16, 0.8],
]
);
RCWL0516 = pcb(
"RCWL-0516", "Microwave Radar Sensor",
size = [36, 17.3, 1.2],
colour = "#17682d",
hole_d = 1.7,
holes = [
[ inch(0.05), inch(0.05) ],
[ -inch(0.05), inch(0.05) ],
[ -inch(0.05), -inch(0.05) ],
[ inch(0.05), -inch(0.05) ],
[ -inch(0.65), -inch(0.05) ],
[ -inch(0.65), inch(0.05) ],
],
grid = [inch(0.05), inch(0.13), 1, 5, silver, inch(0.1), inch(0.1)],
components = [
[inch(0.18), inch(0.13), 90,"smd_cap", CAP1206, 0.5],
[inch(0.18), inch(0.32), 90,"smd_cap", CAP1206, 0.5],
[inch(0.18), inch(0.54), 90,"smd_cap", CAP1206, 0.5],
[inch(0.45), inch(0.34), 0,"smd_soic", SOIC16, "RCWL9196"],
]
);
tiny_buck = pcb("tiny_buck", "Ultra Small 3A buck regulator", [20, 11, 1.6],
hole_d = 1.2,
@@ -1222,7 +1248,7 @@ tiny_pcbs = [ESP_201, ESP_01M, XIAO, ESP_12F, MP1584EN, ESP_01,tiny_buck, LIPO_f
big_pcbs = [BTT_RELAY_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
pcbs = [KY_040, TP4056, L9110S, ZC_A0591, MT3608, RAMPSEndstop, ArduinoNano, HW803_1WAY_RELAY, Feather405, RPI_Pico, ESP32_DOIT_V1, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, OPZ2, PanelDue_v3, RPI3A, RPI3, RPI4];
pcbs = [KY_040, TP4056, L9110S, ZC_A0591, RCWL0516, MT3608,RAMPSEndstop, ArduinoNano, HW803_1WAY_RELAY, Feather405, RPI_Pico, ESP32_DOIT_V1, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, OPZ2, PanelDue_v3, RPI3A, RPI3, RPI4];
pcbs_not_shown = [Melzi, Duex2, PSU12V1A, Keyes5p1, PI_IO, ExtruderPCB];

View File

@@ -18,37 +18,54 @@
//
include <belts.scad>
//
// n t o b w h h b f f s s s s
// a e d e i u u o l l c c c c
// m e l d b b r a a r r r r
// e t t t e n n e e e e
// h h d l g g w w w w
// e e s
// l z
// d t
// n t o b w h h b f f s s s s
// a e d e i u u o l l c c c c
// m e l d b b r a a r r r r
// e t t t e n n e e e e
// h h d l g g w w w w
// e e s
// l z
// d t
//
T5x10_pulley = ["T5x10_pulley", "T5", 10, 15, T5x6, 11.6, 7.9, 7, 5, 19.3, 1.7, 3, 10.7, M3_grub_screw, 1];
T2p5x16_pulley = ["T2p5x16_pulley", "T2.5", 16, 12.16, T2p5x6, 8, 16, 5.7, 5, 16.0, 1.0, 6, 3.75, M4_grub_screw, 1];
GT2x20um_pulley = ["GT2x20um_pulley", "GT2UM", 20, 12.22, GT2x6, 7.5, 18, 6.5, 5, 18.0, 1.0, 6, 3.75, M3_grub_screw, 2]; //Ultimaker
GT2x20ob_pulley = ["GT2x20ob_pulley", "GT2OB", 20, 12.22, GT2x6, 7.5, 16, 5.5, 5, 16.0, 1.0, 6, 3.25, M3_grub_screw, 2]; //Openbuilds
GT2x16_pulley = ["GT2x16_pulley", "GT2", 16, 9.75, GT2x6, 7.0, 13, 5, 5, 13.0, 1.0,4.5,3.0, M3_grub_screw, 2];
GT2x12_pulley = ["GT2x12_pulley", "GT2RD", 12, 7.15, GT2x6, 6.5, 12, 5.5, 4, 12.0, 1.0, 4, 3.0, M3_grub_screw, 2]; //Robotdigg
GT2x20_toothed_idler = ["GT2x20_toothed_idler", "GT2", 20, 12.22, GT2x6, 6.5, 18, 0, 4, 18.0, 1.0, 0, 0, false, 0];
GT2x20_plain_idler = ["GT2x20_plain_idler", "GT2", 0, 12.0, GT2x6, 6.5, 18, 0, 4, 18.0, 1.0, 0, 0, false, 0];
GT2x16_toothed_idler = ["GT2x16_toothed_idler", "GT2", 16, 9.75, GT2x6, 6.5, 14, 0, 3, 14.0, 1.0, 0, 0, false, 0];
GT2x16_plain_idler = ["GT2x16_plain_idler", "GT2", 0, 9.63, GT2x6, 6.5, 13, 0, 3, 13.0, 1.0, 0, 0, false, 0];
GT2x16x7_plain_idler = ["GT2x16x7_plain_idler", "GT2", 0, 9.63, GT2x6, 7.0, 13, 0, 3, 13.0, 1.0, 0, 0, false, 0];
T5x10_pulley = ["T5x10_pulley", "T5", 10, 15, T5x6, 11.6, 7.9, 7, 5, 19.3, 1.7, 3, 10.7, M3_grub_screw, 1];
T2p5x16_pulley = ["T2p5x16_pulley", "T2.5", 16, 12.16, T2p5x6, 8, 16, 5.7, 5, 16.0, 1.0, 6, 3.75, M4_grub_screw, 1];
GT2x20um_pulley = ["GT2x20um_pulley", "GT2UM", 20, 12.22, GT2x6, 7.5, 18, 6.5, 5, 18.0, 1.0, 6, 3.75, M3_grub_screw, 2]; //Ultimaker
GT2x20ob_pulley = ["GT2x20ob_pulley", "GT2OB", 20, 12.22, GT2x6, 7.5, 16, 5.5, 5, 16.0, 1.0, 6, 3.25, M3_grub_screw, 2]; //Openbuilds
GT2x16_pulley = ["GT2x16_pulley", "GT2", 16, 9.75, GT2x6, 7.0, 13, 5, 5, 13.0, 1.0,4.5,3.0, M3_grub_screw, 2];
GT2x12_pulley = ["GT2x12_pulley", "GT2RD", 12, 7.15, GT2x6, 6.5, 12, 5.5, 4, 12.0, 1.0, 4, 3.0, M3_grub_screw, 2]; //Robotdigg
GT2x20_toothed_idler = ["GT2x20_toothed_idler", "GT2", 20, 12.22, GT2x6, 6.5, 18, 0, 4, 18.0, 1.0, 0, 0, false, 0];
GT2x20_plain_idler = ["GT2x20_plain_idler", "GT2", 0, 12.0, GT2x6, 6.5, 18, 0, 4, 18.0, 1.0, 0, 0, false, 0];
GT2x16_toothed_idler = ["GT2x16_toothed_idler", "GT2", 16, 9.75, GT2x6, 6.5, 14, 0, 3, 14.0, 1.0, 0, 0, false, 0];
GT2x16_plain_idler = ["GT2x16_plain_idler", "GT2", 0, 9.63, GT2x6, 6.5, 13, 0, 3, 13.0, 1.0, 0, 0, false, 0];
GT2x16x7_plain_idler = ["GT2x16x7_plain_idler", "GT2", 0, 9.63, GT2x6, 7.0, 13, 0, 3, 13.0, 1.0, 0, 0, false, 0];
pulleys = [T5x10_pulley,
T2p5x16_pulley,
GT2x20um_pulley,
GT2x20ob_pulley,
GT2x16_pulley,
GT2x12_pulley,
GT2x20_toothed_idler,
GT2x20_plain_idler,
GT2x16_toothed_idler,
GT2x16_plain_idler,
GT2x16x7_plain_idler];
GT2x80_pulley = ["GT2x80_pulley", "GT2", 80, 50.42, GT2x6, 7, 35, 9, 5, 55, 1.0, 6, 4.5, M5_grub_screw, 2]; // Powge branded from West3D
GT2x16_toothed_idler_9 = ["GT2x16_toothed_idler_9", "GT2", 16, 9.75, GT2x9, 10, 14, 0, 3, 14.0, 1.0, 0, 0, false, 0];//Robotdigg
GT2x16_pulley_9 = ["GT2x16_pulley_9", "GT2", 16, 9.65, GT2x9, 9.5, 14, 6.5, 5, 14.0, 1.0, 6, 3.5, M3_grub_screw, 2];
GT2x20_pulley_9 = ["GT2x20_pulley_9", "GT2", 20, 12.22, GT2x9, 11, 16, 7, 5, 16.0, 1.0, 6, 3.25, M4_grub_screw, 2];//Powge
GT2x20_toothed_idler_9 = ["GT2x20_toothed_idler_9", "GT2", 20, 12.22, GT2x9, 10, 18, 0, 5, 18.0, 1.0, 0, 0, false, 0];
pulleys = [
T5x10_pulley,
T2p5x16_pulley,
GT2x20_pulley_9,
GT2x20um_pulley,
GT2x20ob_pulley,
GT2x16_pulley_9,
GT2x16_pulley,
GT2x12_pulley,
GT2x16_plain_idler,
GT2x16x7_plain_idler,
GT2x20_plain_idler,
GT2x16_toothed_idler,
GT2x16_toothed_idler_9,
GT2x20_toothed_idler,
GT2x20_toothed_idler_9,
GT2x80_pulley,
];
use <pulley.scad>

View File

@@ -158,6 +158,7 @@ module rd_module(type, value) { //! Draw a PCB mounted potted module, e.g. PSU o
r = rd_module_radius(type);
size = rd_module_size(type);
pin = rd_module_pin_size(type);
color(rd_module_colour(type))
rounded_top_rectangle(size, r, r);
@@ -393,3 +394,236 @@ module rd_electrolytic(type, value, pitch = undef, z = 0, tail = 3) { //! Draw a
cylinder(r = jacket_ir, h = eps);
}
}
function rd_boxc_size(type) = type[1]; //! Overall size and corner radius
function rd_boxc_z(type) = type[2]; //! Height of inner base above PCB.
function rd_boxc_skirt(type) = type[3]; //! Skirt slot, thickness, height
function rd_boxc_leads(type) = type[4]; //! Lead pitch, diameter and length
function rd_boxc_colours(type) = type[5]; //! Case colour and resin fill colour
module rd_box_cap(type, kind, value) { //! Draw radial boxed film capacitor
vitamin(str("rd_boxc(", type[0], ", \"", kind, "\", \"", value, "\" ): ", kind, " ", value));
size = rd_boxc_size(type);
r = size[3];
skirt = rd_boxc_skirt(type);
inset = skirt.y * 2;
leads = rd_boxc_leads(type);
c = rd_boxc_colours(type);
z = rd_boxc_z(type);
$fn = fn;
color(c[0]) {
translate_z(z)
rounded_top_rectangle([size.x, size.y, size.z - z], r, r);
for(i = [0, 1])
translate_z(i * skirt.z)
linear_extrude(z)
difference() {
rounded_square([size.x, size.y], r);
square([size.x - inset, size.y - inset], center = true);
if(!i)
square([skirt.x, size.y], center = true);
}
}
color(c[1])
translate_z(z)
cube([size.x - inset, size.y - inset, 2 * eps], center = true);
color(silver)
for(end = [-1, 1])
translate([end * leads.x / 2, 0]) {
translate_z(- leads.z)
cylinder(d = leads.y, h = leads.z + z);
solder(leads.y / 2);
}
color("black")
translate([0, -size.y / 2])
rotate([90, 0, 0])
linear_extrude(eps)
translate([-size.x * 0.45, size.z * 0.75])
resize([size.x * 0.9, size.z / 6])
text(value, halign = "left", valign = "top");
}
function rd_cm_choke_core(type) = type[1]; //! Core OD, ID, width, corner radius
function rd_cm_choke_seam(type) = type[2]; //! Overlapping semicircular seams to join the two halves of the core width and thickness
function rd_cm_choke_slot(type) = type[3]; //! Slot to hold central separator width, height, thickness
function rd_cm_choke_csep(type) = type[4]; //! Central separator thickness in slot, total thickness, height
function rd_cm_choke_wire(type) = type[5]; //! Wire positions, length and diameter
module rd_cm_choke(type, value) { //! Draw specified common mode choke.
vitamin(str("rd_cm_choke(", type[0], " ,\"", value, "\"): Common mode choke ", value));
core = rd_cm_choke_core(type);
seam = rd_cm_choke_seam(type);
slot = rd_cm_choke_slot(type);
csep = rd_cm_choke_csep(type);
wire = rd_cm_choke_wire(type);
or = core.x / 2;
ir = core.y / 2;
core_w = core.z;
core_r = core[3];
z = seam.y + or;
wire_r = wire[3] / 2;
w = or - ir;
$fs = fs; $fa = fa;
color(grey(90))
translate_z(z) {
rotate([90, 0, 0]) {
rotate_extrude()
translate([(ir + or) / 2, 0])
rounded_square([w, core_w], core_r, center = true);
for(h = [true, false])
hflip(h)
rotate(-90)
rotate_extrude(angle = 180)
translate([or, 0])
square([seam.y, seam.x]);
}
r = sqrt(sqr(or * cos(180 / r2sides(or))) - sqr(slot.z + csep.x / 2));
for(x = [-1, 1], z = [-1, 1])
translate([x * (csep.x / 2 + slot.z / 2), 0, z * (r - slot.y / 2)])
rotate([0, 90, 0])
rounded_rectangle([slot.y, slot.x, slot.z], core_r, center = true);
rotate([0, 90, 0]) {
rounded_rectangle([2 * ir, slot.x, csep.x], core_r, center = true);
rounded_rectangle([csep.z, slot.x, csep.y], core_r, center = true);
}
}
color(silver)
for(x = [-1, 1], y = [-1, 1])
translate([x * wire.x / 2, y * wire.y / 2]) {
solder(wire_r);
vflip()
cylinder(r = wire_r, h = wire.z, $fn = fn);
}
color(copper) {
wire_d = 2 * wire_r;
r = ir - wire_r;
cr = core_r + wire_r;
points = [
[-core_w / 2 + core_r, 0, 0],
[ core_w / 2 + wire_r, 0, 0], cr,
[ core_w / 2 + wire_r, w + wire_r, 0], cr,
[ 0, w + wire_d + seam.y * 2, 0], 7,
[-core_w / 2 - wire_r, w + wire_r, 0], cr,
[-core_w / 2 - wire_r, 0, 0], cr - eps,
[-core_w / 2 + core_r, 0, 0],
];
profile = segmented_path(rounded_path(points, $fn = fn), fs);
min_gap_angle = 2 * asin((slot.z + csep.x / 2 + wire_r) / r);
turns = floor((r * PI * (180 - min_gap_angle) / 180) / wire_d);
turn_angle = wire_d / (r * PI) * 180;
//turns = floor(((or + wire_r) * PI * (180 - min_gap_angle) / 180) / wire_d / 2);
//turn_angle = 2 * asin(wire_d / (or + wire_r));
gap_angle = 180 - turns * turn_angle;
path = arc_points(r, a = [90, 180 + gap_angle / 2, 180], al = 180 - gap_angle, $fn = turns * len(profile));
spiral = spiral_wrap(path, profile, path_length(path) / turns, turns);
tail = bezier_join([[wire.x / 2, wire.y / 2, -z - eps], [wire.x / 2, wire.y / 2, -z]], spiral, 1.5);
tilt = turn_angle * (or + wire_r) / 120;
outer_points = [
[ core_w / 2 - core_r - wire_d, -wire_d, 0],
[-core_w / 2 - wire_r - wire_d, -wire_d, 0], cr + wire_d,
[-core_w / 2 - wire_r, w + wire_r, tilt / 2], cr,
[ 0, w + wire_d + seam.y * 2, -tilt / 4], 7, // No idea why -tilt / 2.5 and not zero.
[ core_w / 2 + wire_r, w + wire_r, -tilt / 1.5], cr,
[ core_w / 2 + wire_r + wire_d, -wire_d, 0], cr + wire_d,
[ core_w / 2 - core_r - wire_d, -wire_d, 0],
];
outer_profile = segmented_path(rounded_path(outer_points, $fn = fn), fs);
outer_path = arc_points(r, a = [90, 180 + gap_angle / 2 + turn_angle / 2, 180], al = 180 - gap_angle, $fn = (turns - 1) * len(outer_profile));
outer_spiral = concat(spiral_wrap(outer_path, outer_profile, path_length(outer_path) / turns, turns), [spiral[len(spiral) - 1]]);
outer_tail = bezier_join([[wire.x / 2, -wire.y / 2, -z - eps], [wire.x / 2, -wire.y / 2, -z]], outer_spiral, 3);
wire_points = circle_points(wire_r, $fn = fn);
translate_z(z)
for(side = [-1, 1]) mirror([side < 0 ? 1 : 0, 0]){
color(copper)sweep(tail, wire_points);
sweep(outer_tail, wire_points);
}
}
}
function rd_coil_size(type) = type[1]; //! OD, ID, height, coil height
function rd_coil_wire(type) = type[2]; //! Wire pitch, diameter and length
function rd_coil_colour(type) = type[3]; //! Core colour
function rd_coil_turns(type) = type[4]; //! Number of turns
module rd_coil(type, value, pitch = undef) { //! Draw the specified vertical coil
size = rd_coil_size(type);
wire = rd_coil_wire(type);
pitch = is_undef(pitch) ? wire.x : pitch;
wire_d = wire.y;
wire_r = wire_d / 2;
vitamin(str("rd_coil(", type[0], " ,\"", value, "\"): Radial inductor ", size.z, "x", size.x, " ", value));
$fs = fs; $fa = fa;
end = (size.z - size[3]) / 2;
function sigmoid(x) = 1 / (1 + exp(-x));
z = end + size[3] / 2;
h = size[3] - wire_d;
turns = rd_coil_turns(type);
color(rd_coil_colour(type)) {
cylinder(d = size.y, h = size.z);
for(z = [0, size.z - end])
translate_z(z)
cylinder(d = size.x, h = end);
}
color(silver)
for(side = [-1, 1])
translate([side * pitch / 2, 0]) {
vflip()
cylinder(d = wire_d, h = wire.z, $fn = fn);
solder(wire.y / 2);
}
color(copper) {
r = size.y / 2 + wire_r;
sides = r2sides4n(r);
leadin = sides / 4;
total = sides * turns;
shortcut = 3;
spiral = [
for(i = [shortcut: total - shortcut])
let(a = 360 * i / sides,
j = i <= leadin ? leadin - i : i >= total - leadin ? i - (total - leadin) : 0,
R = r + j * wire_r / leadin
)
[R * cos(a), R * sin(a), (size[3] - wire.y) * i / total + end + wire_r]
];
half_spiral = [
for(i = [sides / 2 - shortcut : -1 : shortcut * 2])
let(a = 360 * i / sides, R = r + wire_d)
[R * cos(a), R * -sin(a), h * sigmoid((i - sides / 4) / 2) + end + wire_r]
];
path = bezier_join([[-pitch / 2, 0, -eps], [-pitch / 2, 0, 0]], bezier_join(bezier_join(half_spiral, spiral, 1), [[pitch / 2, 0, 0], [pitch / 2, 0, -eps]], 3), 3);
sweep(path, circle_points(wire_r, $fn = fn));
}
color("white")
translate_z(size.z)
linear_extrude(eps)
resize([size.x * 0.9, 0], auto = true)
text(value, halign = "center", valign = "center");
}

View File

@@ -38,10 +38,11 @@ LDE10_20B = ["LDE10_20B","PSU", [53.8, 28.8, 19.0], 0.5, grey(20), [1.0, 0,
rd_modules = [HF33F, VCE03, LDE10_20B];
// Disks
ERZV07D471 = ["ERZV07D471", "Varistor", [6.5, 5.0, 8.0], [4.75, 3.1], [0.6, 1.4], [grey(20), grey(80)]];
6p4mm_disc = ["6p4mm_disc","Ceramic capacitor", [6.5, 2.1, 7.8], [5.0, 0.9], [0.6, 0.8], ["#C5702D", grey(20)]];
ERZV07D471 = ["ERZV07D471", "Varistor", [6.5, 5.0, 8.0], [4.75, 3.1], [0.6, 1.4], [grey(20), grey(80)]];
6p4mm_disc = ["6p4mm_disc", "Ceramic capacitor", [6.5, 2.1, 7.8], [5.0, 0.9], [0.6, 0.8], ["#C5702D", grey(20)]];
10mm_disc = ["10mm_disc", "Ceramic capacitor", [10, 4.25, 12], [7.72, 0], [0.64, 2.0], ["#BA9C16", grey(20)]];
rd_discs = [6p4mm_disc, ERZV07D471];
rd_discs = [6p4mm_disc, ERZV07D471, 10mm_disc];
// Transistors
TO92 = ["TO92", [5.0, 3.9, 4.5], [grey(20), grey(80)], [0.48, 0.48], [[-1,0], [0,0], [1,0]] ];
@@ -54,4 +55,18 @@ ECAP8x11 = ["ECAP8x12", [8.2, 7.5, 12.5], 0.5, [2.4, 2.5], 0.5, inch(0.1), [grey
rd_electrolytics = [ECAP8x11];
// Boxed plastic film capacitors
BOXC18x5x11 = ["BOXC18x5x11", [18, 5, 11, 0.25], 1.2, [8, 0.6, 0.4], [15, 0.6, 4.4], [grey(40), "LightYellow"]];
BOXC18x10x16 = ["BOXC18x10x16", [18, 10, 16, 0.25], 1.7, [12, 0.8, 0.4], [15, 0.8, 4.4], [grey(40), "LightYellow"]];
rd_box_caps = [BOXC18x5x11, BOXC18x10x16];
ATX_CM_CHOKE = ["ATX_CM_CHOKE", [17.4, 11.4, 9, 0.5], [2, 0.8], [11, 4.7, 0.8], [1, 2.4, 6.8], [inch(0.3), inch(0.4), 3, 0.65]];
rd_cm_chokes = [ATX_CM_CHOKE];
IND16x10 = ["IND16x10", [10, 6.7, 16, 10], [inch(0.5), 0.9, 3], grey(20), 10];
rd_coils = [IND16x10];
use <radial.scad>

View File

@@ -43,7 +43,7 @@ MGN12C_carriage = [ "MGN12C", 34.7, 21.7, 27, 13, 3, 15, 20, M3_cap_screw, MG
MGN12H_carriage = [ "MGN12H", 45.4, 32.4, 27, 13, 3, 20, 20, M3_cap_screw, MGN12 ];
MGN15C_carriage = [ "MGN15C", 43.3, 27.7, 32, 16, 4, 20, 25, M3_cap_screw, MGN15 ];
HGH15CA_carriage= [ "HGH15CA", 61.4, 39.4, 34, 28, 4, 26, 26, M4_cap_screw, HGH15CA ];
HGH20CA_carriage= [ "HGH20CA", 77.5, 50.5, 44, 30, 4.6, 35, 32, M5_cap_screw, HGH20CA ];
HGH20CA_carriage= [ "HGH20CA", 77.5, 50.5, 44, 30, 4.6, 36, 32, M5_cap_screw, HGH20CA ];
SSR15_carriage = [ "SSR15", 40.3, 23.3, 34, 24, 4.5, 0, 26, M4_cap_screw, SSR15 ];
rails = [MGN5, MGN7, MGN9, MGN12, MGN15, SSR15, HGH15CA, HGH20CA];

View File

@@ -35,8 +35,8 @@ neon_spades = [[spade4p8, 7.3, 0, -7, 0],
//
// w h t
//
small_rocker = ["small_rocker", "Rocker Switch PRASA1-16F-BB0BW", 13, 19.8, 15, 21, 2, 12.8, 18.5, 11.8, 2.5, -1, 3.8, small_spades];
neon_indicator = ["neon_indicator", "Neon Indicator H8630FBNAL", 13, 19.8, 15, 21, 2, 12.8, 18.5, 12.5, 2.5, 0, 0.3, neon_spades];
small_rocker = ["small_rocker", "Rocker Switch PRASA1-16F-BB0BW", 13, 19.25, 15, 21, 2, 12.8, 18.5, 11.8, 2.5, -1, 3.8, small_spades];
neon_indicator = ["neon_indicator", "Neon Indicator H8630FBNAL", 13, 19.25, 15, 21, 2, 12.8, 18.5, 12.5, 2.5, 0, 0.3, neon_spades];
rockers = [small_rocker, neon_indicator];

134
vitamins/rod_end.scad Normal file
View File

@@ -0,0 +1,134 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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/>.
//
//
//! A rod end, sometimes called a spherical bearing or rod-end eye, is a component used in mechanical systems to create a flexible connection between two parts.
//
include <../utils/core/core.scad>
include <../utils/thread.scad>
function rod_end_bearing_bore(type) = type[1]; //! radius of the bore hole in the bearing
function rod_end_bearing_od(type) = type[2]; //! Outer diameter of the bearing
function rod_end_bore_width(type) = type[3]; //! Width
function rod_end_bearing_width(type) = type[4]; //! Width
function rod_end_bearing_shield_colour(type) = type[5]; //! Shield colour, "silver" for metal
function rod_end_screw_radius(type) = type[6] / 2;//! radius of the screw end, not the bore
function rod_end_sphere_seg_width(type) = type[7]; //! the width of the pivoting part, effectively a (sphere - sphereCaps - center bore)
function rod_end_sphere_radius(type) = type[8]; //!radius of the rod end sphere
function rod_end_screw_length(type) = type[9]; //! length of the screw from eye center, not the bore
function rod_end_thread_length(type) = type[10]; //! length of the threads
function rod_end_overall_length(type) = type[11]; //! overall length of the rod end
function rod_end_bearing_rim(type) = type[12]; //! Outer rim thickness guesstimate
module rod_end_bearing(type) { //! Draw a rod end bearing
bb_bore = rod_end_bearing_bore(type);
bb_od = rod_end_bearing_od(type);
bb_rim = rod_end_bearing_rim(type);
bb_width = rod_end_bearing_width(type);
bb_shield_colour = rod_end_bearing_shield_colour(type);
length = rod_end_screw_length(type);
sphere_rad = rod_end_sphere_radius(type) / 2;
rod_end_sphere_seg_width= rod_end_sphere_seg_width(type);
shaft_rad = rod_end_screw_radius(type) - eps;
thread_rad = rod_end_screw_radius(type);
thread = rod_end_thread_length(type); //length - bb_od/2;
thread_offset = 0;
thread_d = 2 * thread_rad;
pitch = metric_coarse_pitch(thread_d);
colour = grey(80);
shield_width=bb_width - (bb_width < 5 ? 0.5 : 1);
chamfer = bb_rim / 6;
description = str("Rod End Bearing ", type[1], length < 10 ? " x " : " x ", length, "mm");
vitamin(str("Rod End Bearing(", type[0], ", ", length, "): ", description));
module shaft(socket = 0, headless = false) {
shank = length;
if(show_threads && pitch)
translate_z(-length - thread_offset)
male_metric_thread(thread_d, pitch, thread, false, top = headless ? -1 : 0, solid = !headless, colour = colour);
else
color(colour * 0.9)
rotate_extrude() {
translate([0, -length - thread_offset])
square([thread_rad - eps, thread ]);
}
}
module bearingEye() {
color(colour)
rotate_extrude()
difference() {
circle(r = sphere_rad);
translate(v = [0, -sphere_rad])
square(size = sphere_rad * 2);
for(i=[0, 1])
mirror(v = [0, i])
translate(v = [-sphere_rad,rod_end_sphere_seg_width / 2])
square(size = sphere_rad * 2);
square([bb_bore, rod_end_sphere_seg_width + 1], center = true);
}
color(bb_shield_colour)
rotate_extrude()
difference() {
translate([0, -shield_width / 2])
square([bb_od / 2 - bb_rim,shield_width]);
circle(r = sphere_rad);
}
color(colour) {
rotate_extrude()
hull() {
or = bb_od / 2;
h = bb_width;
translate([or - bb_rim, -h / 2 + chamfer])
square([bb_rim, h - 2 * chamfer]);
translate([or - bb_rim, -h / 2])
square([bb_rim - chamfer, h]);
}
translate_z(-bb_width/2+chamfer)
linear_extrude(bb_width-chamfer*2)
difference() {
hull() {
circle(r = bb_od/2);
translate([length-thread,-shaft_rad])
square([0.5,shaft_rad*2]);
}
circle(r = bb_od/2-bb_rim);
}
}
}
shaft();
rotate([0,90,0])
bearingEye();
}

23
vitamins/rod_ends.scad Normal file
View File

@@ -0,0 +1,23 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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/>.
//
RE_m5_bearing = ["RE_m5_bearing", 5, 16, 8, 6, brass, 5, 8, 11.11, 33, 21, 41, 2.0, 2.0, 0, 0]; // uxcell M5x0.8 Right Hand Thread, Self-Lubricating Joint Rod Ends
rod_ends= [ RE_m5_bearing];
use<rod_end.scad>

View File

@@ -235,20 +235,32 @@ module screw(type, length, hob_point = 0, nylon = false) { //! Draw specified sc
cylinder(h=2 * eps, r=socket_rad + eps);
shaft();
}
if(head_type == hs_dome) {
lift = 0.38;
h = head_height - lift;
r = min(2 * head_height, (sqr(head_rad) + sqr(h)) / 2 * h); // Special case for M2
y = sqrt(sqr(r) - sqr(head_rad));
edge_height = head_rad / 7.5;
head_chamfer_angle= 15; // degrees
head_chamfer_x=edge_height*tan(head_chamfer_angle);
head_fillet_radius= 0.3;
p0 = [head_rad, edge_height]; // Lowest point on the arc
p1 = [1.3 * socket_rad / cos(30), head_height]; // Highest point on the arc
p = (p0 + p1) / 2; // Start of bisector
gradient = (p0.x - p1.x) / (p1.y - p0.y); // Gradient of perpendicular bisector = -1 / gradient of the line between p10 and p1
c = p.y - gradient * p.x; // Y ordinate of the centre of the dome
r = norm(p1 - [0, c]); // Dome radius is distance from centre
color(colour) {
rotate_extrude() {
difference() {
intersection() {
translate([0, -y + lift])
translate([0, c])
circle(r);
square([head_rad, head_height]);
// offset(head_fillet_radius) offset(-head_fillet_radius)
polygon(points = [
[0,0],
[head_rad-head_chamfer_x,0],
[head_rad, edge_height],
[head_rad,head_height],
[0,head_height],
]);
}
translate([0, head_height - socket_depth])
square([socket_rad, 10]);

View File

@@ -87,6 +87,8 @@ M2p5_dome_screw = ["M2p5_dome", "M2.5 dome", hs_dome,2.5, 5.35,1.6, 0.8, 2.0
M3_dome_screw = ["M3_dome", "M3 dome", hs_dome, 3, 5.7, 1.65, 1.04,2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
M4_dome_screw = ["M4_dome", "M4 dome", hs_dome, 4, 7.6, 2.2, 1.3, 2.5, 20, M4_washer, M4_nut, M4_tap_radius, M4_clearance_radius];
M5_dome_screw = ["M5_dome", "M5 dome", hs_dome, 5, 9.5, 2.75, 1.56,3.0, 22, M5_washer, M5_nut, M5_tap_radius, M5_clearance_radius];
M6_dome_screw = ["M6_dome", "M6 dome", hs_dome, 6, 10.5, 3.3, 2.5,4.0, 24, M6_washer, M6_nut, M6_tap_radius, M6_clearance_radius];
M8_dome_screw = ["M8_dome", "M8 dome", hs_dome, 8, 14, 4.4, 3, 5.0, 30, M8_washer, M8_nut, M8_tap_radius, M8_clearance_radius];
M2p5_pan_screw = ["M2p5_pan", "M2.5 pan", hs_pan, 2.5, 4.7, 1.7, 0, 0, 0, M2p5_washer, M2p5_nut, M2p5_tap_radius, M2p5_clearance_radius];
M3_pan_screw = ["M3_pan", "M3 pan", hs_pan, 3, 5.4, 2.0, 0, 0, 0, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
@@ -122,7 +124,7 @@ screw_lists = [
[ 0, 0, M3_low_cap_screw],
[ 0, 0, M3_shoulder_screw, M4_shoulder_screw],
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw, M5_cs_cap_screw, M6_cs_cap_screw, M8_cs_cap_screw],
[ M2_dome_screw, M2p5_dome_screw,M3_dome_screw, M4_dome_screw, M5_dome_screw],
[ M2_dome_screw, M2p5_dome_screw,M3_dome_screw, M4_dome_screw, M5_dome_screw, M6_dome_screw, M8_dome_screw],
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
[ No2_screw, 0, No4_screw, No6_screw, No8_screw, No6_cs_screw],

View File

@@ -44,6 +44,7 @@ DiBond = [ "DiBond", "Sheet DiBond", 3, [0.2, 0.2, 0.2, 1 ],
DiBond6 = [ "DiBond6", "Sheet DiBond", 6, [0.2, 0.2, 0.2, 1 ], false];
Cardboard = [ "Cardboard", "Corrugated cardboard", 5, [0.8, 0.6, 0.3, 1 ], false];
FoilTape = [ "FoilTape", "Aluminium foil tape", 0.05,[0.9, 0.9, 0.9, 1 ], false];
Sellotape = [ "Sellotape", "Sellotape tape", 0.05,[1, 1, 0.9, 0.5 ], false];
Foam20 = [ "Foam20", "Foam sponge", 20,[0.3, 0.3, 0.3, 1 ], true];
AL1_6 = [ "AL1_6", "Aluminium tooling plate", 1.6, [0.5, 0.5, 0.5, 0.5], false];
AL2 = [ "AL2", "Aluminium tooling plate", 2, [0.9, 0.9, 0.9, 1 ], false];
@@ -59,6 +60,6 @@ CF3 = [ "CF3", "Sheet carbon fiber", 3, grey(35),
sheets = [CF1, CF2, CF3, MDF3, MDF6, MDF10, MDF12, MDF19, MDF22, PMMA1p25, PMMA2, PMMA3, PMMA6, PMMA8, PMMA10,
glass2, DiBond, DiBond6, Cardboard, FoilTape, AL1_6, AL2, AL3, AL6, AL8, Steel06, Spring08, Silicone3, Foam20];
glass2, DiBond, DiBond6, Cardboard, FoilTape, Sellotape, AL1_6, AL2, AL3, AL6, AL8, Steel06, Spring08, Silicone3, Foam20];
use <sheet.scad>

View File

@@ -55,7 +55,7 @@ function smd_size(size) = //! Convert size to 1/100" notation
module smd_led(type, colour, cutout) { //! Draw an SMD LED with specified `colour`
size = smd_led_size(type);
vitamin(str("smd_led(", type[0], ", ", colour, "): SMD LED ", smd_size(size), " ", colour));
vitamin(str("smd_led(", type[0], ", \"", colour, "\"): SMD LED ", smd_size(size), " ", colour));
lens = smd_led_lens(type);
r = size.y * 0.32;
@@ -137,7 +137,7 @@ function smd_cap_end_cap(type) = type[2]; //! End cap width
module smd_capacitor(type, height, value = undef) { //! Draw an SMD capacitor with specified height
size = smd_cap_size(type);
vitamin(str("smd_capacitor(", type[0], "): SMD capacitor ", smd_size(size), !is_undef(value) ? str(" ", value) : ""));
vitamin(str("smd_capacitor(", type[0], arg(value, undef, "value"), "): SMD capacitor ", smd_size(size), !is_undef(value) ? str(" ", value) : ""));
cap = smd_cap_end_cap(type);
@@ -161,7 +161,7 @@ function smd_sot_lead_size(type) = type[6]; //! Lead width, foot depth, lead
function smd_sot_tab_width(type) = type[7]; //! The wide lead at the top
module smd_sot(type, value) { //! Draw an SMD transistor
vitamin(str("smd_sot(", type[0], "): ", type[0], " package ", value));
vitamin(str("smd_sot(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
size = smd_sot_size(type);
z0 = smd_sot_z(type);
@@ -197,7 +197,6 @@ module smd_sot(type, value) { //! Draw an SMD transistor
linear_extrude(eps)
resize([size.x - 4 * (z2 - z1) * tan(slant), size.y / 2])
text(value, halign = "center", valign = "center");
}
function smd_soic_size(type) = type[1]; //! Body length, width and height
@@ -208,7 +207,7 @@ function smd_soic_lead_span(type) = type[5]; //! Total span of leads
function smd_soic_lead_size(type) = type[6]; //! Lead width, foot depth, lead thickness
module smd_soic(type, value) { //! Draw an SMD SOIC
vitamin(str("smd_soic(", type[0], "): ", type[0], " package ", value));
vitamin(str("smd_soic(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
size = smd_soic_size(type);
z0 = smd_soic_z(type);
@@ -261,7 +260,7 @@ function smd_diode_leads(type) = type[4]; //! Lead extent in x, width, thicknes
function smd_diode_colour(type) = type[5]; //! Body colour
module smd_diode(type, value) { //! Draw an SMD diode
vitamin(str("smd_diode(", type[0], "): ", type[0], " package ", value));
vitamin(str("smd_diode(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
slant = 5; //! 5 degree body draft angle
size = smd_diode_size(type);
@@ -326,7 +325,7 @@ module smd_tant(type, value) { //! Draw an SMD tantalum capacitor
volts = is_undef(value) ? "" : let(c = value[3])
assert(in(codes, c), str("expected the 4th character of value to be a voltage code: ", codes, ", got ", c))
str(", ", voltages[search(c, codes)[0]], "V");
vitamin(str("smd_tant(", type[0], "): SMD Tantalum capacitor package ", type[0][len(type[0]) -1], uF, volts));
vitamin(str("smd_tant(", type[0], arg(value, undef, "value"), "): SMD Tantalum capacitor package ", type[0][len(type[0]) -1], uF, volts));
size = smd_tant_size(type);
slant = 5; //! 5 degree body draft angle
@@ -388,7 +387,7 @@ function smd_inductor_leads(type) = type[4]; //! Lead extent in x, width, thick
function smd_inductor_colour(type) = type[5]; //! Body colour
module smd_inductor(type, value) { //! Draw an SMD inductor
vitamin(str("smd_inductor(", type[0], "): ", type[0], " package ", value));
vitamin(str("smd_inductor(", type[0], " ,\"", value, "\"): ", type[0], " package ", value));
size = smd_inductor_size(type);
z0 = smd_inductor_z(type);
@@ -437,7 +436,7 @@ function smd_pot_cross(type) = type[4]; //! Cross head slot for screwdriver
function smd_pot_flat(type) = type[5]; //! Flat at the back of the wiper
module smd_pot(type, value) { //! Draw an SMD pot
vitamin(str("smd_pot(", type[0], "): ", type[0], " package ", value));
vitamin(str("smd_pot(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
size = smd_pot_size(type);
contacts = smd_pot_contacts(type);
@@ -601,7 +600,7 @@ function smd_qfp_pin_size(type) = type[5]; //! Pins dimensions
function smd_qfp_gullwing(type) = type[6]; //! Gullwing S, L, R1, R2
module smd_qfp(type, value) { //! Draw and SMD QFP package
vitamin(str("smd_qfp(", type[0], "): SMD chip: ", value, ", package : ", type[0]));
vitamin(str("smd_qfp(", type[0], ", \"", value, "\"): SMD chip: ", value, ", package : ", type[0]));
size = smd_qfp_body_size(type);
offset = size.z / 2 * tan(smd_qfp_slant(type));
@@ -652,3 +651,66 @@ module smd_qfp(type, value) { //! Draw and SMD QFP package
circle(r = pin.y, $fn = fn);
}
}
function smd_250V_fuse_size(type) = type[1]; //! Bounding box of the body
function smd_250V_fuse_z(type) = type[2]; //! Height of body above the PCB surface
function smd_250V_fuse_step(type) = type[3]; //! End cutout length, width and height
function smd_250V_fuse_base(type) = type[4]; //! Base length
module gcube(s) translate_z(s.z / 2) cube(s, center = true);
module smd_250V_fuse(type, value) { //! Draw an SMD mains fuse
size = smd_250V_fuse_size(type);
step = smd_250V_fuse_step(type);
base = smd_250V_fuse_base(type);
z = smd_250V_fuse_z(type);
vitamin(str("smd_250V_fuse(", type[0], ", \"", value, "\"): SMD fuse: ", type[0], " ", value));
color("LightYellow")
translate_z(z) {
gcube(base);
translate_z(base.z)
gcube([size.x - step.x * 2, size.y, size.z - base.z]);
for(end = [-1, 1], side = [-1,1]) {
translate([end * (size.x / 2 - step.x / 2), side * (size.y / 2 - step.y / 2)])
gcube(step);
translate([end * (size.x / 2 - step.x / 2 - eps), 0])
gcube([step.x, size.y, base.z]);
}
}
color(silver) {
contact_h = step.z - 0.2;
fuse_d = size.y - 2 * step.y;
for(end = [-1, 1])
translate([end * (size.x / 2 - step.x), 0, contact_h / 2])
rotate([90, 0, 0])
linear_extrude(size.y - 2 * step.y, center = true)
difference() {
rounded_square([step.x * 2, contact_h], 0.2, $fn = fn);
translate([-step.x * end, 0])
square([step.x * 2, contact_h], center = true);
}
translate_z(step.z - fuse_d / 2)
rotate([0, 90, 0])
linear_extrude(size.x - (2 * step.x - eps), center = true)
scale([1, size.y / fuse_d - eps])
rotate(90)
semi_circle(fuse_d / 2);
}
color("black")
translate_z(z + size.z)
linear_extrude(eps)
resize([(size.x - 2 * step.x) * 0.9, size.y / 2])
text(value, halign = "center", valign = "center");
}

View File

@@ -70,8 +70,9 @@ TANT_C = ["TANT_C", [5.8, 3.2, 2.6], 0.1, 1.3, [6.0, 2.2, 0.08, 2.9], ["#E9D769
smd_tants = [TANT_A, TANT_B, TANT_C];
IND2525 = ["IND2525", [6.75, 6.75, 2], 0.1, 1.75, [7.24, 3.2, 0.15, 4.4], grey(50)];
CDRH104 = ["CDRH104", [10.3, 10.3, 4.0], 0.1, 3.85, [10.5, 3.2, 0.15, 4.4], grey(50)];
smd_inductors = [IND2525];
smd_inductors = [IND2525, CDRH104];
TC33X1 = ["TC33X1", [3.0, 3.8, 0.5], [0.95, 0.9, 0.88, 1.5, 0.2, 0.75],[3.0, 0.1, 0.2, 1.2, 1.7, 1.2, 1, 0.5], [2.1, 0.5], 1.5];
@@ -86,4 +87,8 @@ QFP50P1200X1200X160_64N = ["QFP50P1200X1200X160_64N", [10, 10, 1.6], 12, 64, 0.5
smd_qfps = [ QFP50P1200X1200X160_64N ];
OMT250 = ["OMT250", [11, 4.6, 3.3], 0.15, [1.9,0.5, 2.7], [5.5, 4.6, 0.5]];
smd_250V_fuses = [OMT250];
use <smd.scad>

View File

@@ -17,9 +17,11 @@
// If not, see <https://www.gnu.org/licenses/>.
//
peg_spring = ["peg_spring", 6.4, 0.9, 15.5, 8, 1, false, 0, "silver"];
batt_spring = ["batt_spring", 5, 0.5, 8, 5, 1, false, 6, "silver"];
// name OD wireG len #trns clsd flat OD2 color
peg_spring = ["peg_spring", 6.4, 0.9, 15.5, 8, 1, false, 0, "silver"];
yellow_bed_spring = ["yellow_bed_spring", 8, 0.9, 20, 10, 1, false, 0, "yellow"];
batt_spring = ["batt_spring", 5, 0.5, 8, 5, 1, false, 6, "silver"];
springs = [peg_spring, batt_spring];
springs = [peg_spring, batt_spring, yellow_bed_spring];
use <spring.scad>

View File

@@ -80,7 +80,7 @@ module NEMA(type, shaft_angle = 0, jst_connector = false) { //! Draw specified N
shaft_rad = NEMA_shaft_dia(type) / 2;
cap = NEMA_cap_heights(type)[1];
cap2 = NEMA_cap_heights(type)[0];
vitamin(str("NEMA(", type[0], "): Stepper motor NEMA", round(NEMA_width(type) / 2.54), " x ", length, "mm"));
vitamin(str("NEMA(", type[0], "): Stepper motor NEMA", round(NEMA_width(type) / 2.54), " x ", length, "mm (", type[7],"x",type[8], " shaft)"));
thread_d = NEMA_thread_d(type);
corner_r = 0.9;
bore = NEMA_shaft_bore(type);

View File

@@ -26,6 +26,7 @@
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_47L80 = ["NEMA17_47L80", 42.3, 47, 53.6/2, 25, 11, 2, 5, 80, 31, [11.5, 9], 3, false, true, 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];
@@ -34,7 +35,7 @@ NEMA16_19 = ["NEMA16_19", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5
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_30, NEMA8_30BH, NEMA14_36, NEMA16_19, NEMA17_27, NEMA17_34, NEMA17_40, NEMA17_47, NEMA23_51];
stepper_motors = [NEMA8_30, NEMA8_30BH, NEMA14_36, NEMA16_19, NEMA17_27, NEMA17_34, NEMA17_40, NEMA17_47,NEMA17_47L80, NEMA23_51];
small_steppers = [];
use <stepper_motor.scad>

209
vitamins/ttrack.scad Normal file
View File

@@ -0,0 +1,209 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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/>.
//
//! T-Tracks used in woodworking jigs
//
include <../utils/core/core.scad>
use <../utils/thread.scad>
use <screw.scad>
function ttrack_width(type) = type[1]; //! Width of track section
function ttrack_height(type) = type[2]; //! Height of track section
function ttrack_opening(type) = type[3]; //! Width of the opening
function ttrack_slot_width(type) = type[4]; //! Width of the slot
function ttrack_slot_height(type) = type[5]; //! Height of the slot
function ttrack_top_thickness(type) = type[6]; //! Thickness of the top layer
function ttrack_screw_pitch(type) = type[7]; //! Distance between screws
function ttrack_screw(type) = type[8]; //! Screw used to fasten track
function ttrack_fixture(type) = type[9]; //! Fixture, such as T-bolt or Miter insert used with this track
function tbolt_description(type) = type[1]; //! Description of this t-track bolt
function tbolt_head_length(type) = type[2]; //! Head length for t-track bolt
function tbolt_head_width(type) = type[3]; //! Head width for t-track bolt
function tbolt_head_thickness(type) = type[4]; //! Head thickness for t-track bolt
function tbolt_thread(type) = type[5]; //! M thread for this bolt
function t_insert_description(type) = type[1]; //! Description of this t-track insert
function t_insert_top_width(type) = type[2]; //! Top Width of t-track insert
function t_insert_width(type) = type[3]; //! Width of t-track insert
function t_insert_height(type) = type[4]; //! Height of t-track insert
function t_insert_top_thickness(type) = type[5]; //! Top thickness for t-track insert
function t_insert_thread(type) = type[6]; //! M thread for this the screw hole in this insert
function ttrack_holes(type, length) = //! Number of holes in a rail given its `length`
floor((length - 2 * ttrack_screw_end(type)) / ttrack_screw_pitch(type)) + 1;
module ttrack(type, length, colour = "LightSlateGray") { //! Draw the specified rail
W = ttrack_width(type);
H = ttrack_height(type);
SW = ttrack_slot_width(type);
SH = ttrack_slot_height(type);
T = ttrack_top_thickness(type);
O = ttrack_opening(type);
screw=ttrack_screw(type);
vit_colour = (colour == "LightSlateGray" ? "" : str(", colour=\"", colour, "\""));
vitamin(str("ttrack(", type[0], ", ", length, vit_colour, "): T-Track ", type[0], " x ", length, "mm"));
color(colour) {
difference() {
rotate([90,0,0])
linear_extrude(length, center=true, convexity = 3)
polygon([
[ -O/2, 0 ], // left side of the opening
[ -W/2, 0 ], // left top
[ -W/2, -H ], // left bottom
[ W/2, -H ], // right bottom
[ W/2, 0 ], // right top
[ O/2, 0 ], // right side of the opening
[ O/2, -T ], // right bottom side of the opening
[ SW/2, -T ], // right top of the slot
[ SW/2, -T - SH ], // right bottom of the slot
[ -SW/2,-T - SH ], // left bottom of the slot
[ -SW/2, -T ], // left top of the slot
[ -O/2, -T ] // left bottom side of the opening
]);
ttrack_hole_positions(type, length) {
B = H - (SH + T);
screw_countersink(screw, true);
translate_z(-B/2)
cylinder(r=screw_clearance_radius(screw), h=(H-(SH+T) + 0.2), center=true);
}
}
}
}
module ttrack_assembly(type, length, colour = "LightSlateGray") {
ttrack(type, length, colour);
ttrack_hole_positions(type, length)
explode(20)
screw(ttrack_screw(type), 15);
}
module ttrack_hole_positions(type, length) { //! Position children over screw holes
P = ttrack_screw_pitch(type);
H = ttrack_height(type);
B = H - (ttrack_slot_height(type) + ttrack_top_thickness(type));
count = floor(length / P);
first = (length - count * P)/2;
c = first < P/3 ? count - 1 : count; // we don't want screws right on the edge
N = (length - c * P)/2;
for (y = [N:P:length-N])
translate([0,length/2 - y, -H + B])
children();
}
module ttrack_place_bolt(type, pos, bolt = undef) { //! Place a T-Bolt relative to the centre of the track
bolt = is_undef(bolt) ? ttrack_fixture(type) : bolt;
T = tbolt_head_thickness(bolt);
translate([0,pos,-(ttrack_top_thickness(type)/2) - T])
rotate([0,0,90])
children();
}
module ttrack_place_insert(type, pos, insert = undef) { //! Place a T-Insert relative to the centre of the track
insert = is_undef(insert) ? ttrack_fixture(type) : insert;
TT = t_insert_top_thickness(insert);
T = ttrack_top_thickness(type);
translate([0,pos,-T+TT])
rotate([0,0,90])
children();
}
module ttrack_bolt(type, length) {
L = tbolt_head_length(type);
W = tbolt_head_width(type);
T = tbolt_head_thickness(type);
distance = L - W;
D = tbolt_thread(type);
pitch = metric_coarse_pitch(D);
vitamin(str(tbolt_description(type), ":", "M", D, " x ", length, "mm"));
color(silver) {
hull()
for (x = [-1, 1])
translate([x * distance/2, 0, 0])
cylinder(d=W, h=T, center=true);
translate_z((length/2))
male_metric_thread(D, pitch, length - T, center = true, top = -1, bot = 0, solid = true, colour = undef);
}
}
module ttrack_insert(type, length, num_holes = 1, colour="LightSlateGray") {
TW = t_insert_top_width(type);
W = t_insert_width(type);
H = t_insert_height(type);
T = t_insert_top_thickness(type);
//distance = L - W;
D = t_insert_thread(type);
pitch = metric_coarse_pitch(D);
vit_colour = (colour == "LightSlateGray" ? "" : str(", colour=\"", colour, "\""));
vitamin(str("ttrack_insert(", type[0], ", ", length, ", ", num_holes, vit_colour, "):", t_insert_description(type), ", M", length, "mm, with ", num_holes, " M", D));
color(colour) {
union() {
difference() {
rotate([90,0,90]) {
linear_extrude(length, center=true, convexity=2)
polygon([
[ -TW/2, 0 ], // left top
[ -TW/2, -T ], // left centre, bottom of top
[ -W/2, -T ], // left centre
[ -W/2, -H ], // left bottom
[ W/2, -H ], // right bottom
[ W/2, -T ], // right centre
[ TW/2, -T ], // right centre, bottom of top
[ TW/2, 0 ] // right top
]);
}
ttrack_insert_hole_positions(type, length, num_holes)
translate_z(-H/2)
cylinder(h=H+1, d=t_insert_thread(type), center=true);
}
ttrack_insert_hole_positions(type, length, num_holes)
translate_z(-H/2)
female_metric_thread(D, pitch, H, center = true);
}
}
}
module ttrack_insert_hole_positions(type, length, num_holes) {
P = length / (num_holes + 1);
for (x = [P:P:length-P])
translate([length/2 - x,0,0])
children();
}

52
vitamins/ttracks.scad Normal file
View File

@@ -0,0 +1,52 @@
//
// NopSCADlib Copyright Chris Palmer 2024
// 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 <screw.scad>
// Bolts HL, HW, HT, Thread M
ttrack_bolt_M6 = [ "ttrack_bolt_M6", "T-Track Bolt M6", 18, 12, 2.5, 6 ];
ttrack_bolt_M6_small = [ "ttrack_bolt_M6_small", "T-Track Bolt M6 with small head", 18, 11, 2.5, 6 ];
ttrack_bolt_M8 = [ "ttrack_bolt_M8", "T-Track Bolt M8", 22.5, 12.6, 3, 8 ];
// Inserts
// TW, W, H, SH, Thread M
ttrack_insert_mitre_30_M6 = [ "TTrack_insert_Miter30_M6", "T-Track insert, Miter track 30mm, M6 thread", 19, 23, 7.8, 4.8, 6 ];
ttrack_insert_mitre_30_M8 = [ "TTrack_insert_Miter30_M8", "T-Track insert, Miter track 30mm, M8 thread", 19, 23, 7.8, 4.8, 8 ];
//
// Tracks
// Width, Depth, Opening, Slot width, slot height, Top thickness, Screw pitch
// W D O SW SH TT Sp
ttrack_universal_19mm = [ "ttrack_universal_19mm", 19, 9.5, 9.5, 14.2, 3.3, 2.4, 75, M3_cs_cap_screw, ttrack_bolt_M8 ];
ttrack_universal_19mm_A = [ "ttrack_universal_19mm_A", 18.7, 12.5, 8.3, 12, 7.3, 3.5, 75, M3_cs_cap_screw, ttrack_bolt_M6 ];
ttrack_universal_19mm_B = [ "ttrack_universal_19mm_B", 19, 9.5, 6.6, 11.3, 4, 2.5, 75, M3_cs_cap_screw, ttrack_bolt_M6_small ];
ttrack_mitre_30mm = [ "ttrack_mitre_30mm", 30, 12.8, 19.3, 23.6, 3.1, 5.4, 75, M4_cs_cap_screw, ttrack_insert_mitre_30_M6 ];
ttrack_mitre_36mm = [ "ttrack_mitre_36mm", 36, 13.5, 19, 23.5, 3.6, 3.6, 75, M4_cs_cap_screw ];
ttracks = [ ttrack_universal_19mm, ttrack_universal_19mm_A, ttrack_universal_19mm_B, ttrack_mitre_30mm, ttrack_mitre_36mm];
ttrack_bolts = [ ttrack_bolt_M6, ttrack_bolt_M6_small, ttrack_bolt_M8 ];
ttrack_inserts = [ ttrack_insert_mitre_30_M6, ttrack_insert_mitre_30_M8 ];
use <ttrack.scad>

View File

@@ -18,10 +18,11 @@
//
//
//! Tubing and sleeving. The internal diameter can be forced to stretch it over something.
//! Tubing and sleeving. The internal diameter can be forced to stretch it over something. A path can be specified, otherwise it is just straight with the specified length.
//
include <../utils/core/core.scad>
include <../utils/tube.scad>
include <../utils/sweep.scad>
function tubing_material(type) = type[1]; //! Material description
function tubing_od(type) = type[2]; //! Outside diameter
@@ -31,11 +32,12 @@ function tubing_colour(type) = type[4]; //! Colour
function tubing_or(type) = tubing_od(type) / 2; //! Outside radius
function tubing_ir(type) = tubing_id(type) / 2; //! Inside radius
module tubing(type, length = 15, forced_id = 0, center = true) { //! Draw specified tubing with optional forced internal diameter
module tubing(type, length = 15, forced_id = 0, center = true, path = []) { //! Draw specified tubing with optional forced internal diameter and optional path.
original_od = tubing_od(type);
original_id = tubing_id(type);
id = forced_id ? forced_id : original_id;
od = original_od + id - original_id;
length = path ? round(path_length(path)) : length;
if(tubing_material(type) == "Heatshrink sleeving")
vitamin(str("tubing(", type[0], arg(length, 15), "): ", tubing_material(type), " ID ", original_id, "mm x ",length, "mm"));
else
@@ -45,9 +47,19 @@ module tubing(type, length = 15, forced_id = 0, center = true) { //! Draw specif
woven_tube(od / 2, id /2, center = center, length, colour = tubing_colour(type));
else
color(tubing_colour(type))
linear_extrude(length, center = center, convexity = 4)
difference() {
circle(d = od);
circle(d = id);
}
if(path)
render_if(manifold)
difference() {
sweep(path, circle_points(od / 2));
start = path[0] - eps * unit(path[1] - path[0]);
n = len(path) - 1;
end = path[n] + eps * unit(path[n] - path[n - 1]);
sweep(concat([start], path, [end]), circle_points(id / 2));
}
else
linear_extrude(length, center = center, convexity = 4)
difference() {
circle(d = od);
circle(d = id);
}
}

View File

@@ -23,7 +23,7 @@
//! If a washer is given a child, usually a screw or a nut, then it is placed on its top surface.
//
include <../utils/core/core.scad>
include <../utils/sweep.scad>
use <../utils/sweep.scad>
soft_washer_colour = grey(20);
hard_washer_colour = grey(85);

View File

@@ -44,23 +44,62 @@ function cable_is_ribbon(cable) = len(cable) > 2 && cable[2]; //! Is a ribbon ca
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
function cable_merge(cable1, cable2) = //! Combine the wires of two cables
assert(cable_wire_size(cable1) == cable_wire_size(cable2))
assert(cable_is_ribbon(cable1) == cable_is_ribbon(cable2))
cable(cable_wires(cable1) + cable_wires(cable2),
cable_wire_size(cable1),
concat(cable_wire_colours(cable1), cable_wire_colours(cable1)),
cable_is_ribbon(cable1));
// 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>.
// numbers from https://en.wikipedia.org/wiki/Circle_packing_in_a_circle
function cable_radius(cable) = [ //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
0, 1, 2,
2.154, // 3
2.414, // 4
2.701, // 5
3, // 6
3, // 7
3.304, // 8
3.613, // 9
3.813, // 10
3.923, // 11
4.029, // 12
4.236, // 13
4.328, // 14
4.521, // 15
4.615, // 16
4.792, // 17
4.863, // 18
4.863, // 19
5.122, // 20
][cable_wires(cable)] * cable_wire_size(cable) / 2;
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) = //! 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);
[[0, 0], // 0
[1, 1], // 1
[2, 1], // 2
[2, 1 + sin(60)], // 3
[2, 2], // 4
[3, 1 + sin(60)], // 5
[3, 2], // 6
[4, 1 + sin(60)], // 7
[3, 2 + sin(60)], // 8
[3, 3]
][cable_wires(cable)]) * cable_wire_size(cable);
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
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : wires <= 7 ? ceil(wires / 2) : min(wires, 3),
middle = min(wires - bottom, 3),
top = wires - bottom - middle
)
[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)]
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
for(i = [middle - 1 : -1 : 0]) [i - (middle - 1) / 2, middle == bottom ? 1.5 : 0.5 + sin(60)],
for(i = [0 : 1 : top - 1]) [i - [0.5, 0.5, 1][top - 1], top == middle ? 2.5 : 1.5 + sin(60)]
] * cable_wire_size(cable);
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip