Compare commits
123 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2a2b7d8bd6 | ||
|
055b4e7102 | ||
|
00d6efc315 | ||
|
985b6c08d2 | ||
|
1f55097bdd | ||
|
136584d086 | ||
|
225ea9b451 | ||
|
d341ce499e | ||
|
e7376e28c4 | ||
|
e238eaa473 | ||
|
28d8cba98c | ||
|
04e94a859a | ||
|
e696dc4718 | ||
|
30955eb350 | ||
|
d5abee4082 | ||
|
f33a0675f5 | ||
|
5223415429 | ||
|
89d2d2bb71 | ||
|
762ff9cb43 | ||
|
1ee80f4a90 | ||
|
43408843af | ||
|
c4ccc30b35 | ||
|
20db11f81e | ||
|
d82db46ea1 | ||
|
f87f3f51ee | ||
|
ac58524b85 | ||
|
ef06aa4387 | ||
|
68533f96d0 | ||
|
c826f10169 | ||
|
d775a16baa | ||
|
682b8caf41 | ||
|
c915dd8c5c | ||
|
213ce7e25f | ||
|
e5a38b37b3 | ||
|
669e51605f | ||
|
127aab2e7a | ||
|
680563808a | ||
|
df3da13d6b | ||
|
000a7fb0fb | ||
|
d4e8dd8311 | ||
|
1928ec6fb1 | ||
|
f4b9ab961c | ||
|
ac7c4403b9 | ||
|
b7b40ba6a4 | ||
|
317b485ee1 | ||
|
6218287e2a | ||
|
d04f2bc8d1 | ||
|
49c26079fe | ||
|
b5ee63bfc4 | ||
|
a5bc80c0e8 | ||
|
bf8014fba0 | ||
|
ccf2b8e21b | ||
|
99f277de8d | ||
|
fe1ab5d59a | ||
|
e06b485d3e | ||
|
72d9c398bc | ||
|
608f0b2db0 | ||
|
7f8dfb9e73 | ||
|
c9de51fbbb | ||
|
30b7d966a1 | ||
|
abe1b1db01 | ||
|
8835fa0b7d | ||
|
71f935de8e | ||
|
b0a6a873c0 | ||
|
0771d4742c | ||
|
970c538496 | ||
|
4d44eae16a | ||
|
cec790ec09 | ||
|
3c9ec5455b | ||
|
5be85f5c25 | ||
|
e6254daaf1 | ||
|
c31f58a4fd | ||
|
46fc574e7a | ||
|
6ee0fad2e1 | ||
|
6e76c2ce89 | ||
|
a2dfaef2b5 | ||
|
2c197be193 | ||
|
05a67d1b2e | ||
|
be4dc0c57a | ||
|
c4895f84c7 | ||
|
72700a0acb | ||
|
43c78fd1a3 | ||
|
8682d0a470 | ||
|
e71db80093 | ||
|
a280e1fcbd | ||
|
b1ad206ce4 | ||
|
da55f86536 | ||
|
9790bdda11 | ||
|
59c3f984c5 | ||
|
9c2dd1c37b | ||
|
74e569896b | ||
|
3a87d7afde | ||
|
ed6f8cf5c0 | ||
|
1c9945d978 | ||
|
9464ad5dbf | ||
|
370ad8a2d1 | ||
|
b424bea622 | ||
|
c8d9bb7d09 | ||
|
c35c732324 | ||
|
f5528c5a9a | ||
|
09bce09a85 | ||
|
389e2f9c2e | ||
|
c35e263113 | ||
|
bad33da95e | ||
|
f727e1d27d | ||
|
5ddd9f6324 | ||
|
f5d0bfb6c8 | ||
|
b2117fa99a | ||
|
6687a4a7c6 | ||
|
8524ddd34d | ||
|
427ef610de | ||
|
c8869fc415 | ||
|
21c06667a3 | ||
|
d19fad3f9f | ||
|
172bfb16d8 | ||
|
491dbae13b | ||
|
99ebfffd2b | ||
|
f04486a040 | ||
|
42a7d222b5 | ||
|
598a01295f | ||
|
5f72a12125 | ||
|
046c475e18 | ||
|
4138ed438e |
197
CHANGELOG.md
@@ -3,6 +3,203 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v19.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.6.0...v19.7.0 "diff with v19.6.0")
|
||||
* 2022-02-08 [`1f55097`](https://github.com/nophead/NopSCADlib/commit/1f55097bdd3e4d0164a48dd7ebb3fc5370250ac4 "show commit") [C.P.](# "Chris Palmer") Support for twisted cables.
|
||||
Sweep now distbutes twists in proportion to segments lengths.
|
||||
Added `spiral_paths(),` `segmented_path()` and `rounded_path_vertices()` functions.
|
||||
Added `show_path(path)` module.
|
||||
|
||||
### [v19.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.5.1...v19.6.0 "diff with v19.5.1")
|
||||
* 2022-02-06 [`225ea9b`](https://github.com/nophead/NopSCADlib/commit/225ea9b45160195bdf316e7ffdb383a63f898d3c "show commit") [C.P.](# "Chris Palmer") Added `rounded_path()` function to `sweep.scad`.
|
||||
|
||||
#### [v19.5.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.5.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.5.0...v19.5.1 "diff with v19.5.0")
|
||||
* 2022-02-06 [`d341ce4`](https://github.com/nophead/NopSCADlib/commit/d341ce499e56972ff5267d3187387fe7df9d4130 "show commit") [C.P.](# "Chris Palmer") Added `render()` to `pocket_handle()`.
|
||||
|
||||
* 2022-02-06 [`e7376e2`](https://github.com/nophead/NopSCADlib/commit/e7376e28c44355efa425b98aa0511ccdf0b63301 "show commit") [C.P.](# "Chris Palmer") Fixed corner block assembly names when overridden.
|
||||
|
||||
* 2022-02-06 [`e238eaa`](https://github.com/nophead/NopSCADlib/commit/e238eaa473bac72136507d15c57f6156560d6cfe "show commit") [C.P.](# "Chris Palmer") Removed unused, undocumented function.
|
||||
|
||||
### [v19.5.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.5.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.4.1...v19.5.0 "diff with v19.4.1")
|
||||
* 2022-02-01 [`04e94a8`](https://github.com/nophead/NopSCADlib/commit/04e94a859aa0d21f840c992b487a901f096790a4 "show commit") [C.P.](# "Chris Palmer") Added `earth_rot` parameter to `NEMA_screws()`.
|
||||
|
||||
#### [v19.4.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.4.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.4.0...v19.4.1 "diff with v19.4.0")
|
||||
* 2022-02-01 [`e696dc4`](https://github.com/nophead/NopSCADlib/commit/e696dc471845550eb94e1b648d8b109cc11a9bf1 "show commit") [C.P.](# "Chris Palmer") Fixed stupid bug in `euler()`.
|
||||
|
||||
### [v19.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.3.0...v19.4.0 "diff with v19.3.0")
|
||||
* 2022-01-29 [`f33a067`](https://github.com/nophead/NopSCADlib/commit/f33a0675f5b9f6a5ebe1c4b9755e894d1e2b7994 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2022-01-29 [`5223415`](https://github.com/nophead/NopSCADlib/commit/52234154294011d4cc312f9ff98716f484d20a41 "show commit") [C.P.](# "Chris Palmer") Ball bearing test now two rows.
|
||||
|
||||
* 2022-01-28 [`f87f3f5`](https://github.com/nophead/NopSCADlib/commit/f87f3f51ee778ef7ca30319d1d6ff3f4013e8258 "show commit") [M.B.](# "Martin Budden") Added support for flanged bearings.
|
||||
Also added some new cartridge bearings.
|
||||
|
||||
### [v19.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.2.0...v19.3.0 "diff with v19.2.0")
|
||||
* 2022-01-29 [`1ee80f4`](https://github.com/nophead/NopSCADlib/commit/1ee80f4a908ff9939d06186f3b22f54f726fc4d2 "show commit") [C.P.](# "Chris Palmer") Ribbon clamps can now be made to hold multiple ribbons.
|
||||
|
||||
* 2022-01-29 [`4340884`](https://github.com/nophead/NopSCADlib/commit/43408843af2c9b0924d4f5c29ff96644b5f48295 "show commit") [C.P.](# "Chris Palmer") `Butt_box` now has a `thin_blocks` property to make it use `2screw_blocks` instead of fixing blocks along the edges.
|
||||
|
||||
* 2022-01-29 [`c4ccc30`](https://github.com/nophead/NopSCADlib/commit/c4ccc30b35f9b96c8b891efbe424a31bab7e1904 "show commit") [C.P.](# "Chris Palmer") Added `2screw_blocks,` a two screw version of corner blocks.
|
||||
|
||||
* 2022-01-29 [`20db11f`](https://github.com/nophead/NopSCADlib/commit/20db11f81eb713b255c41e3be7e5b9c0373646de "show commit") [C.P.](# "Chris Palmer") Box top bezels can now be modified by adding a child that gets subtracted.
|
||||
|
||||
* 2022-01-29 [`d82db46`](https://github.com/nophead/NopSCADlib/commit/d82db46ea11d99c92cd845a05cc6f9fc069f9497 "show commit") [C.P.](# "Chris Palmer") Added missing description for terminals.
|
||||
|
||||
* 2022-01-26 [`ac58524`](https://github.com/nophead/NopSCADlib/commit/ac58524b8553d09356ca78e830c5ef47d1c1f05b "show commit") [C.P.](# "Chris Palmer") `Butt_box` `star_washers()` property renamed `bbox_star_washers()`.
|
||||
|
||||
* 2022-01-26 [`ef06aa4`](https://github.com/nophead/NopSCADlib/commit/ef06aa43875aad40b016fb2939f256e074699bcf "show commit") [C.P.](# "Chris Palmer") `Butt_box` size and volume echo changed to show `Butt_box`.
|
||||
|
||||
### [v19.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.1.0...v19.2.0 "diff with v19.1.0")
|
||||
* 2022-01-25 [`d775a16`](https://github.com/nophead/NopSCADlib/commit/d775a16baa818e04d707e6759fe480bb88bf8b5f "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2022-01-25 [`682b8ca`](https://github.com/nophead/NopSCADlib/commit/682b8caf4172d51de1ec191051da6eb432e1b35e "show commit") [C.P.](# "Chris Palmer") Removed CB- prefix from PSU descriptions.
|
||||
|
||||
* 2022-01-25 [`c915dd8`](https://github.com/nophead/NopSCADlib/commit/c915dd8c5cc3dbc365ccc18a7a2fc00374fdafbe "show commit") [C.P.](# "Chris Palmer") Made `butt_box` example smaller to make room for more PSUs.
|
||||
|
||||
* 2022-01-23 [`6805638`](https://github.com/nophead/NopSCADlib/commit/680563808aeb129e63de660df09c0c2d53775a65 "show commit") [M.B.](# "Martin Budden") Added ability to add PCB to PSU.
|
||||
Also added two slimline LED PSUs with PCBs and terminals at both ends.
|
||||
|
||||
### [v19.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.0.0...v19.1.0 "diff with v19.0.0")
|
||||
* 2022-01-25 [`127aab2`](https://github.com/nophead/NopSCADlib/commit/127aab2e7ab87ed801b9463d6437983646dacdb5 "show commit") [C.P.](# "Chris Palmer") Added test for terminals to get documentation.
|
||||
Updated images and readme.
|
||||
Note BigTreeTech Relay Module `v1.2` PCB added.
|
||||
|
||||
* 2022-01-23 [`df3da13`](https://github.com/nophead/NopSCADlib/commit/df3da13d6b7c75f41aaf3e499815b51e39e06fea "show commit") [M.B.](# "Martin Budden") Added support for terminals on PCBs.
|
||||
|
||||
## [v19.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v18.4.0...v19.0.0 "diff with v18.4.0")
|
||||
* 2022-01-23 [`d4e8dd8`](https://github.com/nophead/NopSCADlib/commit/d4e8dd831187ea87ab8618f52541f3e53c0c17f8 "show commit") [C.P.](# "Chris Palmer") `Wire_hole_radius()` now rounded up to half mm diameters to match metric drills.
|
||||
`mouse_grommet` STL name is now based on the diameter instead of the radius.
|
||||
Added `mouse_grommet_length(r)` and documented `mouse_grommet_offset(r)`.
|
||||
|
||||
### [v18.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v18.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v18.3.2...v18.4.0 "diff with v18.3.2")
|
||||
* 2022-01-23 [`1928ec6`](https://github.com/nophead/NopSCADlib/commit/1928ec6fb162d44ffa2a8b37cdc5a064040e043c "show commit") [C.P.](# "Chris Palmer") Box can now be named to allow more than one in a project.
|
||||
`box_hole_inset(type)` documented.
|
||||
|
||||
#### [v18.3.2](https://github.com/nophead/NopSCADlib/releases/tag/v18.3.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v18.3.1...v18.3.2 "diff with v18.3.1")
|
||||
* 2022-01-23 [`f4b9ab9`](https://github.com/nophead/NopSCADlib/commit/f4b9ab961cea8364eaf6b75cd308b91978234ae8 "show commit") [C.P.](# "Chris Palmer") Fixed `blower_exit_offset()` for square blowers with 2 screws.
|
||||
|
||||
#### [v18.3.1](https://github.com/nophead/NopSCADlib/releases/tag/v18.3.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v18.3.0...v18.3.1 "diff with v18.3.0")
|
||||
* 2022-01-10 [`317b485`](https://github.com/nophead/NopSCADlib/commit/317b485ee1c17ef8f8004014a54f1c6706201932 "show commit") [C.P.](# "Chris Palmer") Updated the image.
|
||||
|
||||
* 2022-01-11 [`ccf2b8e`](https://github.com/nophead/NopSCADlib/commit/ccf2b8e21b0b3a4d8ab72ea5cdecb0cdfb542e47 "show commit") [G.G.](# "Giampiero Gabbiani") Reverted PERF74x51
|
||||
|
||||
* 2022-01-08 [`99f277d`](https://github.com/nophead/NopSCADlib/commit/99f277de8d71f289d1a7340995d25309369e145c "show commit") [G.G.](# "Giampiero Gabbiani") Fixed offset calculations
|
||||
|
||||
* 2022-01-07 [`fe1ab5d`](https://github.com/nophead/NopSCADlib/commit/fe1ab5d59a5a4746a383111d1d2a558385f820f6 "show commit") [G.G.](# "Giampiero Gabbiani") Fixed grid origin offsets
|
||||
|
||||
### [v18.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v18.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v18.2.0...v18.3.0 "diff with v18.2.0")
|
||||
* 2022-01-10 [`49c2607`](https://github.com/nophead/NopSCADlib/commit/49c26079fea1be8eb4a69d7468fb12df4595ec4c "show commit") [C.P.](# "Chris Palmer") Added `M3x6_hex_pillar`.
|
||||
|
||||
* 2022-01-10 [`b5ee63b`](https://github.com/nophead/NopSCADlib/commit/b5ee63bfc40b9ee698d44f435e58cfbc49ec259c "show commit") [C.P.](# "Chris Palmer") Added more documentation for microswitches.
|
||||
|
||||
* 2022-01-10 [`a5bc80c`](https://github.com/nophead/NopSCADlib/commit/a5bc80c0e865335cde29db9203438fe4bc659f43 "show commit") [C.P.](# "Chris Palmer") Added `D_plug_d()` function.
|
||||
|
||||
* 2022-01-10 [`bf8014f`](https://github.com/nophead/NopSCADlib/commit/bf8014fba0ed630898037712d2fdc432d7966d97 "show commit") [C.P.](# "Chris Palmer") Added `tubing_ir()` function.
|
||||
|
||||
### [v18.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v18.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v18.1.0...v18.2.0 "diff with v18.1.0")
|
||||
* 2021-12-14 [`608f0b2`](https://github.com/nophead/NopSCADlib/commit/608f0b2db052b0c79597be39de5e89b9989e9270 "show commit") [C.P.](# "Chris Palmer") Simplified teardrop top length calculation.
|
||||
|
||||
* 2021-12-11 [`8682d0a`](https://github.com/nophead/NopSCADlib/commit/8682d0a4705ed2d85213d85702b5b9b039906f48 "show commit") [M.B.](# "Martin Budden") Allow configuration of teardrop angle.
|
||||
|
||||
### [v18.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v18.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v18.0.0...v18.1.0 "diff with v18.0.0")
|
||||
* 2021-12-14 [`abe1b1d`](https://github.com/nophead/NopSCADlib/commit/abe1b1db0157a86af14a68ec42bdaa3e079e73a3 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-12-14 [`71f935d`](https://github.com/nophead/NopSCADlib/commit/71f935de8e24673a10707cfe434a2faaf3de1c28 "show commit") [M.B.](# "Martin Budden") Corrected FOV handling.
|
||||
|
||||
* 2021-08-09 [`4138ed4`](https://github.com/nophead/NopSCADlib/commit/4138ed438e1111bafbe3bee17021a922966c334b "show commit") [M.B.](# "Martin Budden") Added ability to display camera field of view.
|
||||
|
||||
## [v18.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v18.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v17.10.0...v18.0.0 "diff with v17.10.0")
|
||||
* 2021-12-12 [`970c538`](https://github.com/nophead/NopSCADlib/commit/970c5384960bb4c436cb789a1c5869c0a4adfaa5 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2021-12-12 [`cec790e`](https://github.com/nophead/NopSCADlib/commit/cec790ec09befd2631734cda88f3254043955638 "show commit") [M.B.](# "Martin Budden") Fixed y-carriage plain pulley and test.
|
||||
|
||||
* 2021-11-27 [`e71db80`](https://github.com/nophead/NopSCADlib/commit/e71db80093e5131908dff4a6ecba02e5c213a7d8 "show commit") [M.B.](# "Martin Budden") Improvements to `core_xy`
|
||||
1. Better default parameters
|
||||
2. Changed `plain_idler_offset` to work in x and y, to facilitate larger idler pulleys
|
||||
|
||||
### [v17.10.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.10.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.9.0...v17.10.0 "diff with v17.9.0")
|
||||
* 2021-12-12 [`c31f58a`](https://github.com/nophead/NopSCADlib/commit/c31f58a4fdf5163dc56b98e89f1a98d08cdfded2 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2021-11-27 [`a280e1f`](https://github.com/nophead/NopSCADlib/commit/a280e1fcbd6fe068a186e5c9f609cff62b2974a4 "show commit") [M.B.](# "Martin Budden") Added GT2x9 belt.
|
||||
|
||||
### [v17.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.8.0...v17.9.0 "diff with v17.8.0")
|
||||
* 2021-12-11 [`a2dfaef`](https://github.com/nophead/NopSCADlib/commit/a2dfaef2b51ffec3f048f0af569b39e8a7dbbeaf "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-11-16 [`9790bdd`](https://github.com/nophead/NopSCADlib/commit/9790bdda11573904bf87c655d1ab7b81736a45e0 "show commit") [M.B.](# "Martin Budden") Added function returning number of links in drag chain.
|
||||
|
||||
### [v17.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.7.2...v17.8.0 "diff with v17.7.2")
|
||||
* 2021-12-11 [`c4895f8`](https://github.com/nophead/NopSCADlib/commit/c4895f84c7cff48baa14040c2759da15d2a165be "show commit") [C.P.](# "Chris Palmer") Updated image and readme.
|
||||
|
||||
* 2021-11-20 [`b1ad206`](https://github.com/nophead/NopSCADlib/commit/b1ad206ce4d29b61f3a9be15adde7f1a51c225b5 "show commit") [M.B.](# "Martin Budden") Rotated conical horihole.
|
||||
|
||||
* 2021-11-20 [`da55f86`](https://github.com/nophead/NopSCADlib/commit/da55f86536746657a1e105858109f177d24c362e "show commit") [M.B.](# "Martin Budden") Added variant of drag chain without supports.
|
||||
Unsupported drag chain has conical pin and corresponding horihole and is printed with cutout facing upwards.
|
||||
|
||||
* Also made clearance a property of the drag chain so it can be altered for printing chain assemblies
|
||||
|
||||
* 2021-12-11 [`43c78fd`](https://github.com/nophead/NopSCADlib/commit/43c78fd1a38de87a210a64c3587bc994731b41c6 "show commit") [C.P.](# "Chris Palmer") Annual image changes due to change of computer.
|
||||
|
||||
#### [v17.7.2](https://github.com/nophead/NopSCADlib/releases/tag/v17.7.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v17.7.1...v17.7.2 "diff with v17.7.1")
|
||||
* 2021-11-13 [`74e5698`](https://github.com/nophead/NopSCADlib/commit/74e569896bd9b4f98bcd7c84322cd358fee8941f "show commit") [C.P.](# "Chris Palmer") Updated images.
|
||||
|
||||
* 2021-11-01 [`ed6f8cf`](https://github.com/nophead/NopSCADlib/commit/ed6f8cf5c0877f7e8ad9323cc4fd3a6983a11080 "show commit") [M.B.](# "Martin Budden") Added shading to base of screw sockets to increase visibility.
|
||||
|
||||
#### [v17.7.1](https://github.com/nophead/NopSCADlib/releases/tag/v17.7.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v17.7.0...v17.7.1 "diff with v17.7.0")
|
||||
* 2021-10-29 [`9464ad5`](https://github.com/nophead/NopSCADlib/commit/9464ad5dbf1c6befaa0059e7cc3f0988d5639173 "show commit") [C.P.](# "Chris Palmer") Fixed knob for pots with split shaft.
|
||||
Changed the order of `knob_for_pot()` parameters.
|
||||
|
||||
### [v17.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.6.0...v17.7.0 "diff with v17.6.0")
|
||||
* 2021-10-28 [`b424bea`](https://github.com/nophead/NopSCADlib/commit/b424bea622d5247fd1e2f1ddd51782aba55277e1 "show commit") [C.P.](# "Chris Palmer") Added printed knobs for pots.
|
||||
|
||||
* 2021-10-28 [`c8d9bb7`](https://github.com/nophead/NopSCADlib/commit/c8d9bb7d094408f70cb91354895856cb915cfe00 "show commit") [C.P.](# "Chris Palmer") Potentiometers now create a BOM entry and have a value specified.
|
||||
|
||||
### [v17.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.5.0...v17.6.0 "diff with v17.5.0")
|
||||
* 2021-10-26 [`f5528c5`](https://github.com/nophead/NopSCADlib/commit/f5528c5a9a51abdd12443a677236ac8610206c20 "show commit") [C.P.](# "Chris Palmer") Single `7_segment` objects can now have multiple digits.
|
||||
This is deduced from the digit size compared to the overall size.
|
||||
The decimal point is now suppressed if there are not enough pins.
|
||||
Added 02531A and 02352A 3 digit displays.
|
||||
|
||||
* 2021-10-26 [`09bce09`](https://github.com/nophead/NopSCADlib/commit/09bce09a85fee3f3ac684743467329c18f4ebb73 "show commit") [C.P.](# "Chris Palmer") Typo
|
||||
|
||||
### [v17.5.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.5.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.4.0...v17.5.0 "diff with v17.4.0")
|
||||
* 2021-10-24 [`bad33da`](https://github.com/nophead/NopSCADlib/commit/bad33da95eb3b20ccbb6e4906dccfe51e8f4372c "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2021-10-21 [`427ef61`](https://github.com/nophead/NopSCADlib/commit/427ef610def6ef2744d565329069719e485a500e "show commit") [M.B.](# "Martin Budden") Allowed naming of magnets. Added radial encoder magnet.
|
||||
|
||||
### [v17.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.3.0...v17.4.0 "diff with v17.3.0")
|
||||
* 2021-10-24 [`f5d0bfb`](https://github.com/nophead/NopSCADlib/commit/f5d0bfb6c80111399f5fa2aeb8bab5bab9101285 "show commit") [C.P.](# "Chris Palmer") Fixed drill `center` parameter in `poly_drill()`.
|
||||
|
||||
* 2021-10-24 [`b2117fa`](https://github.com/nophead/NopSCADlib/commit/b2117fa99a57341f9c93eed97c392c18173aa73c "show commit") [C.P.](# "Chris Palmer") `atx_psu_cutout(type)` now parametric and can be shown in the test.
|
||||
ATX300 PSU now has a correct cutout and more accurate grill holes.
|
||||
The four margins around grill holes can now be specified.
|
||||
|
||||
* 2021-10-24 [`6687a4a`](https://github.com/nophead/NopSCADlib/commit/6687a4a7c62d526a5f376db903dcd74c4fb8a25c "show commit") [C.P.](# "Chris Palmer") Added `jack_4mm_flange_radius()`.
|
||||
|
||||
* 2021-10-24 [`8524ddd`](https://github.com/nophead/NopSCADlib/commit/8524ddd34dd93d0bf5ddf538984809b8f0f8c986 "show commit") [C.P.](# "Chris Palmer") Foot now lowered by squeeze distance so the washer is visible.
|
||||
|
||||
### [v17.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.2.2...v17.3.0 "diff with v17.2.2")
|
||||
* 2021-10-20 [`21c0666`](https://github.com/nophead/NopSCADlib/commit/21c06667a3c5a0bc65440b990e28b8a2f93c7c32 "show commit") [C.P.](# "Chris Palmer") Added ATX300 PSU model.
|
||||
|
||||
* 2021-10-20 [`d19fad3`](https://github.com/nophead/NopSCADlib/commit/d19fad3f9f7e6eba94b2005b4798b5914fff4b69 "show commit") [C.P.](# "Chris Palmer") PSU grills can now have different holes sizes, spacing, round or heaxagonal and avoid a list of rectangular regions.
|
||||
|
||||
* 2021-10-20 [`172bfb1`](https://github.com/nophead/NopSCADlib/commit/172bfb16d8ec8ffee8b5185ef42867b37ab6bce1 "show commit") [C.P.](# "Chris Palmer") Added lugless pressfit IEC inlet.
|
||||
|
||||
* 2021-10-09 [`491dbae`](https://github.com/nophead/NopSCADlib/commit/491dbae13b9ff2736324ff084c6a6f313b4a09fc "show commit") [C.P.](# "Chris Palmer") `screw_shorter_than()` will return 4 or 3 for short grub screws.
|
||||
|
||||
#### [v17.2.2](https://github.com/nophead/NopSCADlib/releases/tag/v17.2.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v17.2.1...v17.2.2 "diff with v17.2.1")
|
||||
* 2021-10-02 [`046c475`](https://github.com/nophead/NopSCADlib/commit/046c475e1833c09a925a5310d1ccc6e4b07e7f89 "show commit") [M.B.](# "Martin Budden") Set convexity to 8 for `linear_extrude` of extrusion.
|
||||
|
||||
#### [v17.2.1](https://github.com/nophead/NopSCADlib/releases/tag/v17.2.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v17.2.0...v17.2.1 "diff with v17.2.0")
|
||||
* 2021-10-06 [`5f72a12`](https://github.com/nophead/NopSCADlib/commit/5f72a1212514ee7f8a795b53b1d1d180329660df "show commit") [C.P.](# "Chris Palmer") Nuts shown on jacks and fuseholders only shown threaded when exploded.
|
||||
|
||||
### [v17.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.1.0...v17.2.0 "diff with v17.1.0")
|
||||
* 2021-10-06 [`82502eb`](https://github.com/nophead/NopSCADlib/commit/82502eb470127b28e4036821077cbdbd06c17e9e "show commit") [C.P.](# "Chris Palmer") Added `pot_nut()` module to draw potentiometer nuts and washers.
|
||||
|
||||
### [v17.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v17.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v17.0.1...v17.1.0 "diff with v17.0.1")
|
||||
* 2021-10-05 [`b541298`](https://github.com/nophead/NopSCADlib/commit/b541298eae361b80df3c6c5797f3940a37fc2a38 "show commit") [C.P.](# "Chris Palmer") Printed foot assembly can now omit the top washer when space is at a premium.
|
||||
Now correctly shows the screw in the squeezed position.
|
||||
|
||||
* 2021-10-02 [`9884160`](https://github.com/nophead/NopSCADlib/commit/9884160ed5e8cd7d1f44c6fee950e3682714da9c "show commit") [C.P.](# "Chris Palmer") Updated the gallery
|
||||
|
||||
#### [v17.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v17.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v17.0.0...v17.0.1 "diff with v17.0.0")
|
||||
* 2021-10-01 [`38c973b`](https://github.com/nophead/NopSCADlib/commit/38c973b316a853fcbef3ccb857d99404a772d9dd "show commit") [C.P.](# "Chris Palmer") FR4 veroboard made the correct colour.
|
||||
veroboard track cuts made slightly bigger.
|
||||
|
BIN
examples/EnviroPlus/assemblies/RPI_assembled.png
Normal file
After Width: | Height: | Size: 203 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_assembled_tn.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_assembly.png
Normal file
After Width: | Height: | Size: 265 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_assembly_tn.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_case_assembled.png
Normal file
After Width: | Height: | Size: 326 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_case_assembled_tn.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_case_assembly.png
Normal file
After Width: | Height: | Size: 336 KiB |
BIN
examples/EnviroPlus/assemblies/RPI_case_assembly_tn.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
examples/EnviroPlus/assemblies/back_assembled.png
Normal file
After Width: | Height: | Size: 126 KiB |
BIN
examples/EnviroPlus/assemblies/back_assembled_tn.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
examples/EnviroPlus/assemblies/back_assembly.png
Normal file
After Width: | Height: | Size: 132 KiB |
BIN
examples/EnviroPlus/assemblies/back_assembly_tn.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
examples/EnviroPlus/assemblies/case_assembled.png
Normal file
After Width: | Height: | Size: 202 KiB |
BIN
examples/EnviroPlus/assemblies/case_assembled_tn.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
examples/EnviroPlus/assemblies/case_assembly.png
Normal file
After Width: | Height: | Size: 249 KiB |
BIN
examples/EnviroPlus/assemblies/case_assembly_tn.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_assembled.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_assembled_tn.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_assembly.png
Normal file
After Width: | Height: | Size: 125 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_assembly_tn.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_case_assembled.png
Normal file
After Width: | Height: | Size: 187 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_case_assembled_tn.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_case_assembly.png
Normal file
After Width: | Height: | Size: 236 KiB |
BIN
examples/EnviroPlus/assemblies/enviro_case_assembly_tn.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
examples/EnviroPlus/assemblies/fan_controller_assembled.png
Normal file
After Width: | Height: | Size: 229 KiB |
BIN
examples/EnviroPlus/assemblies/fan_controller_assembled_tn.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
examples/EnviroPlus/assemblies/fan_controller_assembly.png
Normal file
After Width: | Height: | Size: 130 KiB |
BIN
examples/EnviroPlus/assemblies/fan_controller_assembly_tn.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
examples/EnviroPlus/assemblies/main_assembled.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
examples/EnviroPlus/assemblies/main_assembled_tn.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
examples/EnviroPlus/assemblies/main_assembly.png
Normal file
After Width: | Height: | Size: 219 KiB |
BIN
examples/EnviroPlus/assemblies/main_assembly_tn.png
Normal file
After Width: | Height: | Size: 38 KiB |
5
examples/EnviroPlus/bom/RPI_assembly.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
RPI_assembly:
|
||||
Vitamins:
|
||||
1 Micro SD card
|
||||
1 Raspberry Pi Zero
|
||||
1 Pin header 20 x 2 right_angle
|
7
examples/EnviroPlus/bom/RPI_case_assembly.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
RPI_case_assembly:
|
||||
Vitamins:
|
||||
2 Screw M2.5 pan x 6.4mm
|
||||
|
||||
Assemblies:
|
||||
1 RPI_assembly
|
||||
1 enviro_case_assembly
|
8
examples/EnviroPlus/bom/back_assembly.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
back_assembly:
|
||||
Vitamins:
|
||||
1 Fan 17mm x 8mm
|
||||
1 PMS5003 particle detector
|
||||
|
||||
Printed:
|
||||
1 enviro_plus_case_base.stl
|
||||
1 fan_duct.stl
|
21
examples/EnviroPlus/bom/bom.csv
Normal file
@@ -0,0 +1,21 @@
|
||||
'Micro SD card', 1
|
||||
'Fan 17mm x 8mm', 1
|
||||
'Heatfit insert M2', 4
|
||||
'Nut M2.5 x 2.2mm nyloc', 4
|
||||
'Enviro+', 1
|
||||
'Raspberry Pi Zero', 1
|
||||
'Pin header 20 x 2 right_angle', 1
|
||||
'PMS5003 particle detector', 1
|
||||
'Screw M2 cap x 6mm', 4
|
||||
'Screw M2.5 pan x 6.4mm', 2
|
||||
'Screw M2.5 pan x 8mm', 4
|
||||
'Screw M3 pan x 6mm', 3
|
||||
'SMD capacitor 1206 10uF', 1
|
||||
'SMD resistor 0805 3K3 0.125W', 1
|
||||
'SOT223 package FZT851', 1
|
||||
'Veroboard 6 holes x 6strips', 1
|
||||
'Washer M2 x 5mm x 0.3mm', 4
|
||||
'Washer M2.5 x 5.9mm x 0.5mm', 4
|
||||
'Washer M3 x 7mm x 0.5mm', 3
|
||||
'Wire link 0.8mm x 6.5mm', 3
|
||||
'Wire link 0.8mm x 0.4"', 1
|
Can't render this file because it contains an unexpected character in line 21 and column 23.
|
194
examples/EnviroPlus/bom/bom.json
Normal file
@@ -0,0 +1,194 @@
|
||||
[
|
||||
{
|
||||
"name": "back_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {},
|
||||
"vitamins": {
|
||||
"pms5003(): PMS5003 particle detector": {
|
||||
"count": 1
|
||||
},
|
||||
"fan(fan17x8): Fan 17mm x 8mm": {
|
||||
"count": 1
|
||||
}
|
||||
},
|
||||
"printed": {
|
||||
"fan_duct.stl": {
|
||||
"count": 1,
|
||||
"colour": "darkorange"
|
||||
},
|
||||
"enviro_plus_case_base.stl": {
|
||||
"count": 1,
|
||||
"colour": "grey"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "RPI_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {},
|
||||
"vitamins": {
|
||||
"pcb(RPI0): Raspberry Pi Zero": {
|
||||
"count": 1
|
||||
},
|
||||
": Micro SD card": {
|
||||
"count": 1
|
||||
},
|
||||
"pin_header(2p54header, 20, 2, right_angle = true): Pin header 20 x 2 right_angle": {
|
||||
"count": 1
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "fan_controller_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {},
|
||||
"vitamins": {
|
||||
"veroboard(fan_vb): Veroboard 6 holes x 6strips": {
|
||||
"count": 1
|
||||
},
|
||||
"wire_link(0.8, 10.16, tail = 2.5): Wire link 0.8mm x 0.4\"": {
|
||||
"count": 1
|
||||
},
|
||||
"wire_link(0.8, 0, h = 4, tail = 2.5): Wire link 0.8mm x 6.5mm": {
|
||||
"count": 3
|
||||
},
|
||||
"smd_resistor(RES0805, 3K3): SMD resistor 0805 3K3 0.125W": {
|
||||
"count": 1
|
||||
},
|
||||
"smd_capacitor(CAP1206): SMD capacitor 1206 10uF": {
|
||||
"count": 1
|
||||
},
|
||||
"smd_sot(SOT223): SOT223 package FZT851": {
|
||||
"count": 1
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "enviro_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"fan_controller_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
"pcb(EnviroPlus): Enviro+": {
|
||||
"count": 1
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "case_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {},
|
||||
"vitamins": {
|
||||
"insert(F1BM2): Heatfit insert M2": {
|
||||
"count": 4
|
||||
},
|
||||
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
|
||||
"count": 3
|
||||
},
|
||||
"screw(M3_pan_screw, 6): Screw M3 pan x 6mm": {
|
||||
"count": 3
|
||||
}
|
||||
},
|
||||
"printed": {
|
||||
"enviro_plus_case.stl": {
|
||||
"count": 1,
|
||||
"colour": "grey"
|
||||
},
|
||||
"bulkhead.stl": {
|
||||
"count": 1,
|
||||
"colour": "[0.862745, 0.0784314, 0.235294]"
|
||||
},
|
||||
"foot.stl": {
|
||||
"count": 3,
|
||||
"colour": "darkorange"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "enviro_case_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"case_assembly": 1,
|
||||
"enviro_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
"screw(M2p5_pan_screw, 8): Screw M2.5 pan x 8mm": {
|
||||
"count": 4
|
||||
},
|
||||
"washer(M2p5_washer): Washer M2.5 x 5.9mm x 0.5mm": {
|
||||
"count": 4
|
||||
},
|
||||
"nut(M2p5_nut, nyloc = true): Nut M2.5 x 2.2mm nyloc": {
|
||||
"count": 4
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "RPI_case_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"enviro_case_assembly": 1,
|
||||
"RPI_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
"screw(M2p5_pan_screw, 6.4): Screw M2.5 pan x 6.4mm": {
|
||||
"count": 2
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "main_assembly",
|
||||
"big": null,
|
||||
"ngb": false,
|
||||
"zoomed": 0,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"RPI_case_assembly": 1,
|
||||
"back_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
"washer(M2_washer): Washer M2 x 5mm x 0.3mm": {
|
||||
"count": 4
|
||||
},
|
||||
"screw(M2_cap_screw, 6): Screw M2 cap x 6mm": {
|
||||
"count": 4
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
}
|
||||
]
|
53
examples/EnviroPlus/bom/bom.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
Vitamins:
|
||||
F
|
||||
a
|
||||
n
|
||||
E
|
||||
n c
|
||||
v o
|
||||
R i n
|
||||
p r t
|
||||
i E o r
|
||||
n o
|
||||
c B C v c l M
|
||||
R a a a i a l a
|
||||
p s c s r s e i
|
||||
i e k e o e r n
|
||||
1| | | | | | | | 1 Micro SD card
|
||||
| | 1| | | | | | 1 Fan 17mm x 8mm
|
||||
| | | 4| | | | | 4 Heatfit insert M2
|
||||
| | | | | 4| | | 4 Nut M2.5 x 2.2mm nyloc
|
||||
| | | | 1| | | | 1 Enviro+
|
||||
1| | | | | | | | 1 Raspberry Pi Zero
|
||||
1| | | | | | | | 1 Pin header 20 x 2 right_angle
|
||||
| | 1| | | | | | 1 PMS5003 particle detector
|
||||
| | | | | | | 4| 4 Screw M2 cap x 6mm
|
||||
| 2| | | | | | | 2 Screw M2.5 pan x 6.4mm
|
||||
| | | | | 4| | | 4 Screw M2.5 pan x 8mm
|
||||
| | | 3| | | | | 3 Screw M3 pan x 6mm
|
||||
| | | | | | 1| | 1 SMD capacitor 1206 10uF
|
||||
| | | | | | 1| | 1 SMD resistor 0805 3K3 0.125W
|
||||
| | | | | | 1| | 1 SOT223 package FZT851
|
||||
| | | | | | 1| | 1 Veroboard 6 holes x 6strips
|
||||
| | | | | | | 4| 4 Washer M2 x 5mm x 0.3mm
|
||||
| | | | | 4| | | 4 Washer M2.5 x 5.9mm x 0.5mm
|
||||
| | | 3| | | | | 3 Washer M3 x 7mm x 0.5mm
|
||||
| | | | | | 3| | 3 Wire link 0.8mm x 6.5mm
|
||||
| | | | | | 1| | 1 Wire link 0.8mm x 0.4"
|
||||
|
||||
Printed:
|
||||
| | | 1| | | | | 1 bulkhead.stl
|
||||
| | | 1| | | | | 1 enviro_plus_case.stl
|
||||
| | 1| | | | | | 1 enviro_plus_case_base.stl
|
||||
| | 1| | | | | | 1 fan_duct.stl
|
||||
| | | 3| | | | | 3 foot.stl
|
||||
|
||||
Assemblies:
|
||||
1 RPI_assembly
|
||||
1 RPI_case_assembly
|
||||
1 back_assembly
|
||||
1 case_assembly
|
||||
1 enviro_assembly
|
||||
1 enviro_case_assembly
|
||||
1 fan_controller_assembly
|
||||
1 main_assembly
|
10
examples/EnviroPlus/bom/case_assembly.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
case_assembly:
|
||||
Vitamins:
|
||||
4 Heatfit insert M2
|
||||
3 Screw M3 pan x 6mm
|
||||
3 Washer M3 x 7mm x 0.5mm
|
||||
|
||||
Printed:
|
||||
1 bulkhead.stl
|
||||
1 enviro_plus_case.stl
|
||||
3 foot.stl
|
6
examples/EnviroPlus/bom/enviro_assembly.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
enviro_assembly:
|
||||
Vitamins:
|
||||
1 Enviro+
|
||||
|
||||
Assemblies:
|
||||
1 fan_controller_assembly
|
9
examples/EnviroPlus/bom/enviro_case_assembly.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
enviro_case_assembly:
|
||||
Vitamins:
|
||||
4 Nut M2.5 x 2.2mm nyloc
|
||||
4 Screw M2.5 pan x 8mm
|
||||
4 Washer M2.5 x 5.9mm x 0.5mm
|
||||
|
||||
Assemblies:
|
||||
1 case_assembly
|
||||
1 enviro_assembly
|
8
examples/EnviroPlus/bom/fan_controller_assembly.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
fan_controller_assembly:
|
||||
Vitamins:
|
||||
1 SMD capacitor 1206 10uF
|
||||
1 SMD resistor 0805 3K3 0.125W
|
||||
1 SOT223 package FZT851
|
||||
1 Veroboard 6 holes x 6strips
|
||||
3 Wire link 0.8mm x 6.5mm
|
||||
1 Wire link 0.8mm x 0.4"
|
8
examples/EnviroPlus/bom/main_assembly.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
main_assembly:
|
||||
Vitamins:
|
||||
4 Screw M2 cap x 6mm
|
||||
4 Washer M2 x 5mm x 0.3mm
|
||||
|
||||
Assemblies:
|
||||
1 RPI_case_assembly
|
||||
1 back_assembly
|
BIN
examples/EnviroPlus/docs/cuts.jpg
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
examples/EnviroPlus/docs/fan_connection.jpg
Normal file
After Width: | Height: | Size: 498 KiB |
BIN
examples/EnviroPlus/docs/fan_controller.jpg
Normal file
After Width: | Height: | Size: 164 KiB |
BIN
examples/EnviroPlus/docs/smt.jpg
Normal file
After Width: | Height: | Size: 129 KiB |
298
examples/EnviroPlus/readme.md
Normal file
@@ -0,0 +1,298 @@
|
||||
<a name="TOP"></a>
|
||||
# EnviroPlus
|
||||
Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
|
||||
---
|
||||
## Table of Contents
|
||||
1. [Parts list](#Parts_list)
|
||||
1. [Back Assembly](#back_assembly)
|
||||
1. [RPI Assembly](#RPI_assembly)
|
||||
1. [Fan Controller Assembly](#fan_controller_assembly)
|
||||
1. [Enviro Assembly](#enviro_assembly)
|
||||
1. [Case Assembly](#case_assembly)
|
||||
1. [Enviro Case Assembly](#enviro_case_assembly)
|
||||
1. [RPI Case Assembly](#RPI_case_assembly)
|
||||
1. [Main Assembly](#main_assembly)
|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="Parts_list"></a>
|
||||
## Parts list
|
||||
| <span style="writing-mode: vertical-rl; text-orientation: mixed;">Back</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">RPI</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Fan Controller</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Enviro</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Case</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Enviro Case</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">RPI Case</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Main</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |
|
||||
|---:|---:|---:|---:|---:|---:|---:|---:|---:|:---|
|
||||
| | | | | | | | | | **Vitamins** |
|
||||
| . | . | . | 1 | . | . | . | . | 1 | Enviro+ |
|
||||
| 1 | . | . | . | . | . | . | . | 1 | Fan 17mm x 8mm |
|
||||
| . | . | . | . | 4 | . | . | . | 4 | Heatfit insert M2 |
|
||||
| . | 1 | . | . | . | . | . | . | 1 | Micro SD card |
|
||||
| . | . | . | . | . | 4 | . | . | 4 | Nut M2.5 x 2.2mm nyloc |
|
||||
| 1 | . | . | . | . | . | . | . | 1 | PMS5003 particle detector |
|
||||
| . | 1 | . | . | . | . | . | . | 1 | Pin header 20 x 2 right_angle |
|
||||
| . | 1 | . | . | . | . | . | . | 1 | Raspberry Pi Zero |
|
||||
| . | . | 1 | . | . | . | . | . | 1 | SMD capacitor 1206 10uF |
|
||||
| . | . | 1 | . | . | . | . | . | 1 | SMD resistor 0805 3K3 0.125W |
|
||||
| . | . | 1 | . | . | . | . | . | 1 | SOT223 package FZT851 |
|
||||
| . | . | . | . | . | . | . | 4 | 4 | Screw M2 cap x 6mm |
|
||||
| . | . | . | . | . | . | 2 | . | 2 | Screw M2.5 pan x 6.4mm |
|
||||
| . | . | . | . | . | 4 | . | . | 4 | Screw M2.5 pan x 8mm |
|
||||
| . | . | . | . | 3 | . | . | . | 3 | Screw M3 pan x 6mm |
|
||||
| . | . | 1 | . | . | . | . | . | 1 | Veroboard 6 holes x 6strips |
|
||||
| . | . | . | . | . | . | . | 4 | 4 | Washer M2 x 5mm x 0.3mm |
|
||||
| . | . | . | . | . | 4 | . | . | 4 | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| . | . | . | . | 3 | . | . | . | 3 | Washer M3 x 7mm x 0.5mm |
|
||||
| . | . | 1 | . | . | . | . | . | 1 | Wire link 0.8mm x 0.4" |
|
||||
| . | . | 3 | . | . | . | . | . | 3 | Wire link 0.8mm x 6.5mm |
|
||||
| 2 | 3 | 8 | 1 | 10 | 12 | 2 | 8 | 46 | Total vitamins count |
|
||||
| | | | | | | | | | **3D printed parts** |
|
||||
| . | . | . | . | 1 | . | . | . | 1 | bulkhead.stl |
|
||||
| . | . | . | . | 1 | . | . | . | 1 | enviro_plus_case.stl |
|
||||
| 1 | . | . | . | . | . | . | . | 1 | enviro_plus_case_base.stl |
|
||||
| 1 | . | . | . | . | . | . | . | 1 | fan_duct.stl |
|
||||
| . | . | . | . | 3 | . | . | . | 3 | foot.stl |
|
||||
| 2 | . | . | . | 5 | . | . | . | 7 | Total 3D printed parts count |
|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="back_assembly"></a>
|
||||
## Back Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|1| Fan 17mm x 8mm|
|
||||
|1| PMS5003 particle detector|
|
||||
|
||||
|
||||
### 3D Printed parts
|
||||
|
||||
| 1 x enviro_plus_case_base.stl | 1 x fan_duct.stl |
|
||||
|---|---|
|
||||
|  | 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
1. Print the fan duct in flexible TPE with low infill.
|
||||
1. Slide the pms5003 into the printed receptacle with the fan to the outside. Secure with tape if it is loose.
|
||||
1. Slide the fan into the fan duct.
|
||||
1. Slide the fan duct into the printed recepacle.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="RPI_assembly"></a>
|
||||
## RPI Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|1| Micro SD card|
|
||||
|1| Pin header 20 x 2 right_angle|
|
||||
|1| Raspberry Pi Zero|
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
* Solder a right angle connector to the Raspberry Pi Zero.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="fan_controller_assembly"></a>
|
||||
## Fan Controller Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|1| SMD capacitor 1206 10uF|
|
||||
|1| SMD resistor 0805 3K3 0.125W|
|
||||
|1| SOT223 package FZT851|
|
||||
|1| Veroboard 6 holes x 6strips|
|
||||
|1| Wire link 0.8mm x 0.4"|
|
||||
|3| Wire link 0.8mm x 6.5mm|
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
The fan controller is a single transistor wired as a Miller integrator that effectively multiplies the capacitor value by the gain of the transistor.
|
||||
It converts the PWM signal on GPI4 to a stead DC voltage so that the fan doesn't whine, or stutter.
|
||||
|
||||

|
||||
|
||||
***
|
||||
* Make two track cuts as shown, one wide and the other narrow.
|
||||
|
||||

|
||||
|
||||
1. Add the SMT compeonents and then the wire links.
|
||||
1. Add more solder around the transistor to act as a heatsink.
|
||||
|
||||

|
||||
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="enviro_assembly"></a>
|
||||
## Enviro Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|1| Enviro+|
|
||||
|
||||
|
||||
### Sub-assemblies
|
||||
|
||||
| 1 x fan_controller_assembly |
|
||||
|---|
|
||||
| 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
* Solder the fan_controller to the Enviro+ expansion connector at the 5V, GND and #4 pins.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="case_assembly"></a>
|
||||
## Case Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|4| Heatfit insert M2|
|
||||
|3| Screw M3 pan x 6mm|
|
||||
|3| Washer M3 x 7mm x 0.5mm|
|
||||
|
||||
|
||||
### 3D Printed parts
|
||||
|
||||
| 1 x bulkhead.stl | 1 x enviro_plus_case.stl | 3 x foot.stl |
|
||||
|---|---|---|
|
||||
|  |  | 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
1. Solvent weld or glue the bulkhead into the recess in the bottom of the case.
|
||||
1. Fit the heatfit inserts with a soldering iron with a conical bit heated to about 200°C.
|
||||
1. Tap the three holes for the feet with an M3 tap.
|
||||
1. Screw on the three feet with M3 x 6mm pan screws and washers.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="enviro_case_assembly"></a>
|
||||
## Enviro Case Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|4| Nut M2.5 x 2.2mm nyloc|
|
||||
|4| Screw M2.5 pan x 8mm|
|
||||
|4| Washer M2.5 x 5.9mm x 0.5mm|
|
||||
|
||||
|
||||
### Sub-assemblies
|
||||
|
||||
| 1 x case_assembly | 1 x enviro_assembly |
|
||||
|---|---|
|
||||
|  | 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
* Screw the Enviro+ PCB to the front of the case using M2.5 x 8mm pan screws with washer and nuts on the inside.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="RPI_case_assembly"></a>
|
||||
## RPI Case Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|2| Screw M2.5 pan x 6.4mm|
|
||||
|
||||
|
||||
### Sub-assemblies
|
||||
|
||||
| 1 x RPI_assembly | 1 x enviro_case_assembly |
|
||||
|---|---|
|
||||
|  | 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
* Plug the RPi into the Enviro+ socket and secure with two screws self tapped into the bosses in the case.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
||||
|
||||
---
|
||||
<a name="main_assembly"></a>
|
||||
## Main Assembly
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|---:|:----------|
|
||||
|4| Screw M2 cap x 6mm|
|
||||
|4| Washer M2 x 5mm x 0.3mm|
|
||||
|
||||
|
||||
### Sub-assemblies
|
||||
|
||||
| 1 x RPI_case_assembly | 1 x back_assembly |
|
||||
|---|---|
|
||||
|  | 
|
||||
|
||||
|
||||
|
||||
### Assembly instructions
|
||||

|
||||
|
||||
* Solder the fan wires to the veroboard assembly
|
||||
|
||||

|
||||
|
||||
* Slide the back assembly into the case and secure with four M2 x 6mm cap screws and washers.
|
||||
|
||||

|
||||
|
||||
<span></span>
|
||||
[Top](#TOP)
|
45
examples/EnviroPlus/scad/fan_controller.scad
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
//! Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
|
||||
//
|
||||
// GNU GPL v2
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// Top level model
|
||||
//
|
||||
|
||||
include <NopSCADlib/core.scad>
|
||||
use <NopSCADlib/vitamins/veroboard.scad>
|
||||
include <NopSCADlib/vitamins/smds.scad>
|
||||
|
||||
fan_vb = vero("fan_vb", "fan_controller", 6, 6, breaks = [[2, 1], [2 + eps, 5]],
|
||||
components = [
|
||||
[5, 3, 90, "link", inch(0.4), undef, undef, 2.5],
|
||||
[0, 5, 0, "link", 0, 4, undef, 2.5],
|
||||
[0, 1, 0, "link", 0, 4, undef, 2.5],
|
||||
[0, 0, 0, "link", 0, 4, undef, 2.5],
|
||||
[2, 5, 0, "-smd_res", RES0805, "3K3"],
|
||||
[4, 4.7, 90, "-smd_cap", CAP1206, 1.2, "10uF"],
|
||||
[2, 2.5, 180, "-smd_sot", SOT223, "FZT851"],
|
||||
],
|
||||
joints = [[5, 1], [5, 5], [0, [0, 1, 5]]]
|
||||
);
|
||||
|
||||
//! The fan controller is a single transistor wired as a Miller integrator that effectively multiplies the capacitor value by the gain of the transistor.
|
||||
//! It converts the PWM signal on GPI4 to a stead DC voltage so that the fan doesn't whine, or stutter.
|
||||
//!
|
||||
//! 
|
||||
//!
|
||||
//! ***
|
||||
//! * Make two track cuts as shown, one wide and the other narrow.
|
||||
//!
|
||||
//! 
|
||||
//!
|
||||
//! 1. Add the SMT compeonents and then the wire links.
|
||||
//! 1. Add more solder around the transistor to act as a heatsink.
|
||||
//!
|
||||
//! 
|
||||
//!
|
||||
module fan_controller_assembly() rotate(90) vflip(!exploded()) veroboard_assembly(fan_vb, -vero_thickness(fan_vb) - 1.4, 0);
|
||||
|
||||
fan_controller_assembly();
|
518
examples/EnviroPlus/scad/main.scad
Normal file
@@ -0,0 +1,518 @@
|
||||
//
|
||||
//! Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
|
||||
//
|
||||
// GNU GPL v2
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// Top level model
|
||||
//
|
||||
$explode = 0; // [0, 1]
|
||||
assembly = "main"; // [main, back, RPI, case, enviro_case, RPI_case]
|
||||
|
||||
/* [Hidden] */
|
||||
|
||||
show_box = true;
|
||||
show_enviroplus = true;
|
||||
$pp1_colour = "grey";
|
||||
$extrusion_width = 0.5;
|
||||
|
||||
include <NopSCADlib/core.scad>
|
||||
include <NopSCADlib/vitamins/pin_headers.scad>
|
||||
include <NopSCADlib/vitamins/pcbs.scad>
|
||||
include <NopSCADlib/vitamins/fans.scad>
|
||||
|
||||
use <NopSCADlib/vitamins/insert.scad>
|
||||
use <NopSCADlib/vitamins/veroboard.scad>
|
||||
use <NopSCADlib/utils/round.scad>
|
||||
use <NopSCADlib/printed/foot.scad>
|
||||
use <NopSCADlib/printed/printed_box.scad>
|
||||
use <fan_controller.scad>
|
||||
|
||||
rpi = RPI0;
|
||||
pcb = EnviroPlus;
|
||||
fan = fan17x8;
|
||||
foot = Foot(d = 13, h = 5, t = 2, r = 1, screw = M3_pan_screw);
|
||||
module foot_stl() foot(foot);
|
||||
|
||||
rpi_offset = [0, -pcb_width(pcb) / 2 + 0.5, pcb_width(rpi) / 2 + 8.6];
|
||||
rpi_holes = [0, 1];
|
||||
wall = 2;
|
||||
top_thickness = 2;
|
||||
base_thickness = 2;
|
||||
case_inner_rad = 8;
|
||||
|
||||
width = pcb_length(pcb) + 9 + 10;
|
||||
pcb_x = -(width - pcb_length(pcb) - 9) / 2;
|
||||
depth = pcb_width(pcb) + 9;
|
||||
height = pcb_width(rpi) / 2 + rpi_offset.z + 9;
|
||||
bulkhead_outset = 2;
|
||||
bulkhead_inset = 0.5;
|
||||
bulkhead_t = 2;
|
||||
clearance = 0.1;
|
||||
pcb_screw = alternate_screw(hs_pan, pcb_screw(pcb));
|
||||
|
||||
box = pbox(name = "enviro_plus_case", wall = wall, top_t = top_thickness, base_t = base_thickness, screw = M2_cap_screw, radius = case_inner_rad, ridges = [8, 1],
|
||||
size = [width, depth, height]);
|
||||
|
||||
pms5003 = [50, 38, 21];
|
||||
pms5003_wall = 1;
|
||||
pms5003_pos = [width / 2 - pms5003.x / 2 - pms5003_wall - pbox_screw_inset(box) - insert_boss_radius(screw_insert(pbox_screw(box)), wall) - 0.5,
|
||||
depth / 2 - pms5003.z / 2 - wall - 1,
|
||||
height + top_thickness - pms5003.y / 2];
|
||||
|
||||
|
||||
fan_duct_t = 1.7;
|
||||
foam_t = 0;
|
||||
fan_pos = [pms5003_pos.x - pms5003.x / 2 - pms5003_wall - fan_width(fan) / 2 - fan_duct_t, 1 + foam_t, 12 + top_thickness + fan_depth(fan) / 2];
|
||||
fan_socket = 8;
|
||||
|
||||
module fan_shape() {
|
||||
w = fan_width(fan);
|
||||
p = fan_hole_pitch(fan);
|
||||
r = w / 2 - p;
|
||||
|
||||
rounded_square([w, w], r);
|
||||
}
|
||||
|
||||
module fan_duct_stl() {
|
||||
module frame(z, offset, y = -fan_pos.y)
|
||||
translate([0, y, z])
|
||||
linear_extrude(height = eps)
|
||||
offset(offset)
|
||||
fan_shape();
|
||||
|
||||
z = height + top_thickness - fan_pos.z + fan_depth(fan) / 2 - fan_socket;
|
||||
|
||||
translate([0, -fan_pos.y, z])
|
||||
linear_extrude(height = fan_socket)
|
||||
difference() {
|
||||
fan_shape();
|
||||
|
||||
round(1)
|
||||
offset(-fan_duct_t)
|
||||
fan_shape();
|
||||
}
|
||||
|
||||
stl("fan_duct") union() {
|
||||
difference() {
|
||||
hull() {
|
||||
frame(z, 0);
|
||||
|
||||
frame(fan_depth(fan), fan_duct_t + foam_t, 0);
|
||||
}
|
||||
hull() {
|
||||
frame(z, -fan_duct_t);
|
||||
|
||||
frame(fan_depth(fan), foam_t -extrusion_width / 2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
linear_extrude(height = fan_depth(fan))
|
||||
difference() {
|
||||
offset(fan_duct_t + foam_t)
|
||||
fan_shape();
|
||||
|
||||
offset(foam_t)
|
||||
fan_shape();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pms5003() {
|
||||
vitamin("pms5003(): PMS5003 particle detector");
|
||||
|
||||
w = pms5003.x;
|
||||
d = pms5003.y;
|
||||
h = pms5003.z;
|
||||
t = 0.1;
|
||||
color("silver")
|
||||
difference() {
|
||||
linear_extrude(height = h, center = true)
|
||||
difference() {
|
||||
square([w, d], center = true);
|
||||
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
translate([x * w / 2, y * d / 2])
|
||||
square(2, center = true);
|
||||
}
|
||||
cube([w + 2 * eps, d + 2 * eps, t * 2], center = true);
|
||||
}
|
||||
|
||||
color("black")
|
||||
rounded_rectangle([w - 2 * t, d - 2 * t, h - 2 * t], r = 1, center = true);
|
||||
}
|
||||
|
||||
module pcb_shape(offset)
|
||||
rounded_square([pcb_length(pcb) + 2 * offset, pcb_width(pcb) + 2 * offset], pcb_radius(pcb) + offset);
|
||||
|
||||
module gap() {
|
||||
gap = pcb_component_position(pcb, "-chip");
|
||||
|
||||
translate([gap.x, -gap.y])
|
||||
square([17.5, 20], center = true);
|
||||
}
|
||||
|
||||
module rpi_holes()
|
||||
for(i = rpi_holes) {
|
||||
hole = pcb_coord(rpi, pcb_holes(rpi)[i]);
|
||||
translate([hole.x, rpi_offset.y, -hole.y + rpi_offset.z + top_thickness])
|
||||
rotate([90, 0, 0])
|
||||
children();
|
||||
}
|
||||
|
||||
module feet_positions() {
|
||||
clearance = 2;
|
||||
foot_r = foot_diameter(foot) / 2;
|
||||
x_inset = case_inner_rad + foot_r - pbox_ridges(box).y;
|
||||
z_inset = foot_r + clearance;
|
||||
h = height + base_thickness;
|
||||
|
||||
for(p = [[-1, -1], [1, -1], [0, 1]])
|
||||
translate([p.x * (width / 2 - x_inset), depth / 2 + wall + pbox_ridges(box).y, top_thickness + h / 2 + p.y * (h / 2 - z_inset)])
|
||||
rotate([90, 0, 0])
|
||||
children();
|
||||
}
|
||||
|
||||
module slots(h = 10, expand = 0) {
|
||||
for(comp = [["uSD", 2, 11, 0.7], ["flat_flex", 1, 12, 0.5]]) {
|
||||
p = pcb_component_position(rpi, comp[0]);
|
||||
translate([sign(p.x) * (width / 2 + wall / 2 + pbox_ridges(box).y / 2), rpi_offset.y + pcb_thickness(rpi) + comp[3], top_thickness + rpi_offset.z - p.y])
|
||||
rotate([90, 0, 90])
|
||||
hull() {
|
||||
vertical_tearslot(r = comp[1] + expand, l = comp[2], h = h);
|
||||
|
||||
if(expand)
|
||||
vertical_tearslot(r = comp[1] + expand + h / 2, l = comp[2], h = eps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module box_internal_additions() {
|
||||
translate([pcb_x, 0]) {
|
||||
linear_extrude(height = top_thickness + bulkhead_t)
|
||||
difference() {
|
||||
pcb_shape(bulkhead_outset + wall + pbox_ridges(box).y + eps);
|
||||
|
||||
gap();
|
||||
|
||||
pcb_shape(bulkhead_outset + clearance);
|
||||
}
|
||||
|
||||
rpi_holes()
|
||||
hull() {
|
||||
wall = 1.8;
|
||||
r = screw_radius(pcb_screw) + wall;
|
||||
z = depth / 2 + rpi_offset.y + pbox_ridges(box).y + eps;
|
||||
offset = max(r, z);
|
||||
cylinder(r =r, h = z);
|
||||
|
||||
translate([0, -offset - r, z])
|
||||
cube(eps);
|
||||
}
|
||||
}
|
||||
d = washer_diameter(screw_washer(foot_screw(foot))) + 1;
|
||||
h = pbox_ridges(box).y;
|
||||
feet_positions()
|
||||
translate_z(wall - eps)
|
||||
cylinder(d2 = d, d1 = d + 2 * h, h = h);
|
||||
|
||||
slots(wall + pbox_ridges(box).y + eps, 1);
|
||||
}
|
||||
|
||||
module box_external_additions() {
|
||||
amp = pbox_ridges(box).y + eps;
|
||||
d = foot_diameter(foot) + 1;
|
||||
feet_positions()
|
||||
cylinder(d1 = d, d2 = d + 2 * amp, h = amp);
|
||||
|
||||
slots(wall + pbox_ridges(box).y + eps, 1);
|
||||
}
|
||||
|
||||
|
||||
module box_holes() {
|
||||
translate([pcb_x, 0]) {
|
||||
linear_extrude(height = top_thickness + eps)
|
||||
pcb_shape(clearance);
|
||||
|
||||
rpi_holes()
|
||||
teardrop_plus(r = screw_pilot_hole(pcb_screw), h = 7 - 1.6, center = false);
|
||||
}
|
||||
feet_positions()
|
||||
teardrop(r = screw_pilot_hole(foot_screw(foot)), h = 10, center = true);
|
||||
|
||||
grills = 7;
|
||||
bar = 1.6;
|
||||
x = pcb_x + pcb_length(pcb) / 2 + 2 * wall + pbox_ridges(box).y + 2 * eps;
|
||||
w = width / 2 - x;
|
||||
d = depth - case_inner_rad;
|
||||
pitch = d / (grills - 1);
|
||||
for(i = [0 : grills -1])
|
||||
let(w = i == 0 || i == grills -1 ? w - 1 : w)
|
||||
translate([x + w / 2, -d / 2 + i * pitch])
|
||||
rounded_rectangle([w, pitch - bar, 10], 1);
|
||||
|
||||
slots();
|
||||
}
|
||||
|
||||
module bulkhead_stl() {
|
||||
holes = pcb_holes(pcb);
|
||||
pitch = max([for(h = holes) pcb_coord(pcb, h).x]) - min([for(h = holes) pcb_coord(pcb, h).x]);
|
||||
boss_r = (pitch - 51.4) / 2;
|
||||
|
||||
stl("bulkhead")
|
||||
linear_extrude(height = bulkhead_t)
|
||||
difference() {
|
||||
pcb_shape(bulkhead_outset);
|
||||
|
||||
gap();
|
||||
|
||||
difference() {
|
||||
pcb_shape(-bulkhead_inset);
|
||||
|
||||
pcb_screw_positions(pcb)
|
||||
rotate($i * 90)
|
||||
hull() {
|
||||
circle(boss_r);
|
||||
|
||||
translate([boss_r - eps, -boss_r])
|
||||
square([eps, boss_r]);
|
||||
|
||||
translate([-boss_r, boss_r - eps])
|
||||
square([boss_r, eps]);
|
||||
|
||||
translate([-boss_r, -boss_r])
|
||||
square(eps);
|
||||
}
|
||||
}
|
||||
|
||||
pcb_screw_positions(pcb)
|
||||
poly_circle(screw_clearance_radius(pcb_screw));
|
||||
}
|
||||
}
|
||||
|
||||
module enviro_plus_case_stl() {
|
||||
pbox(box) {
|
||||
box_internal_additions();
|
||||
box_holes();
|
||||
box_external_additions();
|
||||
}
|
||||
}
|
||||
|
||||
module base_additions() {
|
||||
w = pms5003.x + clearance;
|
||||
d = pms5003.z + clearance;
|
||||
wall = pms5003_wall;
|
||||
|
||||
translate([pms5003_pos.x, -pms5003_pos.y])
|
||||
linear_extrude(height = base_thickness + pms5003.y)
|
||||
difference() {
|
||||
square([w + 2 * wall, d + 2 * wall], center = true);
|
||||
square([w, d], center = true);
|
||||
}
|
||||
|
||||
translate([fan_pos.x, 0])
|
||||
linear_extrude(height = top_thickness + fan_socket)
|
||||
difference() {
|
||||
offset(wall)
|
||||
fan_shape();
|
||||
|
||||
fan_shape();
|
||||
}
|
||||
}
|
||||
|
||||
module base_holes() {
|
||||
for(i = [0 : 1]) {
|
||||
p = pcb_component_position(rpi, "usb_uA", i);
|
||||
translate([p.x + pcb_x, -rpi_offset.y - pcb_thickness(rpi) - 1.3])
|
||||
rounded_rectangle([11,7, 100], 0.5, true);
|
||||
}
|
||||
|
||||
translate([pms5003_pos.x, -pms5003_pos.y])
|
||||
rounded_rectangle([pms5003.x - 2 ,pms5003.z - 2, 100], 2, true);
|
||||
|
||||
translate([fan_pos.x, 0])
|
||||
linear_extrude(height = 2 * base_thickness + eps, center = true)
|
||||
round(1)
|
||||
offset(-fan_duct_t)
|
||||
fan_shape();
|
||||
}
|
||||
|
||||
module enviro_plus_case_base_stl()
|
||||
pbox_base(box) {
|
||||
base_additions();
|
||||
base_holes();
|
||||
}
|
||||
|
||||
//! * Solder a right angle connector to the Raspberry Pi Zero.
|
||||
module RPI_assembly()
|
||||
assembly("RPI") {
|
||||
pcb(rpi);
|
||||
|
||||
pcb_grid(rpi, 9.5, 0.5, -0.6)
|
||||
rotate(180)
|
||||
explode(20)
|
||||
pin_header(2p54header, 20, 2, right_angle = true);
|
||||
}
|
||||
|
||||
//! 1. Solvent weld or glue the bulkhead into the recess in the bottom of the case.
|
||||
//! 1. Fit the heatfit inserts with a soldering iron with a conical bit heated to about 200°C.
|
||||
//! 1. Tap the three holes for the feet with an M3 tap.
|
||||
//! 1. Screw on the three feet with M3 x 6mm pan screws and washers.
|
||||
module case_assembly() pose([ 29.60, 0.00, 158.00 ], exploded = true) pose([ 198.00, 0.00, 352.80 ], exploded = false)
|
||||
assembly("case") {
|
||||
if(show_box)
|
||||
stl_colour(pp1_colour) render() enviro_plus_case_stl();
|
||||
else
|
||||
render() difference() {
|
||||
enviro_plus_case_stl();
|
||||
|
||||
translate_z(height / 2)
|
||||
cube([100, 100, height - 20], center = true);
|
||||
}
|
||||
|
||||
pbox_inserts(box);
|
||||
|
||||
translate([pcb_x, 0, top_thickness])
|
||||
explode(20)
|
||||
stl_colour(pp2_colour) render() bulkhead_stl();
|
||||
|
||||
feet_positions() {
|
||||
foot_assembly(0, foot);
|
||||
|
||||
vflip()
|
||||
explode(20, explode_children = true)
|
||||
translate_z(foot_thickness(foot))
|
||||
screw_and_washer(foot_screw(foot), 6);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//! * Solder the fan_controller to the Enviro+ expansion connector at the 5V, GND and #4 pins.
|
||||
module enviro_assembly() hflip(exploded())
|
||||
assembly("enviro") {
|
||||
if(show_enviroplus)
|
||||
pcb(pcb);
|
||||
|
||||
pcb_grid(pcb, 5.5, 2.5, -pcb_thickness(pcb)) {
|
||||
hflip()
|
||||
explode(15)
|
||||
fan_controller_assembly();
|
||||
}
|
||||
if(!exploded())
|
||||
for(x = [8, 7, 3])
|
||||
pcb_grid(pcb, x, 0, 0.05)
|
||||
solder_meniscus(pcb, 0.39, 1);
|
||||
}
|
||||
|
||||
//! * Screw the Enviro+ PCB to the front of the case using M2.5 x 8mm pan screws with washer and nuts on the inside.
|
||||
module enviro_case_assembly() pose([ 231.40, 0.00, 1.20 ])
|
||||
assembly("enviro_case") {
|
||||
case_assembly();
|
||||
|
||||
translate([pcb_x, 0, top_thickness])
|
||||
vflip() explode(20, explode_children = true) {
|
||||
t = pcb_thickness(pcb);
|
||||
nut = screw_nut(pcb_screw);
|
||||
washer = screw_washer(pcb_screw);
|
||||
|
||||
no_explode() enviro_assembly();
|
||||
|
||||
pcb_screw_positions(pcb) {
|
||||
translate_z(t)
|
||||
screw(pcb_screw, screw_longer_than(t + bulkhead_t + nut_thickness(nut, true) + washer_thickness(washer)));
|
||||
|
||||
translate_z(-bulkhead_t)
|
||||
vflip()
|
||||
explode(20, explode_children = true)
|
||||
nut_and_washer(nut, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! * Plug the RPi into the Enviro+ socket and secure with two screws self tapped into the bosses in the case.
|
||||
module RPI_case_assembly() pose([ 20.50, 0.00, 153.30 ])
|
||||
assembly("RPI_case") {
|
||||
enviro_case_assembly();
|
||||
|
||||
translate([pcb_x, 0]) {
|
||||
translate_z(top_thickness) {
|
||||
|
||||
translate(rpi_offset)
|
||||
rotate([-90, 0, 0])
|
||||
RPI_assembly();
|
||||
}
|
||||
rpi_holes()
|
||||
vflip()
|
||||
translate_z(pcb_thickness(rpi))
|
||||
screw(pcb_screw, 6.4);
|
||||
}
|
||||
}
|
||||
|
||||
//! 1. Print the fan duct in flexible TPE with low infill.
|
||||
//! 1. Slide the pms5003 into the printed receptacle with the fan to the outside. Secure with tape if it is loose.
|
||||
//! 1. Slide the fan into the fan duct.
|
||||
//! 1. Slide the fan duct into the printed recepacle.
|
||||
module back_assembly() pose([ 228.60, 0.00, 24.30 ])
|
||||
assembly("back") {
|
||||
translate(pms5003_pos)
|
||||
explode(-50)
|
||||
rotate([90, 0, 0])
|
||||
pms5003();
|
||||
|
||||
explode(-20, explode_children = true)
|
||||
translate(fan_pos) {
|
||||
explode(-20)
|
||||
fan(fan);
|
||||
|
||||
translate_z(-fan_depth(fan) / 2)
|
||||
stl_colour(pp4_colour)
|
||||
render()
|
||||
fan_duct_stl();
|
||||
}
|
||||
|
||||
translate_z(height + top_thickness + base_thickness + eps) vflip()
|
||||
stl_colour(show_box ? pp1_colour : pp2_colour) render() enviro_plus_case_base_stl();
|
||||
}
|
||||
|
||||
//! * Solder the fan wires to the veroboard assembly
|
||||
//!
|
||||
//! 
|
||||
//!
|
||||
//! * Slide the back assembly into the case and secure with four M2 x 6mm cap screws and washers.
|
||||
module main_assembly() pose([170, 335, 0], exploded = false) pose([ 42.20, 0.00, 159.60 ], exploded = true)
|
||||
assembly("main") {
|
||||
RPI_case_assembly();
|
||||
|
||||
explode(20, explode_children = true) {
|
||||
pbox_base_screws(box);
|
||||
|
||||
back_assembly();
|
||||
}
|
||||
}
|
||||
|
||||
if($preview) {
|
||||
if(assembly == "main")
|
||||
main_assembly();
|
||||
else if(assembly == "case")
|
||||
case_assembly();
|
||||
else if(assembly == "back")
|
||||
back_assembly();
|
||||
else if(assembly == "RPI")
|
||||
RPI_assembly();
|
||||
else if(assembly == "RPI_case")
|
||||
RPI_case_assembly();
|
||||
else if(assembly == "enviro_case")
|
||||
enviro_case_assembly();
|
||||
}
|
||||
else {
|
||||
gap = 5;
|
||||
|
||||
enviro_plus_case_stl();
|
||||
|
||||
translate([0, -depth - gap])
|
||||
enviro_plus_case_base_stl();
|
||||
|
||||
translate([0, -2 * (depth + gap)])
|
||||
bulkhead_stl();
|
||||
}
|
BIN
examples/EnviroPlus/stls/bulkhead.png
Normal file
After Width: | Height: | Size: 15 KiB |
4594
examples/EnviroPlus/stls/bulkhead.stl
Normal file
BIN
examples/EnviroPlus/stls/enviro_plus_case.png
Normal file
After Width: | Height: | Size: 14 KiB |
99318
examples/EnviroPlus/stls/enviro_plus_case.stl
Normal file
BIN
examples/EnviroPlus/stls/enviro_plus_case_base.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
12070
examples/EnviroPlus/stls/enviro_plus_case_base.stl
Normal file
BIN
examples/EnviroPlus/stls/fan_duct.png
Normal file
After Width: | Height: | Size: 14 KiB |
8738
examples/EnviroPlus/stls/fan_duct.stl
Normal file
BIN
examples/EnviroPlus/stls/foot.png
Normal file
After Width: | Height: | Size: 26 KiB |
15318
examples/EnviroPlus/stls/foot.stl
Normal file
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 259 KiB |
Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 252 KiB After Width: | Height: | Size: 390 KiB |
@@ -35,6 +35,7 @@ cnc_bit_r = is_undef($cnc_bit_r) ? 1.2 : $cnc_bit_r; // min
|
||||
show_rays = is_undef($show_rays) ? false : $show_rays; // show camera sight lines and light direction
|
||||
show_threads = is_undef($show_threads) ? false : $show_threads; // show screw threads
|
||||
show_plugs = is_undef($show_plugs) ? false : $show_plugs; // plugs on headers
|
||||
teardrop_angle = is_undef($teardrop_angle) ? 45 : $teardrop_angle; // teardrop angle
|
||||
pp1_colour = is_undef($pp1_colour) ? rr_green : $pp1_colour;// printed part colour 1, RepRap logo colour
|
||||
pp2_colour = is_undef($pp2_colour) ? crimson : $pp2_colour;// printed part colour 2
|
||||
pp3_colour = is_undef($pp3_colour) ? "SteelBlue" : $pp3_colour;// printed part colour 3
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 932 KiB After Width: | Height: | Size: 979 KiB |
23
libtest.scad
@@ -123,6 +123,7 @@ use <tests/fixing_block.scad>
|
||||
use <tests/flat_hinge.scad>
|
||||
use <tests/foot.scad>
|
||||
use <tests/handle.scad>
|
||||
use <tests/knob.scad>
|
||||
use <tests/PCB_mount.scad>
|
||||
use <tests/pocket_handle.scad>
|
||||
use <tests/printed_box.scad>
|
||||
@@ -159,10 +160,10 @@ translate([x5, cable_grommets_y + 60])
|
||||
translate([x5, cable_grommets_y + 90])
|
||||
corner_blocks();
|
||||
|
||||
translate([x5, cable_grommets_y + 150])
|
||||
translate([x5, cable_grommets_y + 160])
|
||||
feet();
|
||||
|
||||
translate([x5 + 70, cable_grommets_y + 150])
|
||||
translate([x5 + 70, cable_grommets_y + 160])
|
||||
screw_knobs();
|
||||
|
||||
translate([x5, cable_grommets_y + 470]) {
|
||||
@@ -173,16 +174,19 @@ translate([x5, cable_grommets_y + 470]) {
|
||||
flat_hinges();
|
||||
}
|
||||
|
||||
translate([x5, cable_grommets_y + 370])
|
||||
translate([x5, cable_grommets_y + 380])
|
||||
no_explode() socket_boxes();
|
||||
|
||||
translate([x5 + 60, cable_grommets_y + 200])
|
||||
strap_handles();
|
||||
|
||||
translate([640, cable_grommets_y + 200])
|
||||
printed_pulley_test();
|
||||
|
||||
translate([x5, cable_grommets_y + 250])
|
||||
translate([x5, cable_grommets_y + 200])
|
||||
knobs();
|
||||
|
||||
translate([x5 + 60, cable_grommets_y + 250])
|
||||
strap_handles();
|
||||
|
||||
translate([x5, cable_grommets_y + 300])
|
||||
handle();
|
||||
|
||||
translate([950, 600])
|
||||
@@ -194,8 +198,9 @@ translate([900, 750])
|
||||
translate([900, 850])
|
||||
printed_boxes();
|
||||
|
||||
translate([850, 1330 + 85])
|
||||
bbox_test();
|
||||
translate([950, 1400])
|
||||
rotate(-90)
|
||||
bbox_test();
|
||||
|
||||
inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
|
@@ -30,6 +30,10 @@
|
||||
//! 
|
||||
//!
|
||||
//! Normally the side sheets are the same type but they can be overridden individually as long as the substitute has the same thickness.
|
||||
//!
|
||||
//! A box can have an optional name to allow more than one in the same project.
|
||||
//!
|
||||
//! The top bezel can have an optional child, which is subtracted to allow modification.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../vitamins/sheet.scad>
|
||||
@@ -50,12 +54,13 @@ function box_sheets(type) = type[3]; //! Sheet type used for the sides
|
||||
function box_top_sheet(type) = type[4]; //! Sheet type for the top
|
||||
function box_base_sheet(type) = type[5]; //! Sheet type for the bottom
|
||||
function box_feet(type) = type[6]; //! True to enable feet on the bottom bezel
|
||||
function box_width(type) = type[7]; //! Internal width
|
||||
function box_depth(type) = type[8]; //! Internal depth
|
||||
function box_height(type) = type[9]; //! Internal height
|
||||
function box_name(type) = type[7]; //! Name for projects with more than one box
|
||||
function box_width(type) = type[8]; //! Internal width
|
||||
function box_depth(type) = type[9]; //! Internal depth
|
||||
function box_height(type) = type[10];//! Internal height
|
||||
|
||||
function box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false, shelf_screw = undef) = //! Construct a property list for a box.
|
||||
concat([screw, is_undef(shelf_screw) ? screw : shelf_screw, wall, sheets, top_sheet, base_sheet, feet], size);
|
||||
function box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false, shelf_screw = undef, name = "box") = //! Construct a property list for a box.
|
||||
concat([screw, is_undef(shelf_screw) ? screw : shelf_screw, wall, sheets, top_sheet, base_sheet, feet, name], size);
|
||||
|
||||
function box_bezel_clearance(type) = bezel_clearance;
|
||||
|
||||
@@ -66,7 +71,7 @@ function box_washer(type) = screw_washer(box_screw(type));
|
||||
function box_insert(type) = screw_insert(box_screw(type));
|
||||
function box_shelf_insert(type) = screw_insert(box_shelf_screw(type));
|
||||
|
||||
function box_hole_inset(type) = washer_radius(box_washer(type)) + 1;
|
||||
function box_hole_inset(type) = washer_radius(box_washer(type)) + 1; //! Screw inset from the corner of the internal dimensions
|
||||
function box_insert_r(type) = insert_hole_radius(box_insert(type));
|
||||
function box_insert_l(type) = insert_length(box_insert(type));
|
||||
function box_boss_r(type) = ceil(corrected_radius(box_insert_r(type)) + box_wall(type));
|
||||
@@ -81,7 +86,6 @@ function box_screw_length(type, top) =
|
||||
let(s = top ? box_top_sheet(type) : box_base_sheet(type))
|
||||
screw_length(box_screw(type), sheet_thickness(s) + box_corner_gap(type) + box_profile_overlap(type) - 1, washers = 2, insert = true, longer = true);
|
||||
|
||||
function box_wall_clearance(type) = box_sheet_slot(type) / 2 - sheet_thickness(box_sheets(type)) / 2;
|
||||
function box_margin(type) = box_profile_overlap(type) + box_corner_gap(type); //! How much the bezel intrudes on the specified height
|
||||
function box_intrusion(type) = box_hole_inset(type) + box_boss_r(type); //! Corner profile intrusion
|
||||
function sheet_reduction(type) = 2 * box_corner_gap(type) + sheet_end_clearance;
|
||||
@@ -91,6 +95,8 @@ function box_bezel_height(type, bottom) = //! Bezel height for top or bottom
|
||||
let(t1 = sheet_thickness(box_base_sheet(type)), t2 = sheet_thickness(box_top_sheet(type)))
|
||||
box_corner_rad(type) + box_profile_overlap(type) + (bottom ? max(t1, t2) : t2) - sheet_thickness(box_sheets(type));
|
||||
|
||||
function box_bc_name(type, suffix) = let(name = box_name(type)) name == "box" ? suffix : str(name, "_", suffix); // Backwards compatible name
|
||||
|
||||
grill_hole = 5;
|
||||
grill_gap = 1.9;
|
||||
|
||||
@@ -143,7 +149,7 @@ module box_corner_profile_2D(type) { //! The 2D shape of the corner profile.
|
||||
module box_corner_profile(type) { //! Generates the corner profile STL for 3D printing.
|
||||
length = box_height(type) - 2 * box_margin(type);
|
||||
|
||||
stl("box_corner_profile")
|
||||
stl(str(box_name(type), "_corner_profile"))
|
||||
difference() {
|
||||
linear_extrude(length, center = true, convexity = 5)
|
||||
box_corner_profile_2D(type);
|
||||
@@ -192,7 +198,7 @@ module box_corner_profile_section(type, section, sections) { //! Generates inter
|
||||
}
|
||||
|
||||
module box_corner_profile_sections(type, section, sections) { //! Generate four copies of a corner profile section
|
||||
stl("box_corner_profile");
|
||||
stl(str(box_name(type), "_corner_profile"));
|
||||
offset = box_boss_r(type) + 1;
|
||||
for(i = [0 : 3])
|
||||
rotate(i * 90)
|
||||
@@ -222,7 +228,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
|
||||
height = box_bezel_height(type, bottom);
|
||||
foot_extension = foot_height - height;
|
||||
|
||||
stl(bottom ? "bottom_bezel" : "top_bezel")
|
||||
stl(box_bc_name(type, bottom ? "bottom_bezel" : "top_bezel"))
|
||||
difference() {
|
||||
w = box_width(type);
|
||||
d = box_depth(type);
|
||||
@@ -282,6 +288,12 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
|
||||
box_screw_hole_positions(type)
|
||||
poly_circle(screw_clearance_radius(box_screw(type)));
|
||||
}
|
||||
//
|
||||
// Optional child to subtract
|
||||
//
|
||||
if($children && !bottom)
|
||||
translate_z(-box_profile_overlap(type))
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,7 +367,6 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
|
||||
|
||||
translate([0, bw2 / 2, dh2 / 2])
|
||||
cube([eps, bw2 - 2 * dowel_wall + 2 * extrusion_width, dh2], center = true);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -371,7 +382,9 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
|
||||
union() {
|
||||
clip(xmin = 0, xmax = w, ymin = 0, ymax = h)
|
||||
translate([tw / 2 - x * w, th / 2 - y * h, profile_overlap])
|
||||
box_bezel(type, bottom);
|
||||
box_bezel(type, bottom)
|
||||
if($children && !bottom)
|
||||
children();
|
||||
|
||||
if(x < cols - 1 && y == 0)
|
||||
translate([w, 0])
|
||||
@@ -440,7 +453,7 @@ module box_screw_hole_positions(type) {
|
||||
}
|
||||
|
||||
module box_base_blank(type) { //! Generates a 2D template for the base sheet
|
||||
dxf("box_base");
|
||||
dxf(str(box_name(type), "_base"));
|
||||
|
||||
difference() {
|
||||
sheet_2D(box_base_sheet(type), box_width(type), box_depth(type), box_sheet_r(type));
|
||||
@@ -451,7 +464,7 @@ module box_base_blank(type) { //! Generates a 2D template for the base sheet
|
||||
}
|
||||
|
||||
module box_top_blank(type) { //! Generates a 2D template for the top sheet
|
||||
dxf("box_top");
|
||||
dxf(str(box_name(type), "_top"));
|
||||
|
||||
difference() {
|
||||
sheet_2D(box_top_sheet(type), box_width(type), box_depth(type), box_sheet_r(type));
|
||||
@@ -466,7 +479,7 @@ function subst_sheet(type, sheet) =
|
||||
sheet ? assert(sheet_thickness(sheet) == sheet_thickness(s)) sheet : s;
|
||||
|
||||
module box_shelf_blank(type, sheet = false) { //! Generates a 2D template for a shelf sheet
|
||||
dxf("box_shelf");
|
||||
dxf(str(box_name(type), "_shelf"));
|
||||
|
||||
difference() {
|
||||
sheet_2D(subst_sheet(type, sheet), box_width(type) - bezel_clearance, box_depth(type) - bezel_clearance, 1);
|
||||
@@ -514,7 +527,7 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
|
||||
square([lip, eps]);
|
||||
}
|
||||
|
||||
stl("shelf_bracket")
|
||||
stl(box_bc_name(type, "shelf_bracket"))
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(w)
|
||||
@@ -567,25 +580,25 @@ module box_shelf_bracket_section(type, rows, cols, x, y) { //! Generates section
|
||||
}
|
||||
|
||||
module box_left_blank(type, sheet = false) { //! Generates a 2D template for the left sheet, `sheet` can be set to override the type
|
||||
dxf("box_left");
|
||||
dxf(str(box_name(type), "_left"));
|
||||
|
||||
sheet_2D(subst_sheet(type, sheet), box_depth(type) - sheet_reduction(type), box_height(type) - sheet_reduction(type), 1);
|
||||
}
|
||||
|
||||
module box_right_blank(type, sheet = false) { //! Generates a 2D template for the right sheet, `sheet` can be set to override the type
|
||||
dxf("box_right");
|
||||
dxf(str(box_name(type), "_right"));
|
||||
|
||||
sheet_2D(subst_sheet(type, sheet), box_depth(type) - sheet_reduction(type), box_height(type) - sheet_reduction(type), 1);
|
||||
}
|
||||
|
||||
module box_front_blank(type, sheet = false) { //! Generates a 2D template for the front sheet, `sheet` can be set to override the type
|
||||
dxf("box_front");
|
||||
dxf(str(box_name(type), "_front"));
|
||||
|
||||
sheet_2D(subst_sheet(type, sheet), box_width(type) - sheet_reduction(type), box_height(type) - sheet_reduction(type), 1);
|
||||
}
|
||||
|
||||
module box_back_blank(type, sheet = false) { //! Generates a 2D template for the back sheet, `sheet` can be set to override the type
|
||||
dxf("box_back");
|
||||
dxf(str(box_name(type), "_back"));
|
||||
|
||||
sheet_2D(subst_sheet(type, sheet), box_width(type) - sheet_reduction(type), box_height(type) - sheet_reduction(type), 1);
|
||||
}
|
||||
|
@@ -23,7 +23,7 @@
|
||||
// parameters to make the assembly views. E.g. module box_assembly() _box_assembly(box);
|
||||
//
|
||||
module _box_assembly(type, top = true, base = true, left = true, right = true, back = true, front = true, bezels = true, corners = 4)
|
||||
assembly("box") {
|
||||
assembly(box_name(type)) {
|
||||
echo("Box:", box_width(type), box_depth(type), box_height(type));
|
||||
|
||||
t = sheet_thickness(box_sheets(type));
|
||||
@@ -50,7 +50,9 @@ assembly("box") {
|
||||
translate_z(z * (box_height(type) / 2 - box_corner_gap(type) + 50 * exploded()))
|
||||
rotate([z * 90 - 90, 0, 0])
|
||||
if(bezels && (z > 0 ? top : base))
|
||||
stl_colour(pp1_colour) render() box_bezel(type, z < 0);
|
||||
stl_colour(pp1_colour) render() box_bezel(type, z < 0)
|
||||
if(z > 0 && $children)
|
||||
children();
|
||||
|
||||
translate_z(z * (box_height(type) / 2 + sheet_thickness + 50 * exploded()))
|
||||
box_screw_hole_positions(type)
|
||||
|
@@ -31,7 +31,8 @@
|
||||
//! * An optional list of fixing blocks to be omitted can be given.
|
||||
//! * Star washers can be omitted by setting the 11th parameter to false.
|
||||
//!
|
||||
//! Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
//! Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block) by default. Setting `thin_blocks` uses 2screw_blocks instead of
|
||||
//! fixing_blocks along the sides.
|
||||
//
|
||||
|
||||
use <fixing_block.scad>
|
||||
@@ -46,12 +47,13 @@ function bbox_span(type) = type[4]; //! Maximum span between fixing blocks
|
||||
function bbox_width(type) = type[5]; //! Internal width
|
||||
function bbox_depth(type) = type[6]; //! Internal depth
|
||||
function bbox_height(type) = type[7]; //! Internal height
|
||||
function bbox_name(type) = type[8] ? type[8] : "bbox"; //! Optional name if there is more than one box in a project
|
||||
function bbox_skip_blocks(type)= type[9] ? type[9] : []; //! List of fixing blocks to skip, used to allow a hinged panel for example
|
||||
function star_washers(type) = type[10] ? type[10] : is_undef(type[10]); //! Set to false to remove star washers.
|
||||
function bbox_name(type) = type[8]; //! Optional name if there is more than one box in a project
|
||||
function bbox_skip_blocks(type)= type[9]; //! List of fixing blocks to skip, used to allow a hinged panel for example
|
||||
function bbox_star_washers(type)= type[10];//! Set to false to remove star washers.
|
||||
function bbox_thin_blocks(type) = type[11];//! Set for 2 screw blocks instead of three hole fixing blocks.
|
||||
|
||||
function bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true) = //! Construct the property list for a butt_box
|
||||
[ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers ];
|
||||
function bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true, thin_blocks = false) = //! Construct the property list for a butt_box
|
||||
[ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers, thin_blocks ];
|
||||
|
||||
function bbox_volume(type) = bbox_width(type) * bbox_depth(type) * bbox_height(type) / 1000000; //! Internal volume in litres
|
||||
function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surface area in m^2
|
||||
@@ -108,7 +110,10 @@ function fixing_block_positions(type) = let(
|
||||
rotate([y > 0 ? 180 : 0, x * y * 90, 0]),
|
||||
];
|
||||
|
||||
function side_holes(type) = [for(p = fixing_block_positions(type), q = fixing_block_holes(bbox_screw(type))) p * q];
|
||||
function side_holes(type) = let(
|
||||
screw = bbox_screw(type),
|
||||
holes = bbox_thin_blocks(type) ? 2screw_block_holes(screw) : fixing_block_holes(screw))
|
||||
[for(p = fixing_block_positions(type), q = holes) p * q];
|
||||
|
||||
module bbox_drill_holes(type, t)
|
||||
position_children(concat(corner_holes(type), side_holes(type)), t)
|
||||
@@ -226,11 +231,13 @@ module _bbox_assembly(type, top = true, base = true, left = true, right = true,
|
||||
width = bbox_width(type);
|
||||
depth = bbox_depth(type);
|
||||
height = bbox_height(type);
|
||||
echo("Box:", width, depth, height, volume = bbox_volume(type), area = bbox_area(type));
|
||||
echo("Butt_box:", width, depth, height, volume = bbox_volume(type), area = bbox_area(type));
|
||||
|
||||
t = sheet_thickness(bbox_sheets(type));
|
||||
bt = sheet_thickness(bbox_base_sheet(type));
|
||||
tt = sheet_thickness(bbox_top_sheet(type));
|
||||
star_washers = bbox_star_washers(type);
|
||||
thin_blocks = bbox_thin_blocks(type);
|
||||
|
||||
function is_missing_screw(p) = p.y > depth / 2 - 1 ? !back : false;
|
||||
|
||||
@@ -240,13 +247,16 @@ module _bbox_assembly(type, top = true, base = true, left = true, right = true,
|
||||
let(q = transform([0, 0, 0], p), thickness = q.z > 0 ? tt : bt)
|
||||
multmatrix(p)
|
||||
fastened_corner_block_assembly(is_missing_screw(q) && ((q.z > 0) != (q.x > 0)) ? 0 : t, bbox_screw(type), thickness,
|
||||
is_missing_screw(q) && ((q.z > 0) == (q.x > 0)) ? 0 : t, star_washers = star_washers(type));
|
||||
is_missing_screw(q) && ((q.z > 0) == (q.x > 0)) ? 0 : t, star_washers = star_washers);
|
||||
|
||||
h = height / 2 - 1;
|
||||
for(p = fixing_block_positions(type))
|
||||
let(q = transform([0, 0, 0], p), thickness = q.z > h ? tt : q.z < -h ? bt : t)
|
||||
multmatrix(p)
|
||||
fastened_fixing_block_assembly(is_missing_screw(q) ? 0 : t, bbox_screw(type), thickness2 = thickness, star_washers = star_washers(type));
|
||||
if(thin_blocks)
|
||||
fastened_2screw_block_assembly(is_missing_screw(q) ? 0 : t, bbox_screw(type), thickness_below = thickness, star_washers = star_washers);
|
||||
else
|
||||
fastened_fixing_block_assembly(is_missing_screw(q) ? 0 : t, bbox_screw(type), thickness2 = thickness, star_washers = star_washers);
|
||||
|
||||
for(x = [-1, 1])
|
||||
translate([x * (width / 2 + t / 2 + eps + 25 * exploded()), 0])
|
||||
|
@@ -158,14 +158,14 @@ module mouse_grommet_hole(r, h = 50, z = undef, expand = wall + clearance) //! M
|
||||
square([2 * R, eps]);
|
||||
}
|
||||
|
||||
function mouse_grommet_offset(r) = r + wall;
|
||||
function mouse_grommet_offset(r) = r + wall; //! Offset of the wire from the ground
|
||||
function mouse_grommet_length(r) = 2 * r + 2 * wall + 2 * overlap; //! Length of grommet given r
|
||||
|
||||
module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
||||
|
||||
width = 2 * (wall + clearance) + thickness;
|
||||
length = 2 * r + 2 * wall + 2 * overlap;
|
||||
|
||||
stl(str("mouse_grommet_", r * 10, "_", thickness))
|
||||
stl(str("mouse_grommet_", r * 20, "_", thickness))
|
||||
rotate([90, 0, 0])
|
||||
union() {
|
||||
for(side = [-1, 1])
|
||||
@@ -193,10 +193,10 @@ module mouse_grommet_assembly(r, thickness)
|
||||
mouse_grommet(r, thickness);
|
||||
|
||||
module ribbon_grommet_20_3_stl() ribbon_grommet(20, 3);
|
||||
module mouse_grommet_15_3_stl() mouse_grommet(1.5, 3);
|
||||
module mouse_grommet_20_3_stl() mouse_grommet(2, 3);
|
||||
module mouse_grommet_25_3_stl() mouse_grommet(2.5, 3);
|
||||
module mouse_grommet_30_3_stl() mouse_grommet(3, 3);
|
||||
module mouse_grommet_30_3_stl() mouse_grommet(1.5, 3);
|
||||
module mouse_grommet_40_3_stl() mouse_grommet(2, 3);
|
||||
module mouse_grommet_50_3_stl() mouse_grommet(2.5, 3);
|
||||
module mouse_grommet_60_3_stl() mouse_grommet(3, 3);
|
||||
|
||||
module round_grommet_bottom_30_stl() round_grommet_bottom(3);
|
||||
module round_grommet_bottom_40_stl() round_grommet_bottom(4);
|
||||
|
@@ -29,6 +29,9 @@
|
||||
//! This allows the block and one set of fasteners to be on one assembly and the other fasteners on the mating assemblies.
|
||||
//!
|
||||
//! Star washers can be omitted by setting `star_washers` to false.
|
||||
//!
|
||||
//! A 2screw_block is a thinner version with two screws and two mating surfaces. It can be used as an alternative to fixing blocks when
|
||||
//! high lateral rigity is not required.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
@@ -45,6 +48,7 @@ function corner_block_hole_offset(screw = def_screw) = //! Hole offset from the
|
||||
let(insert = screw_insert(screw))
|
||||
insert_length(insert) + max(overshoot + screw_clearance_radius(screw), insert_hole_radius(insert)) + 1;
|
||||
|
||||
|
||||
function corner_block_width(screw = def_screw) = //! Block width, depth and height
|
||||
corner_block_hole_offset(screw) + insert_outer_d(screw_insert(screw)) / 2 + wall;
|
||||
|
||||
@@ -117,7 +121,7 @@ module corner_block(screw = def_screw, name = false) { //! Generate the STL for
|
||||
}
|
||||
|
||||
module corner_block_assembly(screw = def_screw, name = false) //! The printed block with inserts
|
||||
assembly(str("corner_block_M", 20 * screw_radius(screw)), ngb = true) {
|
||||
assembly(name ? name : str("corner_block_M", 20 * screw_radius(screw)), ngb = true) {
|
||||
insert = screw_insert(screw);
|
||||
|
||||
stl_colour(name ? pp2_colour : pp1_colour)
|
||||
@@ -192,3 +196,127 @@ module corner_block_M30_assembly() corner_block_assembly(M3_cap_screw);
|
||||
//! 1. Lay the blocks on each of their other two flat sides and repeat.
|
||||
//
|
||||
module corner_block_M40_assembly() corner_block_assembly(M4_cap_screw);
|
||||
|
||||
function 2screw_block_width(screw = def_screw) = //! 2 screw block width is narrower, height and depth are as corner_block
|
||||
insert_outer_d(screw_insert(screw)) + 2 * wall;
|
||||
|
||||
function 2screw_block_v_hole(screw = def_screw) = translate([0, corner_block_hole_offset(screw)]) * rotate([180, 0, 0]); //! Transform to bottom hole
|
||||
function 2screw_block_h_hole(screw = def_screw) = translate([0, 0, corner_block_hole_offset(screw)]) * rotate([90, 0, 0]); //! Transform to front hole
|
||||
function 2screw_block_holes(screw) = concat([2screw_block_v_hole(screw)], [2screw_block_h_hole(screw)]); //! List of transforms to both holes
|
||||
|
||||
module 2screw_block_v_hole(screw = def_screw) //! Place children at the bottom screw hole
|
||||
multmatrix(2screw_block_v_hole(screw))
|
||||
children();
|
||||
|
||||
module 2screw_block_h_hole(screw = def_screw) //! Place children at the front screw hole
|
||||
multmatrix(2screw_block_h_hole(screw))
|
||||
children();
|
||||
|
||||
module 2screw_block_holes(screw = def_screw) //! Place children at both screw holes
|
||||
for(p = 2screw_block_holes(screw))
|
||||
multmatrix(p)
|
||||
children();
|
||||
|
||||
module 2screw_block(screw = def_screw, name = false) { //! Generate the STL for a printed 2screw block
|
||||
r = 1;
|
||||
cb_width = 2screw_block_width(screw);
|
||||
cb_height = corner_block_width(screw);
|
||||
cb_depth = cb_height;
|
||||
insert = screw_insert(screw);
|
||||
corner_rad = insert_outer_d(insert) / 2 + wall;
|
||||
offset = corner_block_hole_offset(screw);
|
||||
|
||||
stl(name ? name : str("2screw_block", "_M", screw_radius(screw) * 20))
|
||||
difference() {
|
||||
hull() {
|
||||
translate([-cb_width / 2 + r, r])
|
||||
cylinder(r = r, h = 1);
|
||||
|
||||
translate([cb_width / 2 - r, r])
|
||||
cylinder(r = r, h = 1);
|
||||
|
||||
translate([0, offset, offset])
|
||||
sphere(corner_rad);
|
||||
|
||||
translate([0, offset])
|
||||
cylinder(r = corner_rad, h = 1);
|
||||
|
||||
translate([0, r, offset])
|
||||
rotate([-90, 0, 180])
|
||||
rounded_cylinder(r = corner_rad, h = r, r2 = r);
|
||||
}
|
||||
2screw_block_v_hole(screw)
|
||||
insert_hole(insert, overshoot);
|
||||
|
||||
2screw_block_h_hole(screw)
|
||||
insert_hole(insert, overshoot, true);
|
||||
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
module 2screw_block_assembly(screw = def_screw, name = false) //! The printed block with inserts
|
||||
assembly(name ? name : str("2screw_block_M", 20 * screw_radius(screw)), ngb = true) {
|
||||
insert = screw_insert(screw);
|
||||
|
||||
stl_colour(name ? pp2_colour : pp1_colour)
|
||||
render() 2screw_block(screw, name) children();
|
||||
|
||||
2screw_block_holes(screw)
|
||||
insert(insert);
|
||||
}
|
||||
|
||||
module fastened_2screw_block_assembly(thickness, screw = def_screw, thickness_below = undef, name = false, show_block = true, star_washers = true) { //! Printed block with fasteners
|
||||
thickness2 = !is_undef(thickness_below) ? thickness_below : thickness;
|
||||
function screw_len(t) = screw_length(screw, t + overshoot, star_washers ? 2 : 1, true);
|
||||
screw_length = screw_len(thickness);
|
||||
screw_length2 = screw_len(thickness2);
|
||||
|
||||
if(show_block)
|
||||
2screw_block_assembly(screw, name) children();
|
||||
|
||||
if(thickness)
|
||||
2screw_block_h_hole(screw)
|
||||
translate_z(thickness)
|
||||
screw_and_washer(screw, screw_length, star_washers);
|
||||
|
||||
if(thickness2)
|
||||
2screw_block_v_hole(screw)
|
||||
translate_z(thickness2)
|
||||
screw_and_washer(screw, screw_length2, star_washers);
|
||||
}
|
||||
module 2screw_block_M20_stl() 2screw_block(M2_cap_screw);
|
||||
module 2screw_block_M25_stl() 2screw_block(M2p5_cap_screw);
|
||||
module 2screw_block_M30_stl() 2screw_block(M3_cap_screw);
|
||||
module 2screw_block_M40_stl() 2screw_block(M4_cap_screw);
|
||||
//
|
||||
//! 1. Lay the blocks out and place an M2 insert in the forward facing hole.
|
||||
//! 1. Push them home with a soldering iron with a conical bit heated to 200°C.
|
||||
//! When removing the iron it helps to twist it a little anti-clockwise to release it from the thread.
|
||||
//! 1. Lay the blocks on each of their other flat side and repeat.
|
||||
//
|
||||
module 2screw_block_M20_assembly() 2screw_block_assembly(M2_cap_screw);
|
||||
|
||||
//
|
||||
//! 1. Lay the blocks out and place an M2.5 insert in the forward facing hole.
|
||||
//! 1. Push them home with a soldering iron with a conical bit heated to 200°C.
|
||||
//! When removing the iron it helps to twist it a little anti-clockwise to release it from the thread.
|
||||
//! 1. Lay the blocks on each of their other flat side and repeat.
|
||||
//
|
||||
module 2screw_block_M25_assembly() 2screw_block_assembly(M2p5_cap_screw);
|
||||
|
||||
//
|
||||
//! 1. Lay the blocks out and place an M3 insert in the forward facing hole.
|
||||
//! 1. Push them home with a soldering iron with a conical bit heated to 200°C.
|
||||
//! When removing the iron it helps to twist it a little anti-clockwise to release it from the thread.
|
||||
//! 1. Lay the blocks on each of their other flat side and repeat.
|
||||
//
|
||||
module 2screw_block_M30_assembly() 2screw_block_assembly(M3_cap_screw);
|
||||
|
||||
//
|
||||
//! 1. Lay the blocks out and place an M4 insert in the forward facing hole.
|
||||
//! 1. Push them home with a soldering iron with a conical bit heated to 200°C.
|
||||
//! When removing the iron it helps to twist it a little anti-clockwise to release it from the thread.
|
||||
//! 1. Lay the blocks on each of their other flat side and repeat.
|
||||
//
|
||||
module 2screw_block_M40_assembly() 2screw_block_assembly(M4_cap_screw);
|
||||
|
@@ -35,18 +35,17 @@ include <../core.scad>
|
||||
use <../utils/horiholes.scad>
|
||||
use <../utils/maths.scad>
|
||||
|
||||
clearance = 0.1;
|
||||
|
||||
function drag_chain_name(type) = type[0]; //! The name to allow more than one in a project
|
||||
function drag_chain_size(type) = type[1]; //! The internal size and link length
|
||||
function drag_chain_travel(type) = type[2]; //! X travel
|
||||
function drag_chain_wall(type) = type[3]; //! Side wall thickness
|
||||
function drag_chain_bwall(type) = type[4]; //! Bottom wall
|
||||
function drag_chain_twall(type) = type[5]; //! Top wall
|
||||
function drag_chain_screw(type) = type[6]; //! Mounting screw for the ends
|
||||
function drag_chain_screw_lists(type) = type[7]; //! Two lists of four bools to say which screws positions are used
|
||||
function drag_chain_clearance(type) = type[6]; //! Clearance around joints
|
||||
function drag_chain_supports(type) = type[7]; //! Whether to print version of chain with or without supports
|
||||
function drag_chain_screw(type) = type[8]; //! Mounting screw for the ends
|
||||
function drag_chain_screw_lists(type) = type[9]; //! Two lists of four bools to say which screws positions are used
|
||||
|
||||
function drag_chain_clearance() = clearance; //! Clearance around joints.
|
||||
|
||||
function drag_chain_radius(type) = //! The bend radius at the pivot centres
|
||||
let(s = drag_chain_size(type))
|
||||
@@ -56,12 +55,15 @@ function drag_chain_z(type) = //! Outside dimension of a 180 bend
|
||||
let(os = drag_chain_outer_size(type), s = drag_chain_size(type))
|
||||
2 * drag_chain_radius(type) + os.z;
|
||||
|
||||
function drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5, screw = M2_cap_screw, screw_lists = [[1,0,0,1],[1,0,0,1]]) = //! Constructor
|
||||
[name, size, travel, wall, bwall, twall, screw, screw_lists];
|
||||
function drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5, clearance = 0.1, supports = true, screw = M2_cap_screw, screw_lists = [[1,0,0,1],[1,0,0,1]]) = //! Constructor
|
||||
[name, size, travel, wall, bwall, twall, clearance, supports, screw, screw_lists];
|
||||
|
||||
function drag_chain_outer_size(type) = //! Link outer dimensions
|
||||
let(s = drag_chain_size(type), z = s.z + drag_chain_bwall(type) + drag_chain_twall(type))
|
||||
[s.x + z, s.y + 4 * drag_chain_wall(type) + 2 * clearance, z];
|
||||
[s.x + z, s.y + 4 * drag_chain_wall(type) + 2 * drag_chain_clearance(type), z];
|
||||
|
||||
function drag_chain_links(type) = //! Number of links in chain
|
||||
ceil(drag_chain_travel(type) / drag_chain_size(type).x) + 4;
|
||||
|
||||
function screw_lug_radius(screw) = //! Radius of a screw lug
|
||||
corrected_radius(screw_clearance_radius(screw)) + 3.1 * extrusion_width;
|
||||
@@ -85,6 +87,7 @@ module drag_chain_screw_positions(type, end) { //! Place children at the screw p
|
||||
r = screw_lug_radius(drag_chain_screw(type));
|
||||
s = drag_chain_size(type);
|
||||
os = drag_chain_outer_size(type);
|
||||
clearance = drag_chain_clearance(type);
|
||||
R = os.z / 2;
|
||||
x0 = end ? R + norm([drag_chain_cam_x(type), R - drag_chain_twall(type)]) + clearance + r : r;
|
||||
x1 = end ? os.x - r : os.x - 2 * R - clearance - r;
|
||||
@@ -99,7 +102,7 @@ function drag_chain_cam_x(type) = // how far the cam sticks out
|
||||
let(s = drag_chain_size(type),
|
||||
r = drag_chain_outer_size(type).z / 2,
|
||||
wall = drag_chain_wall(type),
|
||||
cam_r = s.x - 2 * clearance - wall - r, // inner_x_normal - clearance - r
|
||||
cam_r = s.x - 2 * drag_chain_clearance(type) - wall - r, // inner_x_normal - clearance - r
|
||||
twall = drag_chain_twall(type)
|
||||
) min(sqrt(max(sqr(cam_r) - sqr(r - twall), 0)), r);
|
||||
|
||||
@@ -111,8 +114,15 @@ module drag_chain_link(type, start = false, end = false, check_kids = true) { //
|
||||
bwall = drag_chain_bwall(type);
|
||||
twall = drag_chain_twall(type);
|
||||
os = drag_chain_outer_size(type);
|
||||
clearance = drag_chain_clearance(type);
|
||||
supports = drag_chain_supports(type);
|
||||
r = os.z / 2;
|
||||
pin_r = r / 2;
|
||||
// initial estimates of pin_r and pin_h
|
||||
pin_r0 = r / 2 - 0.2;
|
||||
pin_h0 = min(wall + clearance, 2 * pin_r0 - 1);
|
||||
// for conical pin: ensure minimum radius of top of pin and pin does not overlap cutout
|
||||
pin_r = supports ? r / 2 : min(r / 2 - 0.2, (os.z - 2 * twall - 3 * pin_h0 / 4 - 0.2) / 2);
|
||||
pin_h = min(wall + clearance, 2 * pin_r - 1);
|
||||
|
||||
socket_x = r;
|
||||
pin_x = socket_x + s.x;
|
||||
@@ -123,44 +133,51 @@ module drag_chain_link(type, start = false, end = false, check_kids = true) { //
|
||||
inner_x = start ? 0 : outer_normal_x - wall; // s.x - clearance - wall
|
||||
|
||||
roof_x_normal = 2 * r - twall;
|
||||
roof_x = start ? 0 : roof_x_normal;
|
||||
|
||||
floor_x = start ? 0 : 2 * r;
|
||||
cam_x = drag_chain_cam_x(type);
|
||||
assert(r + norm([drag_chain_cam_x(type), r - drag_chain_twall(type)]) + clearance <= inner_x || start, "Link must be longer");
|
||||
|
||||
vflip(!supports)
|
||||
difference() {
|
||||
union() {
|
||||
for(side = [-1, 1])
|
||||
rotate([90, 0, 0]) {
|
||||
// Outer cheeks
|
||||
translate_z(side * (os.y / 2 - wall / 2))
|
||||
linear_extrude(wall, center = true)
|
||||
difference() {
|
||||
difference() {
|
||||
linear_extrude(wall, center = true)
|
||||
hull() {
|
||||
if(start)
|
||||
square([eps, os.z]);
|
||||
else
|
||||
translate([socket_x, r])
|
||||
rotate(180)
|
||||
rotate(supports ? 180 : 0)
|
||||
teardrop(r = r, h = 0);
|
||||
|
||||
translate([outer_end_x - eps, 0])
|
||||
square([eps, os.z]);
|
||||
}
|
||||
if(!start)
|
||||
translate([socket_x, r])
|
||||
horihole(pin_r, r);
|
||||
if(supports)
|
||||
translate([socket_x, r, 0])
|
||||
horihole(pin_r, r, wall + 2*eps);
|
||||
else
|
||||
translate([socket_x, r, -side * (wall / 2 + clearance)])
|
||||
rotate(180)
|
||||
hull() {
|
||||
horihole(r = pin_r + pin_h / 2, z = r, h = eps);
|
||||
translate_z(side * pin_h)
|
||||
horihole(r = pin_r - pin_h / 2, z = r, h = eps);
|
||||
}
|
||||
}
|
||||
// Inner cheeks
|
||||
translate_z(side * (s.y / 2 + wall / 2))
|
||||
translate_z(side * (s.y / 2 + wall / 2)) {
|
||||
linear_extrude(wall, center = true)
|
||||
difference() {
|
||||
union() {
|
||||
hull() {
|
||||
if(!end) {
|
||||
translate([pin_x, r])
|
||||
rotate(180)
|
||||
rotate(supports ? 180 : 0)
|
||||
teardrop(r = r, h = 0);
|
||||
|
||||
translate([pin_x, twall])
|
||||
@@ -186,31 +203,39 @@ module drag_chain_link(type, start = false, end = false, check_kids = true) { //
|
||||
square(os.z);
|
||||
}
|
||||
}
|
||||
// Pin
|
||||
if(!end)
|
||||
translate([pin_x, r, side * (s.y / 2 + wall + clearance)])
|
||||
horicylinder(r = pin_r, z = r, h = 2 * wall);
|
||||
// Pin
|
||||
if(!end)
|
||||
if(supports)
|
||||
translate([pin_x, r, side * (wall / 2 + clearance)])
|
||||
horicylinder(r = pin_r, z = r, h = 2 * wall + eps);
|
||||
else
|
||||
translate([pin_x, r, side * wall / 2])
|
||||
vflip(side == -1)
|
||||
cylinder(r1 = pin_r + pin_h / 2, r2 = pin_r - pin_h / 2, h = pin_h + eps);
|
||||
}
|
||||
|
||||
// Cheek joint
|
||||
translate([inner_x, 0, side * (s.y / 2 + wall) - 0.5])
|
||||
cube([outer_end_x - inner_x, os.z, 1]);
|
||||
}
|
||||
|
||||
// Roof, actually the floor when printed
|
||||
// Roof, actually the floor when printed with supports
|
||||
roof_x = start ? 0 : roof_x_normal;
|
||||
roof_end = end ? s.x + 2 * r : s.x + r - twall - clearance;
|
||||
translate([roof_x, -s.y / 2 - 0.5])
|
||||
cube([roof_end - roof_x , s.y + 1, twall]);
|
||||
translate([roof_x, -s.y / 2 - wall, 0]) {
|
||||
cube([roof_end - roof_x, s.y + 2 * wall, twall]);
|
||||
translate([0, -wall, 0])
|
||||
cube([s.x - roof_x - clearance, s.y + 4 * wall, twall]);
|
||||
}
|
||||
|
||||
translate([roof_x, -os.y / 2 + 0.5])
|
||||
cube([s.x - clearance - roof_x, os.y - 1, twall]);
|
||||
|
||||
// Floor, actually the roof when printed
|
||||
// Floor, actually the roof when printed with supports
|
||||
floor_x = start ? 0 : 2 * r;
|
||||
floor_end = end ? s.x + 2 * r : s.x + r;
|
||||
translate([floor_x, -s.y / 2 - wall, os.z - bwall])
|
||||
translate([floor_x, -s.y / 2 - wall, os.z - bwall]) {
|
||||
cube([floor_end - floor_x, s.y + 2 * wall, bwall]);
|
||||
|
||||
translate([floor_x, -os.y / 2 + 0.5, os.z - bwall])
|
||||
cube([s.x - floor_x - clearance, os.y -1, bwall]);
|
||||
translate([0, -wall, 0])
|
||||
cube([s.x - floor_x - clearance, s.y + 4 * wall, bwall]);
|
||||
}
|
||||
|
||||
if(start || end) {
|
||||
drag_chain_screw_positions(type, end)
|
||||
@@ -223,16 +248,16 @@ module drag_chain_link(type, start = false, end = false, check_kids = true) { //
|
||||
}
|
||||
children();
|
||||
}
|
||||
}
|
||||
} // end union
|
||||
|
||||
if(start || end)
|
||||
translate_z(-eps)
|
||||
drag_chain_screw_positions(type, end)
|
||||
rotate($a)
|
||||
poly_cylinder(r = screw_clearance_radius(drag_chain_screw(type)), h = os.z + 2 * eps, center = false);
|
||||
} // end difference
|
||||
|
||||
}
|
||||
|
||||
if(show_supports() && !end) {
|
||||
if(supports && show_supports() && !end) {
|
||||
for(side = [-1, 1]) {
|
||||
w = 2.1 * extrusion_width;
|
||||
translate([s.x + r + cam_x - w / 2, side * (s.y / 2 + wall / 2), twall / 2])
|
||||
@@ -255,16 +280,15 @@ module _drag_chain_assembly(type, pos = 0, render = false) {
|
||||
s = drag_chain_size(type);
|
||||
x = (1 + exploded()) * s.x;
|
||||
r = drag_chain_radius(type) * x / s.x;
|
||||
travel = drag_chain_travel(type);
|
||||
links = ceil(travel / s.x);
|
||||
actual_travel = links * s.x;
|
||||
links = drag_chain_links(type);
|
||||
actual_travel = (links - 4) * s.x;
|
||||
z = drag_chain_outer_size(type).z;
|
||||
|
||||
zb = z / 2; // z of bottom track
|
||||
c = [actual_travel / 2 + pos / 2, 0, r + zb]; // centre of bend
|
||||
|
||||
points = [ // Calculate list of hinge points
|
||||
for(i = 0, p = [0, 0, z / 2 + 2 * r]; i < links + 5;
|
||||
for(i = 0, p = [0, 0, z / 2 + 2 * r]; i < links + 1;
|
||||
i = i + 1,
|
||||
dx = p.z > c.z ? x : -x,
|
||||
p = max(p.x + dx, p.x) <= c.x ? p + [dx, 0, 0] // Straight sections
|
||||
@@ -277,11 +301,12 @@ module _drag_chain_assembly(type, pos = 0, render = false) {
|
||||
|
||||
module link(n) // Position and colour link with origin at the hinge hole
|
||||
translate([-z / 2, 0, -z / 2]) {
|
||||
stl_colour(n < 0 || n == npoints - 1 ? pp3_colour : n % 2 ? pp1_colour : pp2_colour)
|
||||
render_if(render)
|
||||
drag_chain_link(type, start = n == -1, end = n == npoints - 1, check_kids = false)
|
||||
let($fasteners = 0)
|
||||
children();
|
||||
vflip(!drag_chain_supports(type))
|
||||
stl_colour(n < 0 || n == npoints - 1 ? pp3_colour : n % 2 ? pp1_colour : pp2_colour)
|
||||
render_if(render)
|
||||
drag_chain_link(type, start = n == -1, end = n == npoints - 1, check_kids = false)
|
||||
let($fasteners = 0)
|
||||
children();
|
||||
|
||||
let($fasteners = 1) children();
|
||||
}
|
||||
|
@@ -74,7 +74,8 @@ module foot_assembly(t = 0, type = foot, flip = false, no_washer = false) { //!
|
||||
screw_length = screw_length(screw, foot_thickness(type) + t - squeeze, no_washer ? 1 : 2, nyloc = true);
|
||||
|
||||
vflip() explode(15, true) {
|
||||
stl_colour(pp4_colour) foot(type);
|
||||
translate_z(-squeeze)
|
||||
stl_colour(pp4_colour) foot(type);
|
||||
|
||||
if(t)
|
||||
explode(15, true)
|
||||
|
171
printed/knob.scad
Normal file
@@ -0,0 +1,171 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 221
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Parametric knobs for potentiometers and encoders.
|
||||
//!
|
||||
//! A knob can be constructed by specififying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
//! An optional skirt and / or a pointer can be specified.
|
||||
//!
|
||||
//! The STL includes a support membrane that needs to be cut out and a thread needs to be tapped for the grub screw.
|
||||
//
|
||||
|
||||
include <../core.scad>
|
||||
use <../utils/hanging_hole.scad>
|
||||
use <../utils/rounded_polygon.scad>
|
||||
use <../vitamins/potentiometer.scad>
|
||||
|
||||
clearance = 0.2;
|
||||
|
||||
function knob_name(type) = type[0]; //! Name for the stl maker
|
||||
function knob_top_d(type) = type[1]; //! Diameter at the top
|
||||
function knob_bot_d(type) = type[2]; //! Diameter at the bottom
|
||||
function knob_height(type) = type[3]; //! Height
|
||||
function knob_corner_r(type) = type[4]; //! Rounded top corner
|
||||
function knob_shaft_d(type) = type[5]; //! Shaft diameter
|
||||
function knob_shaft_len(type)= type[6]; //! Shaft length
|
||||
function knob_flat_d(type) = type[7]; //! The shaft diameter at the flat
|
||||
function knob_flat_h(type) = type[8]; //! The length of the flat
|
||||
function knob_screw(type) = type[9]; //! The grub screw type
|
||||
function knob_skirt(type) = type[10]; //! Skirt diameter and thickness
|
||||
function knob_recess(type) = type[11]; //! Recess diameter and thickness to clear nut and thread, diameter, nut height, thread height
|
||||
function knob_pointer(type) = type[12]; //! Pointer outside radius, [point width, back width] and height height
|
||||
|
||||
function knob(name = "knob", top_d = 12, bot_d = 15, height = 18, shaft_length, skirt = [20, 2], pointer = false, corner_r = 2, screw = M3_grub_screw, shaft_d, flat_d, flat_h, recess) = //! Constructor
|
||||
[
|
||||
name, top_d, bot_d, height, corner_r, shaft_d, shaft_length, flat_d, flat_h, screw, skirt, recess, pointer
|
||||
];
|
||||
|
||||
function knob_for_pot(pot, thickness, z = 1, washer = true, top_d = 12, bot_d = 15, height = 0, shaft_length = undef, skirt = [20, 2], pointer = false, corner_r = 2, screw = M3_grub_screw) = //! Construct a knob to fit specified pot
|
||||
let(s = pot_shaft(pot),
|
||||
washer = washer && pot_washer(pot) ? pot_washer(pot) : [0, 0],
|
||||
nut = pot_nut(pot) ? pot_nut(pot) : [pot_thread_d(pot) * cos(30), pot_thread_h(pot) - thickness],
|
||||
shaft_length = is_undef(shaft_length) ? s.z : min(shaft_length, s.z),
|
||||
h = round_to_layer(shaft_length + pot_thread_h(pot) - thickness - z),
|
||||
height = max(height, h + 1),
|
||||
recess = [(z > washer.y ? nut.x / cos(30) : washer.x) + 0.4, round_to_layer(nut.y + washer.y - z + layer_height), round_to_layer(pot_thread_h(pot) - z - thickness + 2 * layer_height)],
|
||||
flat_d = s.y + 0.06,
|
||||
flat_h = min(s[3], shaft_length)
|
||||
)
|
||||
knob(name = str(pot[0], "_knob"),
|
||||
top_d = top_d,
|
||||
bot_d = bot_d,
|
||||
height = height,
|
||||
corner_r = corner_r,
|
||||
screw = screw,
|
||||
skirt = skirt,
|
||||
pointer = pointer,
|
||||
shaft_d = s.x,
|
||||
shaft_length = h,
|
||||
flat_d = flat_d,
|
||||
flat_h = flat_h,
|
||||
recess = recess);
|
||||
|
||||
function knob_screw_z(type) = knob_shaft_len(type) - knob_flat_h(type) / 2;
|
||||
|
||||
module knob(type, supports = true) { //! Generate the STL for a knob
|
||||
r_top = knob_top_d(type) / 2;
|
||||
r_bot = knob_bot_d(type) / 2;
|
||||
h = knob_height(type);
|
||||
r = knob_corner_r(type);
|
||||
screw = knob_screw(type);
|
||||
sr = knob_shaft_d(type) / 2 + (screw ? clearance : 0);
|
||||
top_wall = h - knob_shaft_len(type);
|
||||
fr = knob_flat_d(type) - sr + 2 * clearance;
|
||||
fh = knob_flat_h(type);
|
||||
skirt = knob_skirt(type);
|
||||
recess = knob_recess(type);
|
||||
pointer = knob_pointer(type);
|
||||
|
||||
stl(knob_name(type))
|
||||
{
|
||||
difference() {
|
||||
union() {
|
||||
rotate_extrude() {
|
||||
rounded_polygon([
|
||||
[0, h, 0],
|
||||
[r_top - r, h - r, r],
|
||||
[r_bot, 0, 0],
|
||||
[0, 0, 0],
|
||||
]);
|
||||
|
||||
if(skirt)
|
||||
square([skirt.x / 2, skirt.y]);
|
||||
}
|
||||
if(pointer)
|
||||
linear_extrude(pointer.z)
|
||||
rotate(-90)
|
||||
hull() {
|
||||
translate([pointer.x, 0])
|
||||
square([eps, pointer.y[0]], center = true);
|
||||
|
||||
translate([r_bot, 0])
|
||||
square([eps, pointer.y[1]], center = true);
|
||||
}
|
||||
}
|
||||
shaft_z = recess ? recess.z + (supports ? layer_height : -eps) : -eps;
|
||||
translate_z(shaft_z) {
|
||||
h = h - top_wall - shaft_z;
|
||||
linear_extrude(h)
|
||||
difference() {
|
||||
poly_circle(sr);
|
||||
|
||||
if(fr > 0)
|
||||
translate([-sr, fr])
|
||||
square([2 * sr, sr]);
|
||||
}
|
||||
|
||||
if(h > fh)
|
||||
poly_cylinder(sr, round_to_layer(h - fh), center = false);
|
||||
}
|
||||
|
||||
if(recess)
|
||||
translate_z(-eps)
|
||||
hull() {
|
||||
poly_cylinder(r = recess.x / 2, h = recess.y + eps, center = false);
|
||||
|
||||
linear_extrude(recess.z + eps)
|
||||
offset(min(-(recess.z - recess.y), 0))
|
||||
poly_circle(recess.x / 2);
|
||||
}
|
||||
|
||||
if(screw)
|
||||
translate_z(knob_screw_z(type))
|
||||
rotate([90, 0, 180])
|
||||
teardrop_plus(r = screw_pilot_hole(screw), h = max(r_top, r_bot) + eps, center = false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! Knob with grub screw in place
|
||||
module knob_assembly(type) explode(40, explode_children = true) { //! Assembly with the grub screw in place
|
||||
sr = knob_shaft_d(type) / 2;
|
||||
fr = knob_flat_d(type) < sr ? knob_flat_d(type) - sr : sr;
|
||||
r_top = knob_top_d(type) / 2;
|
||||
r_bot = knob_bot_d(type) / 2;
|
||||
screw_length = screw_shorter_than(min(r_top, r_bot) - fr);
|
||||
screw = knob_screw(type);
|
||||
|
||||
stl_colour(pp1_colour) render() knob(type, supports = false);
|
||||
|
||||
if(screw)
|
||||
translate([0, (fr + screw_length), knob_screw_z(type)])
|
||||
rotate([90, 0, 180])
|
||||
screw(screw, screw_length);
|
||||
}
|
@@ -137,7 +137,7 @@ module pocket_handle_assembly(type) { //! Assembly with fasteners in place
|
||||
|
||||
translate_z(f.z + t / 2) hflip() {
|
||||
stl_colour(pp1_colour)
|
||||
pocket_handle(type);
|
||||
render() pocket_handle(type);
|
||||
|
||||
pocket_handle_hole_positions(type) {
|
||||
translate_z(f.z + t)
|
||||
|
@@ -27,6 +27,7 @@ use <../vitamins/insert.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
use <../vitamins/psu.scad>
|
||||
use <../utils/round.scad>
|
||||
use <../vitamins/terminal.scad>
|
||||
|
||||
wall = 1.8;
|
||||
top = 1.5;
|
||||
|
@@ -18,7 +18,10 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! Clamp for ribbon cable and polypropylene strip.
|
||||
//! Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
//!
|
||||
//! * When `ways` is a scalar number the slot is sized for one rubbon cable and a PP strip.
|
||||
//! * When `ways` is a two element vector the second element indicates the number of cables and the slot is size for just the cables.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
@@ -34,7 +37,8 @@ function ribbon_clamp_hole_pitch(ways, screw = screw) =
|
||||
|
||||
function ribbon_clamp_width(screw = screw) = 2 * (insert_hole_radius(screw_insert(screw)) + wall); //! Width
|
||||
function ribbon_clamp_length(ways, screw = screw) = ribbon_clamp_hole_pitch(ways, screw) + ribbon_clamp_width(screw); //! Length given ways
|
||||
function ribbon_clamp_height(screw = screw) = ribbon_clamp_screw_depth(screw) + 1; //! Height
|
||||
function ribbon_clamp_height(screw = screw, ways = undef) = ribbon_clamp_screw_depth(screw) + 1 + //! Height
|
||||
(!is_undef(ways) && is_list(ways) ? (ways[1] - 1) * inch(0.05) : 0);
|
||||
|
||||
module ribbon_clamp_hole_positions(ways, screw = screw, side = undef) //! Place children at hole positions
|
||||
for(x = is_undef(side) ? [-1, 1] : side)
|
||||
@@ -45,16 +49,20 @@ module ribbon_clamp_holes(ways, h = 20, screw = screw) //! Drill screw holes
|
||||
ribbon_clamp_hole_positions(ways, screw)
|
||||
drill(screw_clearance_radius(screw), h);
|
||||
|
||||
function str_ways(ways) = is_list(ways) ? str(ways[0], "_", ways[1]) : str(ways);
|
||||
function str_screw_d(screw_d) = screw_d != 3 ? str("_", screw_d) : "";
|
||||
|
||||
module ribbon_clamp(ways, screw = screw) { //! Generate STL for given number of ways
|
||||
screw_d = screw_radius(screw) * 2;
|
||||
|
||||
pitch = ribbon_clamp_hole_pitch(ways, screw);
|
||||
d = ribbon_clamp_width(screw);
|
||||
h = ribbon_clamp_height(screw);
|
||||
t = round_to_layer(ribbon_clamp_slot_depth() + wall);
|
||||
h = ribbon_clamp_height(screw, ways);
|
||||
slot_d = is_list(ways) ? ways[1] * inch(0.05) : ribbon_clamp_slot_depth();
|
||||
t = round_to_layer(slot_d + wall);
|
||||
insert = screw_insert(screw);
|
||||
|
||||
stl(str("ribbon_clamp_", ways, screw_d != 3 ? str("_", screw_d) : ""))
|
||||
stl(str("ribbon_clamp_", str_ways(ways), str_screw_d(screw_d)))
|
||||
difference() {
|
||||
union() {
|
||||
hull() {
|
||||
@@ -72,7 +80,7 @@ module ribbon_clamp(ways, screw = screw) { //! Generate STL for given number of
|
||||
}
|
||||
|
||||
translate_z(h)
|
||||
cube([ribbon_clamp_slot(ways), d + 1, ribbon_clamp_slot_depth() * 2], center = true);
|
||||
cube([ribbon_clamp_slot(ways), d + 1, slot_d * 2], center = true);
|
||||
|
||||
ribbon_clamp_hole_positions(ways, screw)
|
||||
translate_z(h)
|
||||
@@ -83,8 +91,8 @@ module ribbon_clamp(ways, screw = screw) { //! Generate STL for given number of
|
||||
|
||||
module ribbon_clamp_assembly(ways, screw = screw) //! Printed part with inserts in place
|
||||
pose([55, 180, 25])
|
||||
assembly(let(screw_d = screw_radius(screw) * 2)str("ribbon_clamp_", ways, screw_d != 3 ? str("_", screw_d) : ""), ngb = true) {
|
||||
h = ribbon_clamp_height(screw);
|
||||
assembly(let(screw_d = screw_radius(screw) * 2)str("ribbon_clamp_", str_ways(ways), str_screw_d(screw_d)), ngb = true) {
|
||||
h = ribbon_clamp_height(screw, ways);
|
||||
insert = screw_insert(screw);
|
||||
|
||||
stl_colour(pp1_colour) render()
|
||||
|
383
readme.md
@@ -35,24 +35,27 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</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 = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</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 = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Variacs">Variacs</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 = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Knob">Knob</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
<a name="7_segments"></a>
|
||||
## 7_segments
|
||||
7 Segment displays
|
||||
7 Segment displays.
|
||||
|
||||
Can be single digits stacked side by side or can be multiple digits in one unit. This is determined by the overall width compared to the width of a digit.
|
||||
Presence of a decimal point is determined by the number of pins. Its position is determined by a heuristic.
|
||||
|
||||
[vitamins/7_segments.scad](vitamins/7_segments.scad) Object definitions.
|
||||
|
||||
@@ -63,7 +66,7 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `7_segment_digit_size(type)` | Size of the actual digit and segemnt width and angle |
|
||||
| `7_segment_digit_size(type)` | Size of the actual digit and segment width and angle |
|
||||
| `7_segment_pin_pitch(type)` | x and y pin pitches and pin diameter |
|
||||
| `7_segment_pins(type)` | None |
|
||||
| `7_segment_size(type)` | Size of the body |
|
||||
@@ -105,7 +108,7 @@ Axial components for PCBs.
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `ax_res(type, value, tol = 5, pitch = 0)` | Through hole axial resistor. If `pitch` is zero the minimum is used. If below the minimum the resistor is placed vertical. |
|
||||
| `wire_link(d, l, h = 1, tail = 3)` | Draw a wire jumper link. |
|
||||
| `wire_link(d, l, h = 1, tail = 3)` | Draw a wire jumper link. If `l` is zero then a vertical wire is drawn. |
|
||||
|
||||

|
||||
|
||||
@@ -120,6 +123,7 @@ Axial components for PCBs.
|
||||
| 1 | `ax_res(res1_2, 8200)` | Resistor 8200 Ohms 5% 0.5W |
|
||||
| 1 | `ax_res(res1_2, 8250, tol = 1)` | Resistor 8250 Ohms 1% 0.5W |
|
||||
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
|
||||
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -146,6 +150,8 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
|
||||
| `bb_bore(type)` | Internal diameter |
|
||||
| `bb_colour(type)` | Shield colour, "silver" for metal |
|
||||
| `bb_diameter(type)` | External diameter |
|
||||
| `bb_flange_diameter(type)` | Flange diameter |
|
||||
| `bb_flange_width(type)` | Flange width |
|
||||
| `bb_hub(type)` | Inner rim thickness guesstimate |
|
||||
| `bb_name(type)` | Part code without shield type suffix |
|
||||
| `bb_rim(type)` | Outer rim thickness guesstimate |
|
||||
@@ -167,8 +173,14 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
|
||||
| 1 | `ball_bearing(BB6201)` | Ball bearing 6201-2RS 12mm x 32mm x 10mm |
|
||||
| 1 | `ball_bearing(BB624)` | Ball bearing 624-2RS 4mm x 13mm x 5mm |
|
||||
| 1 | `ball_bearing(BB6808)` | Ball bearing 6808-2RS 40mm x 52mm x 7mm |
|
||||
| 1 | `ball_bearing(BBF623)` | Ball bearing F623-2RS 3mm x 10mm x 4mm |
|
||||
| 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(BBMR93)` | Ball bearing MR93ZZ 3mm x 9mm x 4mm |
|
||||
| 1 | `ball_bearing(BBSMR95)` | Ball bearing SMR95ZZ 5mm x 9mm x 2.5mm |
|
||||
| 6 | ` bearing_ball(3)` | Steel ball 3mm |
|
||||
| 5 | ` bearing_ball(3)` | Steel ball 3mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -353,6 +365,7 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 128mm |
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 552mm |
|
||||
| 2 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 556mm |
|
||||
| 1 | `belt(GT2x9, [ ... ])` | Belt GT2 x 9mm x 128mm |
|
||||
| 1 | `belt(T2p5x6, [ ... ])` | Belt T2.5 x 6mm x 130mm |
|
||||
| 1 | `belt(T5x10, [ ... ])` | Belt T5 x 10mm x 130mm |
|
||||
| 1 | `belt(T5x6, [ ... ])` | Belt T5 x 6mm x 130mm |
|
||||
@@ -438,6 +451,7 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
||||
<a name="Blowers"></a>
|
||||
## Blowers
|
||||
Models of radial blowers.
|
||||
Note that blower_exit() and blower_exit_offset() are for the inside of the exit for square blowers but the outside for spiral blowers.
|
||||
|
||||
[vitamins/blowers.scad](vitamins/blowers.scad) Object definitions.
|
||||
|
||||
@@ -640,6 +654,9 @@ When the sides are constrained then a circular model is more accurate.
|
||||
|:--- |:--- |
|
||||
| `bezier_cable_length(depth, min_z, pos)` | Calculate a length that will achieve the desired minimum z |
|
||||
| `cable_strip_length(depth, travel, extra = 15)` | Calculate circular cable strip length |
|
||||
| `ribbon_clamp_slot(ways)` | Width of the slot to accept a ribbon cable |
|
||||
| `ribbon_clamp_slot_depth()` | Depth of slot to accept a ribbon cable and a cable strip |
|
||||
| `ribbon_ways(ways)` | Allows ribbon clamps to accept multiple cables |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -674,6 +691,7 @@ PCB cameras.
|
||||
|:--- |:--- |
|
||||
| `camera_connector_pos(type)` | The flex connector block for the camera itself's position |
|
||||
| `camera_connector_size(type)` | The flex connector block for the camera itself's size |
|
||||
| `camera_fov(type)` | The field of view of the camera lens |
|
||||
| `camera_lens(type)` | Stack of lens parts, can be round, rectangular or rounded rectangular, with optional tapered aperture |
|
||||
| `camera_lens_offset(type)` | Offset of the lens center from the PCB centre |
|
||||
| `camera_pcb(type)` | The PCB part of the camera |
|
||||
@@ -681,7 +699,7 @@ PCB cameras.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `camera(type, show_lens = true)` | Draw specified PCB camera |
|
||||
| `camera(type, show_lens = true, fov_distance = 0, fov = undef)` | Draw specified PCB camera |
|
||||
| `camera_lens(type, offset = 0, show_lens = true)` | Draw the lens stack, with optional offset for making a clearance hole |
|
||||
|
||||

|
||||
@@ -871,6 +889,7 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
|
||||
| `d_connector_holes(type)` | Place children at the screw hole positions |
|
||||
| `d_pillar()` | Draw a pillar for a D-connector |
|
||||
| `d_plug(type, socket = false, pcb = false, idc = false)` | Draw specified D plug, which can be IDC, PCB or plain solder bucket |
|
||||
| `d_plug_D(length, width, rad)` | D plug D shape |
|
||||
| `d_socket(connector, pcb = false, idc = false)` | Draw specified D socket, which can be IDC, PCB or plain solder bucket |
|
||||
|
||||

|
||||
@@ -1454,6 +1473,7 @@ IEC mains inlets and outlet.
|
||||
| 1 | `iec(IEC_inlet)` | IEC inlet |
|
||||
| 1 | `iec(IEC_inlet_atx)` | IEC inlet for ATX |
|
||||
| 1 | `iec(IEC_outlet)` | IEC outlet RS 811-7193 |
|
||||
| 1 | `iec(IEC_inlet_atx2)` | IEC pressfit inlet for ATX |
|
||||
| 1 | `iec(IEC_320_C14_switched_fused_inlet)` | IEC320 C14 switched fused inlet module |
|
||||
| 12 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 4 | `screw(M3_cs_cap_screw, 10)` | Screw M3 cs cap x 10mm |
|
||||
@@ -1526,6 +1546,7 @@ E.g. a "brown" socket for mains live needs to be displayed as "sienna" to look r
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `jack_4mm_flange_radius()` | 4mm jack socket flange radius |
|
||||
| `jack_4mm_hole_radius()` | Panel hole radius for 4mm jack |
|
||||
| `jack_4mm_plastic_flange_radius()` | 4mm plastic jack socket flange radius |
|
||||
| `jack_4mm_shielded_hole_radius()` | Panel hole radius for 4mm shielded jack |
|
||||
@@ -1879,6 +1900,7 @@ Cylindrical and ring magnets.
|
||||
|:--- |:--- |
|
||||
| `magnet_h(type)` | Height |
|
||||
| `magnet_id(type)` | Inside diameter if a ring |
|
||||
| `magnet_name(type)` | Name |
|
||||
| `magnet_od(type)` | Outer diameter |
|
||||
| `magnet_r(type)` | Corner radius |
|
||||
|
||||
@@ -1892,9 +1914,10 @@ Cylindrical and ring magnets.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `magnet(MAG484)` | Magnet 6.35mm diameter, 6.35mm high, 3.175mm bore |
|
||||
| 1 | `magnet(MAG8x4x4p2)` | Magnet 8mm diameter, 4mm high, 4.2mm bore |
|
||||
| 1 | `magnet(MAG5x8)` | Magnet 8mm diameter, 5mm high |
|
||||
| 1 | `magnet(MAG484)` | Magnet, 6.35mm diameter, 6.35mm high, 3.175mm bore |
|
||||
| 1 | `magnet(MAG8x4x4p2)` | Magnet, 8mm diameter, 4mm high, 4.2mm bore |
|
||||
| 1 | `magnet(MAG5x8)` | Magnet, 8mm diameter, 5mm high |
|
||||
| 1 | `magnet(MAGRE6x2p5)` | Radial encoder magnet, 6mm diameter, 2.5mm high |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -1952,7 +1975,9 @@ UK 13A sockets at the moment.
|
||||
## Microswitches
|
||||
Used for limit switches. Currently only the button type is supported as the lever and roller types are less accurate.
|
||||
|
||||
The switch is drawn with the button at the nominal operation point. This can be plus or minus `microswitch_op_tol(type)`.
|
||||
The origin of the switch is in the center of the body. `microswitch_button_pos()` is the offset to tip of the button at its operating point.
|
||||
|
||||
The switch is drawn with the button at the nominal operation point. This actual trigger point can be plus or minus `microswitch_op_tol(type)`.
|
||||
|
||||
When the button is released it comes out by a maximum of `microswitch_fp_max(type)` from the nominal operating point.
|
||||
|
||||
@@ -2383,6 +2408,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `potentiometer(BTT_encoder)` | BTT_encoder |
|
||||
| 1 | `box_header(2p54header, 4, 2)` | Box header 4 x 2 |
|
||||
| 1 | `d_plug(DCONN9, pcb = true)` | D-type 9 way PCB mount plug |
|
||||
| 1 | `dil_socket(12, 15.24)` | DIL socket 24 x 0.6" |
|
||||
@@ -2390,6 +2416,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pdip(24, 27C32, w = 15.24)` | IC 27C32 PDIP24 |
|
||||
| 1 | `pdip(8, NE555)` | IC NE555 PDIP8 |
|
||||
| 1 | `idc_transition(2p54header, 5)` | IDC transition header 5 x 2 |
|
||||
| 1 | `potentiometer(KY_040_encoder)` | KY_040_encoder |
|
||||
| 1 | `led(LED10mm, "yellow")` | LED 10 mm yellow |
|
||||
| 1 | `led(LED3mm)` | LED 3 mm red |
|
||||
| 1 | `led(LED5mm, "orange")` | LED 5 mm orange |
|
||||
@@ -2415,6 +2442,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 1K)` | SMD resistor 1206 1K 0.25W |
|
||||
| 1 | `smd_sot(SOT223)` | SOT223 package LM117 |
|
||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
||||
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
|
||||
| 1 | `square_button(button_6mm)` | Square button 6mm |
|
||||
| 1 | `pcb(TMC2130)` | TMC2130 |
|
||||
@@ -2431,6 +2460,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 2 | `vero_pin()` | Vero board pin |
|
||||
| 1 | `wire_link(0.8, 5.08, h = 10.16)` | Wire link 0.8mm x 0.2" |
|
||||
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
|
||||
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2531,6 +2561,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(ArduinoLeonardo)` | Arduino Leonardo |
|
||||
| 1 | `pcb(ArduinoNano)` | Arduino Nano |
|
||||
| 1 | `pcb(ArduinoUno3)` | Arduino Uno R3 |
|
||||
| 1 | `pcb(BTT_RELAY_V1_2)` | BigTreeTech Relay Module v1.2 |
|
||||
| 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 |
|
||||
@@ -2555,7 +2586,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 |
|
||||
| 30 | `nut(M2p5_nut, nyloc = true)` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 28 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 32 | `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(PI_IO)` | PI_IO V2 - not shown |
|
||||
| 1 | `pcb(PSU12V1A)` | PSU 12V 1A - not shown |
|
||||
@@ -2579,8 +2610,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
|
||||
| 8 | `screw(M2p5_pan_screw, 25)` | Screw M2.5 pan x 25mm |
|
||||
| 10 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 14 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
||||
| 4 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
||||
| 13 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
||||
| 9 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
||||
| 8 | `screw(M4_cap_screw, 35)` | Screw M4 cap x 35mm |
|
||||
| 1 | `pcb(XIAO)` | Seeeduino XIAO |
|
||||
| 1 | `pcb(TP4056)` | TP4056 Li-lon Battery charger module |
|
||||
@@ -2590,7 +2621,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 |
|
||||
| 30 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 28 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 32 | `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 |
|
||||
|
||||
@@ -2610,13 +2641,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 2 | pcb_spacer2550.stl |
|
||||
| 4 | pcb_spacer2580.stl |
|
||||
| 4 | pcb_spacer30160.stl |
|
||||
| 5 | pcb_spacer30190.stl |
|
||||
| 4 | pcb_spacer30190.stl |
|
||||
| 5 | pcb_spacer30200.stl |
|
||||
| 4 | pcb_spacer30210.stl |
|
||||
| 5 | pcb_spacer30210.stl |
|
||||
| 4 | pcb_spacer30220.stl |
|
||||
| 4 | pcb_spacer3050.stl |
|
||||
| 6 | pcb_spacer3060.stl |
|
||||
| 4 | pcb_spacer40220.stl |
|
||||
| 4 | pcb_spacer40230.stl |
|
||||
| 4 | pcb_spacer40240.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2659,6 +2691,7 @@ Threaded pillars. Each end can be male or female.
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `pillar(M3x13_hex_pillar)` | Pillar hex M/F M3x13 |
|
||||
| 1 | `pillar(M3x20_hex_pillar)` | Pillar hex M/F M3x20 |
|
||||
| 1 | `pillar(M3x6_hex_pillar)` | Pillar hex M/F M3x6 |
|
||||
| 1 | `pillar(M3x10_nylon_hex_pillar)` | Pillar hex nylon M/F M3x10 |
|
||||
| 1 | `pillar(M3x20_nylon_hex_pillar)` | Pillar hex nylon M/F M3x20 |
|
||||
| 1 | `pillar(M2x16_brass_pillar)` | Pillar nurled F/M M2x16 |
|
||||
@@ -2819,10 +2852,19 @@ Potentiometers and rotary encoders
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `pot_nut(type, washer = true)` | Draw the nut for a potentiometer and possibly a washer |
|
||||
| `potentiometer(type, thickness = 3, shaft_length = undef)` | Draw a potentiometer with nut spaced by specified thickness |
|
||||
| `potentiometer(type, thickness = 3, shaft_length = undef, value = false)` | Draw a potentiometer with nut spaced by specified thickness |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `potentiometer(BTT_encoder)` | BTT_encoder |
|
||||
| 1 | `potentiometer(KY_040_encoder)` | KY_040_encoder |
|
||||
| 1 | `potentiometer(imperial_pot)` | Potentiometer imperial_pot |
|
||||
| 1 | `potentiometer(imperial_pot_x2)` | Potentiometer imperial_pot_x2 |
|
||||
| 1 | `potentiometer(metric_pot)` | Potentiometer metric_pot |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
@@ -2844,6 +2886,7 @@ Face order is bottom, top, left, right, front, back.
|
||||
|:--- |:--- |
|
||||
| `atx_psu(type)` | True if an ATX style PSU |
|
||||
| `psu_accessories(type)` | Accessories to add to BOM, e.g. mains lead |
|
||||
| `psu_face_cutout(type)` | Panel cutout to accommodate this face, e.g. for ATX |
|
||||
| `psu_face_cutouts(type)` | List of polygons to remove |
|
||||
| `psu_face_fan(type)` | Fan x,y position and type |
|
||||
| `psu_face_grill(type)` | Is this face a grill |
|
||||
@@ -2857,50 +2900,45 @@ Face order is bottom, top, left, right, front, back.
|
||||
| `psu_left_bay(type)` | Bay for terminals |
|
||||
| `psu_length(type)` | Length |
|
||||
| `psu_name(type)` | The part name |
|
||||
| `psu_pcb(type)` | The PCB |
|
||||
| `psu_right_bay(type)` | Bay for heatsink |
|
||||
| `psu_screw(type)` | Screw type |
|
||||
| `psu_screw_hole_radius(type)` | Clearance hole for screw, bigger than normal on ATX |
|
||||
| `psu_terminals(type)` | How many terminals and the y offset from the back |
|
||||
| `psu_width(type)` | Width |
|
||||
| `terminal_block_depth(type)` | Total depth |
|
||||
| `terminal_block_depth2(type)` | Depth of contact well |
|
||||
| `terminal_block_divider(type)` | Width of the dividers |
|
||||
| `terminal_block_height(type)` | Height of the dividers |
|
||||
| `terminal_block_height2(type)` | Height under the contacts |
|
||||
| `terminal_block_pitch(type)` | Pitch between screws |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `psu_face_transform(type, face)` | Returns a transformation matrix to get to the specified face |
|
||||
| `psu_size(type)` | Size |
|
||||
| `terminal_block_length(type, ways)` | Total length of terminal block |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `atx_psu_cutout(type)` | Cut out for the rear of an ATX |
|
||||
| `atx_psu_cutout(type, face = f_front)` | Cut out for the rear of an ATX, which is actually f_front! |
|
||||
| `psu(type)` | Draw a power supply |
|
||||
| `psu_screw_positions(type, face = undef)` | Position children at the screw positions on the preferred mounting face, which can be overridden. |
|
||||
| `terminal_block(type, ways)` | Draw a power supply terminal block |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | | IEC mains lead |
|
||||
| 2 | | IEC mains lead |
|
||||
| 1 | `psu(ATX500)` | PSU ATX500 |
|
||||
| 1 | `psu(KY240W)` | PSU KY-240W-12-L |
|
||||
| 1 | `psu(ATX300)` | PSU FSP300-60GHX |
|
||||
| 1 | `psu(KY240W)` | PSU KY-240W-12-L - not shown |
|
||||
| 1 | `psu(NG_CB_200W_24V)` | PSU NIUGUY CB-200W-24V |
|
||||
| 1 | `psu(NG_CB_500W_24V)` | PSU NIUGUY CB-500W-24V |
|
||||
| 1 | `psu(PD_150_12)` | PSU PD-150-12 |
|
||||
| 1 | `psu(S_250_48)` | PSU S-250-48 |
|
||||
| 1 | `psu(S_300_12)` | PSU S-300-12 |
|
||||
| 4 | `screw(No632_pan_screw, 8)` | Screw 6-32 pan x 8mm |
|
||||
| 4 | `screw(M3_cap_screw, 8)` | Screw M3 cap x 8mm |
|
||||
| 9 | `screw(No632_pan_screw, 8)` | Screw 6-32 pan x 8mm |
|
||||
| 8 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
|
||||
| 4 | `screw(M4_cap_screw, 8)` | Screw M4 cap x 8mm |
|
||||
| 12 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 8 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
| 8 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 13 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -3600,6 +3638,13 @@ Surface mount components for PCBs.
|
||||
| `smd_res_end_cap(type)` | End cap width |
|
||||
| `smd_res_power(type)` | Power rating in Watts |
|
||||
| `smd_res_size(type)` | Body length, width and height |
|
||||
| `smd_sot_lead_pitch(type)` | Lead pitch |
|
||||
| `smd_sot_lead_size(type)` | Lead width, foot depth, lead thickness |
|
||||
| `smd_sot_lead_span(type)` | Total span of leads |
|
||||
| `smd_sot_lead_z(type)` | Top of lead frame from top |
|
||||
| `smd_sot_size(type)` | Body length, width and height |
|
||||
| `smd_sot_tab_width(type)` | The wide lead at the top |
|
||||
| `smd_sot_z(type)` | Height above PCB surface |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -3611,9 +3656,10 @@ Surface mount components for PCBs.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `smd_capacitor(type, height)` | Draw an SMD capacitor with specified height |
|
||||
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
|
||||
| `smd_led(type, colour, cutout)` | Draw an SMD LED with specified `colour` |
|
||||
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
|
||||
| `smd_sot(type, value)` | Draw an SMD transistor |
|
||||
|
||||

|
||||
|
||||
@@ -3628,6 +3674,8 @@ Surface mount components for PCBs.
|
||||
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
||||
| 1 | `smd_sot(SOT223)` | SOT223 package FZT851 |
|
||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -3842,7 +3890,7 @@ NEMA stepper motor model.
|
||||
| `NEMA(type, shaft_angle = 0, jst_connector = false)` | Draw specified NEMA stepper motor |
|
||||
| `NEMA_outline(type)` | 2D outline |
|
||||
| `NEMA_screw_positions(type, n = 4)` | Positions children at the screw holes |
|
||||
| `NEMA_screws(type, screw, n = 4, screw_length = 8, earth = undef)` | Place screws and optional earth tag |
|
||||
| `NEMA_screws(type, screw, n = 4, screw_length = 8, earth = undef, earth_rot = undef)` | Place screws and optional earth tag |
|
||||
|
||||

|
||||
|
||||
@@ -3912,6 +3960,40 @@ Should be reasonably accurate if not close to fully open.
|
||||
| 2 | `swiss_clip(UKPFS1008_10)` | Swiss picture clip UKPFS1008_10 11mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Terminals"></a>
|
||||
## Terminals
|
||||
Terminal blocks for power supplies and PCBs.
|
||||
|
||||
[vitamins/terminal.scad](vitamins/terminal.scad) Implementation.
|
||||
|
||||
[tests/terminals.scad](tests/terminals.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `terminal_block_depth(type)` | Total depth |
|
||||
| `terminal_block_depth2(type)` | Depth of contact well |
|
||||
| `terminal_block_divider(type)` | Width of the dividers |
|
||||
| `terminal_block_height(type)` | Height of the dividers |
|
||||
| `terminal_block_height2(type)` | Height under the contacts |
|
||||
| `terminal_block_pitch(type)` | Pitch between screws |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `terminal_block_length(type, ways)` | Total length of terminal block |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `terminal_block(type, ways)` | Draw a power supply terminal block |
|
||||
|
||||

|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -4048,6 +4130,7 @@ Tubing and sleeving. The internal diameter can be forced to stretch it over some
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `tubing_ir(type)` | Inside radius |
|
||||
| `tubing_or(type)` | Outside radius |
|
||||
|
||||
### Modules
|
||||
@@ -4158,6 +4241,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `vero(name, assembly, holes, strips, pitch = inch(0.1)` | Constructor |
|
||||
| `vero_length(type)` | Length of the board |
|
||||
| `vero_size(type)` | Board size |
|
||||
| `vero_thickness(type)` | Thickness of the substrate |
|
||||
@@ -4168,6 +4252,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `solder_meniscus(type, ir = 0.3, r = undef)` | Draw a solder meniscus |
|
||||
| `vero_cutouts(type, angle = undef)` | Make cutouts to clear components |
|
||||
| `vero_grid_pos(type, x, y)` | Convert grid position to offset from the centre |
|
||||
| `vero_mounting_hole_positions(type)` | Positions children at the mounting holes |
|
||||
@@ -4310,8 +4395,8 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
||||
| `cable_width(cable)` | Width in flat clip |
|
||||
| `cable_wire_size(cable)` | Size of each wire in a bundle |
|
||||
| `cable_wires(cable)` | Number of wires in a bindle |
|
||||
| `wire_hole_radius(cable)` | Radius of a hole to accept a bundle of wires |
|
||||
| `cable_wires(cable)` | Number of wires in a bundle |
|
||||
| `wire_hole_radius(cable)` | Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -4392,6 +4477,10 @@ screw type and printed part wall thickness. This diagram shows how the various d
|
||||
|
||||
Normally the side sheets are the same type but they can be overridden individually as long as the substitute has the same thickness.
|
||||
|
||||
A box can have an optional name to allow more than one in the same project.
|
||||
|
||||
The top bezel can have an optional child, which is subtracted to allow modification.
|
||||
|
||||
[printed/box.scad](printed/box.scad) Implementation.
|
||||
|
||||
[tests/box.scad](tests/box.scad) Code for this example.
|
||||
@@ -4403,6 +4492,7 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
| `box_depth(type)` | Internal depth |
|
||||
| `box_feet(type)` | True to enable feet on the bottom bezel |
|
||||
| `box_height(type)` | Internal height |
|
||||
| `box_name(type)` | Name for projects with more than one box |
|
||||
| `box_screw(type)` | Screw type to be used at the corners |
|
||||
| `box_sheets(type)` | Sheet type used for the sides |
|
||||
| `box_shelf_screw(type)` | Screw type to hold a shelf |
|
||||
@@ -4413,9 +4503,10 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false, shelf_screw = undef)` | Construct a property list for a box. |
|
||||
| `box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false, shelf_screw = undef, name = "box")` | Construct a property list for a box. |
|
||||
| `box_bezel_height(type, bottom)` | Bezel height for top or bottom |
|
||||
| `box_corner_gap(type)` | Gap between box_sheets at the corners to connect inside and outside profiles |
|
||||
| `box_hole_inset(type)` | Screw inset from the corner of the internal dimensions |
|
||||
| `box_inset(type)` | How much the bezel intrudes on the specified width and length, away from the corners |
|
||||
| `box_intrusion(type)` | Corner profile intrusion |
|
||||
| `box_margin(type)` | How much the bezel intrudes on the specified height |
|
||||
@@ -4504,7 +4595,8 @@ maximum spacing.
|
||||
* An optional list of fixing blocks to be omitted can be given.
|
||||
* Star washers can be omitted by setting the 11th parameter to false.
|
||||
|
||||
Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block) by default. Setting `thin_blocks` uses 2screw_blocks instead of
|
||||
fixing_blocks along the sides.
|
||||
|
||||
[printed/butt_box.scad](printed/butt_box.scad) Implementation.
|
||||
|
||||
@@ -4521,14 +4613,15 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
| `bbox_sheets(type)` | Sheet type for the sides |
|
||||
| `bbox_skip_blocks(type)` | List of fixing blocks to skip, used to allow a hinged panel for example |
|
||||
| `bbox_span(type)` | Maximum span between fixing blocks |
|
||||
| `bbox_star_washers(type)` | Set to false to remove star washers. |
|
||||
| `bbox_thin_blocks(type)` | Set for 2 screw blocks instead of three hole fixing blocks. |
|
||||
| `bbox_top_sheet(type)` | Sheet type for the top |
|
||||
| `bbox_width(type)` | Internal width |
|
||||
| `star_washers(type)` | Set to false to remove star washers. |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true)` | Construct the property list for a butt_box |
|
||||
| `bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true, thin_blocks = false)` | Construct the property list for a butt_box |
|
||||
| `bbox_area(type)` | Internal surface area in m^2 |
|
||||
| `bbox_volume(type)` | Internal volume in litres |
|
||||
|
||||
@@ -4555,23 +4648,23 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 48 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 36 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||
| 60 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 44 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||
| 4 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||
| 8 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||
| 2 | `sheet(DiBond, 303, 126)` | Sheet DiBond 303mm x 126mm x 3mm |
|
||||
| 1 | `sheet(DiBond, 400, 126)` | Sheet DiBond 400mm x 126mm x 3mm |
|
||||
| 1 | `sheet(DiBond6, 400, 300, 1)` | Sheet DiBond 400mm x 300mm x 6mm |
|
||||
| 1 | `sheet(DiBond, 406, 129)` | Sheet DiBond 406mm x 129mm x 3mm |
|
||||
| 1 | `sheet(PMMA3, 406, 303)` | Sheet acrylic 406mm x 303mm x 3mm |
|
||||
| 48 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 48 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
| 12 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||
| 2 | `sheet(DiBond, 203, 126)` | Sheet DiBond 203mm x 126mm x 3mm |
|
||||
| 1 | `sheet(DiBond, 300, 126)` | Sheet DiBond 300mm x 126mm x 3mm |
|
||||
| 1 | `sheet(DiBond6, 300, 200, 1)` | Sheet DiBond 300mm x 200mm x 6mm |
|
||||
| 1 | `sheet(DiBond, 306, 129)` | Sheet DiBond 306mm x 129mm x 3mm |
|
||||
| 1 | `sheet(PMMA3, 306, 203)` | Sheet acrylic 306mm x 203mm x 3mm |
|
||||
| 60 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 60 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 8 | corner_block_M30.stl |
|
||||
| 8 | fixing_block_M30.stl |
|
||||
| 12 | fixing_block_M30.stl |
|
||||
|
||||
### Routed
|
||||
| Qty | Filename |
|
||||
@@ -4588,7 +4681,7 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
| ---:|:--- |
|
||||
| 1 | bbox_assembly |
|
||||
| 8 | corner_block_M30_assembly |
|
||||
| 8 | fixing_block_M30_assembly |
|
||||
| 12 | fixing_block_M30_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4603,6 +4696,12 @@ of conductive panels, an extra layer of insulation.
|
||||
|
||||
[tests/cable_grommets.scad](tests/cable_grommets.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `mouse_grommet_length(r)` | Length of grommet given r |
|
||||
| `mouse_grommet_offset(r)` | Offset of the wire from the ground |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
@@ -4619,7 +4718,7 @@ of conductive panels, an extra layer of insulation.
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | mouse_grommet_50_3.stl |
|
||||
| 1 | mouse_grommet_100_3.stl |
|
||||
| 1 | ribbon_grommet_20_3.stl |
|
||||
| 1 | round_grommet_bottom_60.stl |
|
||||
| 1 | round_grommet_top_60_3.stl |
|
||||
@@ -4740,6 +4839,9 @@ This allows the block and one set of fasteners to be on one assembly and the oth
|
||||
|
||||
Star washers can be omitted by setting `star_washers` to false.
|
||||
|
||||
A 2screw_block is a thinner version with two screws and two mating surfaces. It can be used as an alternative to fixing blocks when
|
||||
high lateral rigity is not required.
|
||||
|
||||
[printed/corner_block.scad](printed/corner_block.scad) Implementation.
|
||||
|
||||
[tests/corner_block.scad](tests/corner_block.scad) Code for this example.
|
||||
@@ -4747,6 +4849,10 @@ Star washers can be omitted by setting `star_washers` to false.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `2screw_block_h_hole(screw = def_screw)` | Transform to front hole |
|
||||
| `2screw_block_holes(screw)` | List of transforms to both holes |
|
||||
| `2screw_block_v_hole(screw = def_screw)` | Transform to bottom hole |
|
||||
| `2screw_block_width(screw = def_screw)` | 2 screw block width is narrower, height and depth are as corner_block |
|
||||
| `corner_block_h_holes(screw = def_screw)` | List of transforms to side holes |
|
||||
| `corner_block_hole_offset(screw = def_screw)` | Hole offset from the edge |
|
||||
| `corner_block_holes(screw)` | List of transforms to all holes |
|
||||
@@ -4757,11 +4863,17 @@ Star washers can be omitted by setting `star_washers` to false.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `2screw_block(screw = def_screw, name = false)` | Generate the STL for a printed 2screw block |
|
||||
| `2screw_block_assembly(screw = def_screw, name = false)` | The printed block with inserts |
|
||||
| `2screw_block_h_hole(screw = def_screw)` | Place children at the front screw hole |
|
||||
| `2screw_block_holes(screw = def_screw)` | Place children at both screw holes |
|
||||
| `2screw_block_v_hole(screw = def_screw)` | Place children at the bottom screw hole |
|
||||
| `corner_block(screw = def_screw, name = false)` | Generate the STL for a printed corner block |
|
||||
| `corner_block_assembly(screw = def_screw, name = false)` | The printed block with inserts |
|
||||
| `corner_block_h_holes(screw = def_screw, index = undef)` | Place children at the side screw holes |
|
||||
| `corner_block_holes(screw = def_screw)` | Place children at all the holes |
|
||||
| `corner_block_v_hole(screw = def_screw)` | Place children at the bottom screw hole |
|
||||
| `fastened_2screw_block_assembly(thickness, screw = def_screw, thickness_below = undef, name = false, show_block = true, star_washers = true)` | Printed block with fasteners |
|
||||
| `fastened_corner_block_assembly(thickness, screw = def_screw, thickness_below = undef, thickness_side2 = undef, name = false, show_block = true, star_washers = true)` | Printed block with all fasteners |
|
||||
|
||||

|
||||
@@ -4769,26 +4881,30 @@ Star washers can be omitted by setting `star_washers` to false.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 3 | `insert(F1BM2)` | Heatfit insert M2 |
|
||||
| 3 | `insert(F1BM2p5)` | Heatfit insert M2.5 |
|
||||
| 3 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 3 | `insert(F1BM4)` | Heatfit insert M4 |
|
||||
| 3 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
|
||||
| 3 | `screw(M2p5_pan_screw, 10)` | Screw M2.5 pan x 10mm |
|
||||
| 3 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||
| 3 | `screw(M4_dome_screw, 12)` | Screw M4 dome x 12mm |
|
||||
| 3 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
||||
| 3 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 3 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 3 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
| 3 | `star_washer(M2_washer)` | Washer star M2 x 0.3mm |
|
||||
| 3 | `star_washer(M2p5_washer)` | Washer star M2.5 x 0.5mm |
|
||||
| 3 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
| 3 | `star_washer(M4_washer)` | Washer star M4 x 0.8mm |
|
||||
| 5 | `insert(F1BM2)` | Heatfit insert M2 |
|
||||
| 5 | `insert(F1BM2p5)` | Heatfit insert M2.5 |
|
||||
| 5 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 5 | `insert(F1BM4)` | Heatfit insert M4 |
|
||||
| 5 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
|
||||
| 5 | `screw(M2p5_pan_screw, 10)` | Screw M2.5 pan x 10mm |
|
||||
| 5 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||
| 5 | `screw(M4_dome_screw, 12)` | Screw M4 dome x 12mm |
|
||||
| 5 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
||||
| 5 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 5 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 5 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
| 5 | `star_washer(M2_washer)` | Washer star M2 x 0.3mm |
|
||||
| 5 | `star_washer(M2p5_washer)` | Washer star M2.5 x 0.5mm |
|
||||
| 5 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
| 5 | `star_washer(M4_washer)` | Washer star M4 x 0.8mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | 2screw_block_M20.stl |
|
||||
| 1 | 2screw_block_M25.stl |
|
||||
| 1 | 2screw_block_M30.stl |
|
||||
| 1 | 2screw_block_M40.stl |
|
||||
| 1 | corner_block_M20.stl |
|
||||
| 1 | corner_block_M25.stl |
|
||||
| 1 | corner_block_M30.stl |
|
||||
@@ -4797,6 +4913,10 @@ Star washers can be omitted by setting `star_washers` to false.
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | 2screw_block_M20_assembly |
|
||||
| 1 | 2screw_block_M25_assembly |
|
||||
| 1 | 2screw_block_M30_assembly |
|
||||
| 1 | 2screw_block_M40_assembly |
|
||||
| 1 | corner_block_M20_assembly |
|
||||
| 1 | corner_block_M25_assembly |
|
||||
| 1 | corner_block_M30_assembly |
|
||||
@@ -4921,10 +5041,12 @@ to the assembly, for example to add inserts.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `drag_chain_bwall(type)` | Bottom wall |
|
||||
| `drag_chain_clearance(type)` | Clearance around joints |
|
||||
| `drag_chain_name(type)` | The name to allow more than one in a project |
|
||||
| `drag_chain_screw(type)` | Mounting screw for the ends |
|
||||
| `drag_chain_screw_lists(type)` | Two lists of four bools to say which screws positions are used |
|
||||
| `drag_chain_size(type)` | The internal size and link length |
|
||||
| `drag_chain_supports(type)` | Whether to print version of chain with or without supports |
|
||||
| `drag_chain_travel(type)` | X travel |
|
||||
| `drag_chain_twall(type)` | Top wall |
|
||||
| `drag_chain_wall(type)` | Side wall thickness |
|
||||
@@ -4932,8 +5054,8 @@ to the assembly, for example to add inserts.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5, screw = M2_cap_screw, screw_lists = [[1,0,0,1],[1,0,0,1]])` | Constructor |
|
||||
| `drag_chain_clearance()` | Clearance around joints. |
|
||||
| `drag_chain(name, size, travel, wall = 1.6, bwall = 1.5, twall = 1.5, clearance = 0.1, supports = true, screw = M2_cap_screw, screw_lists = [[1,0,0,1],[1,0,0,1]])` | Constructor |
|
||||
| `drag_chain_links(type)` | Number of links in chain |
|
||||
| `drag_chain_outer_size(type)` | Link outer dimensions |
|
||||
| `drag_chain_radius(type)` | The bend radius at the pivot centres |
|
||||
| `drag_chain_z(type)` | Outside dimension of a 180 bend |
|
||||
@@ -5270,6 +5392,75 @@ Printed handle that can be printed without needing support material due to its t
|
||||
| 1 | handle_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Knob"></a>
|
||||
## Knob
|
||||
Parametric knobs for potentiometers and encoders.
|
||||
|
||||
A knob can be constructed by specififying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
An optional skirt and / or a pointer can be specified.
|
||||
|
||||
The STL includes a support membrane that needs to be cut out and a thread needs to be tapped for the grub screw.
|
||||
|
||||
[printed/knob.scad](printed/knob.scad) Implementation.
|
||||
|
||||
[tests/knob.scad](tests/knob.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `knob_bot_d(type)` | Diameter at the bottom |
|
||||
| `knob_corner_r(type)` | Rounded top corner |
|
||||
| `knob_flat_d(type)` | The shaft diameter at the flat |
|
||||
| `knob_flat_h(type)` | The length of the flat |
|
||||
| `knob_height(type)` | Height |
|
||||
| `knob_name(type)` | Name for the stl maker |
|
||||
| `knob_pointer(type)` | None |
|
||||
| `knob_recess(type)` | Recess diameter and thickness to clear nut and thread, diameter, nut height, thread height |
|
||||
| `knob_screw(type)` | The grub screw type |
|
||||
| `knob_shaft_d(type)` | Shaft diameter |
|
||||
| `knob_shaft_len(type)` | Shaft length |
|
||||
| `knob_skirt(type)` | Skirt diameter and thickness |
|
||||
| `knob_top_d(type)` | Diameter at the top |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `knob(name = "knob", top_d = 12, bot_d = 15, height = 18, shaft_length, skirt = [20, 2], pointer = false, corner_r = 2, screw = M3_grub_screw, shaft_d, flat_d, flat_h, recess)` | Constructor |
|
||||
| `knob_for_pot(pot, thickness, z = 1, washer = true, top_d = 12, bot_d = 15, height = 0, shaft_length = undef, skirt = [20, 2], pointer = false, corner_r = 2, screw = M3_grub_screw)` | Construct a knob to fit specified pot |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `knob(type, supports = true)` | Generate the STL for a knob |
|
||||
| `knob_assembly(type) explode(40, explode_children = true)` | Assembly with the grub screw in place |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `potentiometer(BTT_encoder)` | BTT_encoder |
|
||||
| 1 | `potentiometer(KY_040_encoder)` | KY_040_encoder |
|
||||
| 1 | `potentiometer(imperial_pot)` | Potentiometer imperial_pot |
|
||||
| 1 | `potentiometer(imperial_pot_x2)` | Potentiometer imperial_pot_x2 |
|
||||
| 1 | `potentiometer(metric_pot)` | Potentiometer metric_pot |
|
||||
| 1 | `screw(M3_grub_screw, 3)` | Screw M3 grub x 3mm |
|
||||
| 2 | `screw(M3_grub_screw, 4)` | Screw M3 grub x 4mm |
|
||||
| 1 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | BTT_encoder_knob.stl |
|
||||
| 1 | KY_040_encoder_knob.stl |
|
||||
| 1 | imperial_pot_knob.stl |
|
||||
| 1 | imperial_pot_x2_knob.stl |
|
||||
| 1 | metric_pot_knob.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -5604,7 +5795,10 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
||||
---
|
||||
<a name="Ribbon_clamp"></a>
|
||||
## Ribbon_clamp
|
||||
Clamp for ribbon cable and polypropylene strip.
|
||||
Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
|
||||
* When `ways` is a scalar number the slot is sized for one rubbon cable and a PP strip.
|
||||
* When `ways` is a two element vector the second element indicates the number of cables and the slot is size for just the cables.
|
||||
|
||||
[printed/ribbon_clamp.scad](printed/ribbon_clamp.scad) Implementation.
|
||||
|
||||
@@ -5613,7 +5807,7 @@ Clamp for ribbon cable and polypropylene strip.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `ribbon_clamp_height(screw = screw)` | Height |
|
||||
| `ribbon_clamp_height(screw = screw, ways = undef)` | Height |
|
||||
| `ribbon_clamp_length(ways, screw = screw)` | Length given ways |
|
||||
| `ribbon_clamp_width(screw = screw)` | Width |
|
||||
|
||||
@@ -5977,9 +6171,9 @@ allows flexible positioning of the motors.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `coreXY(type, size, pos, separation, x_gap, plain_idler_offset = 0, upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = false, left_lower = false)` | Wrapper module to draw both belts of a coreXY setup |
|
||||
| `coreXY_belts(type, carriagePosition, coreXYPosBL, coreXYPosTR, separation, x_gap = 20, 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, drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false)` | Draw one belt 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)` | 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 |
|
||||
|
||||

|
||||
|
||||
@@ -5987,7 +6181,7 @@ allows flexible positioning of the motors.
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 728mm |
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 824mm |
|
||||
| 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 |
|
||||
@@ -6387,6 +6581,12 @@ Subsequent rotations use the minimum rotation method.
|
||||
The path can be open or closed. If closed sweep ensures that the start and end have the same rotation to line up.
|
||||
An additional twist around the path can be specified. If the path is closed this should be a multiple of 360.
|
||||
|
||||
`rounded_path()` can be used to generate a path of lines connected by arcs, useful for wire runs, etc.
|
||||
The vertices specify where the the path would be without any rounding.
|
||||
Each vertex, apart from the first and the last, has an associated radius and the path shortcuts the vertex with an arc specified by the radius.
|
||||
|
||||
`spiral_paths()` makes a list of new paths that spiral around a given path. It can be used to make twisted wires that follow a rounded_path, for example.
|
||||
|
||||
[utils/sweep.scad](utils/sweep.scad) Implementation.
|
||||
|
||||
[tests/sweep.scad](tests/sweep.scad) Code for this example.
|
||||
@@ -6402,12 +6602,17 @@ An additional twist around the path can be specified. If the path is closed this
|
||||
| `helical_twist_per_segment(r, pitch, sides)` | Calculate the twist around Z that rotate_from_to() introduces |
|
||||
| `path_length(path, i = 0, length = 0)` | Calculated the length along a path |
|
||||
| `rectangle_points(w, h)` | Generate the points of a rectangle |
|
||||
| `rounded_path(path)` | Convert a rounded_path, consisting of a start coordinate, vertex / radius pairs and then an end coordinate, to a path of points for sweep. |
|
||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||
| `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 sprial around the given path. Use for making twisted cables |
|
||||
| `sweep(path, profile, loop = false, twist = 0)` | Generate the point list and face list of the swept volume |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `show_path(path)` | Show a path using a chain of hulls for debugging, duplicate points are highlighted. |
|
||||
| `sweep(path, profile, loop = false, twist = 0, convexity = 1)` | Draw a polyhedron that is the swept volume |
|
||||
|
||||

|
||||
|
@@ -82,6 +82,7 @@ def codify(word, url):
|
||||
|
||||
|
||||
def fixup_comment(comment, url):
|
||||
comment = comment.replace('cnc_bit+_r', 'cnc_bit_r')
|
||||
""" markup code words and fix new paragraphs """
|
||||
result = ''
|
||||
word = ''
|
||||
@@ -161,6 +162,6 @@ if __name__ == '__main__':
|
||||
|
||||
# Print commits excluding merges
|
||||
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U..ated changelog.*', c.comment):
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U..ated chang.*log.*', c.comment):
|
||||
print('* %s [`%s`](%s "show commit") %s %s\n' % (c.date, c.hash[:7], url + '/commit/' + c.hash, initials(c.author), fixup_comment(c.comment, url)), file = file)
|
||||
do_cmd(('codespell -w -L od ' + filename).split())
|
||||
|
@@ -21,9 +21,11 @@ use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/7_segments.scad>
|
||||
|
||||
function digits(s) = 7_segment_digits(s) < 2 ? 2 : 1;
|
||||
|
||||
module 7_segments()
|
||||
layout([for(s = 7_segments) 7_segment_size(s).x * 2], 5) let(s = 7_segments[$i])
|
||||
7_segment_digits(s, 2);
|
||||
layout([for(s = 7_segments) 7_segment_size(s).x * digits(s)], 3) let(s = 7_segments[$i])
|
||||
7_segment_digits(s, digits(s));
|
||||
|
||||
if($preview)
|
||||
7_segments();
|
||||
|
@@ -59,7 +59,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ [3, 3], [3, -3], [-3, 3], [-3, -3] ],
|
||||
// components
|
||||
[
|
||||
[ 20, -5, 180, "trimpot10"],
|
||||
[ 20, -5, 180, "trimpot10"],
|
||||
[ 20, -15, 90, "trimpot10", true],
|
||||
[ 10, 2, 90, "smd_led", LED0805, "red"],
|
||||
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
||||
@@ -69,6 +69,8 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 25, 2, 90, "smd_cap", CAP1206, 1.5],
|
||||
[ 28, 2, 90, "smd_cap", CAP0805, 1.0],
|
||||
[ 31, 2, 90, "smd_cap", CAP0603, 0.7],
|
||||
[ 16, 6, -90, "smd_sot", SOT23, "2N7000"],
|
||||
[ 28, 20, -90, "smd_sot", SOT223, "LM117"],
|
||||
|
||||
[ 10, 10, 0, "2p54header", 4, 1],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, false, "blue" ],
|
||||
@@ -99,6 +101,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 65, 22, 0, "ax_res", res1_2, 100000],
|
||||
[ 55, 22, 0, "vero_pin"],
|
||||
[ 55, 17, 0, "vero_pin", true],
|
||||
[ 55, 9, 0, "link", 0, 5],
|
||||
|
||||
[ 80, 9, 0, "link", inch(0.2), inch(0.4)],
|
||||
[ 80, 12, 0, "ax_res", res1_8, 1000000, 1, inch(0.1)],
|
||||
|
@@ -16,20 +16,33 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
show_cutout = false;
|
||||
|
||||
include <../core.scad>
|
||||
include <../vitamins/psus.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
|
||||
|
||||
module psus()
|
||||
layout([for(p = psus) psu_width(p)], 10) let(p = psus[$i])
|
||||
layout([for(p = psus) atx_psu(p) ? psu_length(p) : psu_width(p)], 10) let(p = psus[$i])
|
||||
rotate(atx_psu(p) ? 0 : 90) {
|
||||
psu(p);
|
||||
|
||||
psu_screw_positions(p)
|
||||
translate_z(3)
|
||||
screw_and_washer(psu_screw(p), 8);
|
||||
if (psu_screw(p))
|
||||
psu_screw_positions(p)
|
||||
translate_z(3)
|
||||
screw_and_washer(psu_screw(p), 8);
|
||||
|
||||
if(show_cutout && atx_psu(p))
|
||||
#atx_psu_cutout(p);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
if($preview) {
|
||||
psus();
|
||||
|
||||
for(p = psus_not_shown)
|
||||
hidden()
|
||||
psu(p);
|
||||
}
|
||||
|
@@ -33,6 +33,11 @@ module smds() {
|
||||
layout([for(c = smd_capacitors) smd_cap_size(c).x], 1)
|
||||
let(c = smd_capacitors[$i])
|
||||
smd_capacitor(c, smd_cap_size(c).y * 0.8);
|
||||
|
||||
translate([0, 12])
|
||||
layout([for(s = smd_sots) smd_sot_size(s).x], 1)
|
||||
let(s = smd_sots[$i])
|
||||
smd_sot(s, ["2N7000", "FZT851"][$i]);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -28,6 +28,9 @@ module axials() {
|
||||
rotate(90)
|
||||
wire_link(0.8, inch(0.4));
|
||||
|
||||
pcb_grid(pcb, 0, 7)
|
||||
wire_link(0.8, 0, 5);
|
||||
|
||||
for(i = [0 : len(ax_resistors) - 1]) {
|
||||
pcb_grid(pcb, 2 * i + 2, 1 + [0, 0.5, 1.5][i])
|
||||
rotate(90)
|
||||
|
@@ -21,10 +21,23 @@ use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/ball_bearings.scad>
|
||||
|
||||
module ball_bearings()
|
||||
layout([for(b = ball_bearings) bb_diameter(b)])
|
||||
ball_bearing(ball_bearings[$i])
|
||||
bearing_ball(3);
|
||||
|
||||
module do_bearings(list)
|
||||
layout([for(b = list) bb_diameter(b)])
|
||||
ball_bearing(list[$i])
|
||||
if (bb_width(list[$i]) >= 5)
|
||||
bearing_ball(3);
|
||||
|
||||
module ball_bearings() {
|
||||
small_bearings = [for(b = ball_bearings) if(bb_diameter(b) < 12) b];
|
||||
big_bearings = [for(b = ball_bearings) if(!in(small_bearings, b)) b];
|
||||
|
||||
translate([0, 0])
|
||||
do_bearings(big_bearings);
|
||||
|
||||
translate([0, -20])
|
||||
do_bearings(small_bearings);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
ball_bearings();
|
||||
|
@@ -25,7 +25,7 @@ include <../printed/butt_box.scad>
|
||||
|
||||
$explode = 0;
|
||||
|
||||
box = bbox(screw = M3_dome_screw, sheets = DiBond, base_sheet = DiBond6, top_sheet = PMMA3, span = 250, size = [400, 300, 120]);
|
||||
box = bbox(screw = M3_dome_screw, sheets = DiBond, base_sheet = DiBond6, top_sheet = PMMA3, span = 150, size = [300, 200, 120]);
|
||||
|
||||
module bbox_assembly() _bbox_assembly(box);
|
||||
|
||||
|
@@ -30,22 +30,25 @@ module coreXY_belts_test() {
|
||||
plain_idler = coreXY_plain_idler(coreXY_type);
|
||||
toothed_idler = coreXY_toothed_idler(coreXY_type);
|
||||
|
||||
pos = [100, 50];
|
||||
coreXYPosBL = [0, 0, 0];
|
||||
coreXYPosTR = [200, 150, 0];
|
||||
separation = [0, coreXY_coincident_separation(coreXY_type).y, pulley_height(plain_idler) + washer_thickness(M3_washer)];
|
||||
pos = [100, 50];
|
||||
x_gap = 10;
|
||||
|
||||
upper_drive_pulley_offset = [40, 10];
|
||||
plain_idler_offset = [10, 5];
|
||||
upper_drive_pulley_offset = [40, 0];
|
||||
lower_drive_pulley_offset = [0, 0];
|
||||
|
||||
coreXY_belts(coreXY_type,
|
||||
carriagePosition = pos,
|
||||
coreXYPosBL = coreXYPosBL,
|
||||
coreXYPosTR = coreXYPosTR,
|
||||
separation = separation,
|
||||
x_gap = 10,
|
||||
upper_drive_pulley_offset = upper_drive_pulley_offset,
|
||||
lower_drive_pulley_offset = lower_drive_pulley_offset,
|
||||
pos,
|
||||
coreXYPosBL,
|
||||
coreXYPosTR,
|
||||
separation,
|
||||
x_gap,
|
||||
plain_idler_offset,
|
||||
upper_drive_pulley_offset,
|
||||
lower_drive_pulley_offset,
|
||||
show_pulleys = true);
|
||||
|
||||
|
||||
@@ -56,18 +59,18 @@ module coreXY_belts_test() {
|
||||
|
||||
// add the screws for the upper drive offset idler pulleys if required
|
||||
if (upper_drive_pulley_offset.x > 0) {
|
||||
translate(coreXY_drive_plain_idler_offset(coreXY_type))
|
||||
translate_z(-pulley_offset(plain_idler))
|
||||
translate(coreXY_drive_plain_idler_offset(coreXY_type) + plain_idler_offset)
|
||||
translate([0, -upper_drive_pulley_offset.y, -pulley_offset(plain_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
translate(coreXY_drive_toothed_idler_offset(coreXY_type))
|
||||
translate_z(-pulley_offset(toothed_idler))
|
||||
translate([0, -upper_drive_pulley_offset.y, -pulley_offset(toothed_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
} else if (upper_drive_pulley_offset.x < 0) {
|
||||
translate([-pulley_od(plain_idler), coreXY_drive_plain_idler_offset(coreXY_type).y])
|
||||
translate_z(-pulley_offset(plain_idler))
|
||||
translate([-pulley_od(plain_idler), coreXY_drive_plain_idler_offset(coreXY_type).y + plain_idler_offset.y])
|
||||
translate([0, -upper_drive_pulley_offset.y, -pulley_offset(plain_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
translate([2*coreXY_drive_pulley_x_alignment(coreXY_type), coreXY_drive_toothed_idler_offset(coreXY_type).y])
|
||||
translate_z(-pulley_offset(toothed_idler))
|
||||
translate([2*coreXY_drive_pulley_x_alignment(coreXY_type) + plain_idler_offset.x, coreXY_drive_toothed_idler_offset(coreXY_type).y])
|
||||
translate([0, -upper_drive_pulley_offset.y, -pulley_offset(toothed_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
}
|
||||
}
|
||||
@@ -79,18 +82,18 @@ module coreXY_belts_test() {
|
||||
|
||||
// add the screws for the lower drive offset idler pulleys if required
|
||||
if (lower_drive_pulley_offset.x < 0) {
|
||||
translate([-coreXY_drive_plain_idler_offset(coreXY_type).x, coreXY_drive_plain_idler_offset(coreXY_type).y])
|
||||
translate_z(-pulley_offset(plain_idler))
|
||||
translate([-coreXY_drive_plain_idler_offset(coreXY_type).x - plain_idler_offset.x, coreXY_drive_plain_idler_offset(coreXY_type).y + plain_idler_offset.y])
|
||||
translate([0, -lower_drive_pulley_offset.y, -pulley_offset(plain_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
translate(coreXY_drive_toothed_idler_offset(coreXY_type))
|
||||
translate_z(-pulley_offset(toothed_idler))
|
||||
translate([0, -lower_drive_pulley_offset.y, -pulley_offset(toothed_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
} else if (lower_drive_pulley_offset.x > 0) {
|
||||
translate([pulley_od(plain_idler), coreXY_drive_plain_idler_offset(coreXY_type).y])
|
||||
translate_z(-pulley_offset(plain_idler))
|
||||
translate([pulley_od(plain_idler), coreXY_drive_plain_idler_offset(coreXY_type).y + plain_idler_offset.y])
|
||||
translate([0, -lower_drive_pulley_offset.y, -pulley_offset(plain_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
translate([-2*coreXY_drive_pulley_x_alignment(coreXY_type), coreXY_drive_toothed_idler_offset(coreXY_type).y])
|
||||
translate_z(-pulley_offset(toothed_idler))
|
||||
translate([-2*coreXY_drive_pulley_x_alignment(coreXY_type) - plain_idler_offset.x, coreXY_drive_toothed_idler_offset(coreXY_type).y])
|
||||
translate([0, -lower_drive_pulley_offset.y, -pulley_offset(toothed_idler)])
|
||||
screw(M3_cap_screw, 20);
|
||||
}
|
||||
}
|
||||
@@ -118,13 +121,13 @@ module coreXY_belts_test() {
|
||||
translate([coreXYPosBL.x, coreXY_toothed_idler_offset(coreXY_type).y, 0])
|
||||
screw(M3_cap_screw, 20);
|
||||
// add the screw for the left Y carriage plain idler
|
||||
translate([coreXYPosBL.x + separation.x + coreXY_plain_idler_offset(coreXY_type).x, separation.y + coreXY_plain_idler_offset(coreXY_type).y, separation.z])
|
||||
translate([coreXYPosBL.x + separation.x + coreXY_plain_idler_offset(coreXY_type).x + (upper_drive_pulley_offset.x == 0 ? 0 : plain_idler_offset.x), separation.y + coreXY_plain_idler_offset(coreXY_type).y, separation.z])
|
||||
screw(M3_cap_screw, 20);
|
||||
// add the screw for the right Y carriage toothed idler
|
||||
translate([coreXYPosTR.x + separation.x, coreXY_toothed_idler_offset(coreXY_type).y, separation.z])
|
||||
screw(M3_cap_screw, 20);
|
||||
// add the screw for the right Y carriage plain idler
|
||||
translate([coreXYPosTR.x - coreXY_plain_idler_offset(coreXY_type).x, separation.y + coreXY_plain_idler_offset(coreXY_type).y, 0])
|
||||
translate([coreXYPosTR.x - coreXY_plain_idler_offset(coreXY_type).x - (lower_drive_pulley_offset.x == 0 ? 0 : plain_idler_offset.x), separation.y + coreXY_plain_idler_offset(coreXY_type).y, 0])
|
||||
screw(M3_cap_screw, 20);
|
||||
}
|
||||
}
|
||||
|
@@ -22,11 +22,18 @@ use <../printed/corner_block.scad>
|
||||
screws = [M2_cap_screw, M2p5_pan_screw, M3_dome_screw, M4_dome_screw];
|
||||
|
||||
module do_corner_block(screw)
|
||||
if($preview)
|
||||
if($preview) {
|
||||
fastened_corner_block_assembly(3, screw = screw);
|
||||
else
|
||||
|
||||
translate([0, 30])
|
||||
fastened_2screw_block_assembly(3, screw = screw);
|
||||
}
|
||||
else {
|
||||
corner_block(screw);
|
||||
|
||||
translate([0, 30])
|
||||
2screw_block(screw);
|
||||
}
|
||||
module corner_blocks()
|
||||
for(i = [0 : len(screws) - 1])
|
||||
translate([i * 30, 0])
|
||||
|
58
tests/knob.scad
Normal file
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2021
|
||||
// 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/>.
|
||||
//
|
||||
z = 1; // [0: 5]
|
||||
thickness = 3; // [0: 5]
|
||||
shaft_length = 10;
|
||||
|
||||
include <../core.scad>
|
||||
use <../printed/knob.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/potentiometers.scad>
|
||||
|
||||
knobs = [for(i = [0 : len(potentiometers) - 1]) let(p = potentiometers[i])
|
||||
knob_for_pot(p, thickness, z, shaft_length = pot_shaft(p).z > 20 ? shaft_length : undef,
|
||||
top_d = [10, 12, 20, 16, 16 ][i],
|
||||
bot_d = [10, 15, 20, 20, 20 ][i],
|
||||
skirt = [false, [20, 2], false, [27, 1.5], [27, 1.5]][i],
|
||||
pointer = [false, false, [14, [1, 5], 2], [13.5, [1, 1], 3], [13.5, [1, 3], 3]][i],
|
||||
screw = let(s = pot_shaft(p)) s.y > s.x / 2 ? M3_grub_screw : false
|
||||
)];
|
||||
|
||||
|
||||
module knobs(show_pot = false)
|
||||
layout([for(p = potentiometers) pot_size(p).x], 5) let(p = potentiometers[$i])
|
||||
if($preview) {
|
||||
translate_z(z)
|
||||
knob_assembly(knobs[$i]);
|
||||
|
||||
if(show_pot)
|
||||
translate_z(-thickness)
|
||||
vflip() {
|
||||
potentiometer(p, shaft_length = shaft_length);
|
||||
|
||||
translate_z(-thickness)
|
||||
pot_nut(p);
|
||||
}
|
||||
}
|
||||
else
|
||||
knob(knobs[$i]);
|
||||
|
||||
|
||||
knobs(true);
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 276 KiB After Width: | Height: | Size: 276 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 142 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |