Compare commits
84 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
c7a6d8164f | ||
|
fe3b84f672 | ||
|
d1a17bd4ac | ||
|
b8efa11fd9 | ||
|
3bc8f35e37 | ||
|
39c11ef3b2 | ||
|
5a8a1da880 | ||
|
3147862212 | ||
|
4fc8a7f47d | ||
|
a9ed9944c3 | ||
|
9cd2dbc316 | ||
|
f3bfbbfcf2 | ||
|
baaa85ffed | ||
|
f1a49d4e28 | ||
|
0eed0673b0 | ||
|
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 | ||
|
608168de8e |
126
CHANGELOG.md
@@ -3,6 +3,132 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v15.18.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.18.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.17.1...v15.18.0 "diff with v15.17.1")
|
||||
* 2021-06-08 [`d1a17bd`](https://github.com/nophead/NopSCADlib/commit/d1a17bd4ac90a7d3d6de7c4d4d032e8198c48647 "show commit") [C.P.](# "Chris Palmer") Added LIPO fuel gauge PCB.
|
||||
|
||||
* 2021-06-08 [`b8efa11`](https://github.com/nophead/NopSCADlib/commit/b8efa11fd9504f4b837be663190d238c6227941e "show commit") [C.P.](# "Chris Palmer") Added SMD capacitors.
|
||||
|
||||
* 2021-06-07 [`3bc8f35`](https://github.com/nophead/NopSCADlib/commit/3bc8f35e37741ef12d45951546059902b472b34a "show commit") [C.P.](# "Chris Palmer") Can now put `jst_ph` connectors on PCBs
|
||||
|
||||
* 2021-06-07 [`39c11ef`](https://github.com/nophead/NopSCADlib/commit/39c11ef3b209256be393b3b211fef72c8ac793a1 "show commit") [C.P.](# "Chris Palmer") Added 2p54joiner to represent cropped headers joining PCBs.
|
||||
|
||||
* 2021-06-07 [`5a8a1da`](https://github.com/nophead/NopSCADlib/commit/5a8a1da8801e3d799b7e322b397b236685552f97 "show commit") [C.P.](# "Chris Palmer") Added Seeeduino XIAO.
|
||||
Tiny PCBs now shown in a third line.
|
||||
|
||||
* 2021-06-07 [`3147862`](https://github.com/nophead/NopSCADlib/commit/3147862212d6d1277a5e164909e4004e3e321f10 "show commit") [C.P.](# "Chris Palmer") PCB lands can be rounded and can specify colour.
|
||||
Holes can be positioned on the edge to make surface mountable connections.
|
||||
|
||||
#### [v15.17.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.17.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.17.0...v15.17.1 "diff with v15.17.0")
|
||||
* 2021-06-07 [`4fc8a7f`](https://github.com/nophead/NopSCADlib/commit/4fc8a7f47df9a880b8e02c9e0f1a3a63d9939c3e "show commit") [C.P.](# "Chris Palmer") Fixed z-fighting between transparent LEDs and PCB.
|
||||
|
||||
### [v15.17.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.17.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.16.2...v15.17.0 "diff with v15.16.2")
|
||||
* 2021-06-06 [`a9ed994`](https://github.com/nophead/NopSCADlib/commit/a9ed9944c328d1fa5121ae10e4e0243bda45f001 "show commit") [C.P.](# "Chris Palmer") Added PERF70x51.
|
||||
|
||||
* 2021-06-06 [`9cd2dbc`](https://github.com/nophead/NopSCADlib/commit/9cd2dbc3167c1d14ac1f72e5676f4154151b5638 "show commit") [C.P.](# "Chris Palmer") Added copper colour constant.
|
||||
Copper PCB pads and veroboard tracks now use copper colour.
|
||||
|
||||
#### [v15.16.2](https://github.com/nophead/NopSCADlib/releases/tag/v15.16.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.16.1...v15.16.2 "diff with v15.16.1")
|
||||
* 2021-06-06 [`f3bfbbf`](https://github.com/nophead/NopSCADlib/commit/f3bfbbfcf21209fd993aa7ebc25c8d8d3c12fbd5 "show commit") [C.P.](# "Chris Palmer") Fixed Python error when top level assembly is empty.
|
||||
|
||||
* 2021-06-06 [`baaa85f`](https://github.com/nophead/NopSCADlib/commit/baaa85ffedb1a7cdca42e01ca8f2e257438070fc "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||
|
||||
* 2021-06-06 [`f1a49d4`](https://github.com/nophead/NopSCADlib/commit/f1a49d4e28bf063950b113c64acaa918d470767f "show commit") [C.P.](# "Chris Palmer") Better description of `pcb_grid()`.
|
||||
|
||||
#### [v15.16.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.16.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.16.0...v15.16.1 "diff with v15.16.0")
|
||||
* 2021-06-04 [`9a4cc7e`](https://github.com/nophead/NopSCADlib/commit/9a4cc7ec42bf440e24ad3dacd88d7055736ae793 "show commit") [C.P.](# "Chris Palmer") Ziptie BOM entries no longer segregated by radius wrapped around.
|
||||
|
||||
### [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()`.
|
||||
|
||||
|
@@ -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
|
||||
@@ -53,9 +54,10 @@ $fs = extrusion_width / 2;
|
||||
function round_to_layer(z) = ceil(z / layer_height) * layer_height;
|
||||
// Some additional named colours
|
||||
function grey(n) = [0.01, 0.01, 0.01] * n; //! Generate a shade of grey to pass to color().
|
||||
gold = [255/255, 215/255, 0/255];
|
||||
brass = [255/255, 220/255, 100/255];
|
||||
silver = [0.75, 0.75, 0.75];
|
||||
gold = [255, 215, 0] / 255;
|
||||
brass = [255, 220, 100] / 255;
|
||||
copper = [230, 140, 51] / 255;
|
||||
|
||||
/*
|
||||
* Enums
|
||||
|
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: 891 KiB After Width: | Height: | Size: 911 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();
|
||||
|
292
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>
|
||||
|
||||
---
|
||||
@@ -334,6 +334,73 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
||||
| 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>
|
||||
|
||||
---
|
||||
@@ -373,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 |
|
||||
@@ -399,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>
|
||||
|
||||
---
|
||||
@@ -1053,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 |
|
||||
@@ -1083,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>
|
||||
@@ -1196,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>
|
||||
@@ -1289,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 |
|
||||
@@ -1445,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 |
|
||||
@@ -2142,7 +2249,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `pcb_accessories(type)` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
|
||||
| `pcb_colour(type)` | Colour of the subtrate |
|
||||
| `pcb_components(type)` | List of components |
|
||||
| `pcb_grid(type)` | Grid if a perfboard |
|
||||
| `pcb_grid(type)` | Grid origin if a perfboard |
|
||||
| `pcb_hole_d(type)` | Mounting hole diameter |
|
||||
| `pcb_holes(type)` | List of hole positions |
|
||||
| `pcb_land_d(type)` | Pad around mounting hole |
|
||||
@@ -2157,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 |
|
||||
@@ -2175,7 +2283,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `hdmi(type, cutout = false)` | Draw HDMI socket |
|
||||
| `jack(cutout = false)` | Draw 3.5mm jack |
|
||||
| `molex_254(ways)` | Draw molex header |
|
||||
| `molex_usb_Ax2(cutout)` | Draw Molex USB connector suitable for perf board |
|
||||
| `molex_usb_Ax1(cutout)` | Draw Molex USB A connector suitable for perf board |
|
||||
| `molex_usb_Ax2(cutout)` | Draw Molex dual USB A connector suitable for perf board |
|
||||
| `pcb(type)` | Draw specified PCB |
|
||||
| `pcb_assembly(type, height, thickness)` | Draw PCB assembly with spaces and fasteners in place |
|
||||
| `pcb_base(type, height, thickness, wall = 2)` | Generate STL for a base with PCB spacers |
|
||||
@@ -2228,6 +2337,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `ax_res(res1_8, 1e+6, tol = 1)` | Resistor 1e+6 Ohms 1% 0.125W |
|
||||
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
|
||||
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 1K)` | SMD resistor 1206 1K 0.25W |
|
||||
@@ -2278,7 +2390,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `pcb_accessories(type)` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
|
||||
| `pcb_colour(type)` | Colour of the subtrate |
|
||||
| `pcb_components(type)` | List of components |
|
||||
| `pcb_grid(type)` | Grid if a perfboard |
|
||||
| `pcb_grid(type)` | Grid origin if a perfboard |
|
||||
| `pcb_hole_d(type)` | Mounting hole diameter |
|
||||
| `pcb_holes(type)` | List of hole positions |
|
||||
| `pcb_land_d(type)` | Pad around mounting hole |
|
||||
@@ -2293,6 +2405,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 |
|
||||
@@ -2311,7 +2424,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `hdmi(type, cutout = false)` | Draw HDMI socket |
|
||||
| `jack(cutout = false)` | Draw 3.5mm jack |
|
||||
| `molex_254(ways)` | Draw molex header |
|
||||
| `molex_usb_Ax2(cutout)` | Draw Molex USB connector suitable for perf board |
|
||||
| `molex_usb_Ax1(cutout)` | Draw Molex USB A connector suitable for perf board |
|
||||
| `molex_usb_Ax2(cutout)` | Draw Molex dual USB A connector suitable for perf board |
|
||||
| `pcb(type)` | Draw specified PCB |
|
||||
| `pcb_assembly(type, height, thickness)` | Draw PCB assembly with spaces and fasteners in place |
|
||||
| `pcb_base(type, height, thickness, wall = 2)` | Generate STL for a base with PCB spacers |
|
||||
@@ -2352,6 +2466,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(EnviroPlus)` | Enviro+ |
|
||||
| 1 | `pcb(ExtruderPCB)` | Extruder connection PCB |
|
||||
| 1 | `pcb(Keyes5p1)` | Keyes5.1 Arduino Uno expansion board - not shown |
|
||||
| 1 | `pcb(LIPO_fuel_gauge)` | LIPO fuel gauge |
|
||||
| 1 | `pcb(MP1584EN)` | MP1584EN 3A buck converter |
|
||||
| 1 | `pcb(MT3608)` | MT3608 boost converter module |
|
||||
| 1 | `pcb(Melzi)` | Melzi electronics - not shown |
|
||||
@@ -2361,13 +2476,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `molex_254(3)` | Molex KK header 3 way |
|
||||
| 16 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
|
||||
| 30 | `nut(M2p5_nut, nyloc = true)` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 22 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 26 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 8 | `nut(M4_nut, nyloc = true)` | Nut M4 x 3.2mm nyloc |
|
||||
| 1 | `pcb(PI_IO)` | PI_IO V2 |
|
||||
| 1 | `pcb(PSU12V1A)` | PSU 12V 1A - not shown |
|
||||
| 1 | `pcb(PERF60x40)` | Perfboard 60 x 40mm |
|
||||
| 1 | `pcb(PERF70x30)` | Perfboard 70 x 30mm |
|
||||
| 1 | `pcb(PERF70x50)` | Perfboard 70 x 50mm |
|
||||
| 1 | `pcb(PERF70x51)` | Perfboard 70 x 51mm |
|
||||
| 1 | `pcb(PERF74x51)` | Perfboard 74 x 51mm |
|
||||
| 1 | `pcb(PERF80x20)` | Perfboard 80 x 20mm |
|
||||
| 1 | `pin_socket(2p54header, 13, 2, right_angle = true)` | Pin socket 13 x 2 right_angle |
|
||||
@@ -2375,16 +2491,18 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(RPI3)` | Raspberry Pi 3 |
|
||||
| 1 | `pcb(RPI4)` | Raspberry Pi 4 |
|
||||
| 1 | `pcb(RPI0)` | Raspberry Pi Zero |
|
||||
| 12 | `screw(M2_cap_screw, 16)` | Screw M2 cap x 16mm |
|
||||
| 4 | `screw(M2_cap_screw, 20)` | Screw M2 cap x 20mm |
|
||||
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
||||
| 8 | `screw(M2_cap_screw, 16)` | Screw M2 cap x 16mm |
|
||||
| 8 | `screw(M2_cap_screw, 20)` | Screw M2 cap x 20mm |
|
||||
| 2 | `screw(M2p5_cap_screw, 16)` | Screw M2.5 cap x 16mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 25)` | Screw M2.5 cap x 25mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
||||
| 12 | `screw(M2p5_pan_screw, 25)` | Screw M2.5 pan x 25mm |
|
||||
| 4 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 9 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
||||
| 9 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
||||
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
|
||||
| 8 | `screw(M2p5_pan_screw, 25)` | Screw M2.5 pan x 25mm |
|
||||
| 8 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||
| 4 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
|
||||
| 14 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
||||
| 8 | `screw(M4_cap_screw, 35)` | Screw M4 cap x 35mm |
|
||||
| 1 | `pcb(XIAO)` | Seeeduino XIAO |
|
||||
| 1 | `pcb(TP4056)` | TP4056 Li-lon Battery charger module |
|
||||
| 3 | `terminal_35(2)` | Terminal block 2 way 3.5mm |
|
||||
| 2 | `green_terminal(gt_2p54, 4)` | Terminal block 4 way 0.1" |
|
||||
@@ -2392,32 +2510,33 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `pcb(WD2002SJ)` | WD2002SJ Buck Boost DC-DC converter |
|
||||
| 16 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
||||
| 30 | `washer(M2p5_washer)` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 22 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 26 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
| 8 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||
| 1 | `pcb(ZC_A0591)` | ZC-A0591 ULN2003 driver PCB |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 4 | pcb_spacer2060.stl |
|
||||
| 4 | pcb_spacer20100.stl |
|
||||
| 4 | pcb_spacer2070.stl |
|
||||
| 4 | pcb_spacer2080.stl |
|
||||
| 4 | pcb_spacer2090.stl |
|
||||
| 4 | pcb_spacer25120.stl |
|
||||
| 4 | pcb_spacer25130.stl |
|
||||
| 4 | pcb_spacer25140.stl |
|
||||
| 4 | pcb_spacer25150_2.stl |
|
||||
| 4 | pcb_spacer25160_2.stl |
|
||||
| 4 | pcb_spacer25180.stl |
|
||||
| 4 | pcb_spacer25190.stl |
|
||||
| 2 | pcb_spacer2580.stl |
|
||||
| 4 | pcb_spacer30170.stl |
|
||||
| 5 | pcb_spacer30200.stl |
|
||||
| 5 | pcb_spacer30210.stl |
|
||||
| 4 | pcb_spacer30220.stl |
|
||||
| 4 | pcb_spacer25100.stl |
|
||||
| 4 | pcb_spacer25110.stl |
|
||||
| 4 | pcb_spacer25120_2.stl |
|
||||
| 4 | pcb_spacer25130_2.stl |
|
||||
| 4 | pcb_spacer25150.stl |
|
||||
| 4 | pcb_spacer25160.stl |
|
||||
| 2 | pcb_spacer2550.stl |
|
||||
| 4 | pcb_spacer2590.stl |
|
||||
| 4 | pcb_spacer30140.stl |
|
||||
| 5 | pcb_spacer30170.stl |
|
||||
| 5 | pcb_spacer30180.stl |
|
||||
| 4 | pcb_spacer30190.stl |
|
||||
| 4 | pcb_spacer3050.stl |
|
||||
| 4 | pcb_spacer40230.stl |
|
||||
| 4 | pcb_spacer40240.stl |
|
||||
| 4 | pcb_spacer3060.stl |
|
||||
| 4 | pcb_spacer40200.stl |
|
||||
| 4 | pcb_spacer40210.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2627,6 +2746,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
|
||||
@@ -2786,26 +2906,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 |
|
||||
|
||||
|
||||
@@ -3047,6 +3176,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 |
|
||||
@@ -3263,6 +3393,8 @@ Surface mount components for PCBs.
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `smd_cap_end_cap(type)` | End cap width |
|
||||
| `smd_cap_size(type)` | Body length, width |
|
||||
| `smd_led_lens(type)` | Lens length width and height |
|
||||
| `smd_led_size(type)` | Body length, width and height |
|
||||
| `smd_res_end_cap(type)` | End cap width |
|
||||
@@ -3279,6 +3411,7 @@ Surface mount components for PCBs.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `smd_capacitor(type, height)` | Draw an SMD capacitor with specified height |
|
||||
| `smd_led(type, colour, cutout)` | Draw an SMD LED with specified `colour` |
|
||||
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
|
||||
|
||||
@@ -3289,6 +3422,9 @@ Surface mount components for PCBs.
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
|
||||
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
||||
@@ -3991,7 +4127,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>
|
||||
@@ -4019,16 +4155,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>
|
||||
@@ -5238,7 +5374,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 |
|
||||
@@ -5440,7 +5576,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 |
|
||||
@@ -5633,8 +5769,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 |
|
||||
|
||||

|
||||
|
@@ -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)
|
||||
|
@@ -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:
|
||||
|
@@ -77,7 +77,7 @@ def bom_to_assemblies(bom_dir, bounds_map):
|
||||
#
|
||||
if flat_bom:
|
||||
ass = flat_bom[-1]
|
||||
if len(ass["assemblies"]) < 2 and not ass["vitamins"] and not ass["printed"] and not ass["routed"]:
|
||||
if len(ass["assemblies"]) == 1 and not ass["vitamins"] and not ass["printed"] and not ass["routed"]:
|
||||
flat_bom = flat_bom[:-1]
|
||||
return [assembly["name"] for assembly in flat_bom]
|
||||
|
||||
@@ -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>
|
||||
|
@@ -64,21 +64,25 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 16, 2, 90, "smd_res", RES1206, "1K"],
|
||||
[ 19, 2, 90, "smd_res", RES0805, "1K"],
|
||||
[ 22, 2, 90, "smd_res", RES0603, "1K"],
|
||||
[ 25, 2, 90, "smd_cap", CAP1206, 1.5],
|
||||
[ 28, 2, 90, "smd_cap", CAP0805, 1.0],
|
||||
[ 31, 2, 90, "smd_cap", CAP0603, 0.7],
|
||||
|
||||
[ 10, 10, 0, "2p54header", 4, 1],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, false, "blue" ],
|
||||
[ 10, 20, 0, "2p54boxhdr", 4, 2],
|
||||
[ 10, 30, 0, "2p54socket", 6, 1],
|
||||
[ 25, 30, 0, "2p54socket", 4, 1, false, 0, false, "red" ],
|
||||
[ 10, 40, 0, "chip", 10, 5, 1, grey(20)],
|
||||
[ 5, 50, 0, "led", LED3mm, "red"],
|
||||
[ 12, 50, 0, "led", LED5mm, "orange"],
|
||||
[ 25, 50, 0, "led", LED10mm, "yellow"],
|
||||
[ 10, 65, 180, "rj45"],
|
||||
[ 8, 85, 180, "usb_A"],
|
||||
[ 65, 50, 0, "led", LED3mm, "red"],
|
||||
[ 75, 50, 0, "led", LED5mm, "orange"],
|
||||
[ 90, 50, 0, "led", LED10mm, "yellow"],
|
||||
[ 10, 45, 180, "rj45"],
|
||||
[ 8, 65, 180, "usb_A"],
|
||||
[ 8, 105, 180, "usb_Ax2"],
|
||||
[ 7, 85, 180, "molex_usb_Ax1"],
|
||||
[ 8.5,125, 180, "molex_usb_Ax2"],
|
||||
[ 3, 140, 180, "usb_uA"],
|
||||
[ 8, 155, 180, "usb_B"],
|
||||
[ 8.5, 125, 180, "molex_usb_Ax2"],
|
||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 218, 0, "buzzer"],
|
||||
[ 8, 190, 180, "jack"],
|
||||
@@ -127,6 +131,8 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 52, 200, 0, "pcb", 11, TMC2130 ],
|
||||
[ 80, 200, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 170, 0, "pdip", 8, "NE555" ],
|
||||
[ 80, 150, 0, "chip", 10, 5, 1, grey(20)],
|
||||
|
||||
[ 52, 206, 0, "2p54socket", 8, 1 ],
|
||||
[ 52, 194, 0, "2p54socket", 8, 1, false, 0, false, "red" ],
|
||||
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
|
||||
|
@@ -29,7 +29,12 @@ module pcbs() {
|
||||
rotate(90)
|
||||
pcb_assembly(pcbs[$i], 5 + $i, 3);
|
||||
|
||||
translate([0, 110])
|
||||
translate([0, 45])
|
||||
layout([for(p = tiny_pcbs) pcb_length(p)], 3)
|
||||
translate([0, pcb_width(tiny_pcbs[$i]) / 2])
|
||||
pcb_assembly(tiny_pcbs[$i], 5 + $i, 3);
|
||||
|
||||
translate([0, 120])
|
||||
layout([for(p = perfboards) pcb_length(p)], 10)
|
||||
translate([0, -pcb_width(perfboards[$i]) / 2])
|
||||
pcb_assembly(perfboards[$i], 5 + $i, 3);
|
||||
|
@@ -28,6 +28,11 @@ module smds() {
|
||||
translate([0, 3])
|
||||
layout([for(l = smd_leds) smd_led_size(l).x], 1)
|
||||
smd_led(smd_leds[$i], ["green", "blue", "red"][$i % 3]);
|
||||
|
||||
translate([0, 6])
|
||||
layout([for(c = smd_capacitors) smd_cap_size(c).x], 1)
|
||||
let(c = smd_capacitors[$i])
|
||||
smd_capacitor(c, smd_cap_size(c).y * 0.8);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -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>
|
||||
|
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: 282 KiB After Width: | Height: | Size: 276 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: 77 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 165 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: 158 KiB After Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 149 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)
|
||||
|
@@ -180,24 +180,25 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
|
||||
tooth_colour = lower_belt ? coreXY_lower_tooth_colour(type) : coreXY_upper_tooth_colour(type));
|
||||
}
|
||||
|
||||
module coreXY(type, size, pos, separation, x_gap, 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);
|
||||
}
|
||||
|
@@ -75,28 +75,28 @@ function rounded_polygon_length(points, tangents) = //! Calculate the length giv
|
||||
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 = [ for (t = _tangents ? _tangents : rounded_polygon_tangents(points)) each [t.x, t.y] ];
|
||||
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
|
||||
|
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
|
||||
|
@@ -50,11 +50,14 @@ function pcb_parts_on_bom(type) = type[9]; //! True if the parts should be sepa
|
||||
function pcb_holes(type) = type[10]; //! List of hole positions
|
||||
function pcb_components(type) = type[11]; //! List of components
|
||||
function pcb_accessories(type) = type[12]; //! List of accessories to go on the BOM, SD cards, USB cables, etc.
|
||||
function pcb_grid(type) = type[13]; //! Grid if a perfboard
|
||||
function pcb_grid(type) = type[13]; //! Grid origin if a perfboard
|
||||
function pcb_polygon(type) = type[14]; //! Optional outline polygon for odd shaped boards
|
||||
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,
|
||||
@@ -158,7 +161,7 @@ module usb_A(h, v_flange_l, bar, cutout) {
|
||||
}
|
||||
}
|
||||
|
||||
module molex_usb_Ax2(cutout) { //! Draw Molex USB connector suitable for perf board
|
||||
module molex_usb_Ax2(cutout) { //! Draw Molex dual USB A connector suitable for perf board
|
||||
w = 15.9;
|
||||
h = 16.6;
|
||||
l = 17;
|
||||
@@ -218,6 +221,63 @@ module molex_usb_Ax2(cutout) { //! Draw Molex USB connector suitable for perf bo
|
||||
}
|
||||
}
|
||||
|
||||
module molex_usb_Ax1(cutout) { //! Draw Molex USB A connector suitable for perf board
|
||||
w = 15.3;
|
||||
h = 7.7;
|
||||
l = 14.5;
|
||||
pin_l = 2.8;
|
||||
clearance = 0.2;
|
||||
tag_l = 4.4;
|
||||
tag_r = 0.5;
|
||||
tag_w = 1.5;
|
||||
tag_t = 0.3;
|
||||
|
||||
if(cutout)
|
||||
translate([0, -w / 2 - clearance, -clearance])
|
||||
cube([100, w + 2 * clearance, h + 2 * clearance]);
|
||||
else {
|
||||
color(silver)
|
||||
translate([-l / 2, 0])
|
||||
rotate([90, 0, 90])
|
||||
translate([-w / 2, 0]) {
|
||||
cube([w, h, l - 9]);
|
||||
|
||||
linear_extrude(l)
|
||||
difference() {
|
||||
square([w, h]);
|
||||
|
||||
translate([w / 2, h / 2])
|
||||
square([12.6, 5.08], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
translate([-1.5, 0, h / 2])
|
||||
usb_A_tongue();
|
||||
|
||||
color(silver)
|
||||
rotate(-90) {
|
||||
for(x = [-1.5 : 1 : 1.5])
|
||||
translate([inch(x / 10), - l / 2 + inch(0.05)])
|
||||
hull() {
|
||||
cube([0.6, 0.3, 2 * pin_l - 2], center = true);
|
||||
|
||||
cube([0.4, 0.3, 2 * pin_l], center = true);
|
||||
}
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([side * w / 2, -l / 2 + 4.2])
|
||||
rotate(-side * 90)
|
||||
hull() {
|
||||
translate([0, tag_l - tag_r])
|
||||
cylinder(r = tag_r, h = tag_t);
|
||||
|
||||
translate([-tag_w / 2, 0])
|
||||
cube([tag_w, eps, tag_t]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module rj45(cutout = false) { //! Draw RJ45 Ethernet connector
|
||||
l = 21;
|
||||
w = 16;
|
||||
@@ -916,6 +976,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
rotate(comp.z) {
|
||||
// Components that have a cutout parameter go in this section
|
||||
if(show(comp, "2p54header")) pin_header(2p54header, comp[4], comp[5], param(6, false), param(8, false), cutouts, colour = param(7, undef));
|
||||
if(show(comp, "2p54joiner")) pin_header(2p54joiner, comp[4], comp[5], param(6, false), param(8, false), cutouts, colour = param(7, undef));
|
||||
if(show(comp, "2p54boxhdr")) box_header(2p54header, comp[4], comp[5], param(6, false), cutouts);
|
||||
if(show(comp, "2p54socket")) pin_socket(2p54header, comp[4], comp[5], param(6, false), param(7, 0), param(8, false), cutouts, param(9, undef));
|
||||
if(show(comp, "chip")) chip(comp[4], comp[5], comp[6], param(7, grey(30)), cutouts);
|
||||
@@ -935,6 +996,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "uSD")) uSD(comp[4], cutouts);
|
||||
if(show(comp, "trimpot10")) trimpot10(param(4, false), cutouts);
|
||||
if(show(comp, "molex_usb_Ax2")) molex_usb_Ax2(cutouts);
|
||||
if(show(comp, "molex_usb_Ax1")) molex_usb_Ax1(cutouts);
|
||||
if(show(comp, "smd_led")) smd_led(comp[4], comp[5], cutouts);
|
||||
if(show(comp, "block")) block(size = [comp[4], comp[5], comp[6]], colour = comp[7], makes_cutout = param(8));
|
||||
if(!cutouts) {
|
||||
@@ -951,16 +1013,18 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "gterm635")) green_terminal(gt_6p35, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "term35")) terminal_35(comp[4], param(5,"blue"));
|
||||
if(show(comp, "transition")) idc_transition(2p54header, comp[4], comp[5]);
|
||||
if(show(comp, "led")) led(comp[4], comp[5], 2.6);
|
||||
if(show(comp, "led")) translate_z(eps) led(comp[4], comp[5], 2.6);
|
||||
if(show(comp, "pdip")) pdip(comp[4], comp[5], param(6, false), param(7, inch(0.3)));
|
||||
if(show(comp, "ax_res")) ax_res(comp[4], comp[5], param(6, 5), param(7, 0));
|
||||
if(show(comp, "link")) wire_link(l = comp[4], h = param(5, 1), d = param(6, 0.8), tail = param(7, 3));
|
||||
if(show(comp, "D_plug")) translate_z(d_pcb_offset(comp[4])) d_plug(comp[4], pcb = true);
|
||||
if(show(comp, "molex_hdr")) molex_254(comp[4]);
|
||||
if(show(comp, "jst_xh")) jst_xh_header(jst_xh_header, comp[4], param(5, false), param(6, "white"), param(7, undef));
|
||||
if(show(comp, "jst_ph")) jst_xh_header(jst_ph_header, comp[4], param(5, false), param(6, "white"), param(7, undef));
|
||||
if(show(comp, "potentiometer")) potentiometer(param(4, 5), param(5, 9));
|
||||
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
|
||||
if(show(comp, "smd_res")) smd_resistor(comp[4], comp[5]);
|
||||
if(show(comp, "smd_cap")) smd_capacitor(comp[4], comp[5]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1015,44 +1079,64 @@ module pcb_grid_positions(type) {
|
||||
module pcb(type) { //! Draw specified PCB
|
||||
grid = pcb_grid(type);
|
||||
t = pcb_thickness(type);
|
||||
w = pcb_width(type);
|
||||
l = pcb_length(type);
|
||||
|
||||
module pcb_shape()
|
||||
if(Len(pcb_polygon(type)))
|
||||
polygon(pcb_polygon(type));
|
||||
else
|
||||
rounded_square([l, w], r = pcb_radius(type));
|
||||
|
||||
if(pcb_name(type))
|
||||
vitamin(str("pcb(", type[0], "): ", pcb_name(type)));
|
||||
|
||||
for(part = pcb_accessories(type))
|
||||
vitamin(part);
|
||||
|
||||
color(pcb_colour(type)) linear_extrude(t) difference() {
|
||||
if(Len(pcb_polygon(type)))
|
||||
polygon(pcb_polygon(type));
|
||||
else
|
||||
rounded_square([pcb_length(type), pcb_width(type)], r = pcb_radius(type));
|
||||
color(pcb_colour(type))
|
||||
linear_extrude(t)
|
||||
difference() {
|
||||
pcb_shape();
|
||||
|
||||
pcb_hole_positions(type)
|
||||
circle(d = pcb_hole_d(type) + eps);
|
||||
pcb_hole_positions(type)
|
||||
offset(eps)
|
||||
circle4n(d = pcb_hole_d(type));
|
||||
|
||||
if(Len(grid))
|
||||
pcb_grid_positions(type)
|
||||
circle(d = 1 + eps);
|
||||
}
|
||||
if(Len(grid))
|
||||
pcb_grid_positions(type)
|
||||
circle(d = 1 + eps);
|
||||
}
|
||||
|
||||
land = pcb_land_d(type);
|
||||
land_r = Len(land) > 2 ? land[2] : 0;
|
||||
hole = pcb_hole_d(type);
|
||||
color("silver")
|
||||
plating = 0.1;
|
||||
color(Len(land) > 3 ? land[3] : silver)
|
||||
translate_z(t / 2)
|
||||
pcb_hole_positions(type)
|
||||
if(is_list(land))
|
||||
linear_extrude(t + 2 * eps, center = true)
|
||||
difference() {
|
||||
square(land, center = true);
|
||||
linear_extrude(t + 2 * plating, center = true)
|
||||
difference() {
|
||||
intersection() {
|
||||
pcb_hole_positions(type)
|
||||
if(is_list(land)) {
|
||||
p = pcb_holes(type)[$i]; // If edge SMT pad then make it rectangular to overlap without gaps
|
||||
edge = abs(p.x) < eps || abs(p.x - l) < eps || abs(p.y) < eps || abs(p.y - w) < eps;
|
||||
rounded_square([land.x, land.y], edge ? 0 : land_r);
|
||||
}
|
||||
else
|
||||
circle(d = max(land, 1));
|
||||
|
||||
circle(d = hole);
|
||||
}
|
||||
else
|
||||
tube(or = max(land, 1) / 2, ir = hole / 2, h = t + 2 * eps);
|
||||
offset(eps)
|
||||
pcb_shape(); // Handle half holes on the edge of PCBs such as ESP8266
|
||||
}
|
||||
|
||||
pcb_hole_positions(type)
|
||||
circle4n(d = hole);
|
||||
}
|
||||
|
||||
fr4 = pcb_colour(type) != "sienna";
|
||||
plating = 0.15;
|
||||
color(pcb_colour(type) == "green" ? "silver" : "gold")
|
||||
pcb_colour = pcb_colour(type);
|
||||
color(pcb_colour == "green" ? silver : pcb_colour == "sienna" ? copper : gold)
|
||||
translate_z(-plating)
|
||||
linear_extrude(fr4 ? t + 2 * plating : plating)
|
||||
if(Len(grid)) {
|
||||
|
@@ -705,6 +705,8 @@ PERF70x30 = ["PERF70x30", "Perfboard 70 x 30mm", 70, 30, 1.6, 0, 2.3, 0, "green"
|
||||
|
||||
PERF60x40 = ["PERF60x40", "Perfboard 60 x 40mm", 60, 40, 1.6, 0, 2.3, 0, "green", true, [[2,2],[-2,2],[2,-2],[-2,-2]], [], [], [5.87, 3.49]];
|
||||
|
||||
PERF70x51 = ["PERF70x51", "Perfboard 70 x 51mm", 70, 51, 1.0, 0, 3.0, 0, "sienna", true, [[3.0, 5.25], [-3.0, 5.25], [3.0, -5.25], [-3.0, -5.25]], [], [], [5.79, 3.91]];
|
||||
|
||||
PERF74x51 = ["PERF74x51", "Perfboard 74 x 51mm", 74, 51, 1.0, 0, 3.0, 0, "sienna", true, [[3.0, 3.5], [-3.0, 3.5], [3.0, -3.5], [-3.0, -3.5]], [], [], [9.5, 4.5]];
|
||||
|
||||
PSU12V1A = ["PSU12V1A", "PSU 12V 1A", 67, 31, 1.7, 0, 3.9, 0, "green", true, [[3.5, 3.5], [-3.5, 3.5], [-3.5, -3.5], [3.5, -3.5]], [], []];
|
||||
@@ -747,10 +749,59 @@ ESP_01 = [
|
||||
[] // accessories
|
||||
];
|
||||
|
||||
pcbs = [MP1584EN, TP4056, ESP_01, RAMPSEndstop, MT3608, PI_IO, ExtruderPCB, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, RPI3, RPI4, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
|
||||
XIAO = [
|
||||
"XIAO", "Seeeduino XIAO",
|
||||
21, 18, 1.2, // Size
|
||||
1.5, // corner radius
|
||||
0.8, // mounting hole diameter
|
||||
[2, 2.6, 1- eps, gold], // pad around mounting hole
|
||||
grey(25), // color
|
||||
false, // true if parts should be separate BOM items
|
||||
[for(x = [0:6], y = [-1,1]) [x * 2.54 + 2.71, y * 3 * 2.54 + 9], // Inboard hole positions
|
||||
for(x = [0:6], y = [-1,1]) [x * 2.54 + 2.71, y * 9 + 9]], // Hole positions on the edge, pad overlaps the inboard holes
|
||||
[ // components
|
||||
[7.6, 9, 0, "block", 12.3, 12, 2.41, silver], // can
|
||||
[21 + 1.76 - 7.35 / 2, 9, 0, "usb_C"],
|
||||
],
|
||||
[] // accessories
|
||||
];
|
||||
|
||||
LIPO_fuel_gauge = [
|
||||
"LIPO_fuel_gauge", "LIPO fuel gauge",
|
||||
24, 10, 1.6, // Size
|
||||
0, // corner radius
|
||||
1, // mounting hole diameter
|
||||
1.8, // pad around mounting hole
|
||||
"red", // color
|
||||
false, // true if parts should be separate BOM items
|
||||
[for(x = [0:2], y = [-1,1]) [x * 2.54 + 5.27, y * 1.5 * 2.54 + 5],
|
||||
for(x = 3, y = [-1,1]) [x * 2.54 + 5.27, y * 0.5 * 2.54 + 5]],
|
||||
[ // components
|
||||
[17, 5, 90, "jst_ph", 2, true],
|
||||
[2.54 + 5.27, 1.5 * 2.54 + 5, 0, "-2p54joiner", 3, 1],
|
||||
[2.54 + 5.27, -1.5 * 2.54 + 5, 0, "-2p54joiner", 3, 1],
|
||||
[3 * 2.54 + 5.27, 5, 0, "-2p54joiner", 1, 2],
|
||||
[6.4 + 1.5, 5, 0, "chip", 3, 2, 0.8],
|
||||
[1.2, 2.5, 90, "smd_res", RES0603, "472"],
|
||||
[2.4, 2.5, 90, "smd_res", RES0603, "472"],
|
||||
[1.2, -2.5, 90, "smd_res", RES0603, "472"],
|
||||
[2.4, -2.5, 90, "smd_res", RES0603, "472"],
|
||||
|
||||
[10.35, -4, -90, "smd_res", RES0603, "181"],
|
||||
[10.35, 4, -90, "smd_res", RES0603, "102"],
|
||||
|
||||
[12.89, 1.5 * 2.54 + 5, 0, "smd_cap", CAP0603, 0.85],
|
||||
[12.89,-1.5 * 2.54 + 5, 0, "smd_cap", CAP0603, 0.85],
|
||||
],
|
||||
[] // accessories
|
||||
];
|
||||
|
||||
tiny_pcbs = [XIAO, MP1584EN, TP4056, ESP_01, LIPO_fuel_gauge];
|
||||
|
||||
pcbs = [RAMPSEndstop, MT3608, PI_IO, ExtruderPCB, ZC_A0591, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, RPI3, RPI4, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
|
||||
|
||||
pcbs_not_shown = [Melzi, Duex2, PSU12V1A, Keyes5p1];
|
||||
|
||||
perfboards = [PERF74x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];
|
||||
perfboards = [PERF74x51, PERF70x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];
|
||||
|
||||
use <pcb.scad>
|
||||
|
@@ -17,16 +17,18 @@
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
// p p b p p b s b b p r r
|
||||
// i i e i i a o o o i a a
|
||||
// t n l n n s c x x n
|
||||
// c o e k b h
|
||||
// h l w w c s t y
|
||||
// c h z o
|
||||
// p p b p p b s b b p r r
|
||||
// i i e i i a o o o i a a
|
||||
// t n l n n s c x x n
|
||||
// c o e k b h
|
||||
// h l w w c s t y
|
||||
// c h z o
|
||||
// f
|
||||
2p54header = ["2p54header", 2.54, 11.6, 3.2, 0.66, "gold", grey(20), 8.5, [0, 0, 8.7], 2.4, 0, 0, 0 ];
|
||||
jst_xh_header = ["jst_xh_header",2.5, 10, 3.4, 0.64, "gold", grey(90), 0, [4.9, 5.75, 7], 0.8, 0.525, 0.6, 6.1];
|
||||
jst_ph_header = ["jst_ph_header",2.0, 9, 3.4, 0.64, silver, grey(90), 0, [3.9, 4.5, 6], 0.6, 0.55, 0.25, 4.8];
|
||||
2p54header = ["2p54header", 2.54, 11.6, 3.2, 0.66, gold, grey(20), 8.5, [0, 0, 8.7], 2.4, 0, 0, 0 ];
|
||||
2p54joiner = ["2p54joiner", 2.54, 6.86, 2.5, 0.66, gold, grey(20), 8.5, [0, 0, 8.7], 2.4, 0, 0, 0 ]; // Cropped pins for joining PCBs
|
||||
|
||||
jst_xh_header = ["jst_xh_header",2.5, 10, 3.4, 0.64, gold, grey(90), 0, [4.9, 5.75, 7], 0.8, 0.525, 0.6, 6.1];
|
||||
jst_ph_header = ["jst_ph_header",2.0, 9, 3.4, 0.64, silver, grey(90), 0, [3.9, 4.5, 6], 0.6, 0.55, 0.25, 4.8];
|
||||
|
||||
pin_headers = [ 2p54header ];
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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>
|
||||
|
@@ -108,6 +108,7 @@ 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],
|
||||
@@ -116,7 +117,7 @@ screw_lists = [
|
||||
[ 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],
|
||||
[ No2_screw, 0, No4_screw, No6_screw, No8_screw, No6_cs_screw],
|
||||
[ 0, 0, M3_grub_screw, M4_grub_screw]
|
||||
];
|
||||
|
||||
|
@@ -109,3 +109,23 @@ module smd_resistor(type, value) { //! Draw an SMD resistor with specified value
|
||||
resize([(size.x - 2 * cap) * 0.75, size.y / 2])
|
||||
text(value, halign = "center", valign = "center");
|
||||
}
|
||||
|
||||
function smd_cap_size(type) = type[1]; //! Body length, width
|
||||
function smd_cap_end_cap(type) = type[2]; //! End cap width
|
||||
|
||||
module smd_capacitor(type, height) { //! Draw an SMD capacitor with specified height
|
||||
size = smd_cap_size(type);
|
||||
vitamin(str("smd_capacitor(", type[0], "): SMD capacitor ", smd_size(size)));
|
||||
|
||||
cap = smd_cap_end_cap(type);
|
||||
|
||||
t = 0.02;
|
||||
color("tan")
|
||||
translate_z(height / 2)
|
||||
cube([size.x - 2 * cap, size.y - 2 * t, height - 2 * t], center = true);
|
||||
|
||||
color(silver)
|
||||
for(end = [-1, 1])
|
||||
translate([end * (size.x / 2 - cap / 2), 0, height / 2])
|
||||
cube([cap, size.y - 2 * eps, height], center = true);
|
||||
}
|
||||
|
@@ -32,4 +32,10 @@ RES1206 = ["RES1206", [3.1, 1.6, 0.6], 0.5, 1/4];
|
||||
|
||||
smd_resistors = [RES0603, RES0805, RES1206];
|
||||
|
||||
CAP0603 = ["CAP0603", [1.6, 0.8], 0.3];
|
||||
CAP0805 = ["CAP0805", [2.0, 1.2], 0.4];
|
||||
CAP1206 = ["CAP1206", [3.1, 1.6], 0.5];
|
||||
|
||||
smd_capacitors = [CAP0603, CAP0805, CAP1206];
|
||||
|
||||
use <smd.scad>
|
||||
|
@@ -83,7 +83,7 @@ module veroboard(type) { //! Draw specified veroboard with missing tracks and tr
|
||||
hole_d = 1;
|
||||
tw = vero_track_width(type);
|
||||
colour = vero_fr4(type) ? "green" : "goldenrod";
|
||||
tc = vero_fr4(type) ? "silver" : "darkorange";
|
||||
tc = vero_fr4(type) ? "silver" : copper;
|
||||
no_track = vero_no_track(type);
|
||||
|
||||
vitamin(str("veroboard(", type[0], "): Veroboard ", holes, " holes x ", strips, "strips"));
|
||||
|
@@ -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)
|
||||
|