1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 12:22:46 +02:00

Compare commits

...

84 Commits

Author SHA1 Message Date
Chris Palmer
d38055c15c Updated readme. 2021-06-17 15:53:59 +01:00
Chris Palmer
0cd0e72d92 Merge branch 'martinbudden-typos' 2021-06-17 15:15:04 +01:00
Chris Palmer
2c4a498a7a Merge branch 'typos' of https://github.com/martinbudden/NopSCADlib into martinbudden-typos 2021-06-17 15:12:31 +01:00
Chris Palmer
451101fcd6 Updated changelog. 2021-06-17 15:11:03 +01:00
Chris Palmer
c7a6d8164f Added molex_usb_Ax1() and now shows SMT caps in the PCB test. 2021-06-17 15:08:53 +01:00
Martin Budden
dcfe4262c5 Fixed typos. 2021-06-11 20:39:01 +01:00
Chris Palmer
fe3b84f672 Updated changelog 2021-06-08 08:17:37 +01:00
Chris Palmer
d1a17bd4ac Added LIPO fuel gauge PCB. 2021-06-08 08:09:08 +01:00
Chris Palmer
b8efa11fd9 Added SMD capacitors. 2021-06-08 08:08:35 +01:00
Chris Palmer
3bc8f35e37 Can now put jst_ph connectors on PCBs 2021-06-07 17:32:23 +01:00
Chris Palmer
39c11ef3b2 Added 2p54joiner to represent cropped headers joining PCBs. 2021-06-07 17:31:44 +01:00
Chris Palmer
5a8a1da880 Added Seeeduino XIAO.
Tiny PCBs now shown in a third line.
2021-06-07 12:23:29 +01:00
Chris Palmer
3147862212 PCB lands can be rounded and can specify colour.
Holes can be positioned on the edge to make surface mountable connections.
2021-06-07 10:59:47 +01:00
Chris Palmer
4fc8a7f47d Fixed z-fighting between transparent LEDs and PCB. 2021-06-07 10:56:32 +01:00
Chris Palmer
a9ed9944c3 Added PERF70x51. 2021-06-06 17:18:37 +01:00
Chris Palmer
9cd2dbc316 Added copper colour constant.
Copper PCB pads and veroboard tracks now use copper colour.
2021-06-06 17:17:33 +01:00
Chris Palmer
f3bfbbfcf2 Fixed Python error when top level assembly is empty. 2021-06-06 16:53:06 +01:00
Chris Palmer
baaa85ffed Updated readme. 2021-06-06 16:51:32 +01:00
Chris Palmer
f1a49d4e28 Better description of pcb_grid(). 2021-06-06 16:49:33 +01:00
Chris Palmer
0eed0673b0 Updated changelog. 2021-06-04 18:48:38 +01:00
Chris Palmer
9a4cc7ec42 Ziptie BOM entries no longer segregated by radius wrapped around. 2021-06-04 18:46:31 +01:00
Chris Palmer
2fb1185edf Updated changelog. 2021-06-04 17:49:17 +01:00
Chris Palmer
a782d43e67 bom.py now generates bom.csv to allow costed BOMs to be made using a spreadsheet. 2021-06-04 17:47:29 +01:00
Chris Palmer
ae934d47c7 Updated changelog. 2021-06-03 11:59:54 +01:00
Chris Palmer
823f3b936e Add the ability to have a target specific top level module in place of main_assembly(). 2021-06-03 11:58:10 +01:00
Chris Palmer
3027b942a6 Updated changelog. 2021-06-02 16:07:19 +01:00
Chris Palmer
749a1f0648 Fixed male thread z-fighting bug. 2021-06-02 16:05:51 +01:00
Chris Palmer
5c898df217 More readable code in rounded_polygon. 2021-06-01 09:53:46 +01:00
Chris Palmer
7a566cc856 Updated changelog. 2021-06-01 08:20:44 +01:00
Chris Palmer
20d799a3c1 IEC_320_C14_switched_fused_inlet now shows the correct object name in the example. 2021-06-01 08:18:57 +01:00
Chris Palmer
2ee95bba65 Updated changelog. 2021-05-31 17:24:31 +01:00
Chris Palmer
f49bb63266 Merge branch 'martinbudden-bldc_motors' 2021-05-31 17:22:43 +01:00
Chris Palmer
258109811b Added uppercase version of BLCD_motors.scad. 2021-05-31 17:21:49 +01:00
Chris Palmer
b39fd536c2 Removed lower case version of bldc_motors.scad. 2021-05-31 17:21:03 +01:00
Chris Palmer
a5a87d260d Updated images and readme. 2021-05-31 17:19:56 +01:00
Chris Palmer
b09efb10e0 Merge branch 'bldc_motors' of https://github.com/martinbudden/NopSCADlib into martinbudden-bldc_motors 2021-05-31 16:25:23 +01:00
Chris Palmer
53acaac379 Updated changelog 2021-05-31 16:22:52 +01:00
Chris Palmer
9b40e0dcef Merge branch 'martinbudden-thread_colour_assert' 2021-05-31 16:20:29 +01:00
Martin Budden
00ca412441 Added BLDC3548 motor. 2021-05-30 18:58:55 +01:00
Martin Budden
1e6d7f5dd6 Brushless DC motors. 2021-05-30 18:55:32 +01:00
Martin Budden
ec07d95657 Added assertion to check colour format in module thread. 2021-05-30 16:00:13 +01:00
Chris Palmer
0dab0dca08 Added missing includes core.scad which generates warnings with latest OpenSCAD snapshots.
Note, however, NopSCADlib does not work with the current OpenSCAD snapshot.
2021-05-19 17:54:31 +01:00
Chris Palmer
6e6cd45295 Updated changelog 2021-05-18 23:21:40 +01:00
Chris Palmer
3a7fde6c56 Merge branch 'master' of https://github.com/nophead/NopSCADlib.git 2021-05-18 23:18:18 +01:00
Chris Palmer
c5bb898856 Updated changelog. 2021-05-18 23:16:15 +01:00
Chris Palmer
11ebe2225d Removed spurious convexity in difference from rounded_polygon(). 2021-05-18 23:14:34 +01:00
Chris
a1e25bb878 Merge pull request #180 from martinbudden/global_defs_typo
Typo in global_defs.
2021-05-15 14:36:58 +01:00
Martin Budden
9689683b7e Typo in global_defs. 2021-05-15 11:42:24 +01:00
Chris Palmer
08946e3d70 Updated changelog. 2021-05-02 17:16:21 +01:00
Chris Palmer
15c2946e91 Merge branch 'martinbudden-blower_size' 2021-05-02 17:14:28 +01:00
Chris Palmer
34019196cd Updated readme 2021-05-02 17:14:14 +01:00
Martin Budden
436fc71cf3 Added blower_size function. 2021-05-02 15:27:44 +01:00
Chris Palmer
fd67c166f7 Updated changelog 2021-04-26 00:02:59 +01:00
Chris Palmer
634deab911 Merge branch 'martinbudden-core_xy_orientation' 2021-04-26 00:01:40 +01:00
Chris Palmer
e2feceb608 Updated readme 2021-04-26 00:00:41 +01:00
Chris Palmer
d1258e0b0c Merge branch 'core_xy_orientation' of https://github.com/martinbudden/NopSCADlib into martinbudden-core_xy_orientation 2021-04-25 23:57:44 +01:00
Chris Palmer
bd61a1dc55 Updated changelog 2021-04-25 23:56:47 +01:00
Chris Palmer
055e83902f Merge branch 'martinbudden-leadnut_typo' 2021-04-25 23:38:27 +01:00
Chris Palmer
feec1e7ae5 Updated readme. 2021-04-25 23:37:48 +01:00
Martin Budden
be76af2fc4 Fixed typo in leadnut.scad. 2021-04-25 18:31:51 +01:00
Martin Budden
9c1a9bf357 Add facility to orient core_xy with left motor being lower or upper motor. 2021-04-25 17:56:24 +01:00
Chris Palmer
9647fb474b Updated changelog 2021-04-25 00:08:57 +01:00
Chris Palmer
49fdfea792 Added 35BYGHJ75 geared stepper. 2021-04-25 00:07:22 +01:00
Chris Palmer
ac0bacfeda Removed echo in rails test. 2021-04-25 00:02:05 +01:00
Chris Palmer
6288059d99 Updated changelog. 2021-04-13 15:07:09 +01:00
Chris Palmer
0f1dff230a Merge branch 'martinbudden-pcb_component' 2021-04-13 15:05:18 +01:00
Chris Palmer
e379fa8ada Updated readme. 2021-04-13 15:05:12 +01:00
Chris Palmer
313d7508df Merge branch 'pcb_component' of https://github.com/martinbudden/NopSCADlib into martinbudden-pcb_component 2021-04-13 15:01:27 +01:00
Chris Palmer
083caca4e8 Updated changelog. 2021-04-13 15:00:37 +01:00
Chris Palmer
49329df00c Merge branch 'martinbudden-box_section' 2021-04-13 14:57:35 +01:00
Chris Palmer
edc0b86bb1 Updated images and readme. 2021-04-13 14:56:08 +01:00
Martin Budden
5fbff060b0 Added a pcb_component function. 2021-04-13 14:42:00 +01:00
Chris Palmer
b94ca4ad3a Merge branch 'box_section' of https://github.com/martinbudden/NopSCADlib into martinbudden-box_section 2021-04-12 22:35:01 +01:00
Chris Palmer
bc5515d35e Updated changelog. 2021-04-12 22:31:23 +01:00
Chris Palmer
44d213deaa Merge branch 'martinbudden-psu_size' 2021-04-12 22:29:41 +01:00
Chris Palmer
145c5d9b1a Updated readme. 2021-04-12 22:29:20 +01:00
Chris Palmer
7abbbd9b96 Merge branch 'psu_size' of https://github.com/martinbudden/NopSCADlib into martinbudden-psu_size 2021-04-12 22:26:25 +01:00
Chris Palmer
5b160cee88 Updated changelog. 2021-04-12 22:23:58 +01:00
Chris Palmer
3f31607840 Added No8 screws. 2021-04-12 22:22:25 +01:00
Martin Budden
1efed649cf Added PSU size function. 2021-04-12 17:52:57 +01:00
Martin Budden
b70c2f993c Added box sections. 2021-04-12 17:47:35 +01:00
Chris Palmer
56e252f3dc Updated changelog 2021-04-05 16:54:31 +01:00
Chris Palmer
f12b36ea04 Corrected MGN12 rail end value.
Added assert for rail end value too big.
2021-04-05 16:45:23 +01:00
Chris Palmer
bd5811e69b Updated changelog 2021-04-03 12:17:54 +01:00
67 changed files with 1329 additions and 288 deletions

View File

@@ -3,6 +3,130 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [v15.19.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.19.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.18.0...v15.19.0 "diff with v15.18.0")
* 2021-06-17 [`c7a6d81`](https://github.com/nophead/NopSCADlib/commit/c7a6d8164f545e83c4d871080ac63b7d903829df "show commit") [C.P.](# "Chris Palmer") Added `molex_usb_Ax1()` and now shows SMT caps in the PCB test.
### [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.

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 137 KiB

View 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
1 'Ferrule for 1.5mm^2 wire - not shown', 3
2 'Wire blue 30/0.25mm strands, length 150mm - not shown', 2
3 'Wire brown 30/0.25mm strands, length 150mm - not shown', 2
4 'Wire green & yellow 30/0.25mm strands, length 150mm - not shown', 2
5 'IEC inlet for ATX', 1
6 'Heatfit insert M3', 2
7 '4mm shielded jack socket blue', 2
8 '4mm shielded jack socket brown', 1
9 '4mm shielded jack socket green', 2
10 'Mains socket 13A', 1
11 'Nut M3 x 2.4mm nyloc', 6
12 'Screw M3 cs cap x 12mm', 2
13 'Screw M3 cs cap x 20mm', 2
14 'Screw M3 dome x 10mm', 4
15 'Heatshrink sleeving ID 3.2mm x 15mm - not shown', 8
16 'Washer M3 x 7mm x 0.5mm', 10

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 889 KiB

After

Width:  |  Height:  |  Size: 911 KiB

View File

@@ -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();

339
readme.md
View File

@@ -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>
---
@@ -268,21 +268,21 @@ SCSnUU and SCSnLUU bearing blocks
<a name="Belts"></a>
## Belts
Models timing belt running in a path over toothed or smooth pulleys and calculates an accurate length.
Only models 2D paths, belt may twist to support crossed belt core XY and other designes where the belt twists!
Only models 2D paths, belt may twist to support crossed belt core XY and other designs where the belt twists!
By default the path is a closed loop. An open loop can be specified by specifying `open=true`, and in that case the start and end points are not connected, leaving the loop open.
To get a 180 degree twist of the loop, you can use the `twist` argument. `Twist` can be a single number, and in that case the belt will twist after
the position with that number. Alternatively `twist` can be a list of boolean values with a boolean for each position; the belt will then twist after
the position that have a `true` value in the `twist` list. If the path is specified with pulley/idler types, then you can use `auto_twist=true`; in
that case the belt will automatically twist so the back of the belt always runs against idlers and the tooth side runs against pullies. If you use
that case the belt will automatically twist so the back of the belt always runs against idlers and the tooth side runs against pulleys. If you use
`open=true` then you might also use `start_twist=true` to let the belt start the part with the back side out.
The path must be specified as a list of positions. Each position should be either a vector with `[x, y, pulley]` or `[x, y, r]`. A pully is a type from
The path must be specified as a list of positions. Each position should be either a vector with `[x, y, pulley]` or `[x, y, r]`. A pulley is a type from
`pulleys.scad`, and correct radius and angle will automatically be calculated. Alternatively a radius can be specified directly.
To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius.
Alternativley you can just specify smooth pulleys in the path, and it will then happen automatically.
Alternatively you can just specify smooth pulleys in the path, and it will then happen automatically.
Individual teeth are not drawn, instead they are represented by a lighter colour.
@@ -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 |
![bldc_motors](tests/png/bldc_motors.png)
### 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 |
![box_sections](tests/png/box_sections.png)
### 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>
---
@@ -489,7 +595,7 @@ PCB mounted buttons. Can optionally have a coloured cap
## Cable_strips
A strip of polypropylene used with ribbon cable to make a cable flexible in one direction only.
Modelled with a Bezier spline, which is not quite the same as a minimum energy curve but very close, epecially
Modelled with a Bezier spline, which is not quite the same as a minimum energy curve but very close, especially
near the extreme positions, where the model needs to be accurate.
When the sides are constrained then a circular model is more accurate.
@@ -537,7 +643,7 @@ PCB cameras.
|:--- |:--- |
| `camera_connector_pos(type)` | The flex connector block for the camera itself's position |
| `camera_connector_size(type)` | The flex connector block for the camera itself's size |
| `camera_lens(type)` | Stack of lens parts, can be round, rectanular or rounded rectangular, with optional tapered aperture |
| `camera_lens(type)` | Stack of lens parts, can be round, rectangular or rounded rectangular, with optional tapered aperture |
| `camera_lens_offset(type)` | Offset of the lens center from the PCB centre |
| `camera_pcb(type)` | The PCB part of the camera |
@@ -795,7 +901,7 @@ Dual inline IC packages and sockets
---
<a name="Displays"></a>
## Displays
LCD dispays.
LCD displays.
[vitamins/displays.scad](vitamins/displays.scad) Object definitions.
@@ -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 |
@@ -1585,7 +1692,7 @@ Standard domed through hole LEDs. Can specify colour and lead length.
LED strip lights that can be cut to size.
The definitions are for the full length but they can be cut to size by specifying how many segments,
which can by calcuated using `light_strip_segments(type, max_length)`.
which can by calculated using `light_strip_segments(type, max_length)`.
The `light_strip_clip()` module makes a clip to go around the light that can be incorporated into a printed bracket to hold it.
@@ -2016,9 +2123,9 @@ Can be shown stretched by specifying the `actual_id`.
---
<a name="Opengrab"></a>
## Opengrab
Nicodrone OpenGrab V3 electro-permananet magnet, see <https://nicadrone.com/products/epm-v3>.
Nicodrone OpenGrab V3 electro-permanent magnet, see <https://nicadrone.com/products/epm-v3>.
A permanent magnet that can be magnatized and de-magnatized electronically.
A permanent magnet that can be magnetized and de-magnetized electronically.
[vitamins/opengrab.scad](vitamins/opengrab.scad) Implementation.
@@ -2061,7 +2168,7 @@ Panel mounted digital meter modules
Notes on the DSN_VC288:
* The tabs aren't modelled because they can be fully retracted if the PCB is removed.
* The current connector isn't moddelled as it is awkwardly tall. I remove it and solder wires instead.
* The current connector isn't modelled as it is awkwardly tall. I remove it and solder wires instead.
[vitamins/panel_meters.scad](vitamins/panel_meters.scad) Object definitions.
@@ -2140,9 +2247,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| `hdmi_width1(type)` | Inside width at the top |
| `hdmi_width2(type)` | Inside width at the bottom |
| `pcb_accessories(type)` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
| `pcb_colour(type)` | Colour of the subtrate |
| `pcb_colour(type)` | Colour of the substrate |
| `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 |
@@ -2276,9 +2388,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| `hdmi_width1(type)` | Inside width at the top |
| `hdmi_width2(type)` | Inside width at the bottom |
| `pcb_accessories(type)` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
| `pcb_colour(type)` | Colour of the subtrate |
| `pcb_colour(type)` | Colour of the substrate |
| `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>
@@ -2583,7 +2702,7 @@ Pin headers and sockets, etc.
---
<a name="PSUs"></a>
## PSUs
Powersupplies. Can be a simple cube or can be defined by a list of six faces, each with thickness, holes, cutouts, etc.
Power supplies. Can be a simple cube or can be defined by a list of six faces, each with thickness, holes, cutouts, etc.
Face order is bottom, top, left, right, front, back.
@@ -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
@@ -2680,7 +2800,7 @@ Timing belt pulleys, both toothed and plain with internal bearings for idlers.
| `pulley_hub_length(type)` | Hub length |
| `pulley_od(type)` | Outer diameter |
| `pulley_screw(type)` | Grub screw type |
| `pulley_screw_length(type)` | Grup screw length |
| `pulley_screw_length(type)` | Grub screw length |
| `pulley_screw_z(type)` | Grub screw position |
| `pulley_screws(type)` | Number of grub screws |
| `pulley_teeth(type)` | Number of teeth |
@@ -2851,7 +2971,7 @@ Ring terminals and earth assemblies for DiBond panels.
### Modules
| Module | Description |
|:--- |:--- |
| `ring_terminal(type)` | Draw specifeid ring terminal |
| `ring_terminal(type)` | Draw specified ring terminal |
| `ring_terminal_assembly(type, thickness, top = false)` | Earthing assembly for DiBond twin skins |
| `ring_terminal_hole(type, h = 0)` | Drill hole for the screw |
@@ -2927,7 +3047,7 @@ Rocker switch. Also used for neon indicator in the same form factor.
## Rod
Steel rods and studding with chamfered ends.
These items are sysmtrical, so by default the origin is in the centre but it can be changed to the bottom.
These items are symmetrical, so by default the origin is in the centre but it can be changed to the bottom.
[vitamins/rod.scad](vitamins/rod.scad) Implementation.
@@ -3056,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 |
@@ -3128,7 +3249,7 @@ Shaft couplings
## Sheets
Sheet materials. Rectangular with optional rounded corners. Negative radii make a chamfer.
The "Soft" parameter can be used to determinesif the sheet material needs machine screws or wood screws, e.g.:
The "Soft" parameter can be used to determine if the sheet material needs machine screws or wood screws, e.g.:
* If soft, wood screws will be used, with a pilot hole.
* If not soft, either tapped holes or a clearance hole and nuts will be used to retain screws.
@@ -3155,8 +3276,8 @@ When woven sheets (e.g. carbon fibre) are rendered it is necessary to specify th
| `sheet_colour2(type)` | Second colour for a woven sheet |
| `sheet_is_soft(type)` | Is soft enough for wood screws |
| `sheet_thickness(type)` | Thickness |
| `sheet_warp(type)` | Wovern sheet warp |
| `sheet_weft(type)` | Wovern sheet weft |
| `sheet_warp(type)` | Woven sheet warp |
| `sheet_weft(type)` | Woven sheet weft |
### Functions
| Function | Description |
@@ -3272,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 |
@@ -3288,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 |
@@ -3298,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 |
@@ -3887,7 +4014,7 @@ If a washer is given a child, usually a screw or a nut, then it is placed on its
| `spring_washer_thickness(type)` | Spring washer thickness |
| `star_washer_diameter(type)` | Star version size |
| `washer_diameter(type)` | External diameter |
| `washer_size(type)` | Noiminal size |
| `washer_size(type)` | Nominal size |
| `washer_soft(type)` | True if rubber |
| `washer_thickness(type)` | Thickness |
@@ -4000,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>
@@ -4028,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` |
![zipties](tests/png/zipties.png)
### 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>
@@ -4195,7 +4322,7 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
| Function | Description |
|:--- |:--- |
| `bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true)` | Construct the property list for a butt_box |
| `bbox_area(type)` | Internal surdface area in m^2 |
| `bbox_area(type)` | Internal surface area in m^2 |
| `bbox_volume(type)` | Internal volume in litres |
### Modules
@@ -4498,7 +4625,7 @@ Rubber door [sealing strip](#sealing_strip) is used to make it airtight and a [d
|:--- |:--- |
| `door_hinge(door_thickness)` | Generates STL for the moving part of the hinge |
| `door_hinge_assembly(top, door_thickness = 6)` | The moving assembly that goes on the door |
| `door_hinge_hole_positions(dir = 0)` | Position chidren at the door hole positions |
| `door_hinge_hole_positions(dir = 0)` | Position children at the door hole positions |
| `door_hinge_parts_stl()` | Generates the STL for both parts of the hinge |
| `door_hinge_stat_hole_positions(dir = 0)` | Position children over the screws holes of the stationary part |
| `door_hinge_stat_stl()` | Generates the STL for the stationary part |
@@ -4544,7 +4671,7 @@ Door latch for 6mm acrylic door for 3D printer. See [door_hinge](#door_hinge).
### Modules
| Module | Description |
|:--- |:--- |
| `door_latch_assembly(sheet_thickness = 3)` | The assembly for a specified sheet thickess |
| `door_latch_assembly(sheet_thickness = 3)` | The assembly for a specified sheet thickness |
| `door_latch_stl()` | Generates the STL for the printed part |
![door_latch](tests/png/door_latch.png)
@@ -4569,7 +4696,7 @@ Door latch for 6mm acrylic door for 3D printer. See [door_hinge](#door_hinge).
## Drag_chain
Parametric cable drag chain to limit the bend radius of a cable run.
Each link has a maximum bend angle of 45&deg;, so the mininium radius is proportional to the link length.
Each link has a maximum bend angle of 45&deg;, so the minimum radius is proportional to the link length.
The travel property is how far it can move in each direction, i.e. half the maximum travel if the chain is mounted in the middle of the travel.
@@ -4633,7 +4760,7 @@ to the assembly, for example to add inserts.
---
<a name="Fan_guard"></a>
## Fan_guard
Pintable fan finger guard to match the specified fan. To be `include`d, not `use`d.
Printable fan finger guard to match the specified fan. To be `include`d, not `use`d.
The ring spacing as well as the number of spokes can be specified, if zero a gasket is generated instead of a guard.
@@ -4778,7 +4905,7 @@ This allows the hinges and one set of screws to belong to one assembly and the o
| `hinge_depth(type)` | Depth of each leaf |
| `hinge_knuckle_dia(type)` | The knuckle diameter |
| `hinge_knuckles(type)` | How many knuckles |
| `hinge_margin(type)` | How far to keep the screws from the knuckes |
| `hinge_margin(type)` | How far to keep the screws from the knuckles |
| `hinge_pin_dia(type)` | The pin diameter |
| `hinge_screw(type)` | Screw type to mount it |
| `hinge_screws(type)` | How many screws |
@@ -5247,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 |
@@ -5449,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 |
@@ -5642,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 |
![core_xy](tests/png/core_xy.png)
@@ -6043,7 +6170,7 @@ A sector of a circle between two angles.
---
<a name="Sweep"></a>
## Sweep
Utility to generate a polhedron by sweeping a 2D profile along a 3D path and utilities for generating paths.
Utility to generate a polyhedron by sweeping a 2D profile along a 3D path and utilities for generating paths.
The initial orientation is the Y axis of the profile points towards the initial center of curvature, Frenet-Serret style.
Subsequent rotations use the minimum rotation method.
@@ -6136,7 +6263,7 @@ Simple tube or ring
### Modules
| Module | Description |
|:--- |:--- |
| `rectangular_tube(size, center = true, thickness = 1, fillet = 0.5)` | Create a retangular tube with filleted corners |
| `rectangular_tube(size, center = true, thickness = 1, fillet = 0.5)` | Create a rectangular tube with filleted corners |
| `ring(or, ir)` | Create a ring with specified external and internal radii |
| `tube(or, ir, h, center = true)` | Create a tube with specified external and internal radii and height `h` |
| `woven_tube(or, ir, h, center= true, colour = grey(30)` | Create a woven tube with specified external and internal radii, height `h`, colours, warp and weft |
@@ -6160,7 +6287,7 @@ Setting the `ngb` parameter of `assembly` to `true` removes its column from the
This is to prevent the global BOM page becoming too wide in large projects by having it include just the major assemblies.
The example below shows how to define a vitamin and incorporate it into an assembly with sub-assemblies and make an exploded view.
The resulting flat BOM is shown but heirachical BOMs are also generated for real projects.
The resulting flat BOM is shown but hierarchical BOMs are also generated for real projects.
If the code to make an STL or DXF is made a child of the `stl()` or `dxf()` module then the STL or DXF will be used in the assembly views generated by `views.py` instead of generating
it with code.
@@ -6240,7 +6367,7 @@ The `pose()` module allows assembly views in the readme to be posed differently
---
<a name="Clip"></a>
## Clip
Construct arbirarily large box to partition 3D space and clip objects, useful for creating cross sections to see the inside when debugging.
Construct arbitrarily large box to partition 3D space and clip objects, useful for creating cross sections to see the inside when debugging.
Original version by Doug Moen on the OpenSCAD forum
@@ -6318,7 +6445,7 @@ This can be used to mitigate the number of sides being small and make small hole
large increase in the number of facets.
When set to 1 the polygons alternate each layer, when set higher the rotation takes `twist + 1` layers to repeat.
A small additional rotation is added to make the polygon rotate one more side over the length of the hole to make it appear round when
veiwed end on.
viewed end on.
When `twist` is set the resulting cylinder is extended by `eps` at each end so that the exact length of the hole can be used without
leaving a scar on either surface.
@@ -6332,7 +6459,7 @@ leaving a scar on either surface.
|:--- |:--- |
| `corrected_diameter(d, n = undef)` | Adjusted diameter to make flats lie on the circle |
| `corrected_radius(r, n = undef)` | Adjusted radius to make flats lie on the circle |
| `sides(r, n = undef)` | Optimium number of sides for specified radius |
| `sides(r, n = undef)` | Optimum number of sides for specified radius |
### Modules
| Module | Description |

View File

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

View File

@@ -173,7 +173,7 @@ def tests(tests):
impl_name = None
if libtest:
vsplit = "AJR" + chr(ord('Z') + 1)
vsplit = "AIR" + chr(ord('Z') + 1)
vtype = locations[0][1]
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
if type == vtype:

View File

@@ -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
View 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();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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
View 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();

View File

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

View File

@@ -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();

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

After

Width:  |  Height:  |  Size: 276 KiB

BIN
tests/png/bldc_motors.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
tests/png/box_sections.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View File

@@ -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()
{

View File

@@ -50,8 +50,6 @@ module rails()
translate_z(-sheet)
vflip()
nut_and_washer(nut, true);
echo(rail[0], (length - (rail_holes(rail, length) - 1) * rail_pitch(rail)) / 2);
}
if($preview)

View File

@@ -29,7 +29,7 @@
//! This is to prevent the global BOM page becoming too wide in large projects by having it include just the major assemblies.
//!
//! The example below shows how to define a vitamin and incorporate it into an assembly with sub-assemblies and make an exploded view.
//! The resulting flat BOM is shown but heirachical BOMs are also generated for real projects.
//! The resulting flat BOM is shown but hierarchical BOMs are also generated for real projects.
//!
//! If the code to make an STL or DXF is made a child of the `stl()` or `dxf()` module then the STL or DXF will be used in the assembly views generated by `views.py` instead of generating
//! it with code.

View File

@@ -18,7 +18,7 @@
//
//
//! Construct arbirarily large box to partition 3D space and clip objects, useful for creating cross sections to see the inside when debugging.
//! Construct arbitrarily large box to partition 3D space and clip objects, useful for creating cross sections to see the inside when debugging.
//!
//! Original version by Doug Moen on the OpenSCAD forum
//

View File

@@ -28,12 +28,12 @@
//! large increase in the number of facets.
//! When set to 1 the polygons alternate each layer, when set higher the rotation takes `twist + 1` layers to repeat.
//! A small additional rotation is added to make the polygon rotate one more side over the length of the hole to make it appear round when
//! veiwed end on.
//! viewed end on.
//!
//! When `twist` is set the resulting cylinder is extended by `eps` at each end so that the exact length of the hole can be used without
//! leaving a scar on either surface.
//
function sides(r, n = undef) = is_undef(n) ? max(round(4 * r), 3) : n ? max(n, 3) : r2sides(r); //! Optimium number of sides for specified radius
function sides(r, n = undef) = is_undef(n) ? max(round(4 * r), 3) : n ? max(n, 3) : r2sides(r); //! Optimum number of sides for specified radius
function corrected_radius(r, n = undef) = r / cos(180 / sides(r, n)); //! Adjusted radius to make flats lie on the circle
function corrected_diameter(d, n = undef) = 2 * corrected_radius(d / 2 , n); //! Adjusted diameter to make flats lie on the circle

View File

@@ -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);
}

View File

@@ -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])]);
}
}
}

View File

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

View File

@@ -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
View 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));
}

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

View File

@@ -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);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -145,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;

View File

@@ -20,11 +20,11 @@
//
// 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 ];
//

View File

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

View File

@@ -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);
}

View File

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

View File

@@ -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"));

View File

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