Compare commits
98 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
9a4cc7ec42 | ||
|
2fb1185edf | ||
|
a782d43e67 | ||
|
ae934d47c7 | ||
|
823f3b936e | ||
|
3027b942a6 | ||
|
749a1f0648 | ||
|
5c898df217 | ||
|
7a566cc856 | ||
|
20d799a3c1 | ||
|
2ee95bba65 | ||
|
f49bb63266 | ||
|
258109811b | ||
|
b39fd536c2 | ||
|
a5a87d260d | ||
|
b09efb10e0 | ||
|
53acaac379 | ||
|
9b40e0dcef | ||
|
00ca412441 | ||
|
1e6d7f5dd6 | ||
|
ec07d95657 | ||
|
0dab0dca08 | ||
|
6e6cd45295 | ||
|
3a7fde6c56 | ||
|
c5bb898856 | ||
|
11ebe2225d | ||
|
a1e25bb878 | ||
|
9689683b7e | ||
|
08946e3d70 | ||
|
15c2946e91 | ||
|
34019196cd | ||
|
436fc71cf3 | ||
|
fd67c166f7 | ||
|
634deab911 | ||
|
e2feceb608 | ||
|
d1258e0b0c | ||
|
bd61a1dc55 | ||
|
055e83902f | ||
|
feec1e7ae5 | ||
|
be76af2fc4 | ||
|
9c1a9bf357 | ||
|
9647fb474b | ||
|
49fdfea792 | ||
|
ac0bacfeda | ||
|
6288059d99 | ||
|
0f1dff230a | ||
|
e379fa8ada | ||
|
313d7508df | ||
|
083caca4e8 | ||
|
49329df00c | ||
|
edc0b86bb1 | ||
|
5fbff060b0 | ||
|
b94ca4ad3a | ||
|
bc5515d35e | ||
|
44d213deaa | ||
|
145c5d9b1a | ||
|
7abbbd9b96 | ||
|
5b160cee88 | ||
|
3f31607840 | ||
|
1efed649cf | ||
|
b70c2f993c | ||
|
56e252f3dc | ||
|
f12b36ea04 | ||
|
bd5811e69b | ||
|
ede4da6f1d | ||
|
51cc2fd679 | ||
|
4ce2f53e20 | ||
|
e338c47e73 | ||
|
8328a70f42 | ||
|
cc794cd7c3 | ||
|
df28bd5116 | ||
|
61de6041d8 | ||
|
b2d712bca9 | ||
|
f3376edaf1 | ||
|
c073419c0b | ||
|
608168de8e | ||
|
fc45a40bd3 | ||
|
52e9c1d7fd | ||
|
ca1b34e9ca | ||
|
cbab9cea02 | ||
|
69cf998862 | ||
|
08bce9ec03 | ||
|
4aa7dbb416 | ||
|
7c7c2e5d3f | ||
|
f6f6664c0d | ||
|
2fd2e118a0 | ||
|
22c6fef113 | ||
|
dcf0c949b9 | ||
|
9ded315801 | ||
|
42e03679b4 | ||
|
d2c795f5f5 | ||
|
83b4ab2374 | ||
|
573c50774b | ||
|
4b93623492 | ||
|
d496898c80 | ||
|
544e69c71b | ||
|
240334784d | ||
|
516b225275 |
147
CHANGELOG.md
@@ -3,6 +3,151 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v15.16.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.16.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.15.0...v15.16.0 "diff with v15.15.0")
|
||||
* 2021-06-04 [`a782d43`](https://github.com/nophead/NopSCADlib/commit/a782d43e67f4091f44bd9018817e7263e2944477 "show commit") [C.P.](# "Chris Palmer") `bom.py` now generates `bom.csv` to allow costed BOMs to be made using a spreadsheet.
|
||||
|
||||
### [v15.15.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.15.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.14.2...v15.15.0 "diff with v15.14.2")
|
||||
* 2021-06-03 [`823f3b9`](https://github.com/nophead/NopSCADlib/commit/823f3b936e6c33897445d3f3272b69237f013537 "show commit") [C.P.](# "Chris Palmer") Add the ability to have a target specific top level module in place of `main_assembly()`.
|
||||
|
||||
#### [v15.14.2](https://github.com/nophead/NopSCADlib/releases/tag/v15.14.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.14.1...v15.14.2 "diff with v15.14.1")
|
||||
* 2021-06-02 [`749a1f0`](https://github.com/nophead/NopSCADlib/commit/749a1f0648196bd0ae47dbe93ac1b5e3a06d78cd "show commit") [C.P.](# "Chris Palmer") Fixed male thread z-fighting bug.
|
||||
|
||||
* 2021-06-01 [`5c898df`](https://github.com/nophead/NopSCADlib/commit/5c898df2172a7e202c9e3d8c6641a0aaf95e5d48 "show commit") [C.P.](# "Chris Palmer") More readable code in `rounded_polygon`.
|
||||
|
||||
#### [v15.14.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.14.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.14.0...v15.14.1 "diff with v15.14.0")
|
||||
* 2021-06-01 [`20d799a`](https://github.com/nophead/NopSCADlib/commit/20d799a3c115d3d32f101c4419d6e9b57c3be8c7 "show commit") [C.P.](# "Chris Palmer") `IEC_320_C14_switched_fused_inlet` now shows the correct object name in the example.
|
||||
|
||||
### [v15.14.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.14.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.13.4...v15.14.0 "diff with v15.13.4")
|
||||
* 2021-05-31 [`2581098`](https://github.com/nophead/NopSCADlib/commit/258109811b7b7f71895340dc4b86b96d7dbc2037 "show commit") [C.P.](# "Chris Palmer") Added uppercase version of `BLCD_motors.scad`.
|
||||
|
||||
* 2021-05-31 [`b39fd53`](https://github.com/nophead/NopSCADlib/commit/b39fd536c2841a95ab50b8a196e21ee8fc5976d1 "show commit") [C.P.](# "Chris Palmer") Removed lower case version of `bldc_motors.scad`.
|
||||
|
||||
* 2021-05-31 [`a5a87d2`](https://github.com/nophead/NopSCADlib/commit/a5a87d260dd4bbe40a8727a4099207271918d02b "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2021-05-30 [`00ca412`](https://github.com/nophead/NopSCADlib/commit/00ca412441c85ea1fd7082453c823445fbbdce4e "show commit") [M.B.](# "Martin Budden") Added BLDC3548 motor.
|
||||
|
||||
* 2021-05-30 [`1e6d7f5`](https://github.com/nophead/NopSCADlib/commit/1e6d7f5dd68e64181aef019bb8bca186abb2ac68 "show commit") [M.B.](# "Martin Budden") Brushless DC motors.
|
||||
|
||||
#### [v15.13.4](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.4 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.3...v15.13.4 "diff with v15.13.3")
|
||||
* 2021-05-30 [`ec07d95`](https://github.com/nophead/NopSCADlib/commit/ec07d95657d52aab375b3b2acb95c87b369d2194 "show commit") [M.B.](# "Martin Budden") Added assertion to check colour format in module thread.
|
||||
|
||||
#### [v15.13.3](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.3 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.2...v15.13.3 "diff with v15.13.2")
|
||||
* 2021-05-19 [`0dab0dc`](https://github.com/nophead/NopSCADlib/commit/0dab0dca08485d1717ee516a61831fcd6963e335 "show commit") [C.P.](# "Chris Palmer") Added missing includes `core.scad` which generates warnings with latest OpenSCAD snapshots.
|
||||
|
||||
* Note, however, NopSCADlib does not work with the current OpenSCAD snapshot.
|
||||
|
||||
#### [v15.13.2](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.1...v15.13.2 "diff with v15.13.1")
|
||||
* 2021-05-15 [`9689683`](https://github.com/nophead/NopSCADlib/commit/9689683b7efbde882c057a903dd7fa018107d029 "show commit") [M.B.](# "Martin Budden") Typo in `global_defs`.
|
||||
|
||||
#### [v15.13.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.0...v15.13.1 "diff with v15.13.0")
|
||||
* 2021-05-18 [`11ebe22`](https://github.com/nophead/NopSCADlib/commit/11ebe2225db09bdd45089e4ebf5c1037243bf45c "show commit") [C.P.](# "Chris Palmer") Removed spurious convexity in difference from `rounded_polygon()`.
|
||||
|
||||
### [v15.13.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.12.0...v15.13.0 "diff with v15.12.0")
|
||||
* 2021-05-02 [`3401919`](https://github.com/nophead/NopSCADlib/commit/34019196cdac6b08e57d773e138a22394b609ea5 "show commit") [C.P.](# "Chris Palmer") Updated readme
|
||||
|
||||
* 2021-05-02 [`436fc71`](https://github.com/nophead/NopSCADlib/commit/436fc71cf319c1e71b6cbd240b76d7cad5ecd8ba "show commit") [M.B.](# "Martin Budden") Added `blower_size` function.
|
||||
|
||||
### [v15.12.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.12.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.11.1...v15.12.0 "diff with v15.11.1")
|
||||
* 2021-04-26 [`e2feceb`](https://github.com/nophead/NopSCADlib/commit/e2feceb608b4491424c0e4c1e7c191f7d8aeceec "show commit") [C.P.](# "Chris Palmer") Updated readme
|
||||
|
||||
* 2021-04-25 [`9c1a9bf`](https://github.com/nophead/NopSCADlib/commit/9c1a9bf3572c07a57b5bd1fde1d9a4aba14e5ea8 "show commit") [M.B.](# "Martin Budden") Add facility to orient `core_xy` with left motor being lower or upper motor.
|
||||
|
||||
#### [v15.11.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.11.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.11.0...v15.11.1 "diff with v15.11.0")
|
||||
* 2021-04-25 [`feec1e7`](https://github.com/nophead/NopSCADlib/commit/feec1e7ae5a5217586e0ab9e7b002e8af8f7c749 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-04-25 [`be76af2`](https://github.com/nophead/NopSCADlib/commit/be76af2fc490e10e4dd115a56019e33005f87db9 "show commit") [M.B.](# "Martin Budden") Fixed typo in `leadnut.scad`.
|
||||
|
||||
### [v15.11.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.11.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.10.1...v15.11.0 "diff with v15.10.1")
|
||||
* 2021-04-25 [`49fdfea`](https://github.com/nophead/NopSCADlib/commit/49fdfea7926d677b6e0a9eee2fbd928f2935e1eb "show commit") [C.P.](# "Chris Palmer") Added 35BYGHJ75 geared stepper.
|
||||
|
||||
#### [v15.10.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.10.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.10.0...v15.10.1 "diff with v15.10.0")
|
||||
* 2021-04-25 [`ac0bacf`](https://github.com/nophead/NopSCADlib/commit/ac0bacfeda43af62256e7bd3184df695b3e01d37 "show commit") [C.P.](# "Chris Palmer") Removed echo in rails test.
|
||||
|
||||
### [v15.10.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.10.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.9.0...v15.10.0 "diff with v15.9.0")
|
||||
* 2021-04-13 [`e379fa8`](https://github.com/nophead/NopSCADlib/commit/e379fa8ada4a4089fc24ce5fc2c140a2531e2e95 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-04-13 [`5fbff06`](https://github.com/nophead/NopSCADlib/commit/5fbff060b019a983eba93eb8c5b16adfb6a3f7ee "show commit") [M.B.](# "Martin Budden") Added a `pcb_component` function.
|
||||
|
||||
### [v15.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.8.0...v15.9.0 "diff with v15.8.0")
|
||||
* 2021-04-13 [`edc0b86`](https://github.com/nophead/NopSCADlib/commit/edc0b86bb1cd52e90fe353c4aea9539e95aa5aee "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2021-03-31 [`b70c2f9`](https://github.com/nophead/NopSCADlib/commit/b70c2f993c351bf71da57cfc169ed02a235cf4f3 "show commit") [M.B.](# "Martin Budden") Added box sections.
|
||||
|
||||
### [v15.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.7.0...v15.8.0 "diff with v15.7.0")
|
||||
* 2021-04-12 [`145c5d9`](https://github.com/nophead/NopSCADlib/commit/145c5d9b1a7c873940abf266a321edabdff3b7a0 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-04-12 [`1efed64`](https://github.com/nophead/NopSCADlib/commit/1efed649cf54607b9d39d4b7f422dd385ccb441f "show commit") [M.B.](# "Martin Budden") Added PSU size function.
|
||||
|
||||
### [v15.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.6.1...v15.7.0 "diff with v15.6.1")
|
||||
* 2021-04-12 [`3f31607`](https://github.com/nophead/NopSCADlib/commit/3f31607840d162f63d12eb2317d2f28af1ecf492 "show commit") [C.P.](# "Chris Palmer") Added No8 screws.
|
||||
|
||||
#### [v15.6.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.6.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.6.0...v15.6.1 "diff with v15.6.0")
|
||||
* 2021-04-05 [`f12b36e`](https://github.com/nophead/NopSCADlib/commit/f12b36ea046b5a784dd81b3c4e95eaf4cf24a58d "show commit") [C.P.](# "Chris Palmer") Corrected MGN12 rail end value.
|
||||
Added assert for rail end value too big.
|
||||
|
||||
### [v15.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.5.0...v15.6.0 "diff with v15.5.0")
|
||||
* 2021-04-03 [`51cc2fd`](https://github.com/nophead/NopSCADlib/commit/51cc2fd6791065e1c94c761abf7dac0271e6ab28 "show commit") [C.P.](# "Chris Palmer") Carriages now appear on the BOM and both variants are shown in the rail test.
|
||||
|
||||
* 2021-03-31 [`608168d`](https://github.com/nophead/NopSCADlib/commit/608168de8e56bfdde5ba605d27baca1900895926 "show commit") [M.B.](# "Martin Budden") Added MGN7H and MGN9H carriages.
|
||||
|
||||
### [v15.5.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.5.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.4.0...v15.5.0 "diff with v15.4.0")
|
||||
* 2021-04-02 [`cc794cd`](https://github.com/nophead/NopSCADlib/commit/cc794cd7c3cd3e3f63d15ebbe5dabb773812ae72 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-03-31 [`fc45a40`](https://github.com/nophead/NopSCADlib/commit/fc45a40bd3c3b524d9edc226952482296e776831 "show commit") [M.B.](# "Martin Budden") Added translated children to pulley.
|
||||
|
||||
### [v15.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.3.1...v15.4.0 "diff with v15.3.1")
|
||||
* 2021-04-02 [`b2d712b`](https://github.com/nophead/NopSCADlib/commit/b2d712bca94165a338e5f904880d12f9c4c5ecd0 "show commit") [C.P.](# "Chris Palmer") Added `quadratic_real_roots()` and `cubic_real_roots()`.
|
||||
|
||||
#### [v15.3.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.3.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.3.0...v15.3.1 "diff with v15.3.0")
|
||||
* 2021-04-02 [`f3376ed`](https://github.com/nophead/NopSCADlib/commit/f3376edaf186b32f442b94d6d0b42f1ba0c7612c "show commit") [C.P.](# "Chris Palmer") Documented `xor()` function.
|
||||
|
||||
### [v15.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.2.0...v15.3.0 "diff with v15.2.0")
|
||||
* 2021-04-02 [`c073419`](https://github.com/nophead/NopSCADlib/commit/c073419c0b4eddcda4cda5bd0f8d48268b6e58ec "show commit") [C.P.](# "Chris Palmer") Added `opengrab_screw_depth()` function.
|
||||
|
||||
### [v15.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.1.1...v15.2.0 "diff with v15.1.1")
|
||||
* 2021-03-22 [`ca1b34e`](https://github.com/nophead/NopSCADlib/commit/ca1b34e9cad5d82bd878fa4ebf439c0fbdad7f77 "show commit") [C.P.](# "Chris Palmer") Added `sink` parameter to `screw_polysink()` to recess the head.
|
||||
|
||||
#### [v15.1.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.1.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.1.0...v15.1.1 "diff with v15.1.0")
|
||||
* 2021-03-22 [`cbab9ce`](https://github.com/nophead/NopSCADlib/commit/cbab9cea028a204032a91729597572a39ed893a2 "show commit") [C.P.](# "Chris Palmer") Fixed `M6_cs_cap_screw`.
|
||||
|
||||
### [v15.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.0.1...v15.1.0 "diff with v15.0.1")
|
||||
* 2021-03-21 [`4aa7dbb`](https://github.com/nophead/NopSCADlib/commit/4aa7dbb416773e42b2b5f77b345f18fcd4d2ae2c "show commit") [C.P.](# "Chris Palmer") Added `M6_cs_cap_screw`.
|
||||
|
||||
#### [v15.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.0.0...v15.0.1 "diff with v15.0.0")
|
||||
* 2021-03-21 [`7c7c2e5`](https://github.com/nophead/NopSCADlib/commit/7c7c2e5d3f76e84ae86892f9d90f21619fa61a47 "show commit") [C.P.](# "Chris Palmer") Pixel changes due to switch to summer computer.
|
||||
|
||||
* 2021-03-15 [`f6f6664`](https://github.com/nophead/NopSCADlib/commit/f6f6664c0d06a7cc3d49f805a2fd4f4978a3a35a "show commit") [C.P.](# "Chris Palmer") Updated OpenSCAD version required.
|
||||
|
||||
## [v15.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v14.1.1...v15.0.0 "diff with v14.1.1")
|
||||
* 2021-03-14 [`9ded315`](https://github.com/nophead/NopSCADlib/commit/9ded3158010b577088fdaca8a25e478f48a27376 "show commit") [C.P.](# "Chris Palmer") Removed the belt gap options and changed the tests to use open loops instead.
|
||||
Note previous belt lengths were incorrect with negative turns.
|
||||
Fixed spelling typos.
|
||||
`_belt_length()` no longer needs belt type.
|
||||
Uptated images and readme.
|
||||
|
||||
* 2021-03-14 [`d2c795f`](https://github.com/nophead/NopSCADlib/commit/d2c795f5f5c564ec4686a7857bd894738a93a6a0 "show commit") [S.](# "SmoothieAq") fix nan angle (hopefully)
|
||||
|
||||
* 2021-03-14 [`573c507`](https://github.com/nophead/NopSCADlib/commit/573c50774bfb2edae25a415ca864abb39c4c1bcf "show commit") [S.](# "SmoothieAq") changes after review
|
||||
|
||||
* 2021-03-11 [`2403347`](https://github.com/nophead/NopSCADlib/commit/240334784db8002468fe0f51c1f6404a64fe44a4 "show commit") [S.](# "SmoothieAq") Extension to `belt.scad`
|
||||
|
||||
* Can now:
|
||||
- render open loops
|
||||
- twist the belt
|
||||
- use pulleys instead of radius in the points list
|
||||
|
||||
* Fixes some precision a few places
|
||||
Breaking change in `belt_length();` now requires a type argument
|
||||
|
||||
#### [v14.1.1](https://github.com/nophead/NopSCADlib/releases/tag/v14.1.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v14.1.0...v14.1.1 "diff with v14.1.0")
|
||||
* 2021-03-13 [`4b93623`](https://github.com/nophead/NopSCADlib/commit/4b93623492a2b8a073ab9dccc91fb2b21c475f21 "show commit") [C.P.](# "Chris Palmer") `changelog.py` now omits "Updated changelog" commits.
|
||||
|
||||
### [v14.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v14.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v14.0.1...v14.1.0 "diff with v14.0.1")
|
||||
* 2021-03-13 [`544e69c`](https://github.com/nophead/NopSCADlib/commit/544e69c71b404636df320be278b3fa7442f10429 "show commit") [C.P.](# "Chris Palmer") `pulley_pr()` now has an optional belt type for non-standard belt over smooth pulleys.
|
||||
|
||||
#### [v14.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v14.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v14.0.0...v14.0.1 "diff with v14.0.0")
|
||||
* 2021-03-08 [`e46e6b6`](https://github.com/nophead/NopSCADlib/commit/e46e6b6e5b95792b5b2b4d7a7e4360beed22df0b "show commit") [C.P.](# "Chris Palmer") Fixed markdown numbered points in `core_xy`.
|
||||
|
||||
## [v14.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v14.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v13.5.0...v14.0.0 "diff with v13.5.0")
|
||||
* 2021-03-06 [`298d1f9`](https://github.com/nophead/NopSCADlib/commit/298d1f92841f30e13b437c6770fc113954b94108 "show commit") [C.P.](# "Chris Palmer") Interface is the same but filenames to be included or used changed.
|
||||
Changlog upated.
|
||||
@@ -43,8 +188,6 @@ Changlog upated.
|
||||
|
||||
* 2021-03-03 [`a7eae4f`](https://github.com/nophead/NopSCADlib/commit/a7eae4f549b51dbe4624a8b67012919cef6cb24a "show commit") [C.P.](# "Chris Palmer") Neater changlog format.
|
||||
|
||||
* 2021-03-03 [`7b770ab`](https://github.com/nophead/NopSCADlib/commit/7b770abe12b71fa4b4f7415aa9f46d0f2c9d54f1 "show commit") [C.P.](# "Chris Palmer") Udpated changelog
|
||||
|
||||
* 2021-03-03 [`31ab856`](https://github.com/nophead/NopSCADlib/commit/31ab8562a783464f93812b8c7c45d403587efd0a "show commit") [C.P.](# "Chris Palmer") Updated images
|
||||
|
||||
* 2021-02-27 [`73c436e`](https://github.com/nophead/NopSCADlib/commit/73c436ee1568c21afd2919593d3f434eb47b53f2 "show commit") [M.B.](# "Martin Budden") Improved contrast of carbon fiber sheets.
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# NopSCADlib usage
|
||||
|
||||
## Requirements
|
||||
1. OpenSCAD 2019.05 or later, download it from here: https://www.openscad.org/downloads.html
|
||||
1. OpenSCAD 2021.01 or later, download it from here: https://www.openscad.org/downloads.html
|
||||
1. Python 2.7+ or 3.6+ from https://www.python.org/downloads/
|
||||
1. ImageMagick 7 www.imagemagick.org
|
||||
|
||||
@@ -270,6 +270,22 @@ The target config file is selected by generating `target.scad` that includes `co
|
||||
The rest of the project includes `target.scad` to use the configuration.
|
||||
Additionally all the generated file directories (assemblies, bom, stls, dxfs, etc.) are placed in a sub-directory called `<target_name>`.
|
||||
|
||||
The build system will look for a `<target_name>_assembly` module and use it as the top level module instead of `main_assembly` if it it exists.
|
||||
That allows the project description to be target specific if the top level modules are in different scad files.
|
||||
The top level assembly instructions and assembly contents could also be different if appropriate.
|
||||
|
||||
If the top level module is just a shell wrapper that simply includes one other assembly, with no additional parts, then it is removed from the build instructions and
|
||||
the assembly it calls becomes the top level. This allows a different project description for each target but only one set of top level instructions without repeating them.
|
||||
|
||||
### Costed BOMs
|
||||
|
||||
A costed bill of materials can be made by opening the generated file `bom/bom.csv` in a spreadsheet program using a single quote as the string delimiter and comma as the field separator.
|
||||
That gets a list of part descriptions and quantities to which prices can be added to get the total cost and perhaps a URL of where to buy each part.
|
||||
|
||||
If a Python file called `parts.py` is found then `bom.py` will attempt to call functions for each part to get a price and URL.
|
||||
Any functions not found are printed, so you can see the format expected.
|
||||
The function are passed the quantity to allow them to calculate volume discounts, etc.
|
||||
|
||||
### Other libraries
|
||||
|
||||
The build scripts need to be able to locate the source files where the modules to generate the STL files and assemblies reside. They will search all the scad files
|
||||
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 137 KiB |
16
examples/MainsBreakOutBox/bom/bom.csv
Normal file
@@ -0,0 +1,16 @@
|
||||
'Ferrule for 1.5mm^2 wire - not shown', 3
|
||||
'Wire blue 30/0.25mm strands, length 150mm - not shown', 2
|
||||
'Wire brown 30/0.25mm strands, length 150mm - not shown', 2
|
||||
'Wire green & yellow 30/0.25mm strands, length 150mm - not shown', 2
|
||||
'IEC inlet for ATX', 1
|
||||
'Heatfit insert M3', 2
|
||||
'4mm shielded jack socket blue', 2
|
||||
'4mm shielded jack socket brown', 1
|
||||
'4mm shielded jack socket green', 2
|
||||
'Mains socket 13A', 1
|
||||
'Nut M3 x 2.4mm nyloc', 6
|
||||
'Screw M3 cs cap x 12mm', 2
|
||||
'Screw M3 cs cap x 20mm', 2
|
||||
'Screw M3 dome x 10mm', 4
|
||||
'Heatshrink sleeving ID 3.2mm x 15mm - not shown', 8
|
||||
'Washer M3 x 7mm x 0.5mm', 10
|
|
@@ -27,15 +27,16 @@
|
||||
// Setting $_bom in the local file overrides it in the local file but not in the libs.
|
||||
//
|
||||
rr_green = [0, 146/255, 0]; // RepRap logo colour
|
||||
crimson = [220/255, 20/255, 60/255];
|
||||
|
||||
$_bom = is_undef($bom) ? 0 : $bom; // 0 no bom, 1 assemblies and stls, 2 vitamins as well
|
||||
$exploded = is_undef($explode) ? 0 : $explode; // 1 for exploded view
|
||||
layer_height = is_undef($layer_height) ? 0.25 : $layer_height; // layer heigth when printing
|
||||
layer_height = is_undef($layer_height) ? 0.25 : $layer_height; // layer height when printing
|
||||
extrusion_width = is_undef($extrusion_width) ? 0.5 : $extrusion_width; // filament width when printing
|
||||
nozzle = is_undef($nozzle) ? 0.45 : $nozzle; // 3D printer nozzle
|
||||
cnc_bit_r = is_undef($cnc_bit_r) ? 1.2 : $cnc_bit_r; // minimum tool radius when milling 2D objects
|
||||
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
|
||||
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
|
||||
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
|
||||
show_rays = is_undef($show_rays) ? false : $show_rays; // show camera sight lines and light direction
|
||||
|
2
lib.scad
@@ -28,6 +28,8 @@ include <vitamins/pcbs.scad>
|
||||
include <vitamins/batteries.scad>
|
||||
include <vitamins/bearing_blocks.scad>
|
||||
include <vitamins/blowers.scad>
|
||||
include <vitamins/bldc_motors.scad>
|
||||
include <vitamins/box_sections.scad>
|
||||
include <vitamins/bulldogs.scad>
|
||||
include <vitamins/buttons.scad>
|
||||
include <vitamins/cameras.scad>
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 884 KiB After Width: | Height: | Size: 908 KiB |
16
libtest.scad
@@ -45,7 +45,9 @@ use <tests/ball_bearings.scad>
|
||||
use <tests/batteries.scad>
|
||||
use <tests/bearing_blocks.scad>
|
||||
use <tests/belts.scad>
|
||||
use <tests/BLDC_motors.scad>
|
||||
use <tests/blowers.scad>
|
||||
use <tests/box_sections.scad>
|
||||
use <tests/bulldogs.scad>
|
||||
use <tests/buttons.scad>
|
||||
use <tests/cable_strips.scad>
|
||||
@@ -368,10 +370,10 @@ extrusions_y = panel_meters_y + 80;
|
||||
translate([x3, veroboard_y])
|
||||
veroboard_test();
|
||||
|
||||
translate([x3 + 70, veroboard_y + 30])
|
||||
translate([x3 + 60, veroboard_y + 20])
|
||||
geared_steppers();
|
||||
|
||||
translate([x3 + 140, veroboard_y + 20])
|
||||
translate([x3 + 160, ssrs_y])
|
||||
pcb_mounts();
|
||||
|
||||
translate([x3 + 170, veroboard_y + 16])
|
||||
@@ -426,6 +428,9 @@ extrusion_brackets_y = rails_y + 250;
|
||||
sk_brackets_y = extrusion_brackets_y + 80;
|
||||
kp_pillow_blocks_y = sk_brackets_y + 50;
|
||||
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
||||
cable_strip_y = fans_y + 50;
|
||||
box_sections_y = cable_strip_y;
|
||||
BLDC_y = sheets_y;
|
||||
|
||||
translate([x4 + 200, belts_y + 58]) {
|
||||
belt_test();
|
||||
@@ -441,7 +446,7 @@ translate([x4 + 175, belts_y, -20])
|
||||
translate([x4, rails_y + 130])
|
||||
rails();
|
||||
|
||||
translate([770, fans_y + 50])
|
||||
translate([770, cable_strip_y])
|
||||
cable_strips();
|
||||
|
||||
translate([x4, kp_pillow_blocks_y])
|
||||
@@ -459,6 +464,11 @@ translate([x4 + 120, extrusion_brackets_y])
|
||||
translate([x4, scs_bearing_blocks_y])
|
||||
scs_bearing_blocks();
|
||||
|
||||
translate([x4, BLDC_y])
|
||||
bldc_motors();
|
||||
|
||||
translate([x6, box_sections_y])
|
||||
box_sections();
|
||||
|
||||
translate([x6, 125])
|
||||
light_strips();
|
||||
|
275
readme.md
@@ -20,32 +20,32 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
||||
|
||||
## Table of Contents<a name="top"/>
|
||||
<table><tr>
|
||||
<th align="left"> Vitamins A-I </th><th align="left"> Vitamins J-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 = "#Axials">Axials</a> </td><td> <a href = "#Jack">Jack</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 = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#LDRs">LDRs</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 = "#Batteries">Batteries</a> </td><td> <a href = "#LED_meters">LED_meters</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 = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LEDs">LEDs</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 = "#Belts">Belts</a> </td><td> <a href = "#Leadnuts">Leadnuts</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 = "#Blowers">Blowers</a> </td><td> <a href = "#Light_strips">Light_strips</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 = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</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 = "#Buttons">Buttons</a> </td><td> <a href = "#Magnets">Magnets</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 = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</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 = "#Cameras">Cameras</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</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 = "#Circlips">Circlips</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</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 = "#Components">Components</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</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 = "#DIP">DIP</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</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 = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</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 = "#Extrusions">Extrusions</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 = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</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 = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</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 = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</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> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</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> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</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 = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</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 = "#IECs">IECs</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<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 = "#Axials">Axials</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 = "#BLDC_motors">BLDC_motors</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 = "#Ball_bearings">Ball_bearings</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 = "#Batteries">Batteries</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 = "#Bearing_blocks">Bearing_blocks</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 = "#Belts">Belts</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 = "#Blowers">Blowers</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 = "#Box_sections">Box_sections</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 = "#Bulldogs">Bulldogs</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 = "#Buttons">Buttons</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</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 = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Sheets">Sheets</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 = "#Cameras">Cameras</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Spades">Spades</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 = "#Circlips">Circlips</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</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 = "#D_connectors">D_connectors</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</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 = "#Displays">Displays</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Toggles">Toggles</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 = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Transformers">Transformers</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 = "#Extrusions">Extrusions</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Tubings">Tubings</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 = "#Fans">Fans</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Veroboard">Veroboard</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 = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillars">Pillars</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 = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</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 = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pin_headers">Pin_headers</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> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
@@ -267,13 +267,22 @@ SCSnUU and SCSnLUU bearing blocks
|
||||
---
|
||||
<a name="Belts"></a>
|
||||
## Belts
|
||||
Models timing belt running over toothed or smooth pulleys and calculates an accurate length.
|
||||
Only models 2D paths, so not crossed belt core XY!
|
||||
Models timing belt running in a path over toothed or smooth pulleys and calculates an accurate length.
|
||||
Only models 2D paths, belt may twist to support crossed belt core XY and other designes where the belt twists!
|
||||
|
||||
By default the path is a closed loop. An open loop can be specified by specifying `open=true`, and in that case the start and end points are not connected, leaving the loop open.
|
||||
|
||||
To get a 180 degree twist of the loop, you can use the `twist` argument. `Twist` can be a single number, and in that case the belt will twist after
|
||||
the position with that number. Alternatively `twist` can be a list of boolean values with a boolean for each position; the belt will then twist after
|
||||
the position that have a `true` value in the `twist` list. If the path is specified with pulley/idler types, then you can use `auto_twist=true`; in
|
||||
that case the belt will automatically twist so the back of the belt always runs against idlers and the tooth side runs against pullies. If you use
|
||||
`open=true` then you might also use `start_twist=true` to let the belt start the part with the back side out.
|
||||
|
||||
The path must be specified as a list of positions. Each position should be either a vector with `[x, y, pulley]` or `[x, y, r]`. A pully is a type from
|
||||
`pulleys.scad`, and correct radius and angle will automatically be calculated. Alternatively a radius can be specified directly.
|
||||
|
||||
To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius.
|
||||
|
||||
By default the path is a closed loop but a gap length and position can be specified to make open loops.
|
||||
To draw the gap its XY position is specified by `gap_pos`. `gap_pos.z` can be used to specify a rotation if the gap is not at the bottom of the loop.
|
||||
Alternativley you can just specify smooth pulleys in the path, and it will then happen automatically.
|
||||
|
||||
Individual teeth are not drawn, instead they are represented by a lighter colour.
|
||||
|
||||
@@ -295,13 +304,15 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `belt_length(points, gap = 0)` | Compute belt length given path and optional gap |
|
||||
| `_belt_points_info(type, points, open, twist, auto_twist, start_twist)` | Helper function that calculates [twist, istwisted, points, tangents, arcs] |
|
||||
| `belt_length(type, points, open = false)` | Compute belt length given path |
|
||||
| `belt_pitch_to_back(type)` | Offset of the back from the pitch radius |
|
||||
| `belt_pulley_pr(type, pulley, twisted=false)` | Pitch radius. Default it expects the belt tooth to be against a toothed pulley an the backside to be against a smooth pulley (an idler). If `twisted` is true, the the belt is the other way around. |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `belt(type, points, gap = 0, gap_pos = undef, belt_colour = grey(20)` | Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified |
|
||||
| `belt(type, points, belt_colour = grey(20)` | Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless open is specified |
|
||||
|
||||

|
||||
|
||||
@@ -309,17 +320,85 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 128mm |
|
||||
| 2 | `belt(GT2x6, [ ... ], 80, [0, 0])` | Belt GT2 x 6mm x 572mm |
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 552mm |
|
||||
| 2 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 556mm |
|
||||
| 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 |
|
||||
| 2 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 2 | `pulley(GT2x16_toothed_idler)` | Pulley GT2 idler 16 teeth |
|
||||
| 4 | `pulley(GT2x20_toothed_idler)` | Pulley GT2 idler 20 teeth |
|
||||
| 2 | `pulley(GT2x16_plain_idler)` | Pulley GT2 idler smooth 9.63mm |
|
||||
| 2 | `pulley(GT2x20ob_pulley)` | Pulley GT2OB 20 teeth |
|
||||
| 6 | `pulley(GT2x16_plain_idler)` | Pulley GT2 idler smooth 9.63mm |
|
||||
| 3 | `pulley(GT2x20ob_pulley)` | Pulley GT2OB 20 teeth |
|
||||
| 2 | `screw(M3_cs_cap_screw, 20)` | Screw M3 cs cap x 20mm |
|
||||
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||
| 6 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="BLDC_motors"></a>
|
||||
## BLDC_motors
|
||||
Brushless DC electric motor
|
||||
|
||||
[vitamins/bldc_motors.scad](vitamins/bldc_motors.scad) Object definitions.
|
||||
|
||||
[vitamins/bldc_motor.scad](vitamins/bldc_motor.scad) Implementation.
|
||||
|
||||
[tests/BLDC_motors.scad](tests/BLDC_motors.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `BLDC_base_diameter(type)` | Base diameter |
|
||||
| `BLDC_base_height_1(type)` | Base height 1 |
|
||||
| `BLDC_base_height_2(type)` | Base height 2 |
|
||||
| `BLDC_base_hole_diameter(type)` | Base hole diameter |
|
||||
| `BLDC_base_holes(type)` | Base holes |
|
||||
| `BLDC_base_open(type)` | Base open |
|
||||
| `BLDC_bell_diameter(type)` | Bell diameter |
|
||||
| `BLDC_bell_height_1(type)` | Bell height 1 |
|
||||
| `BLDC_bell_height_2(type)` | Bell height 2 |
|
||||
| `BLDC_bell_hole_diameter(type)` | Bell hole diameter |
|
||||
| `BLDC_bell_holes(type)` | Bell holes |
|
||||
| `BLDC_bell_spokes(type)` | Bell spoke count |
|
||||
| `BLDC_body_colour(type)` | Body colour |
|
||||
| `BLDC_boss_diameter(type)` | Boss diameter |
|
||||
| `BLDC_boss_height(type)` | Boss height |
|
||||
| `BLDC_diameter(type)` | Diameter of motor |
|
||||
| `BLDC_height(type)` | Height of motor including boss, if any, but excluding prop shaft |
|
||||
| `BLDC_prop_shaft_diameter(type)` | Diameter of unthreaded portion of prop shaft |
|
||||
| `BLDC_prop_shaft_length(type)` | Prop shaft length, including threaded section |
|
||||
| `BLDC_prop_shaft_thread_diameter(type)` | Diameter of threaded section of prop shaft |
|
||||
| `BLDC_prop_shaft_thread_length(type)` | Length of threaded section of prop shaft |
|
||||
| `BLDC_shaft_diameter(type)` | shaft diameter |
|
||||
| `BLDC_shaft_length(type)` | Total shaft length |
|
||||
| `BLDC_shaft_offset(type)` | shaft offset from base |
|
||||
| `BLDC_side_colour(type)` | Side colour |
|
||||
| `BLDC_wire_diameter(type)` | Wire diameter |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `BLDC(type)` | Draw specified BLDC motor |
|
||||
| `BLDC_base_screw_positions(type, n = 4)` | Positions children at the base screw holes |
|
||||
| `BLDC_bell_screw_positions(type, n = 4)` | Positions children at the bell screw holes |
|
||||
| `BLDC_screw_positions(holes, n = 4)` | Screw positions utility function |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `BLDC(BLDC0603)` | Brushless DC motor BLDC0603 |
|
||||
| 1 | `BLDC(BLDC0802)` | Brushless DC motor BLDC0802 |
|
||||
| 1 | `BLDC(BLDC1105)` | Brushless DC motor BLDC1105 |
|
||||
| 1 | `BLDC(BLDC1306)` | Brushless DC motor BLDC1306 |
|
||||
| 1 | `BLDC(BLDC1804)` | Brushless DC motor BLDC1804 |
|
||||
| 1 | `BLDC(BLDC2205)` | Brushless DC motor BLDC2205 |
|
||||
| 1 | `BLDC(BLDC2212)` | Brushless DC motor BLDC2212 |
|
||||
| 1 | `BLDC(BLDC3548)` | Brushless DC motor BLDC3548 |
|
||||
| 1 | `BLDC(BLDC4250)` | Brushless DC motor BLDC4250 |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -361,6 +440,7 @@ Models of radial blowers.
|
||||
|:--- |:--- |
|
||||
| `blower_casing_is_square(type)` | True for square radial fans, false for spiral shape radial blowers |
|
||||
| `blower_exit_offset(type)` | Offset of exit's centre from the edge |
|
||||
| `blower_size(type)` | Size |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -387,6 +467,44 @@ Models of radial blowers.
|
||||
| 2 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Box_sections"></a>
|
||||
## Box_sections
|
||||
Box sections.
|
||||
|
||||
[vitamins/box_sections.scad](vitamins/box_sections.scad) Object definitions.
|
||||
|
||||
[vitamins/box_section.scad](vitamins/box_section.scad) Implementation.
|
||||
|
||||
[tests/box_sections.scad](tests/box_sections.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `box_section_colour(type)` | Colour |
|
||||
| `box_section_colour2(type)` | Colour2, for woven box section |
|
||||
| `box_section_fillet(type)` | Fillet |
|
||||
| `box_section_material(type)` | Material description |
|
||||
| `box_section_size(type)` | Size |
|
||||
| `box_section_thickness(type)` | Wall thickness |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `box_section_is_woven(type)` | Box section is woven, eg carbon fiber |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `box_section(AL12x8x1, 100)` | Aluminium rectangular box section 12mm x 8mm x 1mm, length 100mm |
|
||||
| 1 | `box_section(AL20x20x2, 100)` | Aluminium rectangular box section 20mm x 20mm x 2mm, length 100mm |
|
||||
| 1 | `box_section(CF10x10x1, 100)` | Carbon fiber rectangular box section 10mm x 10mm x 1mm, length 100mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -1041,23 +1159,23 @@ Geared tin can steppers
|
||||
|:--- |:--- |
|
||||
| `gs_boss_d(type)` | Boss around the shaft diameter |
|
||||
| `gs_boss_h(type)` | Boss around the shaft height |
|
||||
| `gs_bulge2_d(type)` | Plastic rear bulge depth from centre |
|
||||
| `gs_bulge2_h(type)` | Plastic rear bulge height |
|
||||
| `gs_bulge2_w(type)` | Plastic rear bulge width |
|
||||
| `gs_bulge_d(type)` | Plastic bulge depth from centre |
|
||||
| `gs_bulge_h(type)` | Plastic bulge height |
|
||||
| `gs_bulge_w(type)` | Plastic bulge width |
|
||||
| `gs_bulge(type)` | Plastic bulge width, depth, height, z offset |
|
||||
| `gs_bulge2(type)` | Plastic rear bulge width, depth, height |
|
||||
| `gs_diameter(type)` | Can diameter |
|
||||
| `gs_flat_length(type)` | Shaft flat length |
|
||||
| `gs_height(type)` | Can height |
|
||||
| `gs_hole_d(type)` | Screw hole diameter |
|
||||
| `gs_lug_t(type)` | Screw lug thickness |
|
||||
| `gs_lug_w(type)` | Screw lug width |
|
||||
| `gs_motor(type)` | Motor diameter and height if separate from gearbox |
|
||||
| `gs_offset(type)` | Offset of the shaft from the centre of the can |
|
||||
| `gs_pitch(type)` | Screw pitch |
|
||||
| `gs_radius(type)` | Top - or bottom + corner radius |
|
||||
| `gs_shaft_d(type)` | Shaft diameter |
|
||||
| `gs_shaft_flat(type)` | Shaft width across the flats |
|
||||
| `gs_shaft_length(type)` | Shaft length |
|
||||
| `gs_wire_d(type)` | Wire diameter |
|
||||
| `gs_wires(type)` | Wire colours and grouping |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -1071,6 +1189,7 @@ Geared tin can steppers
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `geared_stepper(28BYJ_48)` | Geared stepper - 28BYJ-48 5V |
|
||||
| 1 | `geared_stepper(35BYGHJ75)` | Geared stepper - 35BYGHJ75 0.4A |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -1184,7 +1303,7 @@ Needs updating as mostly obsolete versions.
|
||||
| 1 | | Tape self amalgamating silicone 110mm x 25mm |
|
||||
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% - not shown |
|
||||
| 2 | | Wire Red PTFE 16/0.2mm strands, length 170mm |
|
||||
| 4 | `ziptie(small_ziptie, 8)` | Ziptie 2.5mm x 100mm min length |
|
||||
| 4 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -1277,7 +1396,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_switched_fused_inlet)` | IEC320 C14 switched fused inlet module |
|
||||
| 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 |
|
||||
| 8 | `screw(M3_cs_cap_screw, 12)` | Screw M3 cs cap x 12mm |
|
||||
@@ -1433,7 +1552,7 @@ Nuts for leadscrews.
|
||||
| `leadnut_flange_t(type)` | Flange thickness |
|
||||
| `leadnut_height(type)` | Total height |
|
||||
| `leadnut_hole_dia(type)` | The diameter of the screw holes |
|
||||
| `leadnut_hole_pitch(type)` | The radia pitch of the screw holes |
|
||||
| `leadnut_hole_pitch(type)` | The radial pitch of the screw holes |
|
||||
| `leadnut_holes(type)` | The number of screw holes |
|
||||
| `leadnut_lead(type)` | Screw lead |
|
||||
| `leadnut_od(type)` | Outer diameter of the shank |
|
||||
@@ -2018,6 +2137,7 @@ A permanent magnet that can be magnatized and de-magnatized electronically.
|
||||
| `opengrab_depth()` | Module height |
|
||||
| `opengrab_pcb()` | The PCB |
|
||||
| `opengrab_pcb_z()` | PCB offset from the front |
|
||||
| `opengrab_screw_depth()` | Max screw depth in pillars |
|
||||
| `opengrab_target_thickness()` | Target sheet thickness |
|
||||
| `opengrab_width()` | Module width |
|
||||
|
||||
@@ -2144,6 +2264,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `pcb_component(type, name, index = 0)` | Return the component specified by name and index |
|
||||
| `pcb_component_position(type, name, index = 0)` | Return x y position of specified component |
|
||||
| `pcb_coord(type, p)` | Convert offsets from the edge to coordinates relative to the centre |
|
||||
| `pcb_grid_pos(type, x, y, z = 0)` | Returns a pcb grid position |
|
||||
@@ -2280,6 +2401,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `pcb_component(type, name, index = 0)` | Return the component specified by name and index |
|
||||
| `pcb_component_position(type, name, index = 0)` | Return x y position of specified component |
|
||||
| `pcb_coord(type, p)` | Convert offsets from the edge to coordinates relative to the centre |
|
||||
| `pcb_grid_pos(type, x, y, z = 0)` | Returns a pcb grid position |
|
||||
@@ -2614,6 +2736,7 @@ Face order is bottom, top, left, right, front, back.
|
||||
| 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
|
||||
@@ -2681,12 +2804,12 @@ Timing belt pulleys, both toothed and plain with internal bearings for idlers.
|
||||
| `pulley_height(type)` | Total height of pulley |
|
||||
| `pulley_ir(type)` | Inside radius of the teeth |
|
||||
| `pulley_offset(type)` | Offset of the belt path centre |
|
||||
| `pulley_pr(type)` | Pitch radius |
|
||||
| `pulley_pr(type, belt = undef)` | Pitch radius, `belt` only needed for non-standard belt over smooth pulleys |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `pulley(type, colour = silver)` | Draw a pulley |
|
||||
| `pulley(type, colour = silver)` | Draw a pulley, any children are placed above. |
|
||||
| `pulley_assembly(type, colour = silver)` | Draw a pulley with its grub screws in place |
|
||||
|
||||

|
||||
@@ -2773,26 +2896,35 @@ Linear rails with carriages.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 2 | `rail(MGN12, 200)` | Linear rail MGN12 x 200mm |
|
||||
| 1 | `rail(MGN12, 200)` | Linear rail MGN12 x 200mm |
|
||||
| 1 | `rail(MGN15, 200)` | Linear rail MGN15 x 200mm |
|
||||
| 1 | `rail(MGN5, 200)` | Linear rail MGN5 x 200mm |
|
||||
| 1 | `rail(MGN7, 200)` | Linear rail MGN7 x 200mm |
|
||||
| 1 | `rail(MGN9, 200)` | Linear rail MGN9 x 200mm |
|
||||
| 1 | `rail(SSR15, 200)` | Linear rail SSR15 x 200mm |
|
||||
| 1 | `carriage(MGN12C_carriage)` | Linear rail carriage MGN12C |
|
||||
| 1 | `carriage(MGN12H_carriage)` | Linear rail carriage MGN12H |
|
||||
| 1 | `carriage(MGN15C_carriage)` | Linear rail carriage MGN15C |
|
||||
| 1 | `carriage(MGN5C_carriage)` | Linear rail carriage MGN5C |
|
||||
| 1 | `carriage(MGN7C_carriage)` | Linear rail carriage MGN7C |
|
||||
| 1 | `carriage(MGN7H_carriage)` | Linear rail carriage MGN7H |
|
||||
| 1 | `carriage(MGN9C_carriage)` | Linear rail carriage MGN9C |
|
||||
| 1 | `carriage(MGN9H_carriage)` | Linear rail carriage MGN9H |
|
||||
| 1 | `carriage(SSR15_carriage)` | Linear rail carriage SSR15 |
|
||||
| 26 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
|
||||
| 31 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 23 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 4 | `nut(M4_nut, nyloc = true)` | Nut M4 x 3.2mm nyloc |
|
||||
| 11 | `screw(M2_cap_screw, 10)` | Screw M2 cap x 10mm |
|
||||
| 15 | `screw(M2_cs_cap_screw, 10)` | Screw M2 cs cap x 10mm |
|
||||
| 8 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
||||
| 12 | `screw(M3_cap_screw, 12)` | Screw M3 cap x 12mm |
|
||||
| 6 | `screw(M3_cap_screw, 12)` | Screw M3 cap x 12mm |
|
||||
| 3 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 2 | `screw(M3_cs_cap_screw, 12)` | Screw M3 cs cap x 12mm |
|
||||
| 6 | `screw(M3_cs_cap_screw, 16)` | Screw M3 cs cap x 16mm |
|
||||
| 4 | `screw(M3_cs_cap_screw, 16)` | Screw M3 cs cap x 16mm |
|
||||
| 2 | `screw(M4_cap_screw, 16)` | Screw M4 cap x 16mm |
|
||||
| 2 | `screw(M4_cs_cap_screw, 20)` | Screw M4 cs cap x 20mm |
|
||||
| 26 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
||||
| 31 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 23 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 4 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
|
||||
|
||||
@@ -2993,7 +3125,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
||||
| `screw(type, length, hob_point = 0, nylon = false)` | Draw specified screw, optionally hobbed or nylon |
|
||||
| `screw_and_washer(type, length, star = false, penny = false)` | Screw with a washer which can be standard or penny and an optional star washer on top |
|
||||
| `screw_countersink(type, drilled = true)` | Countersink shape |
|
||||
| `screw_polysink(type, h = 100, alt = false)` | A countersink hole made from stacked polyholes for printed parts |
|
||||
| `screw_polysink(type, h = 100, alt = false, sink = 0)` | A countersink hole made from stacked polyholes for printed parts, default is flush, `sink` can be used to recess the head |
|
||||
|
||||

|
||||
|
||||
@@ -3025,6 +3157,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
||||
| 1 | `screw(M5_hex_screw, 30)` | Screw M5 hex x 30mm |
|
||||
| 1 | `screw(M5_pan_screw, 30)` | Screw M5 pan x 30mm |
|
||||
| 1 | `screw(M6_cap_screw, 30)` | Screw M6 cap x 30mm |
|
||||
| 1 | `screw(M6_cs_cap_screw, 30)` | Screw M6 cs cap x 30mm |
|
||||
| 1 | `screw(M6_hex_screw, 30)` | Screw M6 hex x 30mm |
|
||||
| 1 | `screw(M6_pan_screw, 30)` | Screw M6 pan x 30mm |
|
||||
| 1 | `screw(M8_cap_screw, 35)` | Screw M8 cap x 35mm |
|
||||
@@ -3033,6 +3166,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
||||
| 1 | `screw(No4_screw, 10)` | Screw No4 pan wood x 10mm |
|
||||
| 1 | `screw(No6_cs_screw, 30)` | Screw No6 cs wood x 30mm |
|
||||
| 1 | `screw(No6_screw, 30)` | Screw No6 pan wood x 30mm |
|
||||
| 1 | `screw(No8_screw, 30)` | Screw No8 pan wood x 30mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
@@ -3977,7 +4111,7 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
| 1 | | Wire orange 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire red 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire yellow 7/0.2mm strands, length 90mm |
|
||||
| 1 | `ziptie(small_ziptie, 2.1)` | Ziptie 2.5mm x 100mm min length |
|
||||
| 1 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4005,16 +4139,16 @@ Cable zipties.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `ziptie(type, r, t = 0)` | Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t` |
|
||||
| `ziptie(type, r = 5, t = 0)` | Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t` |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `ziptie(small_ziptie, 5)` | Ziptie 2.5mm x 100mm min length |
|
||||
| 1 | `ziptie(ziptie_3p6mm, 5)` | Ziptie 3.6mm x 100mm min length |
|
||||
| 1 | `ziptie(ziptie_3mm, 5)` | Ziptie 3mm x 100mm min length |
|
||||
| 1 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
| 1 | `ziptie(ziptie_3p6mm)` | Ziptie 3.6mm x 100mm min length |
|
||||
| 1 | `ziptie(ziptie_3mm)` | Ziptie 3mm x 100mm min length |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -5224,7 +5358,7 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
||||
| 6 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
||||
| 6 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 6 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
| 3 | `ziptie(small_ziptie, 3)` | Ziptie 2.5mm x 100mm min length |
|
||||
| 3 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
@@ -5426,7 +5560,7 @@ The STL and assembly must be given a name and parameterless wrappers for the stl
|
||||
| 4 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
||||
| 4 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 4 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||
| 4 | `ziptie(small_ziptie, 3)` | Ziptie 2.5mm x 100mm min length |
|
||||
| 4 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
@@ -5619,8 +5753,8 @@ 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)` | 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)` | Draw the coreXY belts |
|
||||
| `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 |
|
||||
|
||||

|
||||
@@ -5628,8 +5762,8 @@ allows flexible positioning of the motors.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `belt(GT2x6, [ ... ], [10.0078, 11.69], [0, -24.686])` | Belt GT2 x 6mm x 742mm |
|
||||
| 1 | `belt(GT2x6, [ ... ], [10.0078, 11.69], [0, -24.686])` | Belt GT2 x 6mm x 852mm |
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 728mm |
|
||||
| 1 | `belt(GT2x6, [ ... ])` | Belt GT2 x 6mm x 824mm |
|
||||
| 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 |
|
||||
@@ -5820,12 +5954,17 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `circle_intersect(c1, r1, c2, r2)` | Calculate one point where two circles in the X-Z plane intersect, clockwise around c1 |
|
||||
| `cosh(x)` | hyperbolic cosine |
|
||||
| `coth(x)` | hyperbolic cotangent |
|
||||
| `cubic_real_roots(a, b, c, d)` | Returns real roots of cubic equation |
|
||||
| `degrees(radians)` | Convert degrees to radians |
|
||||
| `euler(R)` | Convert a rotation matrix to a Euler rotation vector. |
|
||||
| `identity(n, x = 1)` | Construct an arbitrary size identity matrix |
|
||||
| `invert(m)` | Invert a matrix |
|
||||
| `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 |
|
||||
| `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 |
|
||||
| `reverse(v)` | Reverse a vector |
|
||||
| `rot2_z(a)` | Generate a 2x2 matrix to rotate around z |
|
||||
| `rot3_z(a)` | Generate a 3x3 matrix to rotate around z |
|
||||
@@ -5836,14 +5975,17 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `solve(m, i = 0, j = 0)` | Solve each row ensuring diagonal is not zero |
|
||||
| `solve_row(m, i)` | Make diagonal one by dividing the row by it and subtract from other rows to make column zero |
|
||||
| `sqr(x)` | Square x |
|
||||
| `sumv(v)` | sum a vector of values that can be added with "+" |
|
||||
| `tanh(x)` | hyperbolic tangent |
|
||||
| `transform(v, m)` | Apply 4x4 transform to a 3 vector by extending it and cropping it again |
|
||||
| `transform_points(path, m)` | Apply transform to a path |
|
||||
| `translate(v)` | Generate a 4x4 translation matrix, `v` can be `[x, y]`, `[x, y, z]` or `z` |
|
||||
| `transpose(m)` | Transpose an arbitrary size matrix |
|
||||
| `unit(v)` | Convert `v` to a unit vector |
|
||||
| `vec2(v)` | Return a 2 vector with the first two elements of `v` |
|
||||
| `vec3(v)` | Return a 3 vector with the first three elements of `v` |
|
||||
| `vec4(v)` | Return a 4 vector with the first three elements of `v` |
|
||||
| `xor(a,b)` | Logical exclusive OR |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -5957,8 +6099,9 @@ Because the tangents need to be calculated to find the length these can be calcu
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `circle_tangent(p1, p2)` | Compute the clockwise tangent between two circles represented as [x,y,r] |
|
||||
| `rounded_polygon_arcs(points, tangents)` | Compute the arcs at the points, for each point [angle, rotate_angle, length] |
|
||||
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by ` rounded_polygon_tangents` |
|
||||
| `rounded_polygon_tangents(points)` | Compute the straight sections needed to draw and to compute the lengths |
|
||||
| `rounded_polygon_tangents(points)` | Compute the straight sections between a point and the next point, for each section [start_point, end_point, length] |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|
@@ -31,6 +31,12 @@ from set_config import *
|
||||
import json
|
||||
import re
|
||||
|
||||
try:
|
||||
import parts
|
||||
got_parts_py = True
|
||||
except:
|
||||
got_parts_py = False
|
||||
|
||||
def find_scad_file(mname):
|
||||
for filename in os.listdir(source_dir):
|
||||
if filename[-5:] == ".scad":
|
||||
@@ -46,6 +52,18 @@ def find_scad_file(mname):
|
||||
return filename
|
||||
return None
|
||||
|
||||
def main_assembly(target):
|
||||
file = None
|
||||
if target:
|
||||
assembly = target + "_assembly"
|
||||
file = find_scad_file(assembly)
|
||||
if not file:
|
||||
assembly = "main_assembly"
|
||||
file = find_scad_file(assembly)
|
||||
if not file:
|
||||
raise Exception("can't find source for " + assembly)
|
||||
return assembly, file
|
||||
|
||||
class Part:
|
||||
def __init__(self, args):
|
||||
self.count = 1
|
||||
@@ -117,6 +135,33 @@ class BOM:
|
||||
return ass
|
||||
return ass.replace("assembly", "assemblies")
|
||||
|
||||
def print_CSV(self, file = None):
|
||||
i = 0
|
||||
for part in sorted(self.vitamins):
|
||||
i += 1
|
||||
if ': ' in part:
|
||||
part_no, description = part.split(': ')
|
||||
else:
|
||||
part_no, description = "", part
|
||||
qty = self.vitamins[part].count
|
||||
if got_parts_py:
|
||||
match = re.match(r'^.*\((.*?)[,\)].*$', part_no)
|
||||
if match and not match.group(1).startswith('"'):
|
||||
part_no = part_no.replace('(' + match.group(1), '_' + match.group(1) + '(').replace('(, ', '(')
|
||||
func = 'parts.' + part_no.replace('(', '(%d, ' % qty).replace(', )', ')')
|
||||
func = func.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
|
||||
try:
|
||||
price, url = eval(func)
|
||||
print("'%s',%3d,%.2f,'=B%d*C%d',%s" % (description, qty, price, i, i, url), file=file)
|
||||
except:
|
||||
if part_no:
|
||||
print("%s not found in parts.py" % func)
|
||||
print("'%s',%3d" % (description, qty), file=file)
|
||||
else:
|
||||
print("'%s',%3d" % (description, qty), file=file)
|
||||
if got_parts_py:
|
||||
print(",'=SUM(B1:B%d)',,'=SUM(D1:D%d)'" %(i, i), file=file)
|
||||
|
||||
def print_bom(self, breakdown, file = None):
|
||||
if self.vitamins:
|
||||
print("Vitamins:", file=file)
|
||||
@@ -221,28 +266,20 @@ def parse_bom(file = "openscad.log", name = None):
|
||||
return main
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tbom [target_config] [<accessory_name>_assembly] - Generate BOMs for a project or an accessory to a project.")
|
||||
print("\nusage:\n\tbom [target_config] - Generate BOMs for a project.")
|
||||
sys.exit(1)
|
||||
|
||||
def boms(target = None, assembly = None):
|
||||
def boms(target = None):
|
||||
try:
|
||||
bom_dir = set_config(target, usage) + "bom"
|
||||
if assembly:
|
||||
bom_dir += "/accessories"
|
||||
if not os.path.isdir(bom_dir):
|
||||
os.makedirs(bom_dir)
|
||||
else:
|
||||
assembly = "main_assembly"
|
||||
if os.path.isdir(bom_dir):
|
||||
shutil.rmtree(bom_dir)
|
||||
sleep(0.1)
|
||||
os.makedirs(bom_dir)
|
||||
if os.path.isdir(bom_dir):
|
||||
shutil.rmtree(bom_dir)
|
||||
sleep(0.1)
|
||||
os.makedirs(bom_dir)
|
||||
#
|
||||
# Find the scad file that makes the module
|
||||
# Find the scad file that makes the main assembly
|
||||
#
|
||||
scad_file = find_scad_file(assembly)
|
||||
if not scad_file:
|
||||
raise Exception("can't find source for " + assembly)
|
||||
assembly, scad_file = main_assembly(target)
|
||||
#
|
||||
# make a file to use the module
|
||||
#
|
||||
@@ -259,8 +296,9 @@ def boms(target = None, assembly = None):
|
||||
|
||||
main = parse_bom("openscad.echo", assembly)
|
||||
|
||||
if assembly == "main_assembly":
|
||||
main.print_bom(True, open(bom_dir + "/bom.txt","wt"))
|
||||
main.print_bom(True, open(bom_dir + "/bom.txt","wt"))
|
||||
|
||||
main.print_CSV(open(bom_dir + "/bom.csv","wt"))
|
||||
|
||||
for ass in main.assemblies:
|
||||
with open(bom_dir + "/" + ass + ".txt", "wt") as f:
|
||||
@@ -278,20 +316,8 @@ def boms(target = None, assembly = None):
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 3: usage()
|
||||
if len(sys.argv) > 2: usage()
|
||||
|
||||
if len(sys.argv) == 3:
|
||||
target, assembly = sys.argv[1], sys.argv[2]
|
||||
else:
|
||||
if len(sys.argv) == 2:
|
||||
if sys.argv[1][-9:] == "_assembly":
|
||||
target, assembly = None, sys.argv[1]
|
||||
else:
|
||||
target, assembly = sys.argv[1], None
|
||||
else:
|
||||
target, assembly = None, None
|
||||
target = sys.argv[1] if len(sys.argv) == 2 else None
|
||||
|
||||
if assembly:
|
||||
if assembly[-9:] != "_assembly": usage()
|
||||
|
||||
boms(target, assembly)
|
||||
boms(target)
|
||||
|
@@ -159,5 +159,6 @@ if __name__ == '__main__':
|
||||
print('%s [%s](%s "show release") %s %s' % ('#' * (level + 1), ver, url + '/releases/tag/' + ver, type, diff), file = file)
|
||||
|
||||
# Print commits excluding merges
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull'):
|
||||
|
||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U..ated changelog.*', 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)
|
||||
|
@@ -173,7 +173,7 @@ def tests(tests):
|
||||
impl_name = None
|
||||
|
||||
if libtest:
|
||||
vsplit = "AJR" + chr(ord('Z') + 1)
|
||||
vsplit = "AIR" + chr(ord('Z') + 1)
|
||||
vtype = locations[0][1]
|
||||
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
|
||||
if type == vtype:
|
||||
|
@@ -161,6 +161,7 @@ def views(target, do_assemblies = None):
|
||||
# Find all the scad files
|
||||
#
|
||||
main_blurb = None
|
||||
main_assembly, main_file = bom.main_assembly(target)
|
||||
pngs = []
|
||||
for dir in source_dirs(bom_dir):
|
||||
if os.path.isdir(dir):
|
||||
@@ -232,7 +233,7 @@ def views(target, do_assemblies = None):
|
||||
update_image(tmp_name, tn_name)
|
||||
done_assemblies.append(real_name)
|
||||
else:
|
||||
if module == 'main_assembly':
|
||||
if module == main_assembly:
|
||||
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
|
||||
line_no += 1
|
||||
#
|
||||
@@ -246,9 +247,6 @@ def views(target, do_assemblies = None):
|
||||
project = ' '.join(word[0].upper() + word[1:] for word in os.path.basename(os.getcwd()).split('_'))
|
||||
print('<a name="TOP"></a>', file = doc_file)
|
||||
print('# %s' % project, file = doc_file)
|
||||
main_file = bom.find_scad_file('main_assembly')
|
||||
if not main_file:
|
||||
raise Exception("can't find source for main_assembly")
|
||||
text = blurb.scrape_blurb(source_dir + '/' + main_file)
|
||||
blurbs = blurb.split_blurb(text)
|
||||
if len(text):
|
||||
|
31
tests/BLDC_motors.scad
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/bldc_motors.scad>
|
||||
|
||||
module bldc_motors()
|
||||
layout([for(b = bldc_motors) BLDC_diameter(b)])
|
||||
rotate(-90)
|
||||
BLDC(bldc_motors[$i]);
|
||||
|
||||
if($preview)
|
||||
let($show_threads = 1)
|
||||
bldc_motors();
|
@@ -20,10 +20,10 @@
|
||||
//
|
||||
//! BOM and assembly demonstration
|
||||
//
|
||||
$explode = 1; // Normally set on the command line when generating assembly views with views.py
|
||||
include <../core.scad>
|
||||
include <../vitamins/sheets.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
$explode = 1; // Normally set on the command line when generating assembly views with views.py
|
||||
|
||||
screw = M3_cap_screw;
|
||||
sheet = PMMA3;
|
||||
|
@@ -16,6 +16,7 @@
|
||||
// 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>
|
||||
include <../vitamins/ldrs.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
@@ -16,7 +16,7 @@
|
||||
// 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 <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/ball_bearings.scad>
|
||||
|
@@ -25,9 +25,9 @@ use <../utils/layout.scad>
|
||||
module belt_test() {
|
||||
p2 = [-75, -50];
|
||||
p3 = [-75, 100];
|
||||
p4 = [75, 100];
|
||||
p4 = [ 75, 100];
|
||||
|
||||
p5 = [75 + pulley_pr(GT2x20ob_pulley) - pulley_pr(GT2x16_plain_idler), +pulley_pr(GT2x16_plain_idler)];
|
||||
p5 = [ 75 + pulley_pr(GT2x20ob_pulley) - pulley_pr(GT2x16_plain_idler), +pulley_pr(GT2x16_plain_idler)];
|
||||
p6 = [-75 + pulley_pr(GT2x20ob_pulley) + pulley_pr(GT2x16_plain_idler), -pulley_pr(GT2x16_plain_idler)];
|
||||
|
||||
module pulleys(flip = false) {
|
||||
@@ -52,19 +52,21 @@ module belt_test() {
|
||||
translate(p6) pulley_assembly(GT2x16_plain_idler);
|
||||
}
|
||||
|
||||
path = [ [p5.x, p5.y, pulley_pr(GT2x16_plain_idler)],
|
||||
path = [ [-40, 0, 0],
|
||||
[p6.x, p6.y, -pulley_pr(GT2x16_plain_idler)],
|
||||
[p2.x, p2.y, pulley_pr(GT2x20ob_pulley)],
|
||||
[p3.x, p3.y, pulley_pr(GT2x20ob_pulley)],
|
||||
[p4.x, p4.y, pulley_pr(GT2x20ob_pulley)]
|
||||
[p4.x, p4.y, pulley_pr(GT2x20ob_pulley)],
|
||||
[p5.x, p5.y, pulley_pr(GT2x16_plain_idler)],
|
||||
[40, 0, 0],
|
||||
];
|
||||
|
||||
belt = GT2x6;
|
||||
belt(belt, path, 80, [0, 0]);
|
||||
belt(belt, path, open = true);
|
||||
pulleys();
|
||||
translate_z(20)
|
||||
hflip() {
|
||||
belt(belt, path, 80, [0, 0], belt_colour = grey(90), tooth_colour = grey(50));
|
||||
belt(belt, path, open = true, belt_colour = grey(90), tooth_colour = grey(50));
|
||||
pulleys(flip=true);
|
||||
}
|
||||
|
||||
@@ -72,6 +74,31 @@ module belt_test() {
|
||||
layout([for(b = belts) belt_width(b)], 10)
|
||||
rotate([0, 90, 0])
|
||||
belt(belts[$i], [[0, 0, 20], [0, 1, 20]], belt_colour = $i%2==0 ? grey(90) : grey(20), tooth_colour = $i%2==0 ? grey(70) : grey(50));
|
||||
|
||||
// new example with open loop - this is a simplified example of the style used for example for the BLV 3D printer
|
||||
pulley = GT2x20ob_pulley;
|
||||
idler = GT2x16_plain_idler;
|
||||
corners = [[-75,-50],[75,100]];
|
||||
carriagepos = [0,0];
|
||||
carriagew = 80;
|
||||
|
||||
points = [
|
||||
[carriagepos.x - carriagew / 2, carriagepos.y, 0],
|
||||
[corners[0].x + belt_pulley_pr(belt, pulley) + belt_pulley_pr(belt, idler), carriagepos.y - belt_pulley_pr(belt, idler), idler],
|
||||
[corners[0].x, corners[0].y, pulley],
|
||||
[corners[0].x, corners[1].y, idler],
|
||||
[corners[1].x, corners[1].y, idler],
|
||||
[corners[1].x, carriagepos.y + belt_pulley_pr(belt, idler), idler],
|
||||
[carriagepos.x + carriagew / 2, carriagepos.y, 0]
|
||||
];
|
||||
translate_z(-30) {
|
||||
belt(belt, points, open=true, auto_twist=true);
|
||||
for (p = points)
|
||||
if (is_list(p.z))
|
||||
translate([p.x, p.y, 0])
|
||||
pulley_assembly(p.z);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
30
tests/box_sections.scad
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/box_sections.scad>
|
||||
|
||||
module box_sections() {
|
||||
layout([for(b = box_sections) box_section_size(b).x], 20)
|
||||
box_section(box_sections[$i], 100);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
box_sections();
|
@@ -16,6 +16,7 @@
|
||||
// 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 <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/displays.scad>
|
||||
|
@@ -16,12 +16,13 @@
|
||||
// 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>
|
||||
include <../vitamins/geared_steppers.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
module geared_steppers()
|
||||
layout([for(g = geared_steppers) gs_diameter(g)], 5)
|
||||
layout([for(g = geared_steppers) max(gs_diameter(g), gs_pitch(g) + gs_lug_w(g) / 2)], 5)
|
||||
geared_stepper(geared_steppers[$i]);
|
||||
|
||||
geared_steppers();
|
||||
|
@@ -16,6 +16,7 @@
|
||||
// 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 <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/green_terminals.scad>
|
||||
|
@@ -16,6 +16,7 @@
|
||||
// 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 <../vitamins/hygrometer.scad>
|
||||
|
||||
if($preview)
|
||||
|
@@ -16,6 +16,7 @@
|
||||
// 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 <../vitamins/microview.scad>
|
||||
|
||||
microview(!$preview);
|
||||
|
@@ -16,6 +16,7 @@
|
||||
// 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 <../vitamins/o_ring.scad>
|
||||
|
||||
module o_rings()
|
||||
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 162 KiB |
BIN
tests/png/bldc_motors.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
tests/png/box_sections.png
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 152 KiB |
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 188 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 181 KiB |
@@ -16,8 +16,8 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
include <../printed/press_fit.scad>
|
||||
include <../core.scad>
|
||||
use <../printed/press_fit.scad>
|
||||
|
||||
module press_fits()
|
||||
{
|
||||
|
@@ -22,21 +22,28 @@ include <../vitamins/rails.scad>
|
||||
use <../utils/layout.scad>
|
||||
use <../vitamins/nut.scad>
|
||||
|
||||
length = 200;
|
||||
sheet = 3;
|
||||
pos = 1; //[-1 : 0.1 : 1]
|
||||
|
||||
function rail_carriages(rail) = [for(c = carriages) if(carriage_rail(c) == rail) c];
|
||||
|
||||
module rails()
|
||||
layout([for(l = carriages) carriage_width(l)], 20)
|
||||
layout([for(r = rails) carriage_width(rail_carriages(r)[0])], 20)
|
||||
rotate(-90) {
|
||||
carriage = carriages[$i];
|
||||
rail = carriage_rail(carriage);
|
||||
length = 200;
|
||||
rail = rails[$i];
|
||||
carriages = rail_carriages(rail);
|
||||
carriage = carriages[0];
|
||||
screw = rail_screw(rail);
|
||||
nut = screw_nut(screw);
|
||||
washer = screw_washer(screw);
|
||||
|
||||
rail_assembly(carriage, length, pos * carriage_travel(carriage, length) / 2, $i<2 ? grey(20) : "green", $i<2 ? grey(20) : "red");
|
||||
|
||||
if(len(carriages) > 1)
|
||||
translate([-carriage_travel(carriages[1], length) / 2, 0])
|
||||
carriage(carriages[1]);
|
||||
|
||||
rail_screws(rail, length, sheet + nut_thickness(nut, true) + washer_thickness(washer));
|
||||
|
||||
rail_hole_positions(rail, length, 0)
|
||||
|
@@ -16,6 +16,10 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
// Extra countersink depth
|
||||
sink = 0; // [0 : 0.05: 1.0]
|
||||
|
||||
include <../core.scad>
|
||||
|
||||
module polysink_stl() {
|
||||
@@ -32,9 +36,9 @@ module polysink_stl() {
|
||||
let(s = cs_screws[i])
|
||||
translate([i * 20, 0]) {
|
||||
translate_z(size.z)
|
||||
screw_polysink(s, 2 * size.z + 1);
|
||||
screw_polysink(s, 2 * size.z + 1, sink = sink);
|
||||
|
||||
screw_polysink(s, 2 * size.z + 1, alt = true);
|
||||
screw_polysink(s, 2 * size.z + 1, alt = true, sink = sink);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -51,15 +51,20 @@ function coreXY_lower_tooth_colour(type) = type[8]; //! Colour of the lower b
|
||||
// relative to the anchor pulley so that the belts align properly
|
||||
function coreXY_drive_pulley_x_alignment(type) = //! Belt alignment offset of the drive pulley relative to the anchor pulley
|
||||
(pulley_od(coreXY_drive_pulley(type)) - pulley_od(coreXY_toothed_idler(type))) / 2;
|
||||
|
||||
function coreXY_coincident_separation(type) = //! Value of x, y separation to make y-carriage pulleys coincident
|
||||
[ -coreXY_plain_idler_offset(type).x, -(pulley_od(coreXY_plain_idler(type)) + pulley_od(coreXY_toothed_idler(type)))/2, 0 ];
|
||||
|
||||
function coreXY_plain_idler_offset(type) = //! Offset of y-carriage plain idler
|
||||
[ (pulley_od(coreXY_plain_idler(type)) + pulley_od(coreXY_drive_pulley(type))) / 2 + coreXY_drive_pulley_x_alignment(type), pulley_od(coreXY_plain_idler(type))/2, 0 ];
|
||||
|
||||
function coreXY_toothed_idler_offset(type) = //! offset of y-carriage toothed idler
|
||||
[ 0, -pulley_pr(coreXY_toothed_idler(type)), 0 ];
|
||||
|
||||
// helper functions for positioning idlers when the stepper motor drive pulley is offset
|
||||
function coreXY_drive_toothed_idler_offset(type) = //! Offset of toothed drive idler pulley
|
||||
[ 0, coreXY_drive_pulley_x_alignment(type), 0 ];
|
||||
|
||||
function coreXY_drive_plain_idler_offset(type) = //! Offset of plain drive idler pulley
|
||||
[ coreXY_plain_idler_offset(type).x, -(pulley_od(coreXY_plain_idler(type)) + pulley_od(coreXY_drive_pulley(type))) / 2, 0 ];
|
||||
|
||||
@@ -86,7 +91,7 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
|
||||
|
||||
// toothed idler for offset stepper motor drive pulley
|
||||
p3t_type = coreXY_toothed_idler(type);
|
||||
p3t = [ -size.x / 2 + (drive_pulley_offset.x > 0 ? 0 : 2*coreXY_drive_pulley_x_alignment(type)),
|
||||
p3t = [ -size.x / 2 + (drive_pulley_offset.x > 0 ? 0 : 2 * coreXY_drive_pulley_x_alignment(type)),
|
||||
size.y / 2 + coreXY_drive_pulley_x_alignment(type) + drive_pulley_offset.y
|
||||
];
|
||||
|
||||
@@ -102,11 +107,11 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
|
||||
size.y / 2 - pulley_od(p3p_type) / 2 - pulley_od(p3d_type) / 2 + drive_pulley_offset.y
|
||||
];
|
||||
|
||||
// dummy pulleys for y separation
|
||||
p5_type = p4_type;
|
||||
p5 = [ pos.x - size.x / 2, -size.y / 2 + pos.y + separation_y / 2 ];
|
||||
p6_type = p0_type;
|
||||
p6 = [ pos.x - size.x / 2, -size.y / 2 + pos.y - separation_y / 2 ];
|
||||
// Start and end points
|
||||
start_p = [ pos.x - size.x / 2 + x_gap / 2, -size.y / 2 + pos.y - separation_y / 2, 0 ];
|
||||
end_p = [ pos.x - size.x / 2 - x_gap / 2, -size.y / 2 + pos.y + separation_y / 2, 0 ];
|
||||
|
||||
//p6_type = p0_type;
|
||||
|
||||
module show_pulleys(show_pulleys) {// Allows the pulley colour to be set for debugging
|
||||
if (is_list(show_pulleys))
|
||||
@@ -119,16 +124,21 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
|
||||
show_pulleys(show_pulleys) {
|
||||
translate(p0)
|
||||
pulley_assembly(p0_type); // y-carriage toothed pulley
|
||||
|
||||
translate(p1)
|
||||
pulley_assembly(p1_type); // bottom right toothed idler pulley
|
||||
|
||||
translate(p2)
|
||||
pulley_assembly(p2_type); // bottom left anchor toothed idler pulley
|
||||
|
||||
translate(p3d)
|
||||
hflip(hflip)
|
||||
pulley_assembly(p3d_type); // top left stepper motor drive pulley
|
||||
|
||||
if (drive_pulley_offset.x) { // idler pulleys for offset stepper motor drive pulley
|
||||
translate(p3t)
|
||||
pulley_assembly(p3t_type); // toothed idler
|
||||
|
||||
translate(p3p)
|
||||
pulley_assembly(p3p_type); // plain idler
|
||||
}
|
||||
@@ -157,41 +167,38 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
|
||||
[ p3t.x, p3t.y, pulley_od(p3t_type) / 2 ],
|
||||
[ p4.x, p4.y, -pulley_od(p4_type) / 2 ]
|
||||
];
|
||||
path1 = [ // use eps for corner radius to get sharp corners so this part of the belt is deleted by the gap
|
||||
[ p5.x, p5.y, eps ],
|
||||
[ p6.x, p6.y, eps ]
|
||||
];
|
||||
|
||||
belt = coreXY_belt(type);
|
||||
|
||||
path0 = drive_pulley_offset.x == 0 ? concat(path0a, path0b) : drive_pulley_offset.x > 0 ? concat(path0a, path0c) : concat(path0a, path0d);
|
||||
path = separation_y == 0 ? path0 : concat(path0, path1);
|
||||
path = concat([start_p], path0, [end_p]);
|
||||
|
||||
belt(type = belt,
|
||||
points = path,
|
||||
gap = [ x_gap + eps, abs(separation_y) + 2 ],
|
||||
gap_pos = [ pos.x - size.x / 2, pos.y - size.y / 2 + belt_pitch_height(belt) - belt_thickness(belt) / 2 ],
|
||||
open = true,
|
||||
belt_colour = lower_belt ? coreXY_lower_belt_colour(type) : coreXY_upper_belt_colour(type),
|
||||
tooth_colour = lower_belt ? coreXY_lower_tooth_colour(type) : coreXY_upper_tooth_colour(type));
|
||||
}
|
||||
|
||||
module coreXY(type, size, pos, separation, x_gap, plain_idler_offset = 0, upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = false) { //! Wrapper module to draw both belts of a coreXY setup
|
||||
module 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
|
||||
translate([size.x / 2 - separation.x / 2, size.y / 2, -separation.z / 2]) {
|
||||
// lower belt
|
||||
hflip()
|
||||
hflip(!left_lower)
|
||||
explode(25)
|
||||
coreXY_half(type, size, [size.x - pos.x - separation.x, pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true);
|
||||
coreXY_half(type, size, [size.x - pos.x - separation.x/2 - (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true);
|
||||
|
||||
// upper belt
|
||||
translate([separation.x, 0, separation.z])
|
||||
explode(25)
|
||||
coreXY_half(type, size, [pos.x, pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip=false);
|
||||
hflip(left_lower)
|
||||
explode(25)
|
||||
coreXY_half(type, size, [pos.x + separation.x/2 + (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip = false);
|
||||
}
|
||||
}
|
||||
|
||||
module 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) { //! Draw the coreXY belts
|
||||
module 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
|
||||
assert(coreXYPosBL.z == coreXYPosTR.z);
|
||||
|
||||
coreXYSize = coreXYPosTR - coreXYPosBL;
|
||||
translate(coreXYPosBL)
|
||||
coreXY(type, coreXYSize, [carriagePosition.x - coreXYPosBL.x + separation.x / 2, carriagePosition.y - coreXYPosBL.y], separation = separation, x_gap = x_gap, plain_idler_offset = 0, upper_drive_pulley_offset = upper_drive_pulley_offset, lower_drive_pulley_offset = lower_drive_pulley_offset, show_pulleys = show_pulleys);
|
||||
coreXY(type, coreXYSize, [carriagePosition.x - coreXYPosBL.x, carriagePosition.y - coreXYPosBL.y], separation = separation, x_gap = x_gap, plain_idler_offset = 0, upper_drive_pulley_offset = upper_drive_pulley_offset, lower_drive_pulley_offset = lower_drive_pulley_offset, show_pulleys = show_pulleys, left_lower = left_lower);
|
||||
}
|
||||
|
@@ -88,6 +88,7 @@ function scale(v) = let(s = is_list(v) ? v : [v, v, v]) //! Generate a 4x4 matr
|
||||
[0, 0, 0, 1]
|
||||
];
|
||||
|
||||
function vec2(v) = [v.x, v.y]; //! Return a 2 vector with the first two elements of `v`
|
||||
function vec3(v) = [v.x, v.y, v.z]; //! Return a 3 vector with the first three elements of `v`
|
||||
function vec4(v) = [v.x, v.y, v.z, 1]; //! Return a 4 vector with the first three elements of `v`
|
||||
function transform(v, m) = vec3(m * [v.x, v.y, v.z, 1]); //! Apply 4x4 transform to a 3 vector by extending it and cropping it again
|
||||
@@ -153,3 +154,36 @@ function circle_intersect(c1, r1, c2, r2) = //! Calculate one point where tw
|
||||
d = norm(v), // Distance between centres
|
||||
a = atan2(v.z, v.x) - acos((sqr(d) + sqr(r2) - sqr(r1)) / (2 * d * r2)) // Cosine rule to find angle from c2
|
||||
) c2 + r2 * [cos(a), 0, sin(a)]; // Point on second circle
|
||||
|
||||
function map(v, func) = [ for (e = v) func(e) ]; //! make a new vector where the func function argument is applied to each element of the vector v
|
||||
function mapi(v, func) = [ for (i = [0:len(v)-1]) func(i,v[i]) ]; //! 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.
|
||||
function reduce(v, func, unity) = let ( r = function(i,val) i == len(v) ? val : r(i + 1, func(val, v[i])) ) r(0, 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
|
||||
function sumv(v) = reduce(v, function(a, b) a + b, 0); //! sum a vector of values that can be added with "+"
|
||||
|
||||
function xor(a,b) = (a && !b) || (!a && b); //! Logical exclusive OR
|
||||
function cuberoot(x)= sign(x)*abs(x)^(1/3);
|
||||
|
||||
function quadratic_real_roots(a, b, c) = //! Returns real roots of a quadratic equation, biggest first. Returns empty list if no real roots
|
||||
let(2a = 2 * a,
|
||||
2c = 2 * c,
|
||||
det = b^2 - 2a * 2c
|
||||
) det < 0 ? [] :
|
||||
let(r = sqrt(det),
|
||||
x1 = b < 0 ? 2c / (-b + r) : (-b - r) / 2a,
|
||||
x2 = b < 0 ? (-b + r) / 2a : 2c / (-b - r)
|
||||
) [x2, x1];
|
||||
|
||||
function cubic_real_roots(a, b, c, d) = //! Returns real roots of cubic equation
|
||||
let(b = b / a,
|
||||
c = c / a,
|
||||
d = d / a,
|
||||
inflection = -b / 3,
|
||||
p = c - b^2 / 3,
|
||||
q = 2 * b^3 / 27 - b * c / 3 + d,
|
||||
det = q^2 / 4 + p^3 / 27,
|
||||
roots = !p && !q ? 1 : nearly_zero(det) ? 2 : det < 0 ? 3 : 1,
|
||||
r = sqrt(det),
|
||||
x = cuberoot(-q / 2 - r) + cuberoot(-q / 2 + r)
|
||||
) roots == 1 ? [x] :
|
||||
roots == 2 ? [3 * q /p + inflection, -3 * q / p / 2 + inflection] :
|
||||
[for(i = [0 : roots - 1]) 2 * sqrt(-p / 3) * cos(acos(3 * q * sqrt(-3 / p) / p / 2) - i * 120) + inflection];
|
||||
|
@@ -24,6 +24,7 @@
|
||||
//! Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/maths.scad>
|
||||
|
||||
function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two circles represented as [x,y,r]
|
||||
let(
|
||||
@@ -36,56 +37,66 @@ function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two
|
||||
v = [cos(theta), sin(theta)]
|
||||
)[ p1 + r1 * v, p2 + r2 * v ];
|
||||
|
||||
function rounded_polygon_tangents(points) = //! Compute the straight sections needed to draw and to compute the lengths
|
||||
let(len = len(points))
|
||||
[for(i = [0 : len - 1])
|
||||
let(ends = circle_tangent(points[i], points[(i + 1) % len]))
|
||||
for(end = [0, 1])
|
||||
ends[end]];
|
||||
function rounded_polygon_arcs(points, tangents) = //! Compute the arcs at the points, for each point [angle, rotate_angle, length]
|
||||
let(
|
||||
len = len(points)
|
||||
) [ for (i = [0: len-1])
|
||||
let(
|
||||
p1 = vec2(tangents[(i - 1 + len) % len][1]),
|
||||
p2 = vec2(tangents[i][0]),
|
||||
p = vec2(points[i]),
|
||||
v1 = p1 - p,
|
||||
v2 = p2 - p,
|
||||
sr = points[i][2],
|
||||
r = abs(sr),
|
||||
a = r < 0.001 ? 0 : let( aa = acos((v1 * v2) / sqr(r)) ) cross(v1, v2) * sign(sr) <= 0 ? aa : 360 - aa,
|
||||
l = PI * a * r / 180,
|
||||
v0 = [r, 0],
|
||||
v = let (
|
||||
vv = norm(v0 - v2) < 0.001 ? 0 : abs(v2.y) < 0.001 ? 180 :
|
||||
let( aa = acos((v0 * v2) / sqr(r)) ) cross(v0, v2) * sign(sr) <= 0 ? aa : 360 - aa
|
||||
) sr > 0 ? 360 - vv : vv - a
|
||||
) [a, v, l]
|
||||
];
|
||||
|
||||
function sumv(v, i = 0, sum = 0) = i == len(v) ? sum : sumv(v, i + 1, sum + v[i]);
|
||||
function rounded_polygon_tangents(points) = //! Compute the straight sections between a point and the next point, for each section [start_point, end_point, length]
|
||||
let(len = len(points))
|
||||
[ for(i = [0 : len - 1])
|
||||
let(ends = circle_tangent(points[i], points[(i + 1) % len]))
|
||||
[ends[0], ends[1], norm(ends[0] - ends[1])]
|
||||
];
|
||||
|
||||
// the cross product of 2D vectors is the area of the parallelogram between them. We use the sign of this to decide if the angle is bigger than 180.
|
||||
function rounded_polygon_length(points, tangents) = //! Calculate the length given the point list and the list of tangents computed by ` rounded_polygon_tangents`
|
||||
let(
|
||||
len = len(points),
|
||||
indices = [0 : len - 1],
|
||||
straights = [for(i = indices) norm(tangents[2 * i] - tangents[2 * i + 1])],
|
||||
arcs = [for(i = indices) let(p1 = tangents[2 * i + 1],
|
||||
p2 = tangents[(2 * i + 2) % (2 * len)],
|
||||
corner = points[(i + 1) % len],
|
||||
c = [corner.x, corner.y],
|
||||
v1 = p1 - c,
|
||||
v2 = p2 - c,
|
||||
r = abs(corner.z),
|
||||
a = acos((v1 * v2) / sqr(r))) r ? PI * (cross(v1, v2) <= 0 ? a : 360 - a) * r / 180 : 0]
|
||||
)
|
||||
sumv(concat(straights, arcs));
|
||||
arcs = rounded_polygon_arcs(points, tangents)
|
||||
) sumv( map( concat(tangents, arcs), function(e) e[2] ) );
|
||||
|
||||
module rounded_polygon(points, _tangents = undef) { //! Draw the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
||||
len = len(points);
|
||||
indices = [0 : len - 1];
|
||||
tangents = _tangents ? _tangents : rounded_polygon_tangents(points);
|
||||
|
||||
difference(convexity = points) {
|
||||
difference() {
|
||||
union() {
|
||||
for(i = indices)
|
||||
for(i = indices, last = (i - 1 + len) % len)
|
||||
if(points[i][2] > 0)
|
||||
hull() {
|
||||
translate([points[i].x, points[i].y])
|
||||
translate(vec2(points[i]))
|
||||
circle(points[i][2]);
|
||||
polygon([tangents[(2 * i - 1 + 2 * len) % (2 * len)], tangents[2 * i], [points[i].x, points[i].y]]);
|
||||
|
||||
polygon([vec2(tangents[last][1]), vec2(tangents[i][0]), vec2(points[i])]);
|
||||
}
|
||||
|
||||
polygon(tangents, convexity = points);
|
||||
polygon([for(t = tangents) each(vec2(t))], convexity = points);
|
||||
}
|
||||
for(i = indices)
|
||||
for(i = indices, last = (i - 1 + len) % len)
|
||||
if(points[i][2] < 0)
|
||||
hull() {
|
||||
translate([points[i].x, points[i].y])
|
||||
translate(vec2(points[i]))
|
||||
circle(-points[i][2]);
|
||||
|
||||
polygon([tangents[(2 * i - 1 + 2 * len) % (2 *len)], tangents[2 * i], [points[i].x, points[i].y]]);
|
||||
polygon([vec2(tangents[last][1]), vec2(tangents[i][0]), vec2(points[i])]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -50,6 +50,7 @@ function thread_profile(h, crest, angle, overlap = 0.1) = //! Create thread prof
|
||||
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], [crest / 2, h, 0], [base / 2, -overlap, 0]];
|
||||
|
||||
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or female thread, ends can be tapered, chamfered or square
|
||||
assert(is_undef(colour) || is_list(colour), "Thread colour must be in [r, g, b] form");
|
||||
//
|
||||
// Apply colour if defined
|
||||
//
|
||||
@@ -155,7 +156,7 @@ module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, st
|
||||
translate([0, offset])
|
||||
square([r, len]);
|
||||
|
||||
translate([0, bot_chamfer_h])
|
||||
translate([0, offset + bot_chamfer_h])
|
||||
square([r + h + overlap, len - top_chamfer_h - bot_chamfer_h]);
|
||||
}
|
||||
if(!solid)
|
||||
@@ -190,7 +191,8 @@ module female_metric_thread(d, pitch, length, center = true, top = -1, bot = -1,
|
||||
}
|
||||
|
||||
function metric_coarse_pitch(d) //! Convert metric diameter to pitch
|
||||
= d == 1.6 ? 0.35 // M1.6
|
||||
= d == 1.4 ? 0.3 // M1.4
|
||||
: d == 1.6 ? 0.35 // M1.6
|
||||
: [0.4, // M2
|
||||
0.45,// M2.5
|
||||
0.5, // M3
|
||||
|
@@ -18,19 +18,29 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! Models timing belt running over toothed or smooth pulleys and calculates an accurate length.
|
||||
//! Only models 2D paths, so not crossed belt core XY!
|
||||
//! Models timing belt running in a path over toothed or smooth pulleys and calculates an accurate length.
|
||||
//! Only models 2D paths, belt may twist to support crossed belt core XY and other designes where the belt twists!
|
||||
//!
|
||||
//! By default the path is a closed loop. An open loop can be specified by specifying `open=true`, and in that case the start and end points are not connected, leaving the loop open.
|
||||
//!
|
||||
//! To get a 180 degree twist of the loop, you can use the `twist` argument. `Twist` can be a single number, and in that case the belt will twist after
|
||||
//! the position with that number. Alternatively `twist` can be a list of boolean values with a boolean for each position; the belt will then twist after
|
||||
//! the position that have a `true` value in the `twist` list. If the path is specified with pulley/idler types, then you can use `auto_twist=true`; in
|
||||
//! that case the belt will automatically twist so the back of the belt always runs against idlers and the tooth side runs against pullies. If you use
|
||||
//! `open=true` then you might also use `start_twist=true` to let the belt start the part with the back side out.
|
||||
//!
|
||||
//! The path must be specified as a list of positions. Each position should be either a vector with `[x, y, pulley]` or `[x, y, r]`. A pully is a type from
|
||||
//! `pulleys.scad`, and correct radius and angle will automatically be calculated. Alternatively a radius can be specified directly.
|
||||
//!
|
||||
//! To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius.
|
||||
//!
|
||||
//! By default the path is a closed loop but a gap length and position can be specified to make open loops.
|
||||
//! To draw the gap its XY position is specified by `gap_pos`. `gap_pos.z` can be used to specify a rotation if the gap is not at the bottom of the loop.
|
||||
//! Alternativley you can just specify smooth pulleys in the path, and it will then happen automatically.
|
||||
//!
|
||||
//! Individual teeth are not drawn, instead they are represented by a lighter colour.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/rounded_polygon.scad>
|
||||
use <../utils/maths.scad>
|
||||
use <pulley.scad>
|
||||
|
||||
function belt_pitch(type) = type[1]; //! Pitch in mm
|
||||
function belt_width(type) = type[2]; //! Width in mm
|
||||
@@ -41,47 +51,102 @@ function belt_pitch_height(type) = type[5] + belt_tooth_height(type); //! Offset
|
||||
function belt_pitch_to_back(type) = belt_thickness(type) - belt_pitch_height(type); //! Offset of the back from the pitch radius
|
||||
//
|
||||
// We model the belt path at the pitch radius of the pulleys and the pitch line of the belt to get an accurate length.
|
||||
// The belt is then drawn by offseting each side from the pitch line.
|
||||
//
|
||||
module belt(type, points, gap = 0, gap_pos = undef, belt_colour = grey(20), tooth_colour = grey(50)) { //! Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified
|
||||
module belt(type, points, belt_colour = grey(20), tooth_colour = grey(50), open = false, twist = undef, auto_twist = false, start_twist = false) { //! Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless open is specified
|
||||
width = belt_width(type);
|
||||
pitch = belt_pitch(type);
|
||||
thickness = belt_thickness(type);
|
||||
|
||||
info = _belt_points_info(type, points, open, twist, auto_twist, start_twist);
|
||||
dotwist = info[0]; // array of booleans, true if a twist happen after the position
|
||||
twisted = info[1]; // array of booleans, true if the belt is twisted at the position
|
||||
pointsx = info[2]; // array of [x,y,r], r is negative if left-angle (points may have pulleys as third element, but pointsx have radi)
|
||||
tangents = info[3];
|
||||
arcs = info[4];
|
||||
length = ceil(_belt_length(info, open) / pitch) * pitch;
|
||||
|
||||
part = str(type[0],pitch);
|
||||
vitamin(str("belt(", no_point(part), "x", width, ", ", points, arg(gap, 0), arg(gap_pos, undef), "): Belt ", part," x ", width, "mm x ", length, "mm"));
|
||||
vitamin(str("belt(", no_point(part), "x", width, ", ", pointsx, "): Belt ", part," x ", width, "mm x ", length, "mm"));
|
||||
|
||||
len = len(points);
|
||||
|
||||
tangents = rounded_polygon_tangents(points);
|
||||
|
||||
length = ceil((rounded_polygon_length(points, tangents) - (is_list(gap) ? gap.x + gap.y : gap)) / pitch) * pitch;
|
||||
|
||||
module shape() rounded_polygon(points, tangents);
|
||||
|
||||
ph = belt_pitch_height(type);
|
||||
th = belt_tooth_height(type);
|
||||
module gap()
|
||||
if(gap)
|
||||
translate([gap_pos.x, gap_pos.y])
|
||||
rotate(is_undef(gap_pos.z) ? 0 : gap_pos.z)
|
||||
translate([0, ph - thickness / 2])
|
||||
square(is_list(gap) ? [gap.x, gap.y + thickness + eps] : [gap, thickness + eps], center = true);
|
||||
ph = belt_pitch_height(type);
|
||||
module beltp() translate([ph - th, -width / 2]) square([th, width]);
|
||||
module beltb() translate([ph - thickness, -width / 2]) square([thickness - th, width]);
|
||||
|
||||
color(belt_colour)
|
||||
linear_extrude(width, center = true)
|
||||
difference() {
|
||||
offset(-ph + thickness ) shape();
|
||||
offset(-ph + th) shape();
|
||||
gap();
|
||||
}
|
||||
for (i = [0 : len - (open ? 2 : 1)]) {
|
||||
p1 = tangents[i].x;
|
||||
p2 = tangents[i].y;
|
||||
v = p2-p1;
|
||||
a = atan(v.y / v.x) - (v.x < 0 ? 180 : 0); //a2(p2-p1);
|
||||
l = norm(v);
|
||||
translate(p1) rotate([-90, 0, a - 90]) {
|
||||
twist = dotwist[i] ? 180 : 0;
|
||||
mirrored = twisted[i] ? 1 : 0;
|
||||
color(tooth_colour) linear_extrude(l, twist = twist) mirror([mirrored, 0, 0]) beltp();
|
||||
color(belt_colour) linear_extrude(l, twist = twist) mirror([mirrored, 0, 0]) beltb();
|
||||
}
|
||||
}
|
||||
|
||||
color(tooth_colour)
|
||||
linear_extrude(width, center = true)
|
||||
difference() {
|
||||
offset(-ph + th) shape();
|
||||
offset(-ph) shape();
|
||||
gap();
|
||||
}
|
||||
for (i = [(open ? 1 : 0) : len - (open ? 2 : 1)]) {
|
||||
p = pointsx[i];
|
||||
arc = arcs[i];
|
||||
translate([p.x, p.y]) rotate([0, 0, arc[1]]) {
|
||||
mirrored = xor(twisted[i], p[2] < 0) ? 0 : 1;
|
||||
color(tooth_colour) rotate_extrude(angle = arc[0]) translate([abs(p[2]), 0, 0]) mirror([mirrored, 0, 0]) beltp();
|
||||
color(belt_colour) rotate_extrude(angle = arc[0]) translate([abs(p[2]), 0, 0]) mirror([mirrored, 0, 0]) beltb();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function belt_length(points, gap = 0) = rounded_polygon_length(points, rounded_polygon_tangents(points)) - gap; //! Compute belt length given path and optional gap
|
||||
function _belt_points_info(type, points, open, twist, auto_twist, start_twist) = //! Helper function that calculates [twist, istwisted, points, tangents, arcs]
|
||||
let(
|
||||
len = len(points),
|
||||
isleft = function(i) let(
|
||||
p = vec2(points[i]),
|
||||
p0 = vec2(points[(i - 1 + len) % len]),
|
||||
p1 = vec2(points[(i + 1) % len])
|
||||
) cross(p-p0,p1-p) > 0,
|
||||
dotwist = function(i, istwisted) let( in = (i + 1) % len )
|
||||
is_list(twist) ? twist[i] :
|
||||
!is_undef(twist) ? i == twist :
|
||||
open && is_list(points[in][2]) && auto_twist ? !pulley_teeth(points[in][2]) && !xor(isleft(in), istwisted) :
|
||||
false,
|
||||
twisted = [
|
||||
for (
|
||||
i = 0,
|
||||
istwisted = start_twist,
|
||||
twist = dotwist(i, istwisted),
|
||||
nexttwisted = xor(twist, istwisted);
|
||||
i < len;
|
||||
i = i + 1,
|
||||
istwisted = nexttwisted,
|
||||
twist = dotwist(i, istwisted),
|
||||
nexttwisted = xor(twist, istwisted)
|
||||
) [twist, istwisted] ],
|
||||
pointsx = mapi(points, function(i, p) !is_list(p[2]) ? p : [p.x, p.y, let( // if p[2] is not a list it is just r, otherwise it is taken to be a pulley and we calculate r
|
||||
isleft = isleft(i),
|
||||
r = belt_pulley_pr(type, p[2], twisted = !xor(pulley_teeth(p[2]), xor(isleft, twisted[i][1])))
|
||||
) isleft ? -r : r ] ),
|
||||
tangents = rounded_polygon_tangents(pointsx),
|
||||
arcs = rounded_polygon_arcs(pointsx, tangents)
|
||||
) [ [ for (t = twisted) t[0] ], [ for (t = twisted) t[1] ], pointsx, tangents, arcs];
|
||||
|
||||
function belt_pulley_pr(type, pulley, twisted=false) = //! Pitch radius. Default it expects the belt tooth to be against a toothed pulley an the backside to be against a smooth pulley (an idler). If `twisted` is true, the the belt is the other way around.
|
||||
let(
|
||||
thickness = belt_thickness(type),
|
||||
ph = belt_pitch_height(type)
|
||||
) pulley_teeth(pulley)
|
||||
? pulley_pr(pulley) + (twisted ? thickness - ph : 0 )
|
||||
: pulley_ir(pulley) + (twisted ? ph : thickness - ph );
|
||||
|
||||
|
||||
function belt_length(type, points, open = false) = _belt_length(_belt_points_info(type, points, open), open); //! Compute belt length given path
|
||||
|
||||
function _belt_length(info, open) = let(
|
||||
len = len(info[0]),
|
||||
d = open ? 1 : 0,
|
||||
tangents = slice(info[3], 0, len - d) ,
|
||||
arcs = slice(info[4], d, len - d)
|
||||
) sumv( map( concat(tangents, arcs), function(e) e[2] ));
|
||||
|
286
vitamins/bldc_motor.scad
Normal file
@@ -0,0 +1,286 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Brushless DC electric motor
|
||||
//
|
||||
include <NopSCADlib/core.scad>
|
||||
|
||||
use <NopSCADlib/vitamins/rod.scad>
|
||||
use <NopSCADlib/utils/thread.scad>
|
||||
use <NopSCADlib/utils/tube.scad>
|
||||
|
||||
|
||||
function BLDC_diameter(type) = type[1]; //! Diameter of motor
|
||||
function BLDC_height(type) = type[2]; //! Height of motor including boss, if any, but excluding prop shaft
|
||||
function BLDC_shaft_diameter(type) = type[3]; //! shaft diameter
|
||||
function BLDC_shaft_length(type) = type[4]; //! Total shaft length
|
||||
function BLDC_shaft_offset(type) = type[5]; //! shaft offset from base
|
||||
function BLDC_body_colour(type) = type[6]; //! Body colour
|
||||
function BLDC_base_diameter(type) = type[7]; //! Base diameter
|
||||
function BLDC_base_height_1(type) = type[8]; //! Base height 1
|
||||
function BLDC_base_height_2(type) = type[9]; //! Base height 2
|
||||
function BLDC_base_hole_diameter(type) = type[10]; //! Base hole diameter
|
||||
function BLDC_base_holes(type) = type[11]; //! Base holes
|
||||
function BLDC_base_open(type) = type[12]; //! Base open
|
||||
function BLDC_wire_diameter(type) = type[13]; //! Wire diameter
|
||||
function BLDC_side_colour(type) = type[14]; //! Side colour
|
||||
function BLDC_bell_diameter(type) = type[15]; //! Bell diameter
|
||||
function BLDC_bell_height_1(type) = type[16]; //! Bell height 1
|
||||
function BLDC_bell_height_2(type) = type[17]; //! Bell height 2
|
||||
function BLDC_bell_hole_diameter(type) = type[18]; //! Bell hole diameter
|
||||
function BLDC_bell_holes(type) = type[19]; //! Bell holes
|
||||
function BLDC_bell_spokes(type) = type[20]; //! Bell spoke count
|
||||
function BLDC_boss_diameter(type) = type[21]; //! Boss diameter
|
||||
function BLDC_boss_height(type) = type[22]; //! Boss height
|
||||
function BLDC_prop_shaft_length(type) = type[23]; //! Prop shaft length, including threaded section
|
||||
function BLDC_prop_shaft_diameter(type) = type[24]; //! Diameter of unthreaded portion of prop shaft
|
||||
function BLDC_prop_shaft_thread_length(type) = type[25]; //! Length of threaded section of prop shaft
|
||||
function BLDC_prop_shaft_thread_diameter(type) = type[26]; //! Diameter of threaded section of prop shaft
|
||||
|
||||
bldc_cap_colour = grey(50);
|
||||
bldc_shaft_colour = grey(90);
|
||||
bldc_bearing_colour = grey(80);
|
||||
|
||||
module BLDC(type) { //! Draw specified BLDC motor
|
||||
vitamin(str("BLDC(", type[0], "): Brushless DC motor ", type[0]));
|
||||
|
||||
body_colour = BLDC_body_colour(type);
|
||||
side_colour = BLDC_side_colour(type);
|
||||
body_diameter = BLDC_diameter(type);
|
||||
wall_thickness = 1;
|
||||
|
||||
height = BLDC_height(type) - BLDC_boss_height(type);
|
||||
|
||||
module feet(base_diameter) {
|
||||
holes = BLDC_base_holes(type);
|
||||
hole_count = is_list(holes) ? len(holes) : 4;
|
||||
for(i = [0 : 1 : hole_count - 1]) {
|
||||
spacing = is_list(holes) ? holes[i] : holes;
|
||||
radius = base_diameter / 2 - spacing / 2;
|
||||
rotate(i * 360 / hole_count + (hole_count == 4 ? 45 : 0))
|
||||
difference() {
|
||||
hull() {
|
||||
circle(r = radius);
|
||||
translate([-spacing / 2, 0])
|
||||
circle(r = radius);
|
||||
}
|
||||
translate([-spacing / 2, 0])
|
||||
circle(d = BLDC_base_hole_diameter(type));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module cutout(d1, d2, r, h) {
|
||||
translate_z(-eps)
|
||||
linear_extrude(h + 2 * eps)
|
||||
hull() {
|
||||
translate([d1 / 2, 0])
|
||||
circle(r = r);
|
||||
translate([d2 / 2, -r])
|
||||
square([eps, 2 * r]);
|
||||
}
|
||||
}
|
||||
|
||||
module cutout2(d1, r1, d2, r2, h) {
|
||||
translate_z(-eps)
|
||||
linear_extrude(h + 2 * eps)
|
||||
hull() {
|
||||
translate([d1 / 2, 0])
|
||||
circle(r = r1);
|
||||
translate([d2 / 2, 0])
|
||||
circle(r = r2);
|
||||
}
|
||||
}
|
||||
|
||||
module base() {
|
||||
base_diameter = BLDC_base_diameter(type);
|
||||
h1 = BLDC_base_height_1(type);
|
||||
h2 = BLDC_base_height_2(type);
|
||||
color(body_colour)
|
||||
if (BLDC_base_open(type)) {
|
||||
linear_extrude(h1)
|
||||
difference() {
|
||||
union() {
|
||||
feet(base_diameter);
|
||||
circle(d = 3 * BLDC_shaft_diameter(type));
|
||||
}
|
||||
circle(d = 2 * BLDC_shaft_diameter(type));
|
||||
}
|
||||
translate_z(h1)
|
||||
cylinder(d = 3 * BLDC_shaft_diameter(type), h = h2);
|
||||
} else {
|
||||
difference() {
|
||||
union() {
|
||||
render(convexity = 8)
|
||||
linear_extrude(h1)
|
||||
difference() {
|
||||
circle(d = base_diameter);
|
||||
circle(d = 2 * BLDC_shaft_diameter(type));
|
||||
BLDC_base_screw_positions(type)
|
||||
circle(d = BLDC_base_hole_diameter(type));
|
||||
}
|
||||
rotate_extrude()
|
||||
polygon([ [base_diameter / 2, 0], [body_diameter / 2, h1], [body_diameter / 2, h1+h2], [body_diameter / 2 - wall_thickness, h1 + h2], [body_diameter / 2 - wall_thickness, h1], [base_diameter / 2, h1] ]);
|
||||
}
|
||||
r = body_diameter > 40 ? 2 : body_diameter * PI / (8 * 3);
|
||||
if (body_diameter > 40) {
|
||||
r = 2;
|
||||
// cutout for wires
|
||||
translate_z(h2 /2)
|
||||
cutout(base_diameter, body_diameter, 6, h1);
|
||||
for (a = [90, 180, 270])
|
||||
rotate(a) {
|
||||
cutout(base_diameter - 2 * r, body_diameter, r, h1 + h2 / 2);
|
||||
for (b = [-90 / 4, 90 / 4])
|
||||
rotate(b)
|
||||
cutout(base_diameter - 5 * r, body_diameter, r, h1 + h2 / 2);
|
||||
}
|
||||
} else {
|
||||
r = body_diameter * PI / (8 * 3);
|
||||
for (a = [0, 90, 180, 270])
|
||||
rotate(a)
|
||||
cutout(base_diameter, body_diameter, r, h1);
|
||||
}
|
||||
}
|
||||
}
|
||||
color(bldc_bearing_colour)
|
||||
translate_z(0.25)
|
||||
tube(or = BLDC_shaft_diameter(type), ir = BLDC_shaft_diameter(type) / 2, h = h1, center = false);
|
||||
|
||||
if (show_threads)
|
||||
BLDC_base_screw_positions(type)
|
||||
female_metric_thread(BLDC_base_hole_diameter(type), metric_coarse_pitch(BLDC_base_hole_diameter(type)), h1, center = false, colour = body_colour);
|
||||
|
||||
wire_diameter = BLDC_wire_diameter(type);
|
||||
for (i = [0 : 2])
|
||||
color(wire_diameter >= 3 ? ["yellow", grey(20), "red"][i] : grey(20))
|
||||
translate([body_diameter / 5, (i - 1) * wire_diameter, wire_diameter / 2 + 0.25 + (body_diameter > 40 ? h2/2 : 0)])
|
||||
rotate([0, 90, 0])
|
||||
cylinder(r = wire_diameter / 2, h = body_diameter / 2, center = false);
|
||||
|
||||
} // end module base
|
||||
|
||||
module bell() {
|
||||
bell_diameter = BLDC_bell_diameter(type);
|
||||
h1 = BLDC_bell_height_1(type);
|
||||
h2 = BLDC_bell_height_2(type);
|
||||
gap = BLDC_base_open(type) ? 0 : height > 20 ? 0.5 : 0.25;
|
||||
side_length = height - h2 - h1 - gap - BLDC_base_height_1(type) - BLDC_base_height_2(type);
|
||||
|
||||
color(body_colour) {
|
||||
translate_z(height - h2) {
|
||||
difference() {
|
||||
union() {
|
||||
top_thickness = min(h2, 2);
|
||||
render(convexity = 8)
|
||||
translate_z(h2 - top_thickness)
|
||||
linear_extrude(top_thickness)
|
||||
difference() {
|
||||
circle(d = bell_diameter);
|
||||
if (BLDC_shaft_length(type) > height)
|
||||
circle(d = BLDC_shaft_diameter(type));
|
||||
BLDC_bell_screw_positions(type)
|
||||
circle(d = BLDC_bell_hole_diameter(type));
|
||||
}
|
||||
rotate_extrude()
|
||||
polygon([ [bell_diameter/2, h2], [body_diameter/2, 0], [body_diameter/2, -h1], [body_diameter/2 - wall_thickness, -h1], [body_diameter/2 - wall_thickness, 0], [bell_diameter/2, h2 - top_thickness] ]);
|
||||
}
|
||||
spoke_count = BLDC_bell_spokes(type);
|
||||
if (spoke_count % 4 == 0) {
|
||||
r = body_diameter > 40 ? body_diameter / 15 : 2.5;
|
||||
for (a = [0, 90, 180, 270])
|
||||
rotate(a) {
|
||||
cutout(bell_diameter + 2 * r, body_diameter, r, h2);
|
||||
rotate(45) {
|
||||
cutout(bell_diameter, body_diameter, r, h2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
r1 = bell_diameter * PI / (spoke_count * 3);
|
||||
r2 = body_diameter * PI / (spoke_count * 3);
|
||||
for (i = [0 : 1 : spoke_count - 1])
|
||||
rotate(i * 360 / spoke_count)
|
||||
cutout2(bell_diameter, r1, body_diameter, r2, h2);
|
||||
}
|
||||
} // end difference
|
||||
} // end translate
|
||||
|
||||
if (BLDC_boss_height(type))
|
||||
translate_z(height)
|
||||
tube(or = BLDC_boss_diameter(type)/2, ir = BLDC_shaft_diameter(type)/2, h = BLDC_boss_height(type), center = false);
|
||||
|
||||
if (BLDC_prop_shaft_diameter(type))
|
||||
translate_z(height + BLDC_boss_height(type)) {
|
||||
thread_diameter = BLDC_prop_shaft_thread_diameter(type);
|
||||
unthreaded_length = BLDC_prop_shaft_length(type) - BLDC_prop_shaft_thread_length(type);
|
||||
cylinder(d=BLDC_prop_shaft_diameter(type), h = unthreaded_length);
|
||||
translate_z(unthreaded_length)
|
||||
if (show_threads)
|
||||
male_metric_thread(thread_diameter, metric_coarse_pitch(thread_diameter), BLDC_prop_shaft_thread_length(type), center = false);
|
||||
else
|
||||
cylinder(d = thread_diameter, h = BLDC_prop_shaft_thread_length(type));
|
||||
}
|
||||
} // end colour
|
||||
|
||||
color(side_colour)
|
||||
translate_z(height - h2 - h1 -side_length)
|
||||
tube(body_diameter/2, body_diameter/2 - wall_thickness, side_length, center = false);
|
||||
|
||||
if (show_threads)
|
||||
translate_z(height)
|
||||
BLDC_bell_screw_positions(type)
|
||||
vflip()
|
||||
female_metric_thread(BLDC_bell_hole_diameter(type), metric_coarse_pitch(BLDC_bell_hole_diameter(type)), h2, center = false, colour = body_colour);
|
||||
} // end module bell
|
||||
|
||||
base();
|
||||
bell();
|
||||
|
||||
color(bldc_shaft_colour)
|
||||
translate_z(-BLDC_shaft_offset(type) - eps)
|
||||
not_on_bom()
|
||||
rod(d = BLDC_shaft_diameter(type), l = BLDC_shaft_length(type), center = false);
|
||||
|
||||
}
|
||||
|
||||
module BLDC_screw_positions(holes, n = 4) { //! Screw positions utility function
|
||||
hole_count = is_list(holes) ? len(holes) : 4;
|
||||
for($i = [0 : min(n, hole_count) - 1]) {
|
||||
spacing = is_list(holes) ? holes[$i] : holes;
|
||||
rotate($i * 360 / hole_count)
|
||||
translate([spacing / 2, 0])
|
||||
rotate(-$i * 90)
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
module BLDC_base_screw_positions(type, n = 4) { //! Positions children at the base screw holes
|
||||
if (BLDC_base_holes(type))
|
||||
rotate(is_list(BLDC_base_holes(type)) && len(BLDC_base_holes(type)) == 3 ? 180 : 45)
|
||||
BLDC_screw_positions(BLDC_base_holes(type), n)
|
||||
children();
|
||||
}
|
||||
|
||||
module BLDC_bell_screw_positions(type, n = 4) { //! Positions children at the bell screw holes
|
||||
if (BLDC_bell_holes(type))
|
||||
rotate(is_list(BLDC_bell_holes(type)) && len(BLDC_bell_holes(type)) == 3 ? 30 : 0)
|
||||
BLDC_screw_positions(BLDC_bell_holes(type), n)
|
||||
children();
|
||||
}
|
37
vitamins/bldc_motors.scad
Normal file
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
// Brushless DC electric motors
|
||||
//
|
||||
// shaft shaft shaft body base holes base side bell holes boss prop shaft thread
|
||||
// diameter height diam length offset colour diam h1 h2 diam position open wire colour diam h1 h1 d pos spokes d h length diam length diam
|
||||
BLDC0603 = ["BLDC0603", 9.0, 8, 1, 15.5, 1, crimson, 10, 1, 1.5, 1.4, [6,6,6], true, 0.8, grey(20), 9, 1, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0];
|
||||
BLDC0802 = ["BLDC0802", 11.5, 9.5, 1.5, 12, 0.5, grey(20), 9, 1, 2, 1.6, [6,6,6], true, 1.0, grey(20), 11, 2, 0.75, 0, 0, 3, 0, 0, 0, 0, 0, 0];
|
||||
BLDC1105 = ["BLDC1105", 14.0, 11.75, 1.5, 11, 0, grey(90), 12.5, 1.6, 1.4, 2, 9, true, 1.0, grey(90), 12, 1, 1, 2, [5,5], 4, 0, 0, 0, 0, 0, 0];
|
||||
BLDC1306 = ["BLDC1306", 17.75, 14.5, 2, 14, 0, crimson, 16, 1.5, 1, 2, 12, false, 1.0, grey(20), 12, 1, 1, 0, 0, 6, 8, 1, 11.5, 5, 6.5, 5];
|
||||
BLDC1804 = ["BLDC1804", 23.0, 12, 2, 11, 0, grey(20), 19, 2.5, 1.5, 2, 12, false, 1.5, grey(20), 18, 1, 2.5, 0, 0, 6, 9, 1, 12, 5, 6, 5];
|
||||
BLDC2205 = ["BLDC2205", 28.0, 17.25, 3, 16, 0, crimson, 26, 2, 3, 3, [19,16,19,16], false, 1.6, grey(20), 22.5, 1, 3.75, 0, 0, 6, 0, 0, 14, 5, 9, 5];
|
||||
BLDC2212 = ["BLDC2212", 28.0, 27, 3, 26, 0, grey(20), 23, 4, 2, 3, [19,16,19,16], false, 2.0, grey(20), 18, 2, 4, 0, 0, 6, 0, 0, 14, 8, 7, 6];
|
||||
BLDC3548 = ["BLDC3548", 35.0, 45, 5, 65.5, 1, gold, 32, 7, 1, 3, [25,19,25,19], false, 3.0, grey(20), 32, 2, 4,2.5, [16,16,16],6,12, 3.4, 0, 0, 0, 0];
|
||||
BLDC4250 = ["BLDC4250", 42.5, 48, 5, 70, 20, crimson, 38, 4, 6, 3, 25, false, 3.5, grey(20), 28, 3, 6, 3, 17, 8, 12, 2, 0, 0, 0, 0];
|
||||
|
||||
bldc_motors = [BLDC0603, BLDC0802, BLDC1105, BLDC1306, BLDC1804, BLDC2205, BLDC2212, BLDC3548, BLDC4250];
|
||||
|
||||
use <bldc_motor.scad>
|
@@ -28,6 +28,7 @@ use <screw.scad>
|
||||
function blower_length(type) = type[2]; //! Length of enclosing rectangle
|
||||
function blower_width(type) = type[3]; //! Width of enclosing rectangle
|
||||
function blower_depth(type) = type[4]; //! Height
|
||||
function blower_size(type) = [blower_length(type), blower_width(type), blower_depth(type)]; //! Size
|
||||
function blower_bore(type) = type[5]; //! The air intake hole diameter
|
||||
function blower_screw(type) = type[6]; //! The type of screws needed
|
||||
function blower_hub(type) = type[7]; //! Rotor hub diameter
|
||||
|
58
vitamins/box_section.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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Box sections.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../utils/tube.scad>
|
||||
|
||||
include <../vitamins/sheets.scad>
|
||||
|
||||
function box_section_material(type) = type[1]; //! Material description
|
||||
function box_section_size(type) = type[2]; //! Size
|
||||
function box_section_thickness(type) = type[3]; //! Wall thickness
|
||||
function box_section_fillet(type) = type[4]; //! Fillet
|
||||
function box_section_colour(type) = type[5]; //! Colour
|
||||
function box_section_colour2(type) = type[6]; //! Colour2, for woven box section
|
||||
function box_section_is_woven(type) = !is_undef(type[6]); //! Box section is woven, eg carbon fiber
|
||||
|
||||
module box_section(type, length, center = true) {
|
||||
vitamin(str("box_section(", type[0], arg(length, 15), "): ", box_section_material(type), ", length ", length, "mm"));
|
||||
|
||||
size = box_section_size(type);
|
||||
thickness = box_section_thickness(type);
|
||||
|
||||
if (box_section_is_woven(type))
|
||||
translate_z(center ? 0 : length / 2) {
|
||||
rotate([0, -90, 90])
|
||||
for (z = [-size.y / 2, size.y / 2 - thickness])
|
||||
translate_z(z)
|
||||
woven_sheet(CF1, thickness, box_section_colour(type), box_section_colour2(type), length, size.x)
|
||||
square([length, size.x], center=true);
|
||||
rotate([0, -90, 0])
|
||||
for (z = [-size.x / 2, size.x / 2 - thickness])
|
||||
translate_z(z)
|
||||
woven_sheet(CF1, thickness, box_section_colour(type), box_section_colour2(type), length, size.y)
|
||||
square([length, size.y], center=true);
|
||||
}
|
||||
else
|
||||
color(box_section_colour(type))
|
||||
rectangular_tube([size.x, size.y, length], center, thickness, box_section_fillet(type));
|
||||
}
|
30
vitamins/box_sections.scad
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
// Box sections
|
||||
//
|
||||
AL12x8x1 = ["AL12x8x1", "Aluminium rectangular box section 12mm x 8mm x 1mm", [12, 8], 1, 0.5, silver, undef];
|
||||
AL20x20x2 = ["AL20x20x2", "Aluminium rectangular box section 20mm x 20mm x 2mm", [20, 20], 2, 0.5, silver, undef];
|
||||
CF10x10x1 = ["CF10x10x1", "Carbon fiber rectangular box section 10mm x 10mm x 1mm", [10, 10], 1, 0.5, grey(35), grey(20)];
|
||||
|
||||
|
||||
box_sections = [AL12x8x1, AL20x20x2, CF10x10x1];
|
||||
|
||||
use <box_section.scad>
|
@@ -26,89 +26,138 @@ use <../utils/round.scad>
|
||||
|
||||
function gs_diameter(type) = type[2]; //! Can diameter
|
||||
function gs_height(type) = type[3]; //! Can height
|
||||
function gs_pitch(type) = type[4]; //! Screw pitch
|
||||
function gs_lug_w(type) = type[5]; //! Screw lug width
|
||||
function gs_lug_t(type) = type[6]; //! Screw lug thickness
|
||||
function gs_hole_d(type) = type[7]; //! Screw hole diameter
|
||||
function gs_offset(type) = type[8]; //! Offset of the shaft from the centre of the can
|
||||
function gs_boss_d(type) = type[9]; //! Boss around the shaft diameter
|
||||
function gs_boss_h(type) = type[10]; //! Boss around the shaft height
|
||||
function gs_shaft_d(type) = type[11]; //! Shaft diameter
|
||||
function gs_shaft_flat(type) = type[12]; //! Shaft width across the flats
|
||||
function gs_shaft_length(type) = type[13]; //! Shaft length
|
||||
function gs_flat_length(type) = type[14]; //! Shaft flat length
|
||||
function gs_bulge_w(type) = type[15]; //! Plastic bulge width
|
||||
function gs_bulge_d(type) = type[16]; //! Plastic bulge depth from centre
|
||||
function gs_bulge_h(type) = type[17]; //! Plastic bulge height
|
||||
function gs_bulge2_w(type) = type[18]; //! Plastic rear bulge width
|
||||
function gs_bulge2_d(type) = type[19]; //! Plastic rear bulge depth from centre
|
||||
function gs_bulge2_h(type) = type[20]; //! Plastic rear bulge height
|
||||
function gs_radius(type) = type[4]; //! Top - or bottom + corner radius
|
||||
function gs_motor(type) = type[5]; //! Motor diameter and height if separate from gearbox
|
||||
function gs_pitch(type) = type[6]; //! Screw pitch
|
||||
function gs_lug_w(type) = type[7]; //! Screw lug width
|
||||
function gs_lug_t(type) = type[8]; //! Screw lug thickness
|
||||
function gs_hole_d(type) = type[9]; //! Screw hole diameter
|
||||
function gs_offset(type) = type[10]; //! Offset of the shaft from the centre of the can
|
||||
function gs_boss_d(type) = type[11]; //! Boss around the shaft diameter
|
||||
function gs_boss_h(type) = type[12]; //! Boss around the shaft height
|
||||
function gs_shaft_d(type) = type[13]; //! Shaft diameter
|
||||
function gs_shaft_flat(type) = type[14]; //! Shaft width across the flats
|
||||
function gs_shaft_length(type) = type[15]; //! Shaft length
|
||||
function gs_flat_length(type) = type[16]; //! Shaft flat length
|
||||
function gs_bulge(type) = type[17]; //! Plastic bulge width, depth, height, z offset
|
||||
function gs_bulge2(type) = type[18]; //! Plastic rear bulge width, depth, height
|
||||
function gs_wire_d(type) = type[19]; //! Wire diameter
|
||||
function gs_wires(type) = type[20]; //! Wire colours and grouping
|
||||
|
||||
module geared_stepper_screw_positions(type) //! Place children at the screw positions
|
||||
for(side = [-1, 1])
|
||||
translate([side * gs_pitch(type) / 2, -gs_offset(type)])
|
||||
children();
|
||||
|
||||
motor_colour = "#9BA2AC";
|
||||
gearbox_colour = "#FFF7EE";
|
||||
|
||||
module geared_stepper(type) { //! Draw the specified geared stepper
|
||||
vitamin(str("geared_stepper(", type[0], "): Geared stepper - ", type[1]));
|
||||
|
||||
radius = gs_diameter(type) / 2;
|
||||
height = gs_height(type);
|
||||
motor = gs_motor(type);
|
||||
height = gs_height(type) - motor.y;
|
||||
offset = gs_offset(type);
|
||||
color("silver") {
|
||||
translate([0, -offset])
|
||||
rounded_cylinder(r = radius, h = height, r2 = 1);
|
||||
lug_t = gs_lug_t(type);
|
||||
bulge = gs_bulge(type);
|
||||
bulge_z = bulge[3];
|
||||
bulge2 = gs_bulge2(type);
|
||||
wires = gs_wires(type);
|
||||
|
||||
// Gearbox
|
||||
color(motor.y ? gearbox_colour : motor_colour) {
|
||||
difference() {
|
||||
rad = gs_radius(type);
|
||||
translate([0, -offset])
|
||||
if(rad >= 0)
|
||||
rounded_cylinder(r = radius, h = height, r2 = rad);
|
||||
else
|
||||
translate_z(height)
|
||||
vflip()
|
||||
rounded_cylinder(r = radius, h = height, r2 = -rad);
|
||||
|
||||
if(!lug_t)
|
||||
geared_stepper_screw_positions(type)
|
||||
cylinder(d = gs_hole_d(type), h = 10, center = true);
|
||||
}
|
||||
|
||||
cylinder(d = gs_boss_d(type), h = 2 * gs_boss_h(type), center = true);
|
||||
|
||||
linear_extrude(gs_lug_t(type))
|
||||
difference() {
|
||||
hull()
|
||||
if(lug_t)
|
||||
linear_extrude(lug_t)
|
||||
difference() {
|
||||
hull()
|
||||
geared_stepper_screw_positions(type)
|
||||
circle(d = gs_lug_w(type));
|
||||
|
||||
geared_stepper_screw_positions(type)
|
||||
circle(d = gs_lug_w(type));
|
||||
circle(d = gs_hole_d(type));
|
||||
}
|
||||
|
||||
geared_stepper_screw_positions(type)
|
||||
circle(d = gs_hole_d(type));
|
||||
}
|
||||
|
||||
translate([0, -offset - radius, eps])
|
||||
cube([gs_bulge_w(type) - 2, 2 * (gs_bulge_d(type) - radius) - 2, 2 * eps], center = true);
|
||||
if(!bulge_z)
|
||||
translate([0, -offset - radius, eps])
|
||||
cube([bulge.x - 2, 2 * (bulge.y - radius) - 2, 2 * eps], center = true);
|
||||
}
|
||||
|
||||
// Motor
|
||||
if(motor.y)
|
||||
color("#9BA2AC")
|
||||
translate([0, -offset, height])
|
||||
rotate_extrude()
|
||||
union() {
|
||||
r = motor.x / 2;
|
||||
rad = motor[2];
|
||||
square([r - rad, rad]);
|
||||
|
||||
translate([0, motor.y - rad])
|
||||
square([r - rad, rad]);
|
||||
|
||||
hull()
|
||||
for(y = [2 * rad, motor.y - 2 * rad])
|
||||
translate([r - rad, y])
|
||||
circle(rad);
|
||||
}
|
||||
|
||||
// Shaft
|
||||
f = gs_shaft_flat(type);
|
||||
two_flats = f < 0;
|
||||
vflip()
|
||||
color(brass) {
|
||||
color(two_flats ? brass : gearbox_colour) {
|
||||
d = gs_shaft_d(type);
|
||||
h = gs_shaft_length(type);
|
||||
linear_extrude(h)
|
||||
intersection() {
|
||||
circle(d = d);
|
||||
|
||||
square([d + 1, gs_shaft_flat(type)], center = true);
|
||||
translate([0, two_flats ? 0 : (f - d) / 2])
|
||||
square([d + 1, abs(f)], center = true);
|
||||
}
|
||||
|
||||
cylinder(d = d, h = h - gs_flat_length(type));
|
||||
}
|
||||
|
||||
color("skyblue") {
|
||||
h1 = gs_bulge_h(type);
|
||||
translate([0, - offset - radius, eps])
|
||||
rounded_rectangle([gs_bulge_w(type), 2 * (gs_bulge_d(type) - radius), h1], 0.5, center = false);
|
||||
// Wire block
|
||||
color(bulge_z ? "white" : "skyblue") {
|
||||
translate([0, - offset - radius, eps + bulge[3]])
|
||||
rounded_rectangle([bulge.x, 2 * (bulge.y - radius), bulge.z], 0.5, center = false);
|
||||
|
||||
h2 = gs_bulge2_h(type);
|
||||
translate([0, - offset, h1 + 1 - h2])
|
||||
linear_extrude(h2)
|
||||
round(0.5)
|
||||
intersection() {
|
||||
circle(gs_bulge2_d(type));
|
||||
if(bulge2.z)
|
||||
translate([0, - offset, bulge.z + 1 - bulge2.z])
|
||||
linear_extrude(bulge2.z)
|
||||
round(0.5)
|
||||
intersection() {
|
||||
circle(bulge2.y);
|
||||
|
||||
translate([0, -50])
|
||||
square([gs_bulge2_w(type), 100], center = true);
|
||||
}
|
||||
translate([0, -50])
|
||||
square([bulge2.x, 100], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
translate_z(2.5)
|
||||
for(i = [0 : 4])
|
||||
translate([i - 2.5, 0])
|
||||
rotate([90, 0, 0])
|
||||
color(["yellow", "orange", "red", "pink", "blue"][i])
|
||||
cylinder(d = 1, h = radius + offset + 10);
|
||||
wire_d = gs_wire_d(type);
|
||||
for(j = [0 : len(wires) - 1], i = [0 : len(wires[j]) - 1])
|
||||
translate([(i - len(wires[j]) / 2 + 0.5) * wire_d, 0, bulge_z + (j ? bulge.z - 2.5 : 2.5)])
|
||||
rotate([90, 0, 0])
|
||||
color(wires[j][i])
|
||||
cylinder(d = wire_d, h = radius + offset + 10);
|
||||
}
|
||||
|
@@ -20,8 +20,16 @@
|
||||
//
|
||||
//! Geared tin can steppers
|
||||
//
|
||||
28BYJ_48 = ["28BYJ_48", "28BYJ-48 5V", 28, 19, 35, 7, 0.85, 4.2, 8, 9, 1.5, 5, 3, 10, 6, 14.7, 17, 16.5, 17.7, 15.5, 13.8 ];
|
||||
// d h r m p l l h o b b s f s f b b w
|
||||
// i e a o i u u o f o o h l h l u u i
|
||||
// a i d t t g g l f s s a a a a l l r
|
||||
// g i o c e s s s f t f t g g e
|
||||
// h u r h w t e t t e e
|
||||
// t s d t d h w l 2 d
|
||||
// d h r d l w d h z w d h
|
||||
28BYJ_48 = ["28BYJ_48", "28BYJ-48 5V", 28, 19, 1, [ 0, 0, 0], 35, 7, 0.85, 4.2, 8, 9, 1.5, 5,-3.0, 10, 6, [14.7, 17, 16.5, 0], [17.7, 15.5, 13.8], 1, [["yellow", "orange", "red", "pink", "blue"]] ];
|
||||
35BYGHJ75 = ["35BYGHJ75", "35BYGHJ75 0.4A",37, 37, -2, [35, 22, 1], 27, 0, 0, 3.0, 7, 12, 3.0, 5, 4.5, 17, 10, [ 7.7, 20.7, 9.25, 21], [ 0, 0, 0], 1.3,[["brown", "red"], ["yellow", "green"]] ];
|
||||
|
||||
geared_steppers = [28BYJ_48];
|
||||
geared_steppers = [28BYJ_48, 35BYGHJ75];
|
||||
|
||||
use <geared_stepper.scad>
|
||||
|
@@ -55,7 +55,7 @@ outlet_spades = [[spade4p8ll, 8, -7, -2, 90],
|
||||
// w h r t
|
||||
IEC_fused_inlet = ["IEC_fused_inlet", "IEC fused inlet JR-101-1F", M3_cs_cap_screw, 36, 27, 16, 31, 3, 28, 31, 2, 2.0, 30, 33, 4, 3.0, 44, 15, fused_spades, false ];
|
||||
IEC_fused_inlet2= ["IEC_fused_inlet2","IEC fused inlet old", M3_cs_cap_screw, 36, 27, 14, 31, 3, 28, 31, 2, 2.5, 30, 33, 4, 2.5, 44, 18, fused_spades2, false ];
|
||||
IEC_320_C14_switched_fused_inlet = ["IEC_switched_fused_inlet", "IEC320 C14 switched fused inlet module",
|
||||
IEC_320_C14_switched_fused_inlet = ["IEC_320_C14_switched_fused_inlet", "IEC320 C14 switched fused inlet module",
|
||||
M3_cs_cap_screw, 40, 27, 16,46.8,3,28, 48, 2.4, 1.0, 33, 57, 4, 3.0, 48,16.5, iec320c14FusedSwitchedSpades, false ];
|
||||
IEC_inlet = ["IEC_inlet", "IEC inlet", M3_cs_cap_screw, 40, 28, 18, 20, 3, 28, 20.5, 4, 2.5, 37, 23, 1, 2.5, 48, 14, inlet_spades, false ];
|
||||
IEC_inlet_atx = ["IEC_inlet_atx", "IEC inlet for ATX", M3_cs_cap_screw, 40, 27, 18, 19, 3, 30.5, 22, 2, 2.0, 30.5, 22, 2, 4.0, 50, 15, atx_spades, false ];
|
||||
|
@@ -32,7 +32,7 @@ function leadnut_flange_t(type) = type[6]; //! Flange thickness
|
||||
function leadnut_flange_offset(type) = type[7]; //! Offset of the flange from the top
|
||||
function leadnut_holes(type) = type[8]; //! The number of screw holes
|
||||
function leadnut_hole_dia(type) = type[9]; //! The diameter of the screw holes
|
||||
function leadnut_hole_pitch(type) = type[10]; //! The radia pitch of the screw holes
|
||||
function leadnut_hole_pitch(type) = type[10]; //! The radial pitch of the screw holes
|
||||
function leadnut_screw(type) = type[11]; //! The type of the fixing screws
|
||||
function leadnut_pitch(type) = type[12]; //! Screw pitch
|
||||
function leadnut_lead(type) = type[13]; //! Screw lead
|
||||
|
@@ -62,6 +62,7 @@ function opengrab_depth() = depth; //! Module heig
|
||||
function opengrab_target_thickness() = target; //! Target sheet thickness
|
||||
function opengrab_pcb() = pcb; //! The PCB
|
||||
function opengrab_pcb_z() = depth - pillar - pcb_thickness(pcb); //! PCB offset from the front
|
||||
function opengrab_screw_depth() = 4; //! Max screw depth in pillars
|
||||
|
||||
module opengrab() { //! Draw OpenGrab module
|
||||
vitamin("opengrab(): OpenGrab V3 electro permanent magnet");
|
||||
|
@@ -55,6 +55,9 @@ function pcb_polygon(type) = type[14]; //! Optional outline polygon for odd
|
||||
function pcb_screw(type, cap = hs_cap) = Len(type[15]) ? type[15] : find_screw(cap, screw_smaller_than(pcb_hole_d(type))); //! Mounting screw type
|
||||
function pcb_size(type) = [pcb_length(type), pcb_width(type), pcb_thickness(type)]; //! Length, width and thickness in a vector
|
||||
|
||||
function pcb_component(type, name, index = 0) = //! Return the component specified by name and index
|
||||
[for(component = pcb_components(type)) if(component[3] == name) component][index];
|
||||
|
||||
|
||||
function pcb_grid_pos(type, x, y, z = 0) = //! Returns a pcb grid position
|
||||
[-pcb_length(type) / 2 + pcb_grid(type).x + 2.54 * x,
|
||||
|
@@ -44,6 +44,7 @@ function psu_name(type) = type[1]; //! The part name
|
||||
function psu_length(type) = type[2]; //! Length
|
||||
function psu_width(type) = type[3]; //! Width
|
||||
function psu_height(type) = type[4]; //! Height
|
||||
function psu_size(type) = [psu_length(type), psu_width(type), psu_height(type)]; //! Size
|
||||
function psu_screw(type) = type[5]; //! Screw type
|
||||
function psu_screw_hole_radius(type) = type[6]; //! Clearance hole for screw, bigger than normal on ATX
|
||||
function atx_psu(type) = type[7]; //! True if an ATX style PSU
|
||||
|
@@ -42,7 +42,7 @@ function pulley_screw(type) = type[13]; //! Grub screw type
|
||||
function pulley_screws(type) = type[14]; //! Number of grub screws
|
||||
|
||||
function pulley_ir(type) = pulley_od(type) / 2 - (pulley_teeth(type) ? belt_tooth_height(pulley_belt(type)) : 0); //! Inside radius of the teeth
|
||||
function pulley_pr(type) = let(belt = pulley_belt(type)) //! Pitch radius
|
||||
function pulley_pr(type, belt = undef) = let(belt = is_undef(belt) ? pulley_belt(type) : belt) //! Pitch radius, `belt` only needed for non-standard belt over smooth pulleys
|
||||
pulley_teeth(type) ? pulley_teeth(type) * belt_pitch(belt) / 2 / PI
|
||||
: pulley_ir(type) + belt_thickness(belt) - belt_pitch_height(belt);
|
||||
|
||||
@@ -53,7 +53,7 @@ function pulley_extent(type) = max(pulley_flange_dia(type), pulley_hub_dia(type)
|
||||
T_angle = 40;
|
||||
GT_r = 0.555;
|
||||
|
||||
module pulley(type, colour = silver) { //! Draw a pulley
|
||||
module pulley(type, colour = silver) { //! Draw a pulley, any children are placed above.
|
||||
teeth = pulley_teeth(type);
|
||||
od = pulley_od(type);
|
||||
|
||||
@@ -138,6 +138,10 @@ module pulley(type, colour = silver) { //! Draw a pulley
|
||||
else
|
||||
core();
|
||||
}
|
||||
|
||||
if($children)
|
||||
translate_z(pulley_height(type))
|
||||
children();
|
||||
}
|
||||
|
||||
module pulley_assembly(type, colour = silver) { //! Draw a pulley with its grub screws in place
|
||||
|
@@ -37,18 +37,19 @@ function rail_groove_width(type)=type[11]; //! Groove width
|
||||
|
||||
function rail_screw_height(type, screw) = rail_height(type) - rail_bore_depth(type) + screw_head_depth(screw, rail_hole(type)); //! Position screw taking into account countersink into counterbored hole
|
||||
|
||||
function carriage_length(type) = type[0]; //! Overall length
|
||||
function carriage_block_length(type) = type[1]; //! Length of the metal part
|
||||
function carriage_width(type) = type[2]; //! Width of carriage
|
||||
function carriage_height(type) = type[3]; //! Height of carriage
|
||||
function carriage_size(type) = [ type[0], type[2], type[3] ]; //! Size of carriage
|
||||
function carriage_clearance(type) = type[4]; //! Gap under the carriage
|
||||
function carriage_pitch_x(type) = type[5]; //! Screw hole x pitch
|
||||
function carriage_pitch_y(type) = type[6]; //! Screw hole y pitch
|
||||
function carriage_screw(type) = type[7]; //! Carriage screw type
|
||||
function carriage_rail(type) = type[8]; //! Rail type
|
||||
function carriage_length(type) = type[1]; //! Overall length
|
||||
function carriage_block_length(type) = type[2]; //! Length of the metal part
|
||||
function carriage_width(type) = type[3]; //! Width of carriage
|
||||
function carriage_height(type) = type[4]; //! Height of carriage
|
||||
function carriage_clearance(type) = type[5]; //! Gap under the carriage
|
||||
function carriage_pitch_x(type) = type[6]; //! Screw hole x pitch
|
||||
function carriage_pitch_y(type) = type[7]; //! Screw hole y pitch
|
||||
function carriage_screw(type) = type[8]; //! Carriage screw type
|
||||
function carriage_rail(type) = type[9]; //! Rail type
|
||||
|
||||
function carriage_screw_depth(type) = 2 * screw_radius(carriage_screw(type)); //! Carriage thread depth
|
||||
function carriage_travel(type, rail_length) = rail_length - carriage_length(type); //! How far the carriage can travel on a given length rail
|
||||
function carriage_size(type) = [ carriage_length(type), carriage_width(type), carriage_height(type) ]; //! Size of carriage
|
||||
|
||||
function rail_holes(type, length) = //! Number of holes in a rail given its `length`
|
||||
floor((length - 2 * rail_end(type)) / rail_pitch(type)) + 1;
|
||||
@@ -74,6 +75,8 @@ module carriage_hole_positions(type) { //! Position children over screw holes
|
||||
}
|
||||
|
||||
module carriage(type, end_colour = grey(20), wiper_colour = grey(20)) { //! Draw the specified carriage
|
||||
vitamin(str("carriage(", type[0], "_carriage): Linear rail carriage ", type[0]));
|
||||
|
||||
total_l = carriage_length(type);
|
||||
block_l = carriage_block_length(type);
|
||||
block_w = carriage_width(type);
|
||||
@@ -142,6 +145,7 @@ module rail(type, length, colour = grey(90), use_polycircles = false) { //! Draw
|
||||
height = rail_height(type);
|
||||
|
||||
vitamin(str("rail(", type[0], ", ", length, "): Linear rail ", type[0], " x ", length, "mm"));
|
||||
assert(rail_end(type) < (rail_pitch(type) - rail_bore(type)) / 2, type[0]);
|
||||
|
||||
color(colour) {
|
||||
rbr = rail_bore(type) / 2;
|
||||
|
@@ -20,26 +20,29 @@
|
||||
//
|
||||
// Rails
|
||||
//
|
||||
// Wr Hr E P D d h go gw
|
||||
// Wr Hr Emin P D d h go gw
|
||||
MGN5 = [ "MGN5", 5, 3.6, 5, 15, 3.6, 2.4, 0.8, M2_cs_cap_screw, M2_cs_cap_screw, 1, 1 ]; // Screw holes too small for M2 heads
|
||||
MGN7 = [ "MGN7", 7, 5, 5, 15, 4.3, 2.4, 2.6, M2_cap_screw, M2_cs_cap_screw, 1.5, 1.5 ];
|
||||
MGN9 = [ "MGN9", 9, 6, 5, 20, 6.0, 3.5, 3.5, M3_cap_screw, M3_cs_cap_screw, 1.5, 1.5 ];
|
||||
MGN12 =[ "MGN12", 12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, M3_cs_cap_screw, 2.25, 2.75];
|
||||
MGN12 =[ "MGN12", 12, 8, 7.5, 25, 6.0, 3.5, 4.5, M3_cap_screw, M3_cs_cap_screw, 2.25, 2.75];
|
||||
MGN15 =[ "MGN15", 15, 10, 10, 40, 6.0, 3.5, 5.0, M3_cap_screw, M3_cs_cap_screw, 2.5, 2.75 ];
|
||||
SSR15= [ "SSR15", 15, 12.5, 10, 60, 7.5, 4.5, 5.3, M4_cap_screw, M4_cs_cap_screw, 2.5, 2.75 ];
|
||||
//
|
||||
// Carriages
|
||||
//
|
||||
// L L1 W H H1 C B
|
||||
MGN5_carriage = [ 16, 9.6, 12, 6, 1.5, 0, 8, M2_cap_screw, MGN5 ];
|
||||
MGN7C_carriage = [ 23, 14.3, 17, 8, 1.5, 8, 12, M2_cap_screw, MGN7 ];
|
||||
MGN9C_carriage = [ 29.7, 20.8, 20, 10, 2, 10, 15, M3_cap_screw, MGN9 ];
|
||||
MGN12C_carriage = [ 34.7, 21.7, 27, 13, 3, 15, 20, M3_cap_screw, MGN12 ];
|
||||
MGN12H_carriage = [ 45.4, 32.4, 27, 13, 3, 20, 20, M3_cap_screw, MGN12 ];
|
||||
MGN15C_carriage = [ 43.3, 27.7, 32, 16, 4, 20, 25, M3_cap_screw, MGN15 ];
|
||||
SSR15_carriage = [ 40.3, 23.3, 34, 24, 4.5, 0, 26, M4_cap_screw, SSR15 ];
|
||||
// L L1 W H H1 C B
|
||||
MGN5C_carriage = ["MGN5C", 16, 9.6, 12, 6, 1.5, 0, 8, M2_cap_screw, MGN5 ];
|
||||
MGN7C_carriage = ["MGN7C", 23, 14.3, 17, 8, 1.5, 8, 12, M2_cap_screw, MGN7 ];
|
||||
MGN7H_carriage = ["MGN7H", 30.8, 21.8, 17, 8, 1.5,13, 12, M2_cap_screw, MGN7 ];
|
||||
MGN9C_carriage = ["MGN9C", 29.7, 20.8, 20, 10, 2, 10, 15, M3_cap_screw, MGN9 ];
|
||||
MGN9H_carriage = ["MGN9H", 39.9, 29.9, 20, 10, 2, 16, 15, M3_cap_screw, MGN9 ];
|
||||
MGN12C_carriage = ["MGN12C", 34.7, 21.7, 27, 13, 3, 15, 20, M3_cap_screw, MGN12 ];
|
||||
MGN12H_carriage = ["MGN12H", 45.4, 32.4, 27, 13, 3, 20, 20, M3_cap_screw, MGN12 ];
|
||||
MGN15C_carriage = ["MGN15C", 43.3, 27.7, 32, 16, 4, 20, 25, M3_cap_screw, MGN15 ];
|
||||
SSR15_carriage = ["SSR15", 40.3, 23.3, 34, 24, 4.5, 0, 26, M4_cap_screw, SSR15 ];
|
||||
|
||||
rails = [MGN5, MGN7, MGN9, MGN12, MGN15, SSR15];
|
||||
|
||||
carriages = [MGN5_carriage, MGN7C_carriage, MGN9C_carriage, MGN12C_carriage, MGN12H_carriage, MGN15C_carriage, SSR15_carriage];
|
||||
carriages = [MGN5C_carriage, MGN7C_carriage, MGN7H_carriage, MGN9C_carriage, MGN9H_carriage, MGN12C_carriage, MGN12H_carriage, MGN12H_carriage, MGN15C_carriage, SSR15_carriage];
|
||||
|
||||
use <rail.scad>
|
||||
|
@@ -284,10 +284,10 @@ function screw_polysink_r(type, z) = //! Countersink hole profile corrected for
|
||||
)
|
||||
limit(head_rad + head_t - z + (sqrt(2) - 1) * layer_height / 2, screw_clearance_radius(type), head_rad);
|
||||
|
||||
module screw_polysink(type, h = 100, alt = false) { //! A countersink hole made from stacked polyholes for printed parts
|
||||
module screw_polysink(type, h = 100, alt = false, sink = 0) { //! A countersink hole made from stacked polyholes for printed parts, default is flush, `sink` can be used to recess the head
|
||||
head_depth = screw_head_depth(type);
|
||||
assert(head_depth, "Not a countersunk screw");
|
||||
layers = ceil(head_depth / layer_height);
|
||||
layers = ceil((head_depth + sink) / layer_height);
|
||||
rmin = screw_clearance_radius(type);
|
||||
sides = sides(rmin);
|
||||
lh = layer_height + eps;
|
||||
@@ -295,7 +295,7 @@ module screw_polysink(type, h = 100, alt = false) { //! A countersink hole made
|
||||
for(side = [0, 1]) mirror([0, 0, side]) {
|
||||
for(i = [0 : layers - 1])
|
||||
translate_z(i * layer_height) {
|
||||
r = screw_polysink_r(type, i * layer_height + layer_height / 2);
|
||||
r = screw_polysink_r(type, i * layer_height + layer_height / 2 - sink);
|
||||
if(alt)
|
||||
rotate(i % 2 == layers % 2 ? 180 / sides : 0)
|
||||
poly_cylinder(r = r, h = lh, center = false, sides = sides);
|
||||
|
@@ -79,6 +79,7 @@ M2_cs_cap_screw = ["M2_cs_cap","M2 cs cap", hs_cs_cap,2, 3.8, 0, 0.65,1.3
|
||||
M3_cs_cap_screw = ["M3_cs_cap","M3 cs cap", hs_cs_cap,3, 6.0, 0, 1.05,2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
|
||||
M4_cs_cap_screw = ["M4_cs_cap","M4 cs cap", hs_cs_cap,4, 8.0, 0, 1.49,2.5, 20, M4_washer, M4_nut, M4_tap_radius, M4_clearance_radius];
|
||||
M5_cs_cap_screw = ["M5_cs_cap","M5 cs cap", hs_cs_cap,5,10.0, 0, 3.00,3.0, 22, M5_washer, M5_nut, M5_tap_radius, M5_clearance_radius];
|
||||
M6_cs_cap_screw = ["M6_cs_cap","M6 cs cap", hs_cs_cap,6,12.0, 0, 3.00,4.0, 24, M6_washer, M6_nut, M6_tap_radius, M6_clearance_radius];
|
||||
|
||||
M2_dome_screw = ["M2_dome", "M2 dome", hs_dome, 2, 3.5, 1.3, 0.6, 1.3, 16, M2_washer, M2_nut, M2_tap_radius, M2_clearance_radius];
|
||||
M3_dome_screw = ["M3_dome", "M3 dome", hs_dome, 3, 5.7, 1.65, 1.04,2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
|
||||
@@ -107,15 +108,16 @@ No2_screw = ["No2", "No2 pan wood", hs_pan, 2.2, 4.2, 1.7, 0, 0
|
||||
No4_screw = ["No4", "No4 pan wood", hs_pan, 3.0, 5.5, 2.0, 0, 0, 0 ,M3p5_washer, false, No4_pilot_radius, No4_clearance_radius];
|
||||
No6_screw = ["No6", "No6 pan wood", hs_pan, 3.5, 6.7, 2.2, 0, 0, 0 , M4_washer, false, No6_pilot_radius, No6_clearance_radius];
|
||||
No6_cs_screw = ["No6_cs", "No6 cs wood", hs_cs, 3.5, 7.0, 0, 0, 0, 0, M4_washer, false, No6_pilot_radius, No6_clearance_radius];
|
||||
No8_screw = ["No8", "No8 pan wood", hs_pan, 4.2, 8.2, 3.05, 0, 0, 0 , M5_washer, false, No8_pilot_radius, No8_clearance_radius];
|
||||
|
||||
screw_lists = [
|
||||
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
|
||||
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
|
||||
[ 0, 0, M3_low_cap_screw],
|
||||
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw, M5_cs_cap_screw],
|
||||
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw, M5_cs_cap_screw, M6_cs_cap_screw],
|
||||
[ M2_dome_screw, 0, M3_dome_screw, M4_dome_screw, M5_dome_screw],
|
||||
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
|
||||
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
|
||||
[ No2_screw, 0, No4_screw, No6_screw, No6_cs_screw],
|
||||
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
|
||||
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
|
||||
[ No2_screw, 0, No4_screw, No6_screw, No8_screw, No6_cs_screw],
|
||||
[ 0, 0, M3_grub_screw, M4_grub_screw]
|
||||
];
|
||||
|
||||
|
@@ -30,7 +30,7 @@ function ziptie_latch(type) = type[3]; //! Latch dimensions
|
||||
function ziptie_colour(type) = type[4]; //! Colour
|
||||
function ziptie_tail(type) = type[5]; //! The length without teeth
|
||||
|
||||
module ziptie(type, r, t = 0) //! Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t`
|
||||
module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t`
|
||||
{
|
||||
latch = ziptie_latch(type);
|
||||
lx = latch.x / 2;
|
||||
@@ -50,7 +50,7 @@ module ziptie(type, r, t = 0) //! Draw specified ziptie wrapped around radius `r
|
||||
len = length <= 100 ? 100 : length;
|
||||
width = ziptie_width(type);
|
||||
|
||||
vitamin(str("ziptie(", type[0], ", ", r, "): Ziptie ", width, "mm x ", len, "mm min length"));
|
||||
vitamin(str("ziptie(", type[0], "): Ziptie ", width, "mm x ", len, "mm min length"));
|
||||
|
||||
color(ziptie_colour(type)){
|
||||
linear_extrude(width, center = true)
|
||||
|