Compare commits
141 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2f60f568ff | ||
|
0206b2e868 | ||
|
38e2a22a11 | ||
|
4f68353f70 | ||
|
fbaae66d27 | ||
|
f8d17c6f16 | ||
|
97a6a65158 | ||
|
42fccc1afb | ||
|
662db2bd41 | ||
|
76aa613093 | ||
|
0e2778e13d | ||
|
50e23e5f81 | ||
|
59eeb2c5d4 | ||
|
7ea4dbe6cb | ||
|
0d062c24fa | ||
|
95b6771811 | ||
|
ed46cbb147 | ||
|
14ba135169 | ||
|
2a2b7d8bd6 | ||
|
055b4e7102 | ||
|
00d6efc315 | ||
|
985b6c08d2 | ||
|
1f55097bdd | ||
|
136584d086 | ||
|
225ea9b451 | ||
|
d341ce499e | ||
|
e7376e28c4 | ||
|
e238eaa473 | ||
|
1ac5a6f6cb | ||
|
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 | ||
|
046c475e18 | ||
|
4138ed438e |
237
CHANGELOG.md
@@ -3,6 +3,243 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
## [v20.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v19.21.0...v20.0.0 "diff with v19.21.0")
|
||||
* 2022-02-23 [`f8d17c6`](https://github.com/nophead/NopSCADlib/commit/f8d17c6f1615b9ff9b615ad2947c4b0119bf7597 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2022-02-22 [`662db2b`](https://github.com/nophead/NopSCADlib/commit/662db2bd4103dbeb4265c148d5f7e31c98d5dae2 "show commit") [M.B.](# "Martin Budden") Improved stepper motor naming convention.
|
||||
|
||||
### [v19.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.20.0...v19.21.0 "diff with v19.20.0")
|
||||
* 2022-02-23 [`42fccc1`](https://github.com/nophead/NopSCADlib/commit/42fccc1afbf28ef6a94f0480d1306e5bc2e48e46 "show commit") [C.P.](# "Chris Palmer") Added `bezier_join()`.
|
||||
Moved `path_length()` from `sweep.scad` to `maths.scad`.
|
||||
|
||||
### [v19.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.9.1...v19.20.0 "diff with v19.9.1")
|
||||
* 2022-02-15 [`0e2778e`](https://github.com/nophead/NopSCADlib/commit/0e2778e13de2e68fc21a7b4c706aada27a17842c "show commit") [C.P.](# "Chris Palmer") Cables can now have a list of wire colours.
|
||||
Added a constructor for cables.
|
||||
|
||||
* 2022-02-15 [`50e23e5`](https://github.com/nophead/NopSCADlib/commit/50e23e5f818077e3661e25852dc959c34e6c8b4a "show commit") [C.P.](# "Chris Palmer") Added silkscreen text to PCBs.
|
||||
|
||||
#### [v19.9.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.9.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.9.0...v19.9.1 "diff with v19.9.0")
|
||||
* 2022-02-15 [`59eeb2c`](https://github.com/nophead/NopSCADlib/commit/59eeb2c5d4c7cf9da1f219c2b01fabcf450085f3 "show commit") [C.P.](# "Chris Palmer") Trimmed the ribbon clamp tape.
|
||||
|
||||
* 2022-02-15 [`7ea4dbe`](https://github.com/nophead/NopSCADlib/commit/7ea4dbe6cbbc23256d23f7aea87e8aac8d1000a9 "show commit") [C.P.](# "Chris Palmer") Fixed double application of `r2sides()` in `rounded_path()`.
|
||||
Added check for radius too big for corner in `rounded_path()`.
|
||||
Spiral paths can now have 0 twists.
|
||||
|
||||
### [v19.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.8.1...v19.9.0 "diff with v19.8.1")
|
||||
* 2022-02-11 [`95b6771`](https://github.com/nophead/NopSCADlib/commit/95b6771811fd48af46b5c2d426c42c04cd8e5af3 "show commit") [C.P.](# "Chris Palmer") Added printed cable clips.
|
||||
|
||||
* 2022-02-11 [`ed46cbb`](https://github.com/nophead/NopSCADlib/commit/ed46cbb1470587d4fa3ee4e0e8e0513c82693b1b "show commit") [C.P.](# "Chris Palmer") Fixed `cable_bundle()` bugs and added test.
|
||||
Added `cable_bundle_positions()`.
|
||||
Can now mark cables as ribbon to force a flat layout.
|
||||
|
||||
#### [v19.8.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.8.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.8.0...v19.8.1 "diff with v19.8.0")
|
||||
* 2022-02-09 [`2a2b7d8`](https://github.com/nophead/NopSCADlib/commit/2a2b7d8bd60f0ea8ad2c428593e7aea1dfa06e9c "show commit") [C.P.](# "Chris Palmer") Added a second example project.
|
||||
|
||||
### [v19.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.7.0...v19.8.0 "diff with v19.7.0")
|
||||
* 2022-02-09 [`055b4e7`](https://github.com/nophead/NopSCADlib/commit/055b4e7102ffcc39dc376330636efa79739a6555 "show commit") [C.P.](# "Chris Palmer") Added SOT23 and SOT223 SMD packages.
|
||||
`smd_capacitors` can now have a value.
|
||||
Wire links can now have zero length to create a vertical wire.
|
||||
|
||||
* 2022-02-09 [`00d6efc`](https://github.com/nophead/NopSCADlib/commit/00d6efc3154bbd5597a3336bc8bdaf550e42f56a "show commit") [C.P.](# "Chris Palmer") Added veroboard constructor.
|
||||
Documented `solder_meniscus` and made it parametric.
|
||||
|
||||
### [v19.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.6.0...v19.7.0 "diff with v19.6.0")
|
||||
* 2022-02-08 [`1f55097`](https://github.com/nophead/NopSCADlib/commit/1f55097bdd3e4d0164a48dd7ebb3fc5370250ac4 "show commit") [C.P.](# "Chris Palmer") Support for twisted cables.
|
||||
Sweep now distbutes twists in proportion to segments lengths.
|
||||
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: 982 KiB |
73
libtest.scad
@@ -51,6 +51,7 @@ use <tests/blowers.scad>
|
||||
use <tests/box_sections.scad>
|
||||
use <tests/bulldogs.scad>
|
||||
use <tests/buttons.scad>
|
||||
use <tests/cable_clip.scad>
|
||||
use <tests/cable_strips.scad>
|
||||
use <tests/cameras.scad>
|
||||
use <tests/camera_housing.scad>
|
||||
@@ -123,6 +124,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>
|
||||
@@ -153,19 +155,46 @@ translate([x5 + 50, cable_grommets_y])
|
||||
translate([x5 + 95, cable_grommets_y])
|
||||
press_fits();
|
||||
|
||||
translate([x5, cable_grommets_y + 60])
|
||||
fixing_blocks_y = cable_grommets_y + 60;
|
||||
translate([x5, fixing_blocks_y])
|
||||
fixing_blocks();
|
||||
|
||||
translate([x5, cable_grommets_y + 90])
|
||||
corner_blocks_y = fixing_blocks_y + 30;
|
||||
translate([x5, corner_blocks_y])
|
||||
corner_blocks();
|
||||
|
||||
translate([x5, cable_grommets_y + 150])
|
||||
feet_y = corner_blocks_y + 70;
|
||||
translate([x5, feet_y])
|
||||
feet();
|
||||
|
||||
translate([x5 + 70, cable_grommets_y + 150])
|
||||
translate([x5 + 70, feet_y])
|
||||
screw_knobs();
|
||||
|
||||
translate([x5, cable_grommets_y + 470]) {
|
||||
knobs_y = feet_y + 40;
|
||||
translate([640, knobs_y])
|
||||
printed_pulley_test();
|
||||
|
||||
translate([x5, knobs_y])
|
||||
knobs();
|
||||
|
||||
clips_y = knobs_y + 50;
|
||||
translate([x5, clips_y])
|
||||
cable_clips();
|
||||
|
||||
strap_y = clips_y + 50;
|
||||
translate([x5 + 60, strap_y])
|
||||
strap_handles();
|
||||
|
||||
handle_y = strap_y + 50;
|
||||
translate([x5, handle_y])
|
||||
handle();
|
||||
|
||||
pocket_y = handle_y + 70;
|
||||
translate([x5 + 65, pocket_y])
|
||||
pocket_handles();
|
||||
|
||||
hinge_y = pocket_y + 100;
|
||||
translate([x5, hinge_y]) {
|
||||
door_hinges()
|
||||
door_latches();
|
||||
|
||||
@@ -173,29 +202,18 @@ translate([x5, cable_grommets_y + 470]) {
|
||||
flat_hinges();
|
||||
}
|
||||
|
||||
translate([x5, cable_grommets_y + 370])
|
||||
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])
|
||||
handle();
|
||||
|
||||
translate([950, 600])
|
||||
box_test();
|
||||
|
||||
translate([900, 750])
|
||||
pocket_handles();
|
||||
|
||||
translate([900, 850])
|
||||
pbox_y = hinge_y + 70;
|
||||
translate([900, pbox_y])
|
||||
printed_boxes();
|
||||
|
||||
translate([850, 1330 + 85])
|
||||
bbox_test();
|
||||
box_y = pbox_y + 150;
|
||||
translate([950, box_y])
|
||||
box_test();
|
||||
|
||||
|
||||
translate([950, 1400])
|
||||
rotate(-90)
|
||||
bbox_test();
|
||||
|
||||
inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
@@ -422,6 +440,9 @@ translate([x2, extrusions_y])
|
||||
translate([400, transformers_y])
|
||||
transformers();
|
||||
|
||||
translate([x4 + 50, transformers_y])
|
||||
no_explode() socket_boxes();
|
||||
|
||||
|
||||
belts_y = 0;
|
||||
rails_y = belts_y + 200;
|
||||
|
@@ -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])
|
||||
|
117
printed/cable_clip.scad
Normal file
@@ -0,0 +1,117 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2022
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Cable clips to order. Can be for one or two cables of different sizes.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
use <../utils/fillet.scad>
|
||||
|
||||
wall = 2;
|
||||
|
||||
function cable_clip_width(screw) = max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw))); //! Width given the `screw`.
|
||||
function cable_clip_height(cable) = cable_height(cable) + wall; //! Height given the `cable`.
|
||||
function cable_clip_extent(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) + wall; //! How far it extends from the screw.
|
||||
function cable_clip_offset(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) / 2; //! The offset of the cable from the screw
|
||||
|
||||
module single_cable_clip(screw, cable, h = 0) {
|
||||
screw_dia = 2 * screw_clearance_radius(screw);
|
||||
height = cable_clip_width(screw);
|
||||
depth = h ? h : cable_height(cable) + wall;
|
||||
w = cable_width(cable);
|
||||
width = wall + w + wall + screw_dia + wall;
|
||||
hole_x = wall + w + wall + screw_dia / 2;
|
||||
rad = min(wall + cable_wire_size(cable) / 2, depth / 2);
|
||||
r = extrusion_width - eps;
|
||||
translate([-hole_x, 0]) difference() {
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
hull() {
|
||||
rounded_square([width, 1], r, center = false);
|
||||
|
||||
translate([width - 1, 0])
|
||||
rounded_square([1, depth], r, center = false);
|
||||
|
||||
translate([rad, depth - rad])
|
||||
circle(r = rad);
|
||||
}
|
||||
|
||||
translate([wall + cable_width(cable) / 2, 0]) {
|
||||
hull() {
|
||||
for(p = cable_bundle_positions(cable))
|
||||
translate(p)
|
||||
circle(d = cable_wire_size(cable));
|
||||
|
||||
square([w, eps], center = true);
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
translate([side * w / 2, 0])
|
||||
hflip(side < 0)
|
||||
fillet(r = r, h = 0);
|
||||
}
|
||||
}
|
||||
|
||||
translate([hole_x, depth / 2, height / 2])
|
||||
rotate([90,0,0])
|
||||
teardrop_plus(h = depth + 1, r = screw_dia / 2, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module double_cable_clip(screw, cable1, cable2) {
|
||||
h = max(cable_clip_height(cable1), cable_clip_height(cable2));
|
||||
union() {
|
||||
single_cable_clip(screw, cable1, h);
|
||||
|
||||
mirror([1,0,0]) single_cable_clip(screw, cable2, h);
|
||||
}
|
||||
}
|
||||
|
||||
module cable_clip(screw, cable1, cable2 = 0) { //! Create the STL for a single cable or two cable clip
|
||||
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20);
|
||||
function cable_str(cable) = str("_", cable_wires(cable), "_", round(cable_wire_size(cable) * 10));
|
||||
|
||||
if(cable2) {
|
||||
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)));
|
||||
|
||||
double_cable_clip(screw, cable1, cable2);
|
||||
}
|
||||
else {
|
||||
stl(str(clip_str(screw), cable_str(cable1)));
|
||||
|
||||
single_cable_clip(screw, cable1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0) { //! Cable clip with the fasteners
|
||||
height = max(cable_clip_height(cable1), cable2 ? cable_clip_height(cable2) : 0);
|
||||
|
||||
stl_colour(pp1_colour) render()
|
||||
translate([0, cable_clip_width(screw) / 2]) rotate([90, 0, 0])
|
||||
cable_clip(screw, cable1, cable2);
|
||||
|
||||
translate_z(height)
|
||||
screw_and_washer(screw, screw_length(screw, height + thickness, 2, nyloc = true));
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
nut_and_washer(screw_nut(screw), true);
|
||||
}
|
@@ -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()
|
||||
@@ -97,7 +105,7 @@ assembly(let(screw_d = screw_radius(screw) * 2)str("ribbon_clamp_", ways, screw_
|
||||
|
||||
module ribbon_clamp_fastened_assembly(ways, thickness, screw = screw) { //! Clamp with fasteners in place
|
||||
tape_l = floor(ribbon_clamp_slot(ways));
|
||||
tape_width = 25;
|
||||
tape_width = ribbon_clamp_width(screw) + 2;
|
||||
tape_thickness = 0.5;
|
||||
|
||||
vitamin(str(": Tape self amalgamating silicone ",tape_l," x 25mm"));
|
||||
|
484
readme.md
@@ -23,36 +23,40 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
<th align="left"> Vitamins A-H </th><th align="left"> Vitamins I-Q </th><th align="left"> Vitamins R-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
|
||||
<tr><td> <a href = "#7_segments">7_segments</a> </td><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#BOM">BOM</a> </td></tr>
|
||||
<tr><td> <a href = "#Axials">Axials</a> </td><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#BLDC_motors">BLDC_motors</a> </td><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Catenary">Catenary</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Camera_housing">Camera_housing</a> </td><td> <a href = "#Core_xy">Core_xy</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LED_meters">LED_meters</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Box_sections">Box_sections</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Servo_motors">Servo_motors</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#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 = "#BLDC_motors">BLDC_motors</a> </td><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_clip">Cable_clip</a> </td><td> <a href = "#Catenary">Catenary</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Core_xy">Core_xy</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LED_meters">LED_meters</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Camera_housing">Camera_housing</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Box_sections">Box_sections</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Servo_motors">Servo_motors</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#Knob">Knob</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td></td><td></td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
<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 +67,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 +109,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 +124,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 +151,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 +174,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 +366,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 +452,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 +655,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 +692,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 +700,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 +890,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 +1474,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 +1547,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 +1901,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 +1915,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 +1976,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 +2409,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 +2417,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 +2443,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 +2461,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 +2562,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 +2587,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 +2611,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 +2622,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 +2642,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 +2692,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 +2853,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 +2887,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 +2901,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 +3639,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 +3657,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 +3675,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 +3891,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 |
|
||||
|
||||

|
||||
|
||||
@@ -3851,15 +3900,15 @@ NEMA stepper motor model.
|
||||
| ---:|:--- |:---|
|
||||
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
|
||||
| 20 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
|
||||
| 1 | `NEMA(NEMA14)` | Stepper motor NEMA14 x 36mm |
|
||||
| 1 | `NEMA(NEMA16)` | Stepper motor NEMA16 x 19.2mm |
|
||||
| 1 | `NEMA(NEMA17P)` | Stepper motor NEMA17 x 26.5mm |
|
||||
| 1 | `NEMA(NEMA17S)` | Stepper motor NEMA17 x 34mm |
|
||||
| 1 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
|
||||
| 1 | `NEMA(NEMA17)` | Stepper motor NEMA17 x 47mm |
|
||||
| 1 | `NEMA(NEMA23)` | Stepper motor NEMA22 x 51.2mm |
|
||||
| 1 | `NEMA(NEMA8)` | Stepper motor NEMA8 x 30mm |
|
||||
| 1 | `NEMA(NEMA8BH)` | Stepper motor NEMA8 x 30mm |
|
||||
| 1 | `NEMA(NEMA14_36)` | Stepper motor NEMA14 x 36mm |
|
||||
| 1 | `NEMA(NEMA16_19)` | Stepper motor NEMA16 x 19.2mm |
|
||||
| 1 | `NEMA(NEMA17_27)` | Stepper motor NEMA17 x 26.5mm |
|
||||
| 1 | `NEMA(NEMA17_34)` | Stepper motor NEMA17 x 34mm |
|
||||
| 1 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm |
|
||||
| 1 | `NEMA(NEMA17_47)` | Stepper motor NEMA17 x 47mm |
|
||||
| 1 | `NEMA(NEMA23_51)` | Stepper motor NEMA22 x 51.2mm |
|
||||
| 1 | `NEMA(NEMA8_30)` | Stepper motor NEMA8 x 30mm |
|
||||
| 1 | `NEMA(NEMA8_30BH)` | Stepper motor NEMA8 x 30mm |
|
||||
| 16 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 20 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
|
||||
@@ -3912,6 +3961,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 +4131,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 +4242,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 +4253,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 |
|
||||
@@ -4305,13 +4391,17 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable(wires, size, colours, ribbon = false)` | Cable constructor |
|
||||
| `cable_bundle(cable)` | Arrangement of a bundle in a flat cable clip |
|
||||
| `cable_bundle_positions(cable)` | Positions of wires in a bundle to go through a cable strip |
|
||||
| `cable_height(cable)` | Height in flat clip |
|
||||
| `cable_is_ribbon(cable)` | Is a ribbon cable? |
|
||||
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
||||
| `cable_width(cable)` | Width in flat clip |
|
||||
| `cable_wire_colours(cable)` | Individual wire colours |
|
||||
| `cable_wire_size(cable)` | Size of each wire in a bundle |
|
||||
| `cable_wires(cable)` | Number of wires in a 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 +4482,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 +4497,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 +4508,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 +4600,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 +4618,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 +4653,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 +4686,52 @@ 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>
|
||||
|
||||
---
|
||||
<a name="Cable_clip"></a>
|
||||
## Cable_clip
|
||||
Cable clips to order. Can be for one or two cables of different sizes.
|
||||
|
||||
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
|
||||
|
||||
[tests/cable_clip.scad](tests/cable_clip.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip_extent(screw, cable)` | How far it extends from the screw. |
|
||||
| `cable_clip_height(cable)` | Height given the `cable`. |
|
||||
| `cable_clip_offset(screw, cable)` | The offset of the cable from the screw |
|
||||
| `cable_clip_width(screw)` | Width given the `screw`. |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip(screw, cable1, cable2 = 0)` | Create the STL for a single cable or two cable clip |
|
||||
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0)` | Cable clip with the fasteners |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 5 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||
| 3 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||
| 10 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | cable_clip_30_10_13.stl |
|
||||
| 1 | cable_clip_30_1_14_2_14.stl |
|
||||
| 1 | cable_clip_30_1_60.stl |
|
||||
| 1 | cable_clip_30_3_14_4_14.stl |
|
||||
| 1 | cable_clip_30_5_14_6_14.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4603,6 +4746,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 +4768,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 +4889,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 +4899,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 +4913,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 +4931,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 +4963,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 +5091,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 +5104,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 +5442,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 +5845,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 +5857,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 |
|
||||
|
||||
@@ -5886,6 +6130,10 @@ Annotation used in this documentation
|
||||
## Bezier
|
||||
Bezier curves and function to get and adjust the length or minimum z point.
|
||||
|
||||
`bezier_join()` joins two paths with a Bezier curve that starts tangential to the end of `path1` and ends tangential to the end of `path2`.
|
||||
To do this the outer control points are the path ends and the inner two control points are along the tangents to the path ends.
|
||||
The only degree of freedom is how far along those tangents, which are the `d` and optional `d2` parameters.
|
||||
|
||||
[utils/bezier.scad](utils/bezier.scad) Implementation.
|
||||
|
||||
[tests/bezier.scad](tests/bezier.scad) Code for this example.
|
||||
@@ -5896,6 +6144,7 @@ Bezier curves and function to get and adjust the length or minimum z point.
|
||||
| `adjust_bezier_length(v, l, eps = 0.001, r1 = 1.0, r2 = 1.5, l1, l2)` | Adjust Bezier control points `v` to get the required curve length `l` |
|
||||
| `adjust_bezier_z(v, z, eps = 0.001, r1 = 1, r2 = 1.5, z1, z2)` | Adjust Bezier control points `v` to get the required minimum `z` |
|
||||
| `bezier(t, v)` | Returns a point at distance `t` [0 - 1] along the curve with control points `v` |
|
||||
| `bezier_join(path1, path2, d, d2 = undef)` | Join two paths with a Bezier curve, control points are the path ends are `d` and `d2` from the ends in the same direction. |
|
||||
| `bezier_length(v, delta = 0.01, t = 0, length = 0)` | Calculate the length of a Bezier curve from control points `v` |
|
||||
| `bezier_min_z(v, steps = 100, z = inf, i = 0)` | Calculate the minimum z coordinate of a Bezier curve from control points `v` |
|
||||
| `bezier_path(v, steps = 100)` | Returns a Bezier path from control points `v` with `steps` segments |
|
||||
@@ -5977,9 +6226,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,13 +6236,13 @@ 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 |
|
||||
| 8 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
||||
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||
| 2 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
|
||||
| 2 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -6186,6 +6435,7 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `map(v, func)` | make a new vector where the func function argument is applied to each element of the vector v |
|
||||
| `mapi(v, func)` | make a new vector where the func function argument is applied to each element of the vector v. The func will get the index number as first argument, and the element as second argument. |
|
||||
| `nearly_zero(x)` | True if x is close to zero |
|
||||
| `path_length(path, i = 0, length = 0)` | Calculated the length along a path |
|
||||
| `quadratic_real_roots(a, b, c)` | Returns real roots of a quadratic equation, biggest first. Returns empty list if no real roots |
|
||||
| `radians(degrees)` | Convert radians to degrees |
|
||||
| `reduce(v, func, unity)` | reduce a vector v to a single entity by applying the func function recursively to the reduced value so far and the next element, starting with unity as the initial reduced value |
|
||||
@@ -6387,6 +6637,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.
|
||||
@@ -6400,14 +6656,18 @@ An additional twist around the path can be specified. If the path is closed this
|
||||
| `cap(facets, segment = 0, end)` | Create the mesh for an end cap |
|
||||
| `circle_points(r = 1, z = 0, dir = -1)` | Generate the points of a circle, setting z makes a single turn spiral |
|
||||
| `helical_twist_per_segment(r, pitch, sides)` | Calculate the twist around Z that rotate_from_to() introduces |
|
||||
| `path_length(path, i = 0, length = 0)` | Calculated the length along a path |
|
||||
| `rectangle_points(w, h)` | Generate the points of a rectangle |
|
||||
| `rounded_path(path)` | Convert a rounded_path, consisting of a start coordinate, vertex / radius pairs and then an end coordinate, to a path of points for sweep. |
|
||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||
| `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" ],
|
||||
@@ -87,6 +89,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 8, 155, 180, "usb_B"],
|
||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 218, 0, "buzzer"],
|
||||
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
||||
[ 8, 190, 180, "jack"],
|
||||
[ 6, 200, 180, "barrel_jack"],
|
||||
[ 5, 218, 180, "hdmi"],
|
||||
@@ -99,6 +102,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();
|
||||
|
@@ -77,6 +77,17 @@ module beziers() {
|
||||
|
||||
translate(control_points[1] - [0, 0, 2])
|
||||
label(str("bezier_length = ", length, ", bezier_min_z = ", bezier_min_z(curve)), valign = "top");
|
||||
|
||||
path1 = [[20, 20, 0], [40, 20, 0]];
|
||||
path2 = [[70, 40, -5], [60, 40, 0]];
|
||||
|
||||
color("green")
|
||||
for(p = concat(path1, path2))
|
||||
translate(p)
|
||||
sphere(1);
|
||||
|
||||
color("orange")
|
||||
sweep(bezier_join(path1, path2, 10), circle_points(0.5, $fn = 64));
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -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);
|
||||
|
||||
|
59
tests/cable_clip.scad
Normal file
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2022
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
include <../core.scad>
|
||||
use <../printed/cable_clip.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
|
||||
|
||||
sheet_thickness = 3;
|
||||
|
||||
cables = [
|
||||
for(i = [1 : 6]) [i, 1.4], [1, 6], 0, [10, inch(0.05), true], 0
|
||||
];
|
||||
|
||||
screw = M3_dome_screw;
|
||||
|
||||
|
||||
module cable_clips() {
|
||||
for(i = [0 : ceil(len(cables) / 2) - 1])
|
||||
translate([i * 25, 0]) {
|
||||
cable1 = cables[2 * i];
|
||||
cable2 = cables[2 * i + 1];
|
||||
|
||||
if($preview) {
|
||||
cable_clip_assembly(screw, sheet_thickness, cable1, cable2);
|
||||
|
||||
for(j = [0 : 1])
|
||||
let(cable = cables[2 * i + j])
|
||||
if(cable)
|
||||
let(positions = cable_bundle_positions(cable))
|
||||
for(i = [0 : len(positions) - 1])
|
||||
let(p = positions[i])
|
||||
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable), 0, p.y])
|
||||
rotate([90, 0, 0])
|
||||
color([grey(20), "blue", "red", "orange", "yellow", "green", "brown", "purple", "grey", "white"][i])
|
||||
cylinder(d = cable_wire_size(cable), h = 30, center = true);
|
||||
}
|
||||
else
|
||||
cable_clip(screw, cable1, cable2);
|
||||
}
|
||||
}
|
||||
|
||||
cable_clips();
|
@@ -30,44 +30,47 @@ 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);
|
||||
|
||||
|
||||
translate([coreXYPosBL.x + separation.x/2, coreXYPosTR.y + upper_drive_pulley_offset.y, separation.z/2]) {
|
||||
// add the upper drive pulley stepper motor
|
||||
translate([coreXY_drive_pulley_x_alignment(coreXY_type) + upper_drive_pulley_offset.x, 0, -pulley_height(coreXY_drive_pulley(coreXY_type))])
|
||||
NEMA(NEMA17M);
|
||||
NEMA(NEMA17_40);
|
||||
|
||||
// add the screws for the upper drive offset idler pulleys if required
|
||||
if (upper_drive_pulley_offset.x > 0) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -75,22 +78,22 @@ module coreXY_belts_test() {
|
||||
translate([coreXYPosTR.x - separation.x/2, coreXYPosTR.y + lower_drive_pulley_offset.y, -separation.z/2]) {
|
||||
// add the lower drive pulley stepper motor
|
||||
translate([-coreXY_drive_pulley_x_alignment(coreXY_type) + lower_drive_pulley_offset.x, 0, -pulley_height(coreXY_drive_pulley(coreXY_type))])
|
||||
NEMA(NEMA17M);
|
||||
NEMA(NEMA17_40);
|
||||
|
||||
// add the screws for the lower drive offset idler pulleys if required
|
||||
if (lower_drive_pulley_offset.x < 0) {
|
||||
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: 84 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 142 KiB |