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

Compare commits

...

97 Commits

Author SHA1 Message Date
Chris Palmer
117fb626e7 Fixed dimension example image address. 2025-03-27 01:38:09 +00:00
Chris Palmer
0382bad566 Updated changelog. 2025-03-27 01:27:09 +00:00
Chris Palmer
b572325a8f Merge branch 'AlexVerschoot-dimensions' 2025-03-27 00:50:47 +00:00
Chris Palmer
6dc82045ff Shortened the module comments by factoring out the parameter discriptions.
Added the nut example picture.
Fixed nut picture placement.
Updated images and readme.
2025-03-27 00:50:21 +00:00
Chris Palmer
9c7e8a99c7 Merge branch 'dimensions' of https://github.com/AlexVerschoot/NopSCADlib into AlexVerschoot-dimensions 2025-03-22 23:07:20 +00:00
Alex Verschoot
c50f95a203 added some documentation to the nut 2025-03-22 21:43:54 +01:00
Alex Verschoot
49bd6e0a04 added negative offsets to test 2025-03-22 15:00:20 +01:00
Alex Verschoot
921843cc09 made negative offset work as expected (go to the opposite side, and use min instead of max on ccordinates) 2025-03-22 14:58:12 +01:00
Alex Verschoot
c17cc1321b Changed the module comments style 2025-03-19 21:42:34 +01:00
Alex Verschoot
9862b3c3a3 typos 2025-03-16 18:50:51 +01:00
Alex Verschoot
e87e19aa18 removed center from experiment 2025-03-16 18:43:26 +01:00
Alex Verschoot
4f68935b5b some cleanup 2025-03-16 18:23:15 +01:00
Alex Verschoot
8992cce7a6 added argument for text size, and improve auto size 2025-03-15 22:19:12 +01:00
Alex Verschoot
106666ec49 simplified the math to use rotates instead, added examples, and allowed the user to choose witch plane the x,y and z dimensions are in 2025-03-15 21:28:33 +01:00
Alex Verschoot
f731f0fe98 added a function to rotate around the dim axis 2025-03-13 22:53:21 +01:00
Alex Verschoot
3a62198183 replaced the new math functions with rotate and transform 2025-03-13 22:37:53 +01:00
Alex Verschoot
0123885711 Improved text alligment 2025-03-07 22:07:53 +01:00
Alex Verschoot
b166ec47dd Remove old commented code from dimension.scad 2025-03-02 23:07:17 +01:00
Alex Verschoot
6467de5fac Update maths.scad 2025-03-02 23:01:20 +01:00
Alex Verschoot
dc683ed701 added dimensions 2025-03-02 20:18:17 +01:00
Chris Palmer
99d6c2f891 Updated changelog. 2025-02-22 12:20:23 +00:00
Chris Palmer
fc49e8068e Merge branch 'AlexVerschoot-master' 2025-02-22 12:18:10 +00:00
Chris Palmer
862357279a Updated images and readme. 2025-02-22 12:17:07 +00:00
Alex Verschoot
0b8ad93dc5 made the test cases work with the motor in the back 2025-02-16 12:23:20 +01:00
Alex Verschoot
38890400ac added new test cases for motor in the back 2025-02-16 12:22:47 +01:00
Alex Verschoot
9974c03fc9 improved the comments 2025-02-15 16:29:23 +01:00
Alex Verschoot
0208965684 added an option to emplace the motor in the back 2025-02-15 16:25:19 +01:00
Chris Palmer
11e0cfcb43 Updated changelog. 2025-01-22 01:34:04 +00:00
Chris Palmer
6c4d5de350 Merge branch 'loekwous-feature/add-blackpill-pcb' 2025-01-22 01:28:57 +00:00
Chris Palmer
8458e432fc Updated images and readme. 2025-01-22 01:28:39 +00:00
Chris Palmer
7503e8c2cf Merge branch 'feature/add-blackpill-pcb' of https://github.com/loekwous/NopSCADlib into loekwous-feature/add-blackpill-pcb 2025-01-22 00:11:47 +00:00
Chris Palmer
0154b2a32c Added Sparkfun 9DOF_stick PCB. 2025-01-21 14:45:22 +00:00
Chris Palmer
0b802187bb Corrected the chip number on ZC_A0591 pcb. 2025-01-21 14:31:22 +00:00
Chris Palmer
923c3b5c57 Avoid makeing empty folders for dxfs, stls or png if there are no parts of that type. 2025-01-21 14:22:50 +00:00
loekwous
e11bb72814 Added Black pill pcb 2025-01-01 19:29:08 +01:00
Chris Palmer
70fd7fbe14 Updated changelog. 2024-10-20 12:21:16 +01:00
Chris Palmer
45e7962721 Merge branch 'mmuman-micro-rocker' 2024-10-20 12:19:19 +01:00
Chris Palmer
4d8911718c Updated images and readme. 2024-10-20 12:18:52 +01:00
François Revol
cb57b25b0b Add 10x15 micro rocker switches
Spades are not exact but close enough.
2024-10-20 01:03:09 +02:00
Chris Palmer
6deaa5da9c Updated changelog. 2024-10-17 16:24:27 +01:00
Chris Palmer
9820d3eb10 Merge branch 'mmuman-rect-leds' 2024-10-17 16:22:01 +01:00
Chris Palmer
066242af58 Updated images and readme. 2024-10-17 16:19:29 +01:00
Chris Palmer
4b3468f78d Fixed LED bezels to cope with square LEDs. 2024-10-17 16:17:47 +01:00
Chris Palmer
001ea2a174 Fixed LED bezel test. 2024-10-17 16:17:17 +01:00
Chris Palmer
8e9d2dd367 Fixed LED test. 2024-10-17 16:16:47 +01:00
François Revol
f4a7065e1f Add rectangular LEDs
As per https://www.futurlec.com/LED/Red_2x5mm_LED.shtml
2024-10-17 13:36:18 +02:00
Chris Palmer
5ec0c6132d Updated changelog. 2024-10-10 00:33:29 +01:00
Chris Palmer
cef7560947 Merge branch 'nerdyjan-master' 2024-10-10 00:30:47 +01:00
Chris Palmer
7ffff8b7b7 Updated images and readme. 2024-10-10 00:29:58 +01:00
Chris Palmer
e001cc46a3 Restored Lumintop colour to white and made text black on white batteries. 2024-10-10 00:14:58 +01:00
Jan Giebels
7b421570b4 corrected c&p error 2024-10-08 18:47:59 +02:00
Jan Giebels
49ba60f159 added L4680, L32700, L16340 Li-Ion/LiFePo4 batteries 2024-10-08 18:40:54 +02:00
Chris Palmer
0989a02d95 Updated changelog. 2024-10-07 17:51:27 +01:00
Chris Palmer
9e45dbad04 Fixed incorrect parameters passed to tube() in ht_pipe().
Fixed lib.scad to include ht_pipes.scad instead of using it.
2024-10-07 17:50:20 +01:00
Chris Palmer
8cdc04b87b Updated changelog. 2024-10-07 09:05:28 +01:00
Chris Palmer
f65fe59831 Restored 30mm tube section on the bottom of the pipe fitting. 2024-10-07 09:04:01 +01:00
Chris Palmer
5761368e56 Updated changelog. 2024-10-06 23:01:41 +01:00
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
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
81 changed files with 1920 additions and 237 deletions

View File

@@ -3,6 +3,168 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [v21.35.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.35.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.34.0...v21.35.0 "diff with v21.34.0")
* 2025-03-27 [`6dc8204`](https://github.com/nophead/NopSCADlib/commit/6dc82045fffeca383381724abb6d70d7025b2ae5 "show commit") [C.P.](# "Chris Palmer") Shortened the module comments by factoring out the parameter descriptions.
Added the nut example picture.
Fixed nut picture placement.
Updated images and readme.
* 2025-03-22 [`c50f95a`](https://github.com/nophead/NopSCADlib/commit/c50f95a203ead9070407fbae7d1247a00938b255 "show commit") [A.V.](# "Alex Verschoot") added some documentation to the nut
* 2025-03-22 [`49bd6e0`](https://github.com/nophead/NopSCADlib/commit/49bd6e0a04885cf5cad7655aee038e16dc0a7e15 "show commit") [A.V.](# "Alex Verschoot") added negative offsets to test
* 2025-03-22 [`921843c`](https://github.com/nophead/NopSCADlib/commit/921843cc09e7ae2953090c30e7d5b9c644e3b966 "show commit") [A.V.](# "Alex Verschoot") made negative offset work as expected (go to the opposite side, and use min instead of max on coordinates)
* 2025-03-19 [`c17cc13`](https://github.com/nophead/NopSCADlib/commit/c17cc1321bcd06af439519435734f6e0eb8f5d43 "show commit") [A.V.](# "Alex Verschoot") Changed the module comments style
* 2025-03-16 [`9862b3c`](https://github.com/nophead/NopSCADlib/commit/9862b3c3a347fac5bb355b1d62a02bdc0970221b "show commit") [A.V.](# "Alex Verschoot") typos
* 2025-03-16 [`e87e19a`](https://github.com/nophead/NopSCADlib/commit/e87e19aa182acee64e3d47c282c81b7ef495bf81 "show commit") [A.V.](# "Alex Verschoot") removed `center` from experiment
* 2025-03-16 [`4f68935`](https://github.com/nophead/NopSCADlib/commit/4f68935b5b56b7405eb6c1e0fae5845e8f800489 "show commit") [A.V.](# "Alex Verschoot") some cleanup
* 2025-03-15 [`8992cce`](https://github.com/nophead/NopSCADlib/commit/8992cce7a62d2fec956aae64236ba19dc340603f "show commit") [A.V.](# "Alex Verschoot") added argument for text size, and improve auto size
* 2025-03-15 [`106666e`](https://github.com/nophead/NopSCADlib/commit/106666ec493f6b088ee398b276e8734d0790a451 "show commit") [A.V.](# "Alex Verschoot") simplified the math to use rotates instead, added examples, and allowed the user to choose witch plane the x,y and z dimensions are in
* 2025-03-13 [`f731f0f`](https://github.com/nophead/NopSCADlib/commit/f731f0fe98a3a3d975c34cd85ac4f618c2f1bf6b "show commit") [A.V.](# "Alex Verschoot") added a function to rotate around the dim axis
* 2025-03-13 [`3a62198`](https://github.com/nophead/NopSCADlib/commit/3a62198183b6a1dce74479ae44e00b4d5e690431 "show commit") [A.V.](# "Alex Verschoot") replaced the new math functions with rotate and transform
* 2025-03-07 [`0123885`](https://github.com/nophead/NopSCADlib/commit/012388571185c674293ba17de39e0db59a775ff4 "show commit") [A.V.](# "Alex Verschoot") Improved text alligment
* 2025-03-02 [`b166ec4`](https://github.com/nophead/NopSCADlib/commit/b166ec47dd7e34e6798c1287d0ce8612a84e9be1 "show commit") [A.V.](# "Alex Verschoot") Remove old commented code from `dimension.scad`
* 2025-03-02 [`6467de5`](https://github.com/nophead/NopSCADlib/commit/6467de5facdc2a5b6ccdbdbe32f703ba3faa70f4 "show commit") [A.V.](# "Alex Verschoot") Update `maths.scad`
* 2025-03-02 [`dc683ed`](https://github.com/nophead/NopSCADlib/commit/dc683ed701b016a1c79800db2ed41aed9cf8cac6 "show commit") [A.V.](# "Alex Verschoot") added dimensions
### [v21.34.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.34.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.33.0...v21.34.0 "diff with v21.33.0")
* 2025-02-22 [`8623572`](https://github.com/nophead/NopSCADlib/commit/862357279a98c9511e2db166585065c660eb331d "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2025-02-16 [`0b8ad93`](https://github.com/nophead/NopSCADlib/commit/0b8ad93dc5c1ed89c6525e846c02f756bfbe9b2b "show commit") [A.V.](# "Alex Verschoot") made the test cases work with the motor in the back
* 2025-02-16 [`3889040`](https://github.com/nophead/NopSCADlib/commit/38890400ac03c64635674412e621236ab28f0314 "show commit") [A.V.](# "Alex Verschoot") added new test cases for motor in the back
* 2025-02-15 [`9974c03`](https://github.com/nophead/NopSCADlib/commit/9974c03fc9c1ca0f67ce27fa5ea5f69c94d416ba "show commit") [A.V.](# "Alex Verschoot") improved the comments
* 2025-02-15 [`0208965`](https://github.com/nophead/NopSCADlib/commit/0208965684441bb2022fe2b513aa8ee28ce22f41 "show commit") [A.V.](# "Alex Verschoot") added an option to emplace the motor in the back
### [v21.33.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.33.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.32.1...v21.33.0 "diff with v21.32.1")
* 2025-01-22 [`8458e43`](https://github.com/nophead/NopSCADlib/commit/8458e432fcb472c0b2f7c880f9c06ea7d4f7511f "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2025-01-01 [`e11bb72`](https://github.com/nophead/NopSCADlib/commit/e11bb72814010692e22f0cbe891c77fac0bcebfe "show commit") [L.](# "loekwous") Added Black pill pcb
* 2025-01-21 [`0154b2a`](https://github.com/nophead/NopSCADlib/commit/0154b2a32ce6cd9fd0a5e8cd69e1b26f0358f816 "show commit") [C.P.](# "Chris Palmer") Added Sparkfun `9DOF_stick` PCB.
#### [v21.32.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.32.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.32.0...v21.32.1 "diff with v21.32.0")
* 2025-01-21 [`0b80218`](https://github.com/nophead/NopSCADlib/commit/0b802187bb56726e84128df9ccb46c9a830e7dbc "show commit") [C.P.](# "Chris Palmer") Corrected the chip number on `ZC_A0591` pcb.
* 2025-01-21 [`923c3b5`](https://github.com/nophead/NopSCADlib/commit/923c3b5c573cde6f9bc4611e6bf0e5cc2922443e "show commit") [C.P.](# "Chris Palmer") Avoid making empty folders for dxfs, stls or png if there are no parts of that type.
### [v21.32.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.32.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.31.0...v21.32.0 "diff with v21.31.0")
* 2024-10-20 [`4d89117`](https://github.com/nophead/NopSCADlib/commit/4d8911718c54fdee5054d934c4aeeee34386d7f9 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2024-10-17 [`cb57b25`](https://github.com/nophead/NopSCADlib/commit/cb57b25b0bbe23b5f5a7f5c910dbdd3cf53530dd "show commit") [F.R.](# "Fran<61>ois Revol") Add 10x15 micro rocker switches
* Spades are not exact but close enough.
### [v21.31.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.31.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.30.0...v21.31.0 "diff with v21.30.0")
* 2024-10-17 [`066242a`](https://github.com/nophead/NopSCADlib/commit/066242af588446037fc69606388ccc65d9884ad6 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2024-10-17 [`4b3468f`](https://github.com/nophead/NopSCADlib/commit/4b3468f78d998fbd2e849d10bdc63dd3aeadc72a "show commit") [C.P.](# "Chris Palmer") Fixed LED bezels to cope with square LEDs.
* 2024-10-17 [`001ea2a`](https://github.com/nophead/NopSCADlib/commit/001ea2a174dbc4395636fb325628a53874e59943 "show commit") [C.P.](# "Chris Palmer") Fixed LED bezel test.
* 2024-10-17 [`8e9d2dd`](https://github.com/nophead/NopSCADlib/commit/8e9d2dd367015403aa542b16fa384d08856e8401 "show commit") [C.P.](# "Chris Palmer") Fixed LED test.
* 2024-10-17 [`f4a7065`](https://github.com/nophead/NopSCADlib/commit/f4a7065e1f1198add4e50754343fd0d97954e239 "show commit") [F.R.](# "Fran<61>ois Revol") Add rectangular LEDs
* As per `https://www.futurlec.com/LED/Red_2x5mm_LED.shtml`
### [v21.30.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.30.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.29.2...v21.30.0 "diff with v21.29.2")
* 2024-10-10 [`7ffff8b`](https://github.com/nophead/NopSCADlib/commit/7ffff8b7b7e111400dd7e3cb8e96bc95471a8ffa "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2024-10-10 [`e001cc4`](https://github.com/nophead/NopSCADlib/commit/e001cc46a34206801c7e1a474634b9b1f83dfc9a "show commit") [C.P.](# "Chris Palmer") Restored Lumintop colour to white and made text black on white batteries.
* 2024-10-08 [`7b42157`](https://github.com/nophead/NopSCADlib/commit/7b421570b46136de925963321ef44cb570e868b6 "show commit") [J.G.](# "Jan Giebels") corrected c&p error
* 2024-10-08 [`49ba60f`](https://github.com/nophead/NopSCADlib/commit/49ba60f159b2c3685696fff3f1dca5a9184d2553 "show commit") [J.G.](# "Jan Giebels") added L4680, L32700, L16340 `Li-Ion/LiFePo4` batteries
#### [v21.29.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.29.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.29.1...v21.29.2 "diff with v21.29.1")
* 2024-10-07 [`9e45dba`](https://github.com/nophead/NopSCADlib/commit/9e45dbad04bb4752b9b3aceaa88ee71bb975d749 "show commit") [C.P.](# "Chris Palmer") Fixed incorrect parameters passed to `tube()` in `ht_pipe()`.
Fixed `lib.scad` to include `ht_pipes.scad` instead of using it.
#### [v21.29.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.29.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.29.0...v21.29.1 "diff with v21.29.0")
* 2024-10-07 [`f65fe59`](https://github.com/nophead/NopSCADlib/commit/f65fe598318d349a5a8764e2dbbe80acfdc0be2e "show commit") [C.P.](# "Chris Palmer") Restored 30mm tube section on the bottom of the pipe fitting.
### [v21.29.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.29.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.28.2...v21.29.0 "diff with v21.28.2")
* 2024-10-06 [`932c68a`](https://github.com/nophead/NopSCADlib/commit/932c68a2c01307fd22946b17f9419894f2de2e9f "show commit") [C.P.](# "Chris Palmer") 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 [`78e3360`](https://github.com/nophead/NopSCADlib/commit/78e3360900f61f30d5df7d53084a7e752ecd836a "show commit") [J.G.](# "Jan Giebels") changed naming of `ht_pipes` test script
* 2024-10-06 [`178f67f`](https://github.com/nophead/NopSCADlib/commit/178f67f815dca6edc65651c0b9cfb9d670c349ae "show commit") [J.G.](# "Jan Giebels") added more pipes and some cleanup
* 2024-10-06 [`af1b057`](https://github.com/nophead/NopSCADlib/commit/af1b057f597f75532b17f042e7711337731aa0c3 "show commit") [J.G.](# "Jan Giebels") added info and description
* 2024-10-06 [`195917a`](https://github.com/nophead/NopSCADlib/commit/195917a8790926515a6fffb2a02d7154855de568 "show commit") [J.G.](# "Jan Giebels") added HT pipes to lib
* 2024-10-06 [`9ed6aab`](https://github.com/nophead/NopSCADlib/commit/9ed6aab6c8cfd1a647f5eae2eac8d74832328065 "show commit") [J.G.](# "Jan Giebels") added test script and some more HT pipes
* 2024-10-05 [`c61386c`](https://github.com/nophead/NopSCADlib/commit/c61386caf937840e9a07e348b3ad96af71820dd2 "show commit") [J.G.](# "Jan Giebels") added HT waterpipes
* 2024-10-02 [`549dbc9`](https://github.com/nophead/NopSCADlib/commit/549dbc9380f39f8521554963f2051c3f05f5495f "show commit") [G.L.](# "Greg Land") Relative paths for vitamin `rod_end` includes
#### [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

BIN
docs/sliding_t_nut.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -41,6 +41,7 @@ include <vitamins/fastons.scad>
include <vitamins/gear_motors.scad>
include <vitamins/geared_steppers.scad>
include <vitamins/hot_ends.scad>
include <vitamins/ht_pipes.scad>
include <vitamins/inserts.scad>
include <vitamins/ldrs.scad>
include <vitamins/leadnuts.scad>
@@ -58,6 +59,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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1002 KiB

After

Width:  |  Height:  |  Size: 1018 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>
@@ -156,7 +157,7 @@ cable_grommets_y = 0;
translate([x5, cable_grommets_y])
cable_grommets();
translate([x5, cable_grommets_y + 30])
translate([x5, cable_grommets_y + 45])
led_bezels();
translate([x5 + 50, cable_grommets_y])
@@ -178,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])
@@ -223,7 +224,7 @@ translate([950, box_y])
inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 140;
washers_y = nuts_y + 160;
screws_y = washers_y + 120;
threaded_inserts_y = screws_y + 180;
circlips_y = threaded_inserts_y + 30;
@@ -293,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();
@@ -306,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])
@@ -362,9 +366,12 @@ components_y = toggles_y + 40;
translate([x2, leds_y])
leds();
translate([x2 + 35, leds_y])
translate([x2 + 55, leds_y])
ldrs();
translate([x2 + 87, leds_y])
fuseholders();
translate([x2 + 8, carriers_y])
carriers();
@@ -374,9 +381,6 @@ translate([x2, magnets_y])
translate([x2 + 20, carriers_y])
led_meters();
translate([x2 + 70, leds_y])
fuseholders();
translate([x2, spades_y])
spades();
@@ -402,15 +406,17 @@ 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;
hot_ends_y = blowers_y + 90;
batteries_y = hot_ends_y + 65;
panel_meters_y = batteries_y + 70;
extrusions_y = panel_meters_y + 100;
extrusions_y = panel_meters_y + 130;
box_sections_y = extrusions_y + 70;
translate([x3, veroboard_y])
veroboard_test();
@@ -421,10 +427,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])
@@ -454,7 +460,7 @@ translate([x3, ssrs_y]) {
translate([x3, blowers_y])
blowers();
translate([x3, batteries_y])
translate([x2, batteries_y])
batteries();
translate([x3 + 10, hot_ends_y])
@@ -466,6 +472,9 @@ translate([x2, panel_meters_y])
translate([x2, extrusions_y])
extrusions();
translate([x2, box_sections_y])
box_sections();
translate([370, transformers_y])
transformers();
@@ -482,7 +491,6 @@ extrusion_brackets_y = rails_y + 250;
sk_brackets_y = extrusion_brackets_y + 80;
kp_pillow_blocks_y = sk_brackets_y + 60;
bearing_blocks_y = kp_pillow_blocks_y + 60;
box_sections_y = batteries_y;
BLDC_y = bearing_blocks_y + 180;
pot_y = bearing_blocks_y;
cable_strip_y = sheets_y + 30;
@@ -534,8 +542,5 @@ translate([x4, BLDC_y])
translate([x4, pot_y])
potentiometers();
translate([x2, box_sections_y])
box_sections();
translate([x6, 125])
light_strips();

View File

@@ -40,32 +40,72 @@ function led_bezel_hole_r(type) = //! Panel hole radius
module led_bezel(type) { //! Makes the STL for the bezel
led = led_bezel_led(type);
stl(str(led[0],"_bezel")) {
rl = led_diameter(led) / 2;
rr = led_rim_dia(led) / 2;
wall = led_bezel_wall(type);
poly_tube(or = rr + wall + led_bezel_flange(type), ir = rl, h = led_bezel_flange_t(type)); // Flange
poly_tube(or = rl + wall, ir = rl, h = led_height(led) - rl - led_rim_t(led)); // Tube up to LED flange
poly_tube(or = corrected_radius(rr) + wall, ir = rr, h = led_bezel_height(type)); // Tube beyond the flange
if(is_num(led_diameter(led))) {
rl = led_diameter(led) / 2;
rr = led_rim_dia(led) / 2;
poly_tube(or = rr + wall + led_bezel_flange(type), ir = rl, h = led_bezel_flange_t(type)); // Flange
poly_tube(or = rl + wall, ir = rl, h = led_height(led) - rl - led_rim_t(led)); // Tube up to LED flange
poly_tube(or = corrected_radius(rr) + wall, ir = rr, h = led_bezel_height(type)); // Tube beyond the flange
}
else {
linear_extrude(led_bezel_flange_t(type)) // Flange
difference() {
offset(wall + led_bezel_flange(type))
square(led_rim_dia(led), true);
square(led_diameter(led), true);
}
linear_extrude(led_height(led) - led_rim_t(led)) // Tube up to the LED flange
difference() {
offset(wall)
square(led_diameter(led), true);
square(led_diameter(led), true);
}
linear_extrude(led_bezel_height(type)) // Tube beyond the LED flange
difference() {
offset(wall)
square(led_rim_dia(led), true);
square(led_rim_dia(led), true);
}
}
}
}
module led_bezel_retainer(type) { //! Makes the STL for the retaining ring
led = led_bezel_led(type);
stl(str(led[0],"_bezel_retainer")) {
ir = led_bezel_r(type);
poly_tube(or = ir + led_bezel_wall(type), ir = ir, h = 4);
wall = led_bezel_wall(type);
if(is_num(led_diameter(led))) {
ir = led_bezel_r(type);
poly_tube(or = ir + wall, ir = ir, h = 4);
}
else
linear_extrude(4)
difference() {
offset(2 * wall)
square(led_rim_dia(led), true);
offset(wall)
square(led_rim_dia(led), true);
}
}
}
module led_bezel_assembly(type, colour = "red") {//! Led bezel with LED
led = led_bezel_led(type);
d = led_diameter(led);
assembly(str(led[0], "_", colour, "_bezel")) {
translate_z(led_bezel_flange_t(type)) {
vflip()
stl_colour(pp1_colour)
led_bezel(type);
translate_z(-led_height(led) + led_diameter(led) / 2)
translate_z(-led_height(led) + (is_num(d) ? d / 2 : 0))
explode(-20)
led(led, colour);
}

357
readme.md
View File

@@ -25,30 +25,31 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
<tr><td> <a href = "#antennas">Antennas</a> </td><td> <a href = "#inserts">Inserts</a> </td><td> <a href = "#rails">Rails</a> </td><td> <a href = "#butt_box">Butt_box</a> </td><td> <a href = "#bezier">Bezier</a> </td><td> <a href = "#clip">Clip</a> </td></tr>
<tr><td> <a href = "#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 = "#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 = "#toggles">Toggles</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#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 = "#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 = "#ttracks">Ttracks</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 = "#tubings">Tubings</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 = "#variacs">Variacs</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 = "#veroboard">Veroboard</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 = "#washers">Washers</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 = "#wire">Wire</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></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 = "#dimension">Dimension</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 = "#rod_ends">Rod_ends</a> </td><td> <a href = "#carriers">Carriers</a> </td><td> <a href = "#dogbones">Dogbones</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 = "#fillet">Fillet</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 = "#gears">Gears</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 = "#hanging_hole">Hanging_hole</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 = "#horiholes">Horiholes</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 = "#layout">Layout</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 = "#maths">Maths</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 = "#offset">Offset</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 = "#pcb_utils">PCB_utils</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 = "#quadrant">Quadrant</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 = "#round">Round</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_cylinder">Rounded_cylinder</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_polygon">Rounded_polygon</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 = "#rounded_triangle">Rounded_triangle</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 = "#sector">Sector</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 = "#splines">Splines</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 = "#sweep">Sweep</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 = "#thread">Thread</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> <a href = "#tube">Tube</a> </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>
@@ -271,6 +275,7 @@ exposing enough information to make a battery box.
| `battery_neg_dia(type)` | Negative terminal diameter |
| `battery_pos_dia(type)` | Positive terminal diameter |
| `battery_pos_height(type)` | Positive terminal height above the casing |
| `battery_type(type)` | Battery type |
| `battery_usb_offset(type)` | USB connector offset from the top |
| `contact_height(type)` | Height of the flat part |
| `contact_neg(type)` | Negative spring height above the plate when compressed and the spring type |
@@ -292,8 +297,8 @@ exposing enough information to make a battery box.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 7 | `battery_contact(bcontact, false)` | Battery negative contact |
| 7 | `battery_contact(bcontact, true)` | Battery positive contact |
| 10 | `battery_contact(bcontact, false)` | Battery negative contact |
| 10 | `battery_contact(bcontact, true)` | Battery positive contact |
| 1 | `battery(A23CELL)` | Cell A23 12v |
| 1 | `battery(AACELL)` | Cell AA |
| 1 | `battery(AAACELL)` | Cell AAA |
@@ -301,6 +306,9 @@ exposing enough information to make a battery box.
| 1 | `battery(DCELL)` | Cell D |
| 1 | `battery(LUMINTOP)` | Cell LUMINTOP 18650 LION with charger |
| 1 | `battery(S25R18650)` | Cell Samsung 25R 18650 LION |
| 1 | `battery(L16340)` | Li-Ion/LiFePo4 16340 3.2v |
| 1 | `battery(L32700)` | Li-Ion/LiFePo4 32700 3.2v |
| 1 | `battery(L4680)` | Li-Ion/LiFePo4 4680 3.2v |
<a href="#top">Top</a>
@@ -1002,9 +1010,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>
@@ -1585,6 +1595,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>
---
@@ -2009,6 +2112,7 @@ Standard domed through hole LEDs. Can specify colour and lead length.
| 1 | `led(LED3mm, "green")` | LED 3 mm green |
| 1 | `led(LED5mm, "blue")` | LED 5 mm blue |
| 1 | `led(LED8mm)` | LED 8 mm red |
| 1 | `led(LED5x2mm, "green")` | LED [5, 2] mm green |
<a href="#top">Top</a>
@@ -2356,6 +2460,10 @@ Default is steel but can be drawn as brass or nylon. A utility for making nut tr
If a nut is given a child then it gets placed on its top surface.
The following diagram shows you the parameters for drawing a sliding_t_nut:
![](docs/sliding_t_nut.png)
[vitamins/nuts.scad](vitamins/nuts.scad) Object definitions.
[vitamins/nut.scad](vitamins/nut.scad) Implementation.
@@ -2374,6 +2482,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 |
@@ -2393,7 +2503,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)
@@ -2436,6 +2548,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 |
@@ -2668,7 +2782,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 |
@@ -2704,6 +2820,7 @@ 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 |
@@ -2869,6 +2986,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `pcb(BTT_SKR_E3_TURBO)` | BigTreeTech SKR E3 Turbo |
| 1 | `pcb(BTT_SKR_MINI_E3_V2_0)` | BigTreeTech SKR Mini E3 v2.0 |
| 1 | `pcb(BTT_SKR_V1_4_TURBO)` | BigTreeTech SKR v1.4 Turbo |
| 1 | `pcb(BlackPill)` | Black Pill |
| 1 | | Cat 5 patch cable 300mm |
| 1 | `d_plug(DCONN15, pcb = true)` | D-type 15 way PCB mount plug - not shown |
| 1 | `pcb(DuetE)` | Duet 2 Ethernet electronics |
@@ -2896,7 +3014,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `molex_254(3)` | Molex KK header 3 way - not shown |
| 20 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
| 38 | `nut(M2p5_nut, nyloc = true)` | Nut M2.5 x 2.2mm nyloc |
| 47 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
| 48 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
| 8 | `nut(M4_nut, nyloc = true)` | Nut M4 x 3.2mm nyloc |
| 1 | `pcb(OPZ2)` | Orange Pi Zero 2 |
| 1 | `pcb(PI_IO)` | PI_IO V2 - not shown |
@@ -2920,17 +3038,19 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 4 | `screw(M2_cap_screw, 25)` | Screw M2 cap x 25mm |
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
| 12 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
| 8 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
| 4 | `screw(M2p5_cap_screw, 40)` | Screw M2.5 cap x 40mm |
| 4 | `screw(M2p5_dome_screw, 25)` | Screw M2.5 dome x 25mm |
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
| 8 | `screw(M2p5_pan_screw, 30)` | Screw M2.5 pan x 30mm |
| 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 |
| 5 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
| 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 |
| 1 | `pcb(9DOF_stick)` | Sparkfun 9 degrees of freedom IMU |
| 1 | `pcb(TP4056)` | TP4056 Li-lon Battery charger module |
| 3 | `terminal_35(2)` | Terminal block 2 way 3.5mm - not shown |
| 2 | `green_terminal(gt_2p54, 4)` | Terminal block 4 way 0.1" - not shown |
@@ -2939,7 +3059,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `pcb(WD2002SJ)` | WD2002SJ Buck Boost DC-DC converter |
| 20 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
| 38 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
| 47 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 48 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 8 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
| 1 | `pcb(ZC_A0591)` | ZC-A0591 ULN2003 driver PCB |
@@ -2953,18 +3073,18 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 4 | pcb_spacer2090.stl |
| 2 | pcb_spacer25110.stl |
| 4 | pcb_spacer25140.stl |
| 4 | pcb_spacer25170.stl |
| 4 | pcb_spacer25180.stl |
| 4 | pcb_spacer25190_2.stl |
| 4 | pcb_spacer25190.stl |
| 4 | pcb_spacer25200_2.stl |
| 4 | pcb_spacer25240.stl |
| 4 | pcb_spacer25210_2.stl |
| 4 | pcb_spacer25250.stl |
| 4 | pcb_spacer25260.stl |
| 4 | pcb_spacer25270.stl |
| 4 | pcb_spacer2580.stl |
| 4 | pcb_spacer30130.stl |
| 4 | pcb_spacer30210.stl |
| 5 | pcb_spacer30130.stl |
| 4 | pcb_spacer30220.stl |
| 3 | pcb_spacer30230.stl |
| 4 | pcb_spacer30230.stl |
| 3 | pcb_spacer30240.stl |
| 10 | pcb_spacer3050.stl |
| 9 | pcb_spacer3060.stl |
| 9 | pcb_spacer3070.stl |
@@ -3372,9 +3492,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 |
@@ -3386,8 +3511,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>
@@ -3411,6 +3537,15 @@ Radial components for PCBs.
| `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 |
@@ -3441,6 +3576,8 @@ Radial components for PCBs.
| 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 |
@@ -3452,7 +3589,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 |
@@ -3462,6 +3601,7 @@ 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 |
@@ -3672,6 +3812,7 @@ Rocker switch. Also used for neon indicator in the same form factor.
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 2 | `rocker(neon_indicator)` | Neon Indicator H8630FBNAL |
| 2 | `rocker(micro_rocker)` | Rocker Switch 10x15 |
| 2 | `rocker(small_rocker)` | Rocker Switch PRASA1-16F-BB0BW |
@@ -3723,6 +3864,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>
---
@@ -3856,11 +4039,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 |
@@ -4405,6 +4590,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>
@@ -4504,18 +4690,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>
@@ -6254,6 +6441,7 @@ Printed LED bezels for panel mounting
| 1 | `led(LED3mm, "yellow")` | LED 3 mm yellow |
| 1 | `led(LED5mm, "blue")` | LED 5 mm blue |
| 1 | `led(LED8mm)` | LED 8 mm red |
| 1 | `led(LED5x2mm, "yellow")` | LED [5, 2] mm yellow |
### Printed
| Qty | Filename |
@@ -6264,6 +6452,8 @@ Printed LED bezels for panel mounting
| 1 | LED3mm_bezel_retainer.stl |
| 1 | LED5mm_bezel.stl |
| 1 | LED5mm_bezel_retainer.stl |
| 1 | LED5x2mm_bezel.stl |
| 1 | LED5x2mm_bezel_retainer.stl |
| 1 | LED8mm_bezel.stl |
| 1 | LED8mm_bezel_retainer.stl |
@@ -6273,6 +6463,7 @@ Printed LED bezels for panel mounting
| 1 | LED10mm_orange_bezel_assembly |
| 1 | LED3mm_yellow_bezel_assembly |
| 1 | LED5mm_blue_bezel_assembly |
| 1 | LED5x2mm_yellow_bezel_assembly |
| 1 | LED8mm_red_bezel_assembly |
@@ -6512,8 +6703,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 |
@@ -6521,12 +6713,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 |
@@ -6535,13 +6732,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 |
@@ -7022,9 +7224,9 @@ allows flexible positioning of the motors.
### Modules
| Module | Description |
|:--- |:--- |
| `coreXY(type, size, pos, separation, x_gap = 0, plain_idler_offset = [0, 0], upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false)` | Wrapper module to draw both belts of a coreXY setup |
| `coreXY(type, size, pos, separation, x_gap = 0, plain_idler_offset = [0, 0], upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false, motor_back = false)` | Wrapper module to draw both belts of a coreXY setup |
| `coreXY_belts(type, carriagePosition, coreXYPosBL, coreXYPosTR, separation, x_gap = 0, plain_idler_offset = [0, 0], upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false)` | Draw the coreXY belts |
| `coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_offset = [0, 0], drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false)` | Draw one belt of a coreXY setup |
| `coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_offset = [0, 0], drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false, motor_back = false)` | Draw one belt of a coreXY setup |
![core_xy](tests/png/core_xy.png)
@@ -7033,12 +7235,44 @@ allows flexible positioning of the motors.
| ---:|:--- |:---|
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 728mm |
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 790mm |
| 7 | `pulley(GT2x16_toothed_idler)` | Pulley GT2 idler 16 teeth |
| 3 | `pulley(GT2x16_plain_idler)` | Pulley GT2 idler smooth 9.63mm |
| 2 | `pulley(GT2x20ob_pulley)` | Pulley GT2OB 20 teeth |
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 826mm |
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 826mm |
| 2 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 836mm |
| 15 | `pulley(GT2x16_toothed_idler)` | Pulley GT2 idler 16 teeth |
| 15 | `pulley(GT2x16_plain_idler)` | Pulley GT2 idler smooth 9.63mm |
| 6 | `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 |
| 12 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
| 6 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm (5x20 shaft) |
<a href="#top">Top</a>
---
<a name="dimension"></a>
## Dimension
Modules for adding dimensions to assembly views.
<img src="https://github.com/nophead/NopSCADlib/raw/master/docs/sliding_t_nut.png" width="500", height="378">
* If `text` is empty, will display the measured distance.
* `offset` will determine how much space is between the measured point and the dimension.
* `thickness` is the thickness of the lines, and size of the arrows, if 0, will use 0.5% of the length of the dim.
* `text_size` will determine the size of the text, if 0, will use percentage of the length of the dim.
[utils/dimension.scad](utils/dimension.scad) Implementation.
[tests/dimension.scad](tests/dimension.scad) Code for this example.
### Modules
| Module | Description |
|:--- |:--- |
| `dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim = 0)` | Creates a 3D dimension between two points. |
| `dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy")` | Creates a dimension in the x direction. Plane options : xy, xz |
| `dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy")` | Creates a dimension in the y direction. Plane options : xy, yz |
| `dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz")` | Creates a dimension in the z direction. Plane options : xz, yz |
![dimension](tests/png/dimension.png)
<a href="#top">Top</a>
@@ -7505,6 +7739,7 @@ Each vertex, apart from the first and the last, has an associated radius and the
| `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

View File

@@ -66,9 +66,16 @@ def make_parts(target, part_type, parts = None):
top_dir = set_config(target, lambda: usage(part_type))
target_dir = top_dir + part_type + 's'
deps_dir = target_dir + "/deps"
bom_dir = top_dir + "bom"
tmp_dir = mktmpdir(top_dir)
#
# Check we have some of this type
#
bom_dir = top_dir + "bom"
all_parts = bom_to_parts(bom_dir, part_type)
if not all_parts:
return
tmp_dir = mktmpdir(top_dir)
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
@@ -83,7 +90,6 @@ def make_parts(target, part_type, parts = None):
#
# Decide which files to make
#
all_parts = bom_to_parts(bom_dir, part_type)
if parts:
targets = list(parts) #copy the list so we dont modify the list passed in
else:

View File

@@ -37,19 +37,21 @@ def usage():
sys.exit(1)
def render(target, type):
#
# Make the target directory
#
top_dir = set_config(target, usage)
tmp_dir = mktmpdir(top_dir)
target_dir = top_dir + type + 's'
bom_dir = top_dir + 'bom'
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
#
# Find all the parts
#
parts = bom_to_parts(bom_dir, type)
if not parts:
return
#
# Make the target directory
#
tmp_dir = mktmpdir(top_dir)
target_dir = top_dir + type + 's'
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
#
# Read the json bom to get the colours
#

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

@@ -23,7 +23,7 @@ include <../vitamins/leds.scad>
use <../printed/led_bezel.scad>
module led_bezels()
layout([for(l = LEDs) led_diameter(l)], 6) let(l = LEDs[$i], b = led_bezel(l))
layout([for(l = LEDs) max(led_diameter(l))], 6) let(l = LEDs[$i], b = led_bezel(l))
if($preview)
led_bezel_fastened_assembly(b, 3, ["yellow", "blue", "red", "orange"][$i % 4]);
else {

View File

@@ -22,7 +22,7 @@ use <../utils/layout.scad>
include <../vitamins/leds.scad>
module leds()
layout([for(l = LEDs) led_diameter(l)], 5)
layout(echoit([for(l = LEDs) max(led_diameter(l))]), 5)
led(LEDs[$i], ["green", "blue", "red", "orange"][$i % 4]);
if($preview)

View File

@@ -134,6 +134,7 @@ test_pcb = ["test_pcb", "Test PCB",
[ 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
@@ -189,7 +190,7 @@ test_pcb = ["test_pcb", "Test PCB",
[ 52, 200, 0, "pcb", 11, TMC2130 ],
[ 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"],
@@ -197,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

@@ -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

@@ -132,5 +132,57 @@ module coreXY_belts_test() {
}
}
if ($preview)
module coreXY_motor_in_back_test1() {
size = [200,200];
pos = [100,100];
separation = [20,5,10];
coreXY(coreXY_GT2_20_16, size, pos, separation, x_gap = 0, plain_idler_offset = [0, 0], upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = true, left_lower = false, motor_back = true);
rotate([180,0,0])
translate (
[ separation.x/2
, 0
, -separation.z/2 -15 ])
NEMA(NEMA17_40);
translate (
[ size.x - separation.x/2
, 0
, -separation.z/2 - 15 ])
NEMA(NEMA17_40);
}
module coreXY_motor_in_back_test2() {
size = [200,200];
pos = [100,100];
separation = [0,5,10];
upper_drive_pulley_offset = [20, 5];
lower_drive_pulley_offset = [20, 5];
coreXY(coreXY_GT2_20_16, size, pos, separation, x_gap = 0, plain_idler_offset = [20, 0], upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = true, left_lower = false, motor_back = true);
translate (
[ size.x - separation.x/2 - lower_drive_pulley_offset.x
, lower_drive_pulley_offset.y
, -separation.z/2 - 15 ])
NEMA(NEMA17_40);
translate (
[ separation.x/2 + upper_drive_pulley_offset.x
, upper_drive_pulley_offset.y
, separation.z/2 - 25 ])
NEMA(NEMA17_40);
}
if ($preview) {
coreXY_belts_test();
translate ([-250, 0,0])
coreXY_motor_in_back_test1();
translate ([-250, -250,0])
coreXY_motor_in_back_test2();
}

79
tests/dimension.scad Normal file
View File

@@ -0,0 +1,79 @@
//
// NopSCADlib Copyright Chris Palmer 2025
// 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/dimension.scad>
module dimensions_3d_xy() {
dimension([0,0,0], [10,10,0], "", 0.2);
dimension([0,0,0], [10,-10,0], "", 0.2);
dimension([0,0,0], [-10,10,0], "");
dimension([0,0,0], [-10,-10,0], "");
dimension([0,0,0], [0,10,0], "");
dimension([0,0,0], [0,-10,0], "");
dimension([0,0,0], [10,0,0], "",rot_around_dim=0);
dimension([0,0,0], [-10,0,0], "", rot_around_dim=90);
}
module dimensions_3d_xyz() {
dimension([0,0,0], [10,10,10], "");
dimension([0,0,0], [10,-10,10], "");
dimension([0,0,0], [-10,10,10], "");
dimension([0,0,0], [-10,-10,10], "");
dimension([0,0,0], [10,10,-10], "");
dimension([0,0,0], [10,-10,-10], "");
dimension([0,0,0], [-10,10,-10], "");
dimension([0,0,0], [-10,-10,-10], "", rot_around_dim=45);
dimension([0,0,0], [-3,0,10], "");
dimension([0,0,0], [0,0,-10], "");
dimension([0,0,0], [0,2,10], "");
dimension([0,0,0], [0,2,-10], "");
}
module dimension_1d_x() {
dimension_x([12,0,0], [18,0,0]);
dimension_x([12,5,0], [18,10,0], offset = -1);
dimension_x([12,0,-5], [18,0,0], plane= "xz");
dimension_x([12,5,0], [18,10,5]);
}
module dimension_1d_y() {
dimension_y([12,0,0], [12,-5,0]);
dimension_y([12,-8,0], [18,-10,0]);
dimension_y([12,-5,0], [18,-10,5], offset = -1, plane= "yz");
}
module dimension_1d_z() {
dimension_z([20,0,5], [20,0,0]);
dimension_z([20,0,10], [20,0,0]);
dimension_z([20,0,0], [20,10,10],plane= "yz");
}
if($preview)
dimensions_3d_xy();
dimensions_3d_xyz();
dimension_1d_x();
dimension_1d_y();
dimension_1d_z();

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: 135 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 147 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: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 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: 130 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 124 KiB

BIN
tests/png/dimension.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 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

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: 113 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 82 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: 207 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 237 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: 204 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 83 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: 80 KiB

After

Width:  |  Height:  |  Size: 80 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 169 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,7 +21,9 @@ include <../vitamins/pcbs.scad>
module radials() {
pcb = PERF70x50;
$solder = pcb_solder(pcb);
pcb(pcb);
translate([0, pcb_width(pcb) + inch(0.2)]) {
pcb(pcb);
@@ -36,9 +38,17 @@ module radials() {
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])
@@ -51,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];
@@ -60,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();

162
utils/core_xy.scad Normal file → Executable file
View File

@@ -68,41 +68,61 @@ function coreXY_drive_plain_idler_offset(type) = //! Offset of plain drive idler
[ coreXY_plain_idler_offset(type).x, -(pulley_od(coreXY_plain_idler(type)) + pulley_od(coreXY_drive_pulley(type))) / 2, 0 ];
module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_offset = [0, 0], drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false) { //! Draw one belt of a coreXY setup
module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_offset = [0, 0], drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false, motor_back = false) { //! Draw one belt of a coreXY setup
// y-carriage toothed pulley
p0_type = coreXY_toothed_idler(type);
p0 = [ size.x / 2, -size.y / 2 - pulley_od(p0_type) / 2 + pos.y - separation_y / 2 ];
p0t_type = coreXY_toothed_idler(type);
p0p_type = coreXY_plain_idler(type);
p0t = [ size.x / 2, -size.y / 2 - pulley_od(p0t_type) / 2 + pos.y - separation_y / 2 ];
p0p = [ size.x / 2, -size.y / 2 - pulley_od(p0p_type) / 2 + pos.y - separation_y / 2 ];
// bottom right toothed idler pulley
p1_type = p0_type;
p1t_type = p0t_type;
p1p_type = p0p_type;
p1 = [ size.x / 2, -size.y / 2 ];
// bottom left anchor toothed idler pulley
p2_type = p0_type;
p2_type = coreXY_toothed_idler(type);
p2 = [ -size.x / 2, -size.y / 2 ];
//drive type if the motor is in the back
p2d_type = coreXY_drive_pulley(type);
p2d = [ lower_belt ? p2.x - drive_pulley_offset.x:p2.x + drive_pulley_offset.x,
p2.y + drive_pulley_offset.y
];
// plain idler for offset stepper motor if the motor is in the back
p2p_type = coreXY_plain_idler(type);
p2p = [ lower_belt ? p2.x + plain_idler_offset.x - drive_pulley_offset.x : p2.x + plain_idler_offset.x + drive_pulley_offset.x,
p2.y + plain_idler_offset.y
];
// stepper motor drive pulley
// stepper motor drive pulley if motor not in back
p3d_type = coreXY_drive_pulley(type);
p3d = [ -size.x / 2 + coreXY_drive_pulley_x_alignment(type) + drive_pulley_offset.x,
size.y / 2 + drive_pulley_offset.y
];
// toothed idler for offset stepper motor drive pulley
// toothed idler for offset stepper motor drive pulley if motor not in back
p3t_type = coreXY_toothed_idler(type);
p3t = [ -size.x / 2 + (drive_pulley_offset.x > 0 ? 0 : plain_idler_offset.x + 2 * coreXY_drive_pulley_x_alignment(type)),
p3t = [ -size.x / 2 + ((drive_pulley_offset.x > 0 || motor_back ) ? 0 : plain_idler_offset.x + 2 * coreXY_drive_pulley_x_alignment(type)),
size.y / 2 + coreXY_drive_pulley_x_alignment(type)
];
// y-carriage plain pulley
p4_type = coreXY_plain_idler(type);
p4t_type = coreXY_toothed_idler(type);
p4 = [ -size.x / 2 + pulley_od(p4_type) / 2 + pulley_od(p3d_type) / 2 + coreXY_drive_pulley_x_alignment(type) + (drive_pulley_offset.x == 0 ? 0 : plain_idler_offset.x),
-size.y / 2 + pulley_od(p4_type) / 2 + pos.y + separation_y / 2
];
p4mb = [-size.x / 2 + pulley_od(p4_type) / 2 + pulley_od(p3t_type) / 2 + coreXY_drive_pulley_x_alignment(type),
-size.y / 2 + pulley_od(p4_type) / 2 + pos.y + separation_y / 2];
// plain idler for offset stepper motor drive pulley
// plain idler for offset stepper motor drive pulley if motor not in back
p3p_type = p4_type;
p3p = [ drive_pulley_offset.x > 0 ? p4.x : -p0.x - pulley_od(p0_type),
p3p = [ drive_pulley_offset.x > 0 ? p4.x : -p0p.x - pulley_od(p0p_type),
size.y / 2 - pulley_od(p3p_type) / 2 - pulley_od(p3d_type) / 2 + plain_idler_offset.y
];
@@ -110,7 +130,7 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
start_p = [ pos.x - size.x / 2 + x_gap / 2, -size.y / 2 + pos.y - separation_y / 2, 0 ];
end_p = [ pos.x - size.x / 2 - x_gap / 2, -size.y / 2 + pos.y + separation_y / 2, 0 ];
//p6_type = p0_type;
//p6_type = p0p_type;
module show_pulleys(show_pulleys) {// Allows the pulley colour to be set for debugging
if (is_list(show_pulleys))
@@ -121,33 +141,81 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
}
show_pulleys(show_pulleys) {
translate(p0)
pulley_assembly(p0_type); // y-carriage toothed pulley
if ( !motor_back ) {
translate(p0t)
pulley_assembly(p0t_type); // y-carriage toothed pulley
translate(p1)
pulley_assembly(p1t_type); // bottom right toothed idler pulley
translate(p2)
pulley_assembly(p2_type); // bottom left anchor toothed idler pulley
translate(p3d)
hflip(hflip)
pulley_assembly(p3d_type); // top left stepper motor drive pulley
translate(p1)
pulley_assembly(p1_type); // bottom right toothed idler pulley
if (drive_pulley_offset.x ) { // idler pulleys for offset stepper motor drive pulley
translate(p3t)
pulley_assembly(p3t_type); // toothed idler
translate(p2)
pulley_assembly(p2_type); // bottom left anchor toothed idler pulley
translate(p3d)
hflip(hflip)
pulley_assembly(p3d_type); // top left stepper motor drive pulley
if (drive_pulley_offset.x) { // idler pulleys for offset stepper motor drive pulley
translate(p3t)
pulley_assembly(p3t_type); // toothed idler
translate(p3p)
pulley_assembly(p3p_type); // plain idler
translate(p3p)
pulley_assembly(p3p_type); // plain idler
}
translate(p4)
pulley_assembly(p4_type); // y-carriage plain pulley
}
translate(p4)
pulley_assembly(p4_type); // y-carriage plain pulley
else { //motor in the back
if (drive_pulley_offset.x ) { // idler pulleys for offset stepper motor drive pulley
translate(p0p)
pulley_assembly(p0p_type); // y-carriage plain pulley
translate(p1)
pulley_assembly(p1p_type); // bottom right plain idler pulley
//left bottom corner
translate(p2)
pulley_assembly(p2p_type); // plain idler
translate(p2p)
pulley_assembly(p2p_type); // plain idler
translate(p2d)
hflip(hflip)
pulley_assembly(p2d_type); // bottom left stepper motor drive pulley
translate(p3t)
pulley_assembly(p3p_type); // top left plain idler
translate(p4mb)
pulley_assembly(p4t_type); // y-carriage toothed pulley
} else {
translate(p0t)
pulley_assembly(p0t_type); // y-carriage toothed pulley
translate(p1)
pulley_assembly(p1t_type); // bottom right toothed idler pulley
//left bottom corner
// bottom left stepper motor drive pulley
translate(p2)
if(lower_belt)
hflip(hflip)
pulley_assembly(p2d_type);
else
hflip(!hflip)
pulley_assembly(p2d_type);
translate(p3t)
pulley_assembly(p3t_type); // top left toothed idler
translate(p4mb)
pulley_assembly(p4_type); // y-carriage plain pulley
}
}
}
path0a = [
[ p0.x, p0.y, pulley_od(p0_type) / 2 ],
[ p1.x, p1.y, pulley_od(p1_type) / 2 ],
[ p0p.x, p0p.y, pulley_od(p0p_type) / 2 ],
[ p1.x, p1.y, pulley_od(p1p_type) / 2 ],
[ p2.x, p2.y, pulley_od(p2_type) / 2 ]
];
path0b = [
@@ -169,8 +237,28 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
belt = coreXY_belt(type);
path0 = drive_pulley_offset.x == 0 ? concat(path0a, path0b) : drive_pulley_offset.x > 0 ? concat(path0a, path0c) : concat(path0a, path0d);
path = concat([start_p], path0, [end_p]);
path0 = drive_pulley_offset.x == 0 ? concat(path0a, path0b) : drive_pulley_offset.x > 0 ? concat(path0a, path0c) : concat(path0a, path0d);
path_mb_0a = [
[ p0p.x, p0p.y, pulley_od(p0p_type) / 2 ],
[ p1.x, p1.y, pulley_od(p1p_type) / 2 ],
[ p2.x, p2.y, pulley_od(p2d_type) / 2 ],
[ p3t.x, p3t.y, pulley_od(p3t_type) / 2 ],
[ p4mb.x, p4mb.y, -pulley_od(p4_type) / 2 ]
];
path_mb_0b = [
[ p0t.x, p0t.y, pulley_od(p0t_type) / 2 ],
[ p1.x, p1.y, pulley_od(p1p_type) / 2 ],
[ p2p.x, p2p.y, pulley_od(p2p_type) / 2 ],
[ p2d.x, p2d.y, -pulley_od(p2d_type) / 2 ],
[ p2.x, p2.y, pulley_od(p2p_type) / 2 ],
[ p3t.x, p3t.y, pulley_od(p3p_type) / 2 ],
[ p4mb.x, p4mb.y, -pulley_od(p4_type) / 2 ]
];
path_mb0 = drive_pulley_offset.x == 0 ? path_mb_0a : path_mb_0b;
path = motor_back? concat([start_p], path_mb0, [end_p]):concat([start_p], path0, [end_p]);
belt(type = belt,
points = path,
@@ -179,18 +267,18 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
tooth_colour = lower_belt ? coreXY_lower_tooth_colour(type) : coreXY_upper_tooth_colour(type));
}
module coreXY(type, size, pos, separation, x_gap = 0, plain_idler_offset = [0, 0], upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false) { //! Wrapper module to draw both belts of a coreXY setup
module coreXY(type, size, pos, separation, x_gap = 0, plain_idler_offset = [0, 0], upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false, motor_back = false) { //! Wrapper module to draw both belts of a coreXY setup
translate([size.x / 2 - separation.x / 2, size.y / 2, -separation.z / 2]) {
// lower belt
hflip(!left_lower)
explode(25)
coreXY_half(type, size, [size.x - pos.x - separation.x/2 - (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true);
coreXY_half(type, size, [size.x - pos.x - separation.x/2 - (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true, motor_back);
// upper belt
translate([separation.x, 0, separation.z])
hflip(left_lower)
explode(25)
coreXY_half(type, size, [pos.x + separation.x/2 + (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip = false);
coreXY_half(type, size, [pos.x + separation.x/2 + (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip = false, motor_back);
}
}

174
utils/dimension.scad Normal file
View File

@@ -0,0 +1,174 @@
//
// NopSCADlib Copyright Chris Palmer 2025
// 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/>.
//
//
//! Modules for adding dimensions to assembly views.
//!
//! <img src="https://github.com/nophead/NopSCADlib/raw/master/docs/sliding_t_nut.png" width="500", height="378">
//!
//! * If `text` is empty, will display the measured distance.
//! * `offset` will determine how much space is between the measured point and the dimension.
//! * `thickness` is the thickness of the lines, and size of the arrows, if 0, will use 0.5% of the length of the dim.
//! * `text_size` will determine the size of the text, if 0, will use percentage of the length of the dim.
include <../utils/core/core.scad>
include <../utils/maths.scad>
module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim = 0) { //! Creates a 3D dimension between two points.
// Compute vector between points
direction = endpoint - startpoint;
length = norm(direction);
midpoint = (startpoint + endpoint) / 2;
thickness = (thickness == 0? length/200:thickness);
// Ensure nonzero values for calculations
dir_xy = norm([direction.x, direction.y]);
// Compute rotation angles
azimuth = atan2(direction.y, direction.x);
elevation = -atan2(direction.z, dir_xy);
//end triangle size
etr_width = thickness *10;
etr_height = thickness *4;
// Draw measurement line as a thin cylinder
translate(midpoint)
rotate([0, elevation, azimuth])
rotate([0, 90, 0])
resize([thickness, thickness, length - etr_width+0.01 ])
cube(center = true);
//do some vector calculations
dir = (length > 0) ? (direction / length) * thickness * 4 : [1, 0, 0];
// Draw endpoint markers
translate(startpoint)
rotate([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,0,-thickness/2])
linear_extrude(thickness)
polygon([[etr_width, etr_height/2],[0,0],[etr_width, -etr_height/2]],[[0,1,2]]);
translate(endpoint)
rotate([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,0,-thickness/2])
linear_extrude(thickness)
polygon([[-etr_width, etr_height/2],[0,0],[-etr_width, -etr_height/2]],[[0,1,2]]);
// Draw the text/distance
translate(midpoint)
rotate([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,thickness,-thickness/2])
linear_extrude(thickness)
text(text == "" ? str(length) : text, size = (text_size == 0? length/15:text_size), valign = "bottom", halign = "center");
}
module dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Creates a dimension in the x direction. Plane options : xy, xz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
y = offset > 0 ? max(startpoint.y, endpoint.y) + (plane=="xy"?offset:0) : min(startpoint.y, endpoint.y) + (plane=="xy"?offset:0);
z = offset > 0 ? max(startpoint.z, endpoint.z) + (plane=="xz"?offset:0) : min(startpoint.z, endpoint.z) + (plane=="xz"?offset:0);
dimension([startpoint.x, y, z], [endpoint.x, y, z], text, thickness, text_size, rot_around_dim=(plane=="xz"?90:0));
v1= [startpoint.x, y, z]-startpoint;
h1 = norm(v1);
axis1 = cross([0,0,1], v1);
angle1 = atan2(norm(axis1), v1.z);
translate(startpoint)
rotate(angle1, axis1)
cylinder( h= h1+thickness*2, d=thickness);
v2= [endpoint.x, y, z]-endpoint;
h2 = norm(v2);
axis2 = cross([0,0,1], v2);
angle2 = atan2(norm(axis2), v2.z);
translate(endpoint)
rotate(angle2, axis2)
cylinder( h= h2+thickness*2, d=thickness);
}
module dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Creates a dimension in the y direction. Plane options : xy, yz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
x = offset > 0 ? max(startpoint.x, endpoint.x) + (plane=="xy"?offset:0) : min(startpoint.x, endpoint.x) + (plane=="xy"?offset:0);
z = offset > 0 ? max(startpoint.z, endpoint.z) + (plane=="yz"?offset:0) : min(startpoint.z, endpoint.z) + (plane=="yz"?offset:0);
dimension([x, startpoint.y, z], [x, endpoint.y, z], text, thickness, text_size, rot_around_dim=(plane=="yz"?90:0));
v1= [x, startpoint.y, z]-startpoint;
h1 = norm(v1);
axis1 = cross([0,0,1], v1);
angle1 = atan2(norm(axis1), v1.z);
translate(startpoint)
rotate(angle1, axis1)
rotate([offset>0?0:180,0,0])
cylinder( h= h1+thickness*2, d=thickness);
v2= [x, endpoint.y, z]-endpoint;
h2 = norm(v2);
axis2 = cross([0,0,1], v2);
angle2 = atan2(norm(axis2), v2.z);
translate(endpoint)
rotate(angle2, axis2)
rotate([offset>0?0:180,0,0])
cylinder( h= h2+thickness*2, d=thickness);
}
module dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz") { //! Creates a dimension in the z direction. Plane options : xz, yz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
x = offset > 0 ? max(startpoint.x, endpoint.x) + (plane=="xz"?offset:0) : min(startpoint.x, endpoint.x) + (plane=="xz"?offset:0);
y = offset > 0 ? max(startpoint.y, endpoint.y) + (plane=="yz"?offset:0) : min(startpoint.y, endpoint.y) + (plane=="yz"?offset:0);
dimension([x, y, startpoint.z], [x, y, endpoint.z], text, thickness, text_size, rot_around_dim=(plane=="xz"?90:0));
v1= [x, y, startpoint.z]-startpoint;
h1 = norm(v1);
axis1 = cross([0,0,1], v1);
angle1 = atan2(norm(axis1), v1.z);
translate(startpoint)
rotate(angle1, axis1)
cylinder( h= h1+thickness*2, d=thickness);
v2= [x, y, endpoint.z]-endpoint;
h2 = norm(v2);
axis2 = cross([0,0,1], v2);
angle2 = atan2(norm(axis2), v2.z);
translate(endpoint)
rotate(angle2, axis2)
cylinder( h= h2+thickness*2, d=thickness);
}

View File

@@ -263,3 +263,28 @@ module show_path(path, r = 0.1) //! Show a path using a chain of hulls for debug
translate(path[i])
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

@@ -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

@@ -45,7 +45,10 @@ AAACELL = ["AAACELL", "Cell AAA", 44.5, 10.5
CCELL = ["CCELL", "Cell C", 50, 26.2, 20, 7.5, 1.5, "brown", [], 0, bcontact];
DCELL = ["DCELL", "Cell D", 61.5, 34.2, 22, 8.2, 2.4, "brown", [], 0, bcontact];
A23CELL = ["A23CELL", "Cell A23 12v", 28.5, 10.3, 5.2,5.2, 1.0, "silver", [], 0, bcontact];
LI4680 = ["L4680", "Li-Ion/LiFePo4 4680 3.2v", 80.2, 46.2, 35,35, 0, "green", [], 0, bcontact];
LI32700 = ["L32700", "Li-Ion/LiFePo4 32700 3.2v", 70.2, 32.4, 25,13, 0, "blue", [], 0, bcontact];
LI16340 = ["L16340", "Li-Ion/LiFePo4 16340 3.2v", 35.2, 16.4, 14,6, 1.0, "blue", [], 0, bcontact];
batteries = [AAACELL, AACELL, CCELL, DCELL, LUMINTOP, S25R18650, A23CELL];
batteries = [AAACELL, AACELL, CCELL, DCELL, LUMINTOP, S25R18650, A23CELL, LI4680, LI32700, LI16340];
use <battery.scad>

View File

@@ -28,7 +28,9 @@
include <../utils/core/core.scad>
use <spring.scad>
use <../utils/rounded_cylinder.scad>
use <../utils/pcb_utils.scad>
function battery_type(type) = type[0]; //! Battery type
function battery_length(type) = type[2]; //! Total length including terminals
function battery_diameter(type) = type[3]; //! Casing diameter
function battery_neg_dia(type) = type[4]; //! Negative terminal diameter
@@ -109,6 +111,13 @@ module battery(type) { //! Draw a battery
battery_led_positions(type)
color(["red","green","blue"][$i])
cylinder(d = 1.5, h = eps);
color(battery_colour(type) == "white" ? "black" : "white")
rotate([0, 0, 90])
cylindrical_wrap(battery_diameter(type)/2)
resize([0, battery_diameter(type)], auto = true)
rotate(90)
text(battery_type(type), halign = "center", valign = "center");
}
function contact_width(type) = type[1]; //! Width of the flat part

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>

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, center = false);
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

@@ -41,16 +41,21 @@ module led(type, colour = "red", lead = 5, right_angle = 0) { //! Draw specified
rotate([right_angle ? 90 : 0, 0, 0])
translate_z(right_angle ? right_angle - led_rim_t(type) : 0)
color(colour) {
rotate_extrude()
rounded_corner(r = d / 2, h = led_height(type), r2 = d / 2);
if (is_num(d)) {
rotate_extrude()
rounded_corner(r = d / 2, h = led_height(type), r2 = d / 2);
linear_extrude(led_rim_t(type))
difference() {
circle(d = led_rim_dia(type));
linear_extrude(led_rim_t(type))
difference() {
circle(d = led_rim_dia(type));
translate([d / 2 + eps, -5])
square(10);
}
translate([d / 2 + eps, -5])
square(10);
}
} else {
translate_z(led_height(type)/2) cube([d.x, d.y, led_height(type)], center = true);
translate_z(led_rim_t(type)/2) cube([led_rim_dia(type).x, led_rim_dia(type).y, led_rim_t(type)], center = true);
}
}
t = led_lead_t(type);
len = lead - (right_angle ? t : 0);

View File

@@ -18,18 +18,20 @@
//
//
// d r r h p l
// i i i e i e
// a m m i t a
// g c d
// d t h h
// t t
// d r r h p l
// i i i e i e
// a m m i t a
// g c d
// d t h h
// t t
//
LED3mm = ["LED3mm", 3, 3.15, 1.15, 4.6, 2.54, 0.4];
LED5mm = ["LED5mm", 5, 5.9, 1.1, 9.0, 2.54, 0.4];
LED8mm = ["LED8mm", 8, 9.2, 1.95,11.0, 2.54, 0.4];
LED10mm = ["LED10mm", 10, 11.0, 2.0, 13.5, 2.54, 0.4];
LED3mm = ["LED3mm", 3, 3.15, 1.15, 4.6, 2.54, 0.4];
LED5mm = ["LED5mm", 5, 5.9, 1.1, 9.0, 2.54, 0.4];
LED8mm = ["LED8mm", 8, 9.2, 1.95, 11.0, 2.54, 0.4];
LED10mm = ["LED10mm", 10, 11.0, 2.0, 13.5, 2.54, 0.4];
LEDs = [LED3mm, LED5mm, LED8mm, LED10mm];
LED5x2mm = ["LED5x2mm", [5,2], [5,2.7], 0.7, 7.0, 2.54, 0.5];
LEDs = [LED3mm, LED5mm, LED8mm, LED10mm, LED5x2mm];
use <led.scad>

View File

@@ -21,6 +21,10 @@
//! Default is steel but can be drawn as brass or nylon. A utility for making nut traps included.
//!
//! If a nut is given a child then it gets placed on its top surface.
//!
//! The following diagram shows you the parameters for drawing a sliding_t_nut:
//!
//! ![](docs/sliding_t_nut.png)
//
include <../utils/core/core.scad>
use <washer.scad>
@@ -41,9 +45,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 +197,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 +252,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

@@ -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

@@ -1170,6 +1170,8 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
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));

View File

@@ -750,7 +750,7 @@ ZC_A0591 = ["ZC_A0591", "ZC-A0591 ULN2003 driver PCB", 35, 32, 1.6, 0, 2.5, 0, "
[ [ 11.725, 8.3, -90, "jst_xh", 5],
[ -6.5, 10, 0, "2p54header", 1, 4],
[ 20.4, -4.5, 0, "2p54header", 4, 1],
[ 20.4, 11, 180, "pdip", 16, "ULN2803AN", true],
[ 20.4, 11, 180, "pdip", 16, "ULN2003AN", true],
[ 5.5, 6, 0, "led", LED3mm, [1,1,1, 0.5]],
[ 5.5, 10.5, 0, "led", LED3mm, [1,1,1, 0.5]],
[ 5.5, 15, 0, "led", LED3mm, [1,1,1, 0.5]],
@@ -1020,6 +1020,39 @@ ArduinoNano = let(l = 43.18, w = 17.78, pitch = inch(0.6), pins = 15, poffset =
[(l - inch(pins - 1) / 10) / 2 + poffset, (w - pitch) / 2, pins, 2, silver, 2.54, pitch], // 15x2 grid of holes
];
BlackPill = let(l = 52.81, w = 20.78, pitch = inch(0.6), pins = 20, poffset = inch(-0.05), led_spacing = [0, 9.93/2], btn_spacing = [0, 4.3/2]) [
"BlackPill", "Black Pill",
l, w, 1.6, // Size
0, // corner radius
0, // mounting hole diameter
0, // pad around mounting hole
"#101010", // color
false, // true if parts should be separate BOM items
[],
[ // components
[l / 2 + poffset, w / 2 - pitch / 2, 0, "-2p54joiner", pins, 1, undef, "yellow"],
[l / 2 + poffset, w / 2 + pitch / 2, 0, "-2p54joiner", pins, 1, undef, "yellow"],
[l - inch(0.27), w / 2, 90, "2p54header", 4, 1, undef, undef, true],
[ l -26.75, w / 2, 45, "chip", 7, 7, 1.3],
[ 3.6, w / 2, 180, "usb_C" ],
[ 15, 5.3, 0, "text", 4, 1.27, "BOOT0"],
[ 15, w-5.3, 0, "text", 4, 1.27, "NRST"],
[ l - 16, w/2-led_spacing.y, 0, "text", 4, 1.27, "PWR"],
[ l - 16, w/2+led_spacing.y, 0, "text", 4, 1.27, "C13"],
[ 15, w / 2 - btn_spacing.y, 90, "chip", 3.5, 6, 1.8, silver ], // mock button boot0
[ 15, w / 2 - btn_spacing.y, 90, "chip", 1.3, 2.6, 2.6, grey(90) ], // mock button boot0
[ 15, w / 2 + btn_spacing.y, 90, "chip", 3.5, 6, 1.8, silver ], // mock button nrst
[ 15, w / 2 + btn_spacing.y, 90, "chip", 1.3, 2.6, 2.6, grey(90) ], // mock button nrst
[ l - 12, 8.5, 90, "chip", 3.5, 6, 1.8, silver ], // mock button user
[ l - 12, 8.5, 90, "chip", 1.3, 2.6, 2.6, grey(90) ], // mock button user
[ l - 17, 12.5, 90, "chip", 3.2, 2.5, 0.6, brass ], // xtal
[ l - 12, 12.5, 90, "smd_sot", SOT23],
[ l - 12, w / 2 - led_spacing.y, 0, "smd_led", LED0603, "red"],
[ l - 12, w / 2 + led_spacing.y, 0, "smd_led", LED0603, "blue"]],
[], // accessories
[(l - inch(pins - 1) / 10) / 2 + poffset, (w - pitch) / 2, pins, 2, silver, 2.54, pitch], // 15x2 grid of holes
];
KY_040 = ["KY_040", "KY-040 rotart encoder breakout",
26.3, 19.5, 1.6, 0, 3, 0, grey(20), false,
[
@@ -1244,11 +1277,31 @@ tiny_buck = pcb("tiny_buck", "Ultra Small 3A buck regulator", [20, 11, 1.6],
]
);
tiny_pcbs = [ESP_201, ESP_01M, XIAO, ESP_12F, MP1584EN, ESP_01,tiny_buck, LIPO_fuel_gauge];
9DOF_stick = pcb("9DOF_stick", "Sparkfun 9 degrees of freedom IMU", [24, 11, 0.8],
colour = "red",
hole_d = 3.3,
holes = [[-1.2 - 3.3 / 2, 11 / 2]],
components = [
[9.7, 11/ 2, 0, "chip", 3, 3.5, 1],
[9.7, 8.5, 0, "smd_cap", CAP0603, 0.8],
for(i = [0 : 3])
[5.27, 2.5 + i * 2, 0, "smd_cap", CAP0603, 0.8],
[12.8, 4, 90, "smd_res", RES0603, "472"],
[14.1, 4, 90, "smd_res", RES0603, "472"],
// Silkscreen
[17.75, 1.4, 0,"text", 11, 1.4, "9DOF Stick", "Liberation Sans:style=Bold"],
[3, 11/2, 90, "text", 10, 1, "SCL SDA VDD GND", "Liberation Sans:style=Bold"],
],
grid = [inch(0.05), 11 / 2 - inch(0.15), 1, 4, "silver", 0, inch(0.1)]
);
tiny_pcbs = [ESP_201, ESP_01M, XIAO, ESP_12F, MP1584EN, ESP_01,tiny_buck, LIPO_fuel_gauge, 9DOF_stick];
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, 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 = [KY_040, TP4056, L9110S, ZC_A0591, RCWL0516, MT3608,RAMPSEndstop, ArduinoNano, HW803_1WAY_RELAY, Feather405, RPI_Pico,
ESP32_DOIT_V1, BlackPill, 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

@@ -451,3 +451,179 @@ module rd_box_cap(type, kind, value) { //! Draw radial boxed film capacitor
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]] ];
@@ -60,4 +61,12 @@ BOXC18x10x16 = ["BOXC18x10x16", [18, 10, 16, 0.25], 1.7, [12, 0.8, 0.4], [15, 0.
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

@@ -19,6 +19,9 @@
include <spades.scad>
micro_spades = [[spade3p5, 7.6, 0, 0, 0],
[spade3p5, 7.6, 0, 5.1, 0]];
small_spades = [[spade4p8, 7.6, 0, 0, 0],
[spade4p8, 7.6, 0, 7.1, 0]];
@@ -26,18 +29,19 @@ neon_spades = [[spade4p8, 7.3, 0, -7, 0],
[spade4p8, 7.3, 0, 7, 0]];
//
// p s s f f f w h d b p b
// a l l l l l i e e e i u
// r o o a a a d i p z v t
// t t t n n n t g t e o t
// g g g h h h l t o
// w h e e e t n
// p s s f f f w h d b p b
// a l l l l l i e e e i u
// r o o a a a d i p z v t
// t t t n n n t g t e o t
// g g g h h h l t o
// w h e e e t n
//
// w h t
// w h t
//
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];
micro_rocker = ["micro_rocker", "Rocker Switch 10x15", 8.8, 13.9, 10.5, 15, 1.5, 8.2, 14, 9.3, 2.0, 0.8, 3.0, micro_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];
rockers = [micro_rocker, small_rocker, neon_indicator];
use <rocker.scad>

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

@@ -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>