1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 20:32:35 +02:00

Compare commits

...

76 Commits

Author SHA1 Message Date
Chris Palmer
f0c25d37b0 Workarounds for bugs in the OpenSCAD snapshots. 2021-09-12 18:02:43 +01:00
Chris Palmer
588a1edf62 Updated changelog. 2021-09-11 12:02:53 +01:00
Chris Palmer
3299aad5c8 Parametric potentiometers added, changes PCB "potentiometer" parameters.
The first one is now the type that defaults to the previous BigTreeTech version.
The second parameter is the shaft length overrride.

Added ESP32_DOIT_V1, ArduinoNano and KY_040 breakout PCBs.
2021-09-11 12:01:04 +01:00
Chris Palmer
74c52aac04 Can now make perfboard without screw holes.
Fixed missing items from last commit.
2021-09-11 11:54:26 +01:00
Chris Palmer
726d9ed2dc Can now draw right angle Molex KK connectors and can skip pins to allow high voltage. 2021-09-11 11:51:24 +01:00
Chris Palmer
8a838dd1ce Added pcb_grid_components() module for placing parts on a perfboard. 2021-09-11 11:46:25 +01:00
Chris Palmer
181c6ac624 Added vero_pin PCB component. 2021-09-11 11:44:36 +01:00
Chris Palmer
e952aa7840 PCB chip compoment can now be round if width is zero to fake round buttons. 2021-09-11 11:28:21 +01:00
Chris Palmer
466ee31e10 Added Jack_4mm_shielded_nut_radius(). 2021-09-11 11:21:58 +01:00
Chris Palmer
4c926c529b Fixed axial lead min pitch bug. 2021-09-11 11:20:37 +01:00
Chris Palmer
edb1eccbf1 TFT128x160 LCD display added. 2021-09-11 11:19:24 +01:00
Chris Palmer
061812cc8b PMMA1p25 sheet added. 2021-09-11 11:16:43 +01:00
Chris Palmer
ce0c97b45e 7_segment displays added as PCB component. 2021-09-11 11:15:39 +01:00
Chris Palmer
696b14699c Updated changelog. 2021-09-05 10:26:53 +01:00
Chris Palmer
2166a9be6a extrusion_corner_bracket_assembly() and extrusion_inner_corner_bracket() can now be passed the extrusion type.
E2020t and E4040t thinner extrusions added to work with the brackets.
Extrusions can now have recessed channels, round or square centre sections and holes.
Fixed the shape of extrusion centre section spars.
T-nuts now have 45 degree chamfers instead of a fixed 1mm minimum thickness.
2021-09-05 10:24:42 +01:00
Chris Palmer
511729008d Added missing documentation for sliding_t_nut(). 2021-09-03 15:47:15 +01:00
Chris Palmer
5111ec04bc E40_corner_bracket, E40_corner_bracket and M8_sliding_ball_t_nut added.
Inner corner brackets now show the long arm with chamfered ridges rather
than a normal T-nut and the grub screws are inserted to meet the extrusion.
2021-09-03 09:23:24 +01:00
Chris Palmer
cef3a620a6 Updated changelog 2021-08-31 23:41:34 +01:00
Chris Palmer
da5191e52c Merge branch 'martinbudden-M2p5_dome_screw' 2021-08-31 23:40:51 +01:00
Chris Palmer
d9af5b7f70 Updated images and readme. 2021-08-31 23:38:34 +01:00
Chris Palmer
c30d7f1ad9 Merge branch 'M2p5_dome_screw' of https://github.com/martinbudden/NopSCADlib into martinbudden-M2p5_dome_screw 2021-08-31 23:15:56 +01:00
Chris Palmer
a5382cbe04 Updated changelog. 2021-08-31 23:03:22 +01:00
Chris Palmer
00c5c90a5e Updated big picture 2021-08-31 23:00:58 +01:00
Chris Palmer
01c26d8a34 Added Lichuan servo motors contributed by Niclas Hedhman. 2021-08-31 22:51:24 +01:00
Chris Palmer
ef2102420b Added NEMA8 and NEMA8BH stepper motors.
Steppers can now have dual shafts, hollow shafts and black end caps.
2021-08-31 22:43:37 +01:00
Chris Palmer
540f841163 Added crude representation of JST ZH connectors. 2021-08-31 22:25:31 +01:00
Chris Palmer
1045502efb Added more aluminium sheet thickness 2021-08-31 22:12:30 +01:00
Chris Palmer
485184f092 Added HGH15CA and HGH20CA rails. 2021-08-31 22:04:12 +01:00
Chris Palmer
b893c9069a Added SFU1610 ballscrew nut 2021-08-31 21:56:20 +01:00
Chris Palmer
69f4ced29d Added M8_cs_cap_screw, M5_grub_screw and M6_grub_screw.
Fixed M6_cs_cap_screw and M4_grub_screw socket sizes.
2021-08-31 21:50:43 +01:00
Chris Palmer
5c1aa849fe New layout for big picture. 2021-08-31 21:34:28 +01:00
Martin Budden
9d65f69bf3 Added M2p5_dome_screw. 2021-08-31 20:05:47 +01:00
Chris Palmer
515b99fdc0 Merge branch 'martinbudden-rpi_pico' 2021-08-27 16:18:22 +01:00
Chris Palmer
631d052c68 Updated changelog 2021-08-27 16:18:04 +01:00
Chris Palmer
1247303cb9 Updated images and readme. 2021-08-27 16:15:42 +01:00
Chris Palmer
290be4beb6 Merge branch 'rpi_pico' of https://github.com/martinbudden/NopSCADlib into martinbudden-rpi_pico 2021-08-27 15:04:23 +01:00
Chris Palmer
24e941799d Udpated changelog. 2021-08-27 14:27:29 +01:00
Chris Palmer
6a556c5879 Merge branch 'martinbudden-bldc_propshaft_fix' 2021-08-27 14:20:14 +01:00
Martin Budden
14ab1bb8b6 Added Raspberry Pi Pico. 2021-08-13 10:05:27 +01:00
Martin Budden
be53547728 Fixed display of BLDC prop shaft when thread lengh = 0. 2021-08-09 15:17:30 +01:00
Chris Palmer
ba7d7d32ad Updated chnagelog. 2021-07-04 08:39:47 +01:00
Chris Palmer
d3049bc81b Merge branch 'martinbudden-pcb_plating_colour' 2021-07-04 08:38:20 +01:00
Martin Budden
df35e14fc7 Improved handling of pcb plating colour. 2021-07-01 22:49:35 +01:00
Chris Palmer
21c2aa5d62 Updated changelog. 2021-06-29 11:44:48 +01:00
Chris Palmer
c982876ebc Can now specify the screw used for PSU shrouds and get the wall thickness. 2021-06-29 11:42:20 +01:00
Chris Palmer
5ccda42e5b Updated changelog. 2021-06-17 16:17:09 +01:00
Chris Palmer
92d0444e5f Changelog now runs codespell to fix the spellings in the commit comments. 2021-06-17 16:15:46 +01:00
Chris Palmer
b239c1462e Updated changelog. 2021-06-17 16:01:31 +01:00
Chris Palmer
6413b7b2a0 Merge branch 'martinbudden-spelling_corrections' 2021-06-17 15:58:32 +01:00
Chris Palmer
0b0ce66c85 Updated changelog. 2021-06-17 15:56:09 +01:00
Chris Palmer
d38055c15c Updated readme. 2021-06-17 15:53:59 +01:00
Chris Palmer
cf99418a19 Merge branch 'spelling_corrections' of https://github.com/martinbudden/NopSCADlib into martinbudden-spelling_corrections 2021-06-17 15:15:37 +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
8d7c44b80d Spelling corrections. 2021-06-15 10:01:32 +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
122 changed files with 10852 additions and 9206 deletions

View File

@@ -3,6 +3,143 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
## [v16.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v16.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v15.25.0...v16.0.0 "diff with v15.25.0")
* 2021-09-11 [`3299aad`](https://github.com/nophead/NopSCADlib/commit/3299aad5c83d1fe21d3bdddd1450f8de19078d13 "show commit") [C.P.](# "Chris Palmer") Parametric potentiometers added, changes PCB "potentiometer" parameters.
The first one is now the type that defaults to the previous BigTreeTech version.
The second parameter is the shaft length override.
* Added `ESP32_DOIT_V1,` ArduinoNano and `KY_040` breakout PCBs.
* 2021-09-11 [`74c52aa`](https://github.com/nophead/NopSCADlib/commit/74c52aac0428995930b4af562a480025003b992d "show commit") [C.P.](# "Chris Palmer") Can now make perfboard without screw holes.
Fixed missing items from last commit.
* 2021-09-11 [`726d9ed`](https://github.com/nophead/NopSCADlib/commit/726d9ed2dc921b5a7ef8c5b0fa6b17628f706bf8 "show commit") [C.P.](# "Chris Palmer") Can now draw right angle Molex KK connectors and can skip pins to allow high voltage.
* 2021-09-11 [`8a838dd`](https://github.com/nophead/NopSCADlib/commit/8a838dd1ceaac7d595aea47494cb28b9a424ee8a "show commit") [C.P.](# "Chris Palmer") Added `pcb_grid_components()` module for placing parts on a perfboard.
* 2021-09-11 [`181c6ac`](https://github.com/nophead/NopSCADlib/commit/181c6ac6248e7db6204b6d461f122e719492b0cc "show commit") [C.P.](# "Chris Palmer") Added `vero_pin` PCB component.
* 2021-09-11 [`e952aa7`](https://github.com/nophead/NopSCADlib/commit/e952aa7840cf4f3765c518a481d32f582bef27b4 "show commit") [C.P.](# "Chris Palmer") PCB chip component can now be round if width is zero to fake round buttons.
* 2021-09-11 [`466ee31`](https://github.com/nophead/NopSCADlib/commit/466ee31e10e670ff35e22429084a34612f821f7d "show commit") [C.P.](# "Chris Palmer") Added `Jack_4mm_shielded_nut_radius()`.
* 2021-09-11 [`4c926c5`](https://github.com/nophead/NopSCADlib/commit/4c926c529b199dbe589fb0c43f323db94ffe5597 "show commit") [C.P.](# "Chris Palmer") Fixed axial lead min pitch bug.
* 2021-09-11 [`edb1ecc`](https://github.com/nophead/NopSCADlib/commit/edb1eccbf156ff4b06723b18f832637328b1c3e0 "show commit") [C.P.](# "Chris Palmer") TFT128x160 LCD display added.
* 2021-09-11 [`061812c`](https://github.com/nophead/NopSCADlib/commit/061812cc8bc51e5a957d7d3acaffd9bcda14cc15 "show commit") [C.P.](# "Chris Palmer") PMMA1p25 sheet added.
* 2021-09-11 [`ce0c97b`](https://github.com/nophead/NopSCADlib/commit/ce0c97b45e6e501554e66bcd4140d4dd3f532a1c "show commit") [C.P.](# "Chris Palmer") `7_segment` displays added as PCB component.
### [v15.25.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.25.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.24.0...v15.25.0 "diff with v15.24.0")
* 2021-09-05 [`2166a9b`](https://github.com/nophead/NopSCADlib/commit/2166a9be6a6fc75b06f0051971606cd181079e15 "show commit") [C.P.](# "Chris Palmer") `extrusion_corner_bracket_assembly()` and `extrusion_inner_corner_bracket()` can now be passed the extrusion type.
E2020t and E4040t thinner extrusions added to work with the brackets.
Extrusions can now have recessed channels, round or square centre sections and holes.
Fixed the shape of extrusion centre section spars.
T-nuts now have 45 degree chamfers instead of a fixed 1mm minimum thickness.
* 2021-09-03 [`5117290`](https://github.com/nophead/NopSCADlib/commit/511729008dcc878a148c3bbd00edf69de9736fb5 "show commit") [C.P.](# "Chris Palmer") Added missing documentation for `sliding_t_nut()`.
* 2021-09-03 [`5111ec0`](https://github.com/nophead/NopSCADlib/commit/5111ec04bc1d19cc46b811bf79d026fcd2ca70f8 "show commit") [C.P.](# "Chris Palmer") `E40_corner_bracket,` `E40_corner_bracket` and `M8_sliding_ball_t_nut` added.
Inner corner brackets now show the long arm with chamfered ridges rather
than a normal T-nut and the grub screws are inserted to meet the extrusion.
### [v15.24.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.24.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.23.0...v15.24.0 "diff with v15.23.0")
* 2021-08-31 [`d9af5b7`](https://github.com/nophead/NopSCADlib/commit/d9af5b7f705791ca8ef230ecd1b831c042587002 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2021-08-31 [`9d65f69`](https://github.com/nophead/NopSCADlib/commit/9d65f69bf3e7cd325d24bc5410a4763bb7164b8f "show commit") [M.B.](# "Martin Budden") Added `M2p5_dome_screw`.
### [v15.23.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.23.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.22.0...v15.23.0 "diff with v15.22.0")
* 2021-08-31 [`00c5c90`](https://github.com/nophead/NopSCADlib/commit/00c5c90a5e74f47f0e6f5e3a7996f70fa34f0833 "show commit") [C.P.](# "Chris Palmer") Updated big picture
* 2021-08-31 [`01c26d8`](https://github.com/nophead/NopSCADlib/commit/01c26d8a349e802738a8b0d06575a3e6915bf070 "show commit") [C.P.](# "Chris Palmer") Added Lichuan servo motors contributed by Niclas Hedhman.
* 2021-08-31 [`ef21024`](https://github.com/nophead/NopSCADlib/commit/ef2102420b15e5be4008a6a3cecf5416857265f9 "show commit") [C.P.](# "Chris Palmer") Added NEMA8 and NEMA8BH stepper motors.
Steppers can now have dual shafts, hollow shafts and black end caps.
* 2021-08-31 [`540f841`](https://github.com/nophead/NopSCADlib/commit/540f84116355e7f44a9b5796816d1e3422128ff3 "show commit") [C.P.](# "Chris Palmer") Added crude representation of JST ZH connectors.
* 2021-08-31 [`1045502`](https://github.com/nophead/NopSCADlib/commit/1045502efb1cb94fb7bcc11fd4483b425a880926 "show commit") [C.P.](# "Chris Palmer") Added more aluminium sheet thickness
* 2021-08-31 [`485184f`](https://github.com/nophead/NopSCADlib/commit/485184f09213ff0b191d5c8339471cd24ba3cc90 "show commit") [C.P.](# "Chris Palmer") Added HGH15CA and HGH20CA rails.
* 2021-08-31 [`b893c90`](https://github.com/nophead/NopSCADlib/commit/b893c9069a6bae762733cf1e139d49bab28ad792 "show commit") [C.P.](# "Chris Palmer") Added SFU1610 ballscrew nut
* 2021-08-31 [`69f4ced`](https://github.com/nophead/NopSCADlib/commit/69f4ced29da7e37c88ca24b924c6430144eec849 "show commit") [C.P.](# "Chris Palmer") Added `M8_cs_cap_screw,` `M5_grub_screw` and `M6_grub_screw`.
Fixed `M6_cs_cap_screw` and `M4_grub_screw` socket sizes.
* 2021-08-31 [`5c1aa84`](https://github.com/nophead/NopSCADlib/commit/5c1aa849fe5992617c3128c47dfc969504cbfd2f "show commit") [C.P.](# "Chris Palmer") New layout for big picture.
### [v15.22.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.22.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.21.1...v15.22.0 "diff with v15.21.1")
* 2021-08-27 [`1247303`](https://github.com/nophead/NopSCADlib/commit/1247303cb9dc2694994993b5dc046683becb7fde "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2021-08-13 [`14ab1bb`](https://github.com/nophead/NopSCADlib/commit/14ab1bb8b614055e0bf4ad33799276b0017ca13e "show commit") [M.B.](# "Martin Budden") Added Raspberry Pi Pico.
#### [v15.21.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.21.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.21.0...v15.21.1 "diff with v15.21.0")
* 2021-08-09 [`be53547`](https://github.com/nophead/NopSCADlib/commit/be53547728834d8e786ad4cb5637c768320a3105 "show commit") [M.B.](# "Martin Budden") Fixed display of BLDC prop shaft when thread length `=` 0.
* 2021-07-04 [`ba7d7d3`](https://github.com/nophead/NopSCADlib/commit/ba7d7d32adf554d163143c0ae1707565340bb35b "show commit") [C.P.](# "Chris Palmer") Updated chnagelog.
### [v15.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.20.0...v15.21.0 "diff with v15.20.0")
* 2021-07-01 [`df35e14`](https://github.com/nophead/NopSCADlib/commit/df35e14fc71794c3826d6c99ce3cab93a4cfa5fe "show commit") [M.B.](# "Martin Budden") Improved handling of pcb plating colour.
### [v15.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.19.3...v15.20.0 "diff with v15.19.3")
* 2021-06-29 [`c982876`](https://github.com/nophead/NopSCADlib/commit/c982876ebc0f95b466de1af3c80642dfd88800e6 "show commit") [C.P.](# "Chris Palmer") Can now specify the screw used for PSU shrouds and get the wall thickness.
#### [v15.19.3](https://github.com/nophead/NopSCADlib/releases/tag/v15.19.3 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.19.2...v15.19.3 "diff with v15.19.2")
* 2021-06-17 [`92d0444`](https://github.com/nophead/NopSCADlib/commit/92d0444e5f96c8f4768afb3d014044d7e66c6e69 "show commit") [C.P.](# "Chris Palmer") Changelog now runs codespell to fix the spellings in the commit comments.
#### [v15.19.2](https://github.com/nophead/NopSCADlib/releases/tag/v15.19.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.19.1...v15.19.2 "diff with v15.19.1")
* 2021-06-15 [`8d7c44b`](https://github.com/nophead/NopSCADlib/commit/8d7c44b80deffcc8c6b84c7a6485c959826cb381 "show commit") [M.B.](# "Martin Budden") Spelling corrections.
#### [v15.19.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.19.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.19.0...v15.19.1 "diff with v15.19.0")
* 2021-06-17 [`d38055c`](https://github.com/nophead/NopSCADlib/commit/d38055c15c8b00f91f9c5a4749264acc9b123aad "show commit") [C.P.](# "Chris Palmer") Updated readme.
* 2021-06-11 [`dcfe426`](https://github.com/nophead/NopSCADlib/commit/dcfe4262c519fb750702564309b790cda5b1c090 "show commit") [M.B.](# "Martin Budden") Fixed typos.
### [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.
@@ -144,7 +281,7 @@ Breaking change in `belt_length();` now requires a type argument
## [v14.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v14.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v13.5.0...v14.0.0 "diff with v13.5.0")
* 2021-03-06 [`298d1f9`](https://github.com/nophead/NopSCADlib/commit/298d1f92841f30e13b437c6770fc113954b94108 "show commit") [C.P.](# "Chris Palmer") Interface is the same but filenames to be included or used changed.
Changlog upated.
Changelog updated.
* 2021-03-06 [`491c3b4`](https://github.com/nophead/NopSCADlib/commit/491c3b4ea8d2ef51e55fd389f0dc0b9a6b9bd9a4 "show commit") [C.P.](# "Chris Palmer") Updated readme, `lib.scad` and image.
@@ -180,7 +317,7 @@ Changlog upated.
* 2021-03-03 [`614e5f3`](https://github.com/nophead/NopSCADlib/commit/614e5f3a72db309a3dee996d7241317556883e8d "show commit") [C.P.](# "Chris Palmer") Issues in the changelog now link to to the issue.
* 2021-03-03 [`a7eae4f`](https://github.com/nophead/NopSCADlib/commit/a7eae4f549b51dbe4624a8b67012919cef6cb24a "show commit") [C.P.](# "Chris Palmer") Neater changlog format.
* 2021-03-03 [`a7eae4f`](https://github.com/nophead/NopSCADlib/commit/a7eae4f549b51dbe4624a8b67012919cef6cb24a "show commit") [C.P.](# "Chris Palmer") Neater changelog format.
* 2021-03-03 [`31ab856`](https://github.com/nophead/NopSCADlib/commit/31ab8562a783464f93812b8c7c45d403587efd0a "show commit") [C.P.](# "Chris Palmer") Updated images
@@ -203,7 +340,7 @@ Changlog upated.
* 2021-02-20 [`03a0c2f`](https://github.com/nophead/NopSCADlib/commit/03a0c2fe981ce12cda51a693f69b4fb19696cb8a "show commit") [C.P.](# "Chris Palmer") Fixed typo.
### [v13.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v13.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v13.2.0...v13.3.0 "diff with v13.2.0")
* 2021-02-20 [`7c2df8d`](https://github.com/nophead/NopSCADlib/commit/7c2df8d36d214a8bf8ebdcd39da293209bc175ab "show commit") [C.P.](# "Chris Palmer") The pose module can now specify the camera distance supressing viewall and
* 2021-02-20 [`7c2df8d`](https://github.com/nophead/NopSCADlib/commit/7c2df8d36d214a8bf8ebdcd39da293209bc175ab "show commit") [C.P.](# "Chris Palmer") The pose module can now specify the camera distance suppressing viewall and
autocentre.
### [v13.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v13.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v13.1.0...v13.2.0 "diff with v13.1.0")
@@ -498,9 +635,9 @@ Updated pics and readme.
* 2020-12-28 [`ba586b3`](https://github.com/nophead/NopSCADlib/commit/ba586b368582db163af143ebb60afed270f77b1c "show commit") [C.P.](# "Chris Palmer") Example images update to match new contersink screws and teardrops.
### [v10.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v10.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v10.20.1...v10.21.0 "diff with v10.20.1")
* 2020-12-28 [`8d22940`](https://github.com/nophead/NopSCADlib/commit/8d22940506df525ac52ef6f8a00ea03661f3b682 "show commit") [C.P.](# "Chris Palmer") Project blurb can now be split with into sections with markdown horizonal rules
* 2020-12-28 [`8d22940`](https://github.com/nophead/NopSCADlib/commit/8d22940506df525ac52ef6f8a00ea03661f3b682 "show commit") [C.P.](# "Chris Palmer") Project blurb can now be split with into sections with markdown horizontal rules
made with asterisks.
If an image is include in the first section the default image is supressed.
If an image is include in the first section the default image is suppressed.
#### [v10.20.1](https://github.com/nophead/NopSCADlib/releases/tag/v10.20.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v10.20.0...v10.20.1 "diff with v10.20.0")
* 2020-12-26 [`87c8bbb`](https://github.com/nophead/NopSCADlib/commit/87c8bbb9a549aabb84004426332dc964583472c5 "show commit") [M.B.](# "Martin Budden") Fixed error in `carriage_size` function.
@@ -515,12 +652,12 @@ If an image is include in the first section the default image is supressed.
### [v10.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v10.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v10.19.0...v10.20.0 "diff with v10.19.0")
* 2020-12-24 [`6f8ff60`](https://github.com/nophead/NopSCADlib/commit/6f8ff606fa5b2ef7d81fb687b77bd6236f6d277f "show commit") [C.P.](# "Chris Palmer") Removed `woven_sheet()` from the readme.
Removed redundent code.
Removed redundant code.
* 2020-12-24 [`acd5de0`](https://github.com/nophead/NopSCADlib/commit/acd5de0fbd513b67387478b4c89a5ef4f11b440b "show commit") [C.P.](# "Chris Palmer") Fixed extra BOM entries for woven sheet.
Added render colour to BOM for 3D sheets.
* 2020-12-23 [`cc1e3ba`](https://github.com/nophead/NopSCADlib/commit/cc1e3baaf6ba7451b3545efc949015af822dc95c "show commit") [C.P.](# "Chris Palmer") Reimplemeted woven sheets with an eye to speed and interface consistancy.
* 2020-12-23 [`cc1e3ba`](https://github.com/nophead/NopSCADlib/commit/cc1e3baaf6ba7451b3545efc949015af822dc95c "show commit") [C.P.](# "Chris Palmer") Reimplemeted woven sheets with an eye to speed and interface consistency.
* 2020-12-13 [`85cb54e`](https://github.com/nophead/NopSCADlib/commit/85cb54ef318597a4922077785247ddcb08d5e00d "show commit") [M.B.](# "Martin Budden") Added sheet with checkerboard texture to simulate carbon fiber.
@@ -985,7 +1122,7 @@ Done to reduced the number of global constants.
`Panel_meters` can now have inner apertures and buttons.
### [v7.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v7.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v7.1.1...v7.2.0 "diff with v7.1.1")
* 2020-05-02 [`baa737c`](https://github.com/nophead/NopSCADlib/commit/baa737c4d83be0ab38685122ebe535872fe63e20 "show commit") [C.P.](# "Chris Palmer") Updated example to use Foot contructor.
* 2020-05-02 [`baa737c`](https://github.com/nophead/NopSCADlib/commit/baa737c4d83be0ab38685122ebe535872fe63e20 "show commit") [C.P.](# "Chris Palmer") Updated example to use Foot constructor.
* 2020-05-02 [`70b13d2`](https://github.com/nophead/NopSCADlib/commit/70b13d2f2723caa18a69afb7a179d88366c82c51 "show commit") [C.P.](# "Chris Palmer") Added functions to create property lists that are created by the client.
Foot, box, bbox, pbox, `flat_hinge` and `strap_handle`.
@@ -1189,7 +1326,7 @@ The implementation files are still lower case for backwards compatibility.
* 2020-03-03 [`bd60b50`](https://github.com/nophead/NopSCADlib/commit/bd60b50b099d76f6588ddfe900be276ed7d0cf98 "show commit") [C.P.](# "Chris Palmer") Removed lower case tests
* 2020-03-03 [`4d51cb7`](https://github.com/nophead/NopSCADlib/commit/4d51cb73f3d2b3a92ac4c12a2002bc4918228969 "show commit") [C.P.](# "Chris Palmer") Table of contents now has three vitamin coloumns
* 2020-03-03 [`4d51cb7`](https://github.com/nophead/NopSCADlib/commit/4d51cb73f3d2b3a92ac4c12a2002bc4918228969 "show commit") [C.P.](# "Chris Palmer") Table of contents now has three vitamin columns
* 2020-03-02 [`3b77c97`](https://github.com/nophead/NopSCADlib/commit/3b77c975325851caf5e602ae6ceaa8e5d9126425 "show commit") [C.P.](# "Chris Palmer") Example now include `core.scad` instead of `lib.scad`.
@@ -1466,7 +1603,7 @@ This means 5mm, 6mm etc comes before 10mm in BOM.
* 2020-01-11 [`d1324a6`](https://github.com/nophead/NopSCADlib/commit/d1324a670eb7ec898e6663dc9394fc1bd19ef664 "show commit") [M.B.](# "Martin Budden") Added JST-XH connector for pcbs.
* 2020-02-22 [`599fbba`](https://github.com/nophead/NopSCADlib/commit/599fbba6c2b036a4a22fa04f2e06f67ef5bb9578 "show commit") [C.P.](# "Chris Palmer") Reduced dependecies in `pcb_mount` test.
* 2020-02-22 [`599fbba`](https://github.com/nophead/NopSCADlib/commit/599fbba6c2b036a4a22fa04f2e06f67ef5bb9578 "show commit") [C.P.](# "Chris Palmer") Reduced dependencies in `pcb_mount` test.
### [v2.19.0](https://github.com/nophead/NopSCADlib/releases/tag/v2.19.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v2.16.0...v2.19.0 "diff with v2.16.0")
* 2020-02-22 [`6097e07`](https://github.com/nophead/NopSCADlib/commit/6097e0709498166c61712094fcc11f083e25959f "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
@@ -1782,7 +1919,7 @@ IEC screw length fixed at 10 if inserts used.
* 2019-06-14 [`a51e96e`](https://github.com/nophead/NopSCADlib/commit/a51e96ec433c6d347e0d313573585cda9978e7b4 "show commit") [C.P.](# "Chris Palmer") Nuts now show their thickness on the BOM so half nuts have a different description.
## [v1.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v1.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v0.0.1...v1.0.0 "diff with v0.0.1")
* 2019-06-14 [`b719601`](https://github.com/nophead/NopSCADlib/commit/b719601a645d899f5477c13a34f857d178bcc3a1 "show commit") [C.P.](# "Chris Palmer") Fixed cable strip parameters and BOM desciption
* 2019-06-14 [`b719601`](https://github.com/nophead/NopSCADlib/commit/b719601a645d899f5477c13a34f857d178bcc3a1 "show commit") [C.P.](# "Chris Palmer") Fixed cable strip parameters and BOM description
#### [v0.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v0.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v0.0.0...v0.0.1 "diff with v0.0.0")
* 2019-06-14 [`5ede2d0`](https://github.com/nophead/NopSCADlib/commit/5ede2d0895a8a813ef2bc47bf94462d668bc440b "show commit") [C.P.](# "Chris Palmer") Smooth pulleys now show their OD on the BOM.

View File

@@ -277,6 +277,15 @@ The top level assembly instructions and assembly contents could also be differen
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

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -24,13 +24,10 @@
// bom defaults to 0
// Setting $bom on the command line or in the main file before including lib.scad overrides it everywhere.
// Setting $bom after including lib overrides bom in the libs but not in the local file.
// 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 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
@@ -54,9 +51,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

@@ -55,6 +55,7 @@ include <vitamins/pulleys.scad>
include <vitamins/ring_terminals.scad>
include <vitamins/rails.scad>
include <vitamins/rod.scad>
include <vitamins/servo_motors.scad>
include <vitamins/shaft_couplings.scad>
include <vitamins/sheets.scad>
include <vitamins/sk_brackets.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 908 KiB

After

Width:  |  Height:  |  Size: 931 KiB

View File

@@ -41,6 +41,7 @@
//
include <lib.scad>
use <tests/7_segments.scad>
use <tests/ball_bearings.scad>
use <tests/batteries.scad>
use <tests/bearing_blocks.scad>
@@ -83,6 +84,7 @@ use <tests/panel_meters.scad>
use <tests/PCBs.scad>
use <tests/pillars.scad>
use <tests/pillow_blocks.scad>
use <tests/potentiometers.scad>
use <tests/press_fit.scad>
use <tests/PSUs.scad>
use <tests/pulleys.scad>
@@ -92,6 +94,7 @@ use <tests/rockers.scad>
use <tests/rod.scad>
use <tests/screws.scad>
use <tests/sealing_strip.scad>
use <tests/servo_motors.scad>
use <tests/shaft_couplings.scad>
use <tests/sheets.scad>
use <tests/SK_brackets.scad>
@@ -185,16 +188,15 @@ translate([x5, cable_grommets_y + 250])
translate([950, 600])
box_test();
translate([830, 770])
translate([900, 750])
pocket_handles();
translate([950, 750])
translate([900, 850])
printed_boxes();
translate([850, 1330])
translate([850, 1330 + 85])
bbox_test();
inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 120;
@@ -206,13 +208,14 @@ sealing_strip_y = springs_y + 20;
tubings_y = sealing_strip_y + 20;
pillars_y = tubings_y + 20;
ball_bearings_y = pillars_y + 40;
pulleys_y = ball_bearings_y +40;
hot_ends_y = pulleys_y + 60;
linear_bearings_y = hot_ends_y + 50;
sheets_y = linear_bearings_y + 90;
pulleys_y = ball_bearings_y + 40;
leadnuts_y = pulleys_y + 60;
linear_bearings_y = leadnuts_y + 50;
steppers_y = linear_bearings_y + 110;
sheets_y = steppers_y + 55;
pcbs_y = sheets_y + 60;
displays_y = pcbs_y + 170;
fans_y = displays_y + 80;
displays_y = pcbs_y + 140;
fans_y = displays_y + 110;
transformers_y = fans_y + 120;
psus_y = transformers_y + 190;
@@ -255,13 +258,16 @@ translate([x0, ball_bearings_y])
translate([x0, pulleys_y])
pulleys();
translate([x0, leadnuts_y])
leadnuts();
translate([x0, linear_bearings_y]) {
linear_bearings();
rods();
}
translate([x0 + 10, hot_ends_y])
hot_ends();
translate([x0, steppers_y])
stepper_motors();
translate([x0, sheets_y])
sheets();
@@ -279,7 +285,7 @@ translate([x0, fans_y]) {
fan_guards();
}
translate([x0, transformers_y])
translate([760, fans_y])
variacs();
translate([x0, psus_y]) {
@@ -291,7 +297,6 @@ translate([x0, psus_y]) {
zipties_y = 0;
bulldogs_y = zipties_y + 30;
swiss_clips_y = bulldogs_y + 35;
leadnuts_y = swiss_clips_y + 50;
translate([x1, zipties_y])
zipties();
@@ -302,10 +307,6 @@ translate([x1, bulldogs_y])
translate([x1, swiss_clips_y])
swiss_clips();
translate([x1, leadnuts_y])
leadnuts();
leds_y = 0;
carriers_y = leds_y + 40;
magnets_y = carriers_y + 40;
@@ -362,9 +363,9 @@ iecs_y = d_connectors_y + 80;
modules_y = iecs_y + 60;
ssrs_y = modules_y + 80;
blowers_y = ssrs_y + 60;
batteries_y = blowers_y + 100;
steppers_y = batteries_y + 55;
panel_meters_y = steppers_y + 70;
hot_ends_y = blowers_y + 100;
batteries_y = hot_ends_y + 55;
panel_meters_y = batteries_y + 70;
extrusions_y = panel_meters_y + 80;
translate([x3, veroboard_y])
@@ -409,8 +410,8 @@ translate([x3, blowers_y])
translate([x3, batteries_y])
batteries();
translate([x2, steppers_y]) // interloper
stepper_motors();
translate([x3 + 10, hot_ends_y])
hot_ends();
translate([x2, panel_meters_y])
panel_meters();
@@ -418,7 +419,7 @@ translate([x2, panel_meters_y])
translate([x2, extrusions_y])
extrusions();
translate([x3, transformers_y])
translate([400, transformers_y])
transformers();
@@ -426,18 +427,21 @@ belts_y = 0;
rails_y = belts_y + 200;
extrusion_brackets_y = rails_y + 250;
sk_brackets_y = extrusion_brackets_y + 80;
kp_pillow_blocks_y = sk_brackets_y + 50;
kp_pillow_blocks_y = sk_brackets_y + 60;
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;
box_sections_y = batteries_y;
BLDC_y = scs_bearing_blocks_y + 120;
pot_y = BLDC_y + 40;
cable_strip_y = pot_y + 50;
translate([0, transformers_y])
servo_motors();
translate([x4 + 200, belts_y + 58]) {
belt_test();
translate([0, 60])
opengrab_test();
}
translate([x4 + 175, belts_y, -20])
@@ -446,7 +450,7 @@ translate([x4 + 175, belts_y, -20])
translate([x4, rails_y + 130])
rails();
translate([770, cable_strip_y])
translate([x4, cable_strip_y])
cable_strips();
translate([x4, kp_pillow_blocks_y])
@@ -458,7 +462,7 @@ translate([x4, sk_brackets_y])
translate([x4, extrusion_brackets_y])
extrusion_brackets();
translate([x4 + 120, extrusion_brackets_y])
translate([x1, swiss_clips_y + 50])
shaft_couplings();
translate([x4, scs_bearing_blocks_y])
@@ -467,7 +471,10 @@ translate([x4, scs_bearing_blocks_y])
translate([x4, BLDC_y])
bldc_motors();
translate([x6, box_sections_y])
translate([x4, pot_y])
potentiometers();
translate([x2, box_sections_y])
box_sections();
translate([x6, 125])

View File

@@ -54,7 +54,7 @@ function bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", s
[ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers ];
function bbox_volume(type) = bbox_width(type) * bbox_depth(type) * bbox_height(type) / 1000000; //! Internal volume in litres
function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surdface area in m^2
function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surface area in m^2
2 * (w * d + w * h + d * h) / 1000000;
module bbox_shelf_blank(type) { //! 2D template for a shelf

View File

@@ -45,7 +45,7 @@ function door_hinge_stat_screw() = stat_screw; //! Screw use to fas
function door_hinge_stat_width() = stat_width; //! Width of the stationary part
function door_hinge_stat_length() = stat_length; //! Length of the stationary part
module door_hinge_hole_positions(dir = 0) { //! Position chidren at the door hole positions
module door_hinge_hole_positions(dir = 0) { //! Position children at the door hole positions
hole_pitch = width - 10;
for(side = [-1, 1])

View File

@@ -57,7 +57,7 @@ module door_latch_stl() { //! Generates the STL for the printed part
}
}
module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specified sheet thickess
module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specified sheet thickness
washer = screw_washer(screw);
nut = screw_nut(screw);

View File

@@ -20,7 +20,7 @@
//
//! 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.
//!

View File

@@ -17,7 +17,7 @@
// If not, see <https://www.gnu.org/licenses/>.
//
//! 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.
//

View File

@@ -40,7 +40,7 @@ function hinge_knuckles(type) = type[6]; //! How many knuckles
function hinge_screw(type) = type[7]; //! Screw type to mount it
function hinge_screws(type) = type[8]; //! How many screws
function hinge_clearance(type) = type[9]; //! Clearance between knuckles
function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckes
function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckles
function flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin) = //! Construct the property list for a flat hinge.
[name, size.x, size.y, size.z, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin];
@@ -73,7 +73,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
assert(kr > pr, "knuckle diameter must be bigger than the pin diameter");
n = hinge_knuckles(type);
assert(n >= 3, "must be at least three knuckes");
assert(n >= 3, "must be at least three knuckles");
mn = ceil(n / 2); // Male knuckles
fn = floor(n / 2); // Female knuckles
gap = hinge_clearance(type);

View File

@@ -41,6 +41,7 @@ overlap = 6;
cable_tie_inset = wall + 4;
function psu_shroud_extent(type) = 15 + wall; //! How far it extends beyond the PSU to clear the connections
function psu_shroud_wall(type) = wall; //! The wall thickness
function psu_shroud_depth(type) = //! Outside depth of the shroud
psu_left_bay(type) + overlap + psu_shroud_extent(type);
@@ -154,7 +155,7 @@ assembly(str("PSU_shroud_", name), ngb = true) {
insert(insert);
}
module psu_shroud_fastened_assembly(type, cable_d, thickness, name, cables = 1) //! Assembly with screws in place
module psu_shroud_fastened_assembly(type, cable_d, thickness, name, cables = 1, screw = screw) //! Assembly with screws in place
{
screw_length = screw_length(screw,thickness + counter_bore, 2, true);

453
readme.md

File diff suppressed because it is too large Load Diff

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":
@@ -129,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)
@@ -265,6 +298,8 @@ def boms(target = None):
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:
bom = main.assemblies[ass]

View File

@@ -24,6 +24,7 @@ from __future__ import print_function
import sys
import subprocess
import re
from tests import do_cmd
filename = 'CHANGELOG.md'
@@ -162,3 +163,4 @@ if __name__ == '__main__':
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U..ated changelog.*', c.comment):
print('* %s [`%s`](%s "show commit") %s %s\n' % (c.date, c.hash[:7], url + '/commit/' + c.hash, initials(c.author), fixup_comment(c.comment, url)), file = file)
do_cmd(('codespell -w -L od ' + filename).split())

View File

@@ -139,6 +139,7 @@ def make_parts(target, part_type, parts = None):
#
part_maker_name = tmp_dir + '/' + part_type + ".scad"
with open(part_maker_name, "w") as f:
f.write("include <NopSCADlib/global_defs.scad>\n")
f.write("use <%s/%s>\n" % (reltmp(dir, target), filename))
f.write("%s();\n" % module);
t = time.time()

View File

@@ -17,7 +17,7 @@
# If not, see <https://www.gnu.org/licenses/>.
#
# Set command line options from enviroment variables and check if they have changed
# Set command line options from environment variables and check if they have changed
import json, os, deps
from colorama import Fore, init

View File

@@ -94,11 +94,13 @@ def render(target, type):
cam = "--camera=0,0,0,70,0,315,500" if type == 'stl' else "--camera=0,0,0,0,0,0,500"
render = "--preview" if type == 'stl' or colour != pp1 else "--render"
tmp_name = tmp_dir + '/' + part[:-4] + '.png'
openscad.run("-o", tmp_name, png_maker_name, colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall");
dummy_deps_name = tmp_dir + '/tmp.deps' # work around for OpenSCAD issue #3879
openscad.run("-o", tmp_name, png_maker_name, colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-d", dummy_deps_name)
do_cmd(("magick "+ tmp_name + " -trim -resize 280x280 -background %s -gravity Center -extent 280x280 -bordercolor %s -border 10 %s"
% (background, background, tmp_name)).split())
update_image(tmp_name, png_name)
os.remove(png_maker_name)
os.remove(dummy_deps_name)
#
# Remove tmp dir
#

View File

@@ -72,6 +72,8 @@ def update_image(tmp_name, png_name):
if pixels < 0 or pixels > threshold:
shutil.copyfile(tmp_name, png_name)
print(Fore.YELLOW + png_name + " updated" + Fore.WHITE, pixels if pixels > 0 else '')
if png_name.endswith('_tn.png'):
os.remove(diff_name)
else:
os.utime(png_name, None)
os.remove(diff_name)

View File

@@ -25,6 +25,7 @@ import time
def mktmpdir(top_dir):
tmp_dir = top_dir + 'tmp'
if not os.path.isdir(tmp_dir):
time.sleep(0.1)
os.makedirs(tmp_dir)
else:
for file in os.listdir(tmp_dir):

View File

@@ -77,12 +77,12 @@ 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]
def eop(doc_file, last = False, first = False):
print('<span></span>', file = doc_file) # An invisable marker for page breaks because markdown takes much longer if the document contains a div
print('<span></span>', file = doc_file) # An invisible marker for page breaks because markdown takes much longer if the document contains a div
if not first:
print('[Top](#TOP)', file = doc_file)
if not last:
@@ -216,6 +216,7 @@ def views(target, do_assemblies = None):
#
png_maker_name = tmp_dir + '/png.scad'
with open(png_maker_name, "w") as f:
f.write("include <NopSCADlib/global_defs.scad>\n")
f.write("use <%s/%s>\n" % (reltmp(dir, target), filename))
f.write("%s();\n" % module);
t = time.time()

29
tests/7_segments.scad Normal file
View File

@@ -0,0 +1,29 @@
//
// 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/7_segments.scad>
module 7_segments()
layout([for(s = 7_segments) 7_segment_size(s).x * 2], 5) let(s = 7_segments[$i])
7_segment_digits(s, 2);
if($preview)
7_segments();

View File

@@ -22,6 +22,8 @@ include <../vitamins/d_connectors.scad>
include <../vitamins/leds.scad>
include <../vitamins/axials.scad>
include <../vitamins/smds.scad>
include <../vitamins/7_segments.scad>
include <../vitamins/potentiometers.scad>
use <../vitamins/pcb.scad>
@@ -46,7 +48,7 @@ TMC2130 = ["TMC2130", "TMC2130",
[]
];
test_pcb = ["TestPCB", "Test PCB",
test_pcb = ["test_pcb", "Test PCB",
100, 250, 1.6, // length, width, thickness
3, // Corner radius
2.75, // Mounting hole diameter
@@ -64,21 +66,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"],
@@ -91,6 +97,8 @@ test_pcb = ["TestPCB", "Test PCB",
[ 65, 12, 0, "ax_res", res1_8, 1000],
[ 65, 17, 0, "ax_res", res1_4, 10000],
[ 65, 22, 0, "ax_res", res1_2, 100000],
[ 55, 22, 0, "vero_pin"],
[ 55, 17, 0, "vero_pin", true],
[ 80, 9, 0, "link", inch(0.2), inch(0.4)],
[ 80, 12, 0, "ax_res", res1_8, 1000000, 1, inch(0.1)],
@@ -127,11 +135,14 @@ 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],
[ 50, 240, 0, "potentiometer"],
[ 75, 240, 0, "potentiometer", 7, 8],
[ 75, 240, 0, "potentiometer", KY_040_encoder, 8],
[ 30, 85, -90, "7seg", WT5011BSR, 2],
],
// accessories
[]

View File

@@ -21,7 +21,7 @@ include <../vitamins/pcbs.scad>
use <../utils/layout.scad>
function spacing(p) = let(w = pcb_width(p)) w < 22 ? w + 3 : w + 10;
function spacing(p) = let(w = pcb_width(p)) w < 22 ? w + 3 : w + 7;
module pcbs() {
layout([for(p = pcbs) spacing(p)], 0)
@@ -29,7 +29,12 @@ module pcbs() {
rotate(90)
pcb_assembly(pcbs[$i], 5 + $i, 3);
translate([0, 110])
translate([0, 65])
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

@@ -22,18 +22,20 @@ include <../vitamins/extrusions.scad>
use <../utils/layout.scad>
module sk_brackets() {
module sk_brackets(examples = false) {
screws = [M4_dome_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];
nuts = [M4_hammer_nut, M4_sliding_t_nut, M5_sliding_t_nut, undef];
// channel depth = 6 for 2020 extrusion, 9 for 3030 extrusion
depths = [6, 6, 9, 0];
layout([for(s = sk_brackets) 1.5 * sk_size(s)[1]]) {
sk_bracket_assembly(sk_brackets[$i], screw_type = screws[$i], nut_type = nuts[$i], max_screw_depth = depths[$i]);
translate([0, -sk_hole_offset(sk_brackets[$i]) - extrusion_width($i < 2 ? E2020 : E3030) / 2, 0])
rotate([0, 90, 0])
extrusion($i < 2 ? E2020 : E3030, 20, false);
if(examples)
translate([0, -sk_hole_offset(sk_brackets[$i]) - extrusion_width($i < 2 ? E2020 : E3030) / 2, 0])
rotate([0, 90, 0])
extrusion($i < 2 ? E2020 : E3030, 20, false);
}
}
if($preview)
sk_brackets();
sk_brackets(true);

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

@@ -24,7 +24,10 @@ use <../vitamins/pcb.scad>
module displays()
layout([for(d = displays) pcb_length(display_pcb(d))], 10)
display(displays[$i]);
translate([0, pcb_width(displays[$i]) / 2])
vflip()
display(displays[$i]);
if($preview)
displays();
let($show_threads = true)
displays();

View File

@@ -16,13 +16,51 @@
// 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>
include <../core.scad>
include <../vitamins/extrusion_brackets.scad>
include <../vitamins/extrusions.scad>
include <../vitamins/extrusion_brackets.scad>
include <../vitamins/washers.scad>
include <../vitamins/nuts.scad>
module inner_bracket_test(bracket, backwards = false)
rotate([90, 0, 180]) {
extrusion = extrusion_inner_corner_bracket_extrusion(bracket);
eWidth = extrusion_width(extrusion);
size = extrusion_inner_corner_bracket_size(bracket);
tnut = extrusion_inner_corner_bracket_tnut(bracket);
translate([backwards ? -eWidth : 0, 0])
extrusion_inner_corner_bracket(bracket, backwards = backwards);
translate([-eWidth / 2, 0])
rotate([-90, 0, 0])
extrusion(extrusion, size.x - nut_thickness(tnut) - extrusion_tab_thickness(extrusion), false, cornerHole = eWidth > 20);
translate([-eWidth, -eWidth / 2])
rotate([0, 90, 0])
extrusion(extrusion, eWidth + size.y - nut_thickness(tnut) - extrusion_tab_thickness(extrusion), false, cornerHole = eWidth > 20);
}
module bracket_test(bracket)
rotate([90, 0, 180]) {
extrusion = extrusion_corner_bracket_extrusion(bracket);
eWidth = extrusion_width(extrusion);
size = extrusion_corner_bracket_size(bracket);
extrusion_corner_bracket_assembly(bracket);
translate([-eWidth / 2, 0])
rotate([-90, 0, 0])
extrusion(extrusion, size.y, false, cornerHole = eWidth > 20);
translate([-eWidth, -eWidth / 2])
rotate([0, 90, 0])
extrusion(extrusion, eWidth + size.x, false, cornerHole = eWidth > 20);
}
module extrusion_brackets(examples = false) {
extrusion_inner_corner_bracket(E20_inner_corner_bracket);
@@ -32,34 +70,30 @@ module extrusion_brackets(examples = false) {
translate([60, 0])
extrusion_corner_bracket_assembly(E20_corner_bracket);
eWidth = extrusion_width(E2020);
translate([110, 0])
extrusion_inner_corner_bracket(E40_inner_corner_bracket);
translate([140, 0])
extrusion_corner_bracket_assembly(E40_corner_bracket);
if(examples) {
translate([20, 60, 10]) rotate([90, 0, 180]) {
extrusion_inner_corner_bracket(E20_inner_corner_bracket);
translate([20, 50, 10])
inner_bracket_test(E20_inner_corner_bracket, true);
translate([-eWidth / 2, 0, 0])
rotate([-90, 0, 0])
extrusion(E2020, 20, false);
translate([20, 80, 10])
inner_bracket_test(E20_inner_corner_bracket);
translate([-eWidth, -eWidth / 2, 0])
rotate([0, 90, 0])
extrusion(E2020, 40, false);
}
translate([20, 120, 10])
bracket_test(E20_corner_bracket);
translate([100, 60, 10]) rotate([90, 0, 180]) {
extrusion_corner_bracket_assembly(E20_corner_bracket);
translate([100, 70, 10])
inner_bracket_test(E40_inner_corner_bracket);
translate([-eWidth / 2, 0, 0])
rotate([-90, 0, 0])
extrusion(E2020, 30, false);
translate([-eWidth, -eWidth / 2, 0])
rotate([0, 90, 0])
extrusion(E2020, 50, false);
}
translate([100, 130, 10])
bracket_test(E40_corner_bracket);
}
}
if($preview)
extrusion_brackets(true);
let($show_threads = true)
extrusion_brackets(true);

View File

@@ -21,9 +21,24 @@ use <../utils/layout.scad>
include <../vitamins/extrusions.scad>
gap = 10;
module extrusions()
layout([for(e = extrusions) extrusion_width(e)], 10)
extrusion(extrusions[$i], 80, cornerHole = extrusion_width(extrusions[$i]) > 20);
layout([for(e = extrusions) is_list(e[0]) ? extrusion_width(e[0]) : extrusion_width(e)], gap)
let(e = extrusions[$i])
if(is_list(e[0])) {
list = e;
heights = [for(e = list) extrusion_height(e)];
l = len(heights) - 1;
offset = (heights * [for(i = [0 : l]) 1] + l * gap) / 2;
translate([0, -offset])
rotate(90)
layout(heights, gap)
rotate(-90)
extrusion(list[$i], 80, cornerHole = extrusion_width(list[$i]) > 20);
}
else
extrusion(e, 80, cornerHole = extrusion_width(e) > 20);
if ($preview)
extrusions();

View File

@@ -52,6 +52,12 @@ module nuts() {
if(n == M5_nut)
sliding_t_nut(M5_sliding_t_nut);
if(n == M6_nut)
sliding_t_nut(M6_sliding_t_nut);
if(n == M8_nut)
sliding_t_nut(M8_sliding_ball_t_nut);
}
translate([0, 80]) {

View File

@@ -64,8 +64,9 @@ module pin_headers() {
pin_socket(pin_headers[$i], 3, 3, right_angle = true);
}
for(i = [0, 1], p = [5, 2][i], j = [0 , 1]) {
h = [jst_ph_header, jst_xh_header][j];
headers = [jst_zh_header, jst_ph_header, jst_xh_header];
for(i = [0, 1], p = [5, 2][i], j = [0 : len(headers) - 1]) {
h = headers[j];
translate([-20 * (i + 1), 0 + j * 40])
jst_xh_header(h, p);

BIN
tests/png/7_segments.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 126 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: 77 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 176 KiB

BIN
tests/png/servo_motors.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 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: 107 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 149 KiB

31
tests/potentiometers.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/>.
//
//! Potentiometers and rotary encoders
include <../core.scad>
include <../utils/layout.scad>
include <../vitamins/potentiometers.scad>
module potentiometers()
layout([for(p = potentiometers) pot_size(p).x])
hflip()
potentiometer(potentiometers[$i], shaft_length = 30);
if($preview)
let($show_threads = true)
potentiometers();

View File

@@ -29,7 +29,7 @@ pos = 1; //[-1 : 0.1 : 1]
function rail_carriages(rail) = [for(c = carriages) if(carriage_rail(c) == rail) c];
module rails()
layout([for(r = rails) carriage_width(rail_carriages(r)[0])], 20)
layout([for(r = rails) carriage_width(rail_carriages(r)[0])], 10)
rotate(-90) {
rail = rails[$i];
carriages = rail_carriages(rail);

View File

@@ -48,7 +48,7 @@ module screws() {
for(x = [0 : len(screw_lists[y]) -1]) {
screw = screw_lists[y][x];
if(screw) {
length = screw_head_type(screw) == hs_grub ? 6
length = screw_head_type(screw) == hs_grub ? screw_radius(screw) * 4
: screw_radius(screw) <= 1.5 ? 10
: screw_max_thread(screw) ? screw_longer_than(screw_max_thread(screw) + 5)
: 30;

31
tests/servo_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/servo_motors.scad>
module servo_motors()
layout([for(s = servo_motors) servo_motor_width(s)], 10) let(s = servo_motors[$i]) {
rotate(-90) // Show the keyway
servo_motor(s);
}
if($preview)
servo_motors();

View File

@@ -22,12 +22,12 @@ include <../vitamins/stepper_motors.scad>
use <../utils/layout.scad>
module stepper_motors()
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = true) let(m = stepper_motors[$i]) {
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = false) let(m = stepper_motors[$i]) {
rotate(180)
NEMA(m, 0, m == NEMA17P || m == NEMA17M || m == NEMA17M8);
NEMA(m, 0, in([NEMA17P, NEMA17M, NEMA17M8, NEMA8, NEMA8BH], m));
translate_z(4)
NEMA_screws(m, M3_pan_screw, n = $i, earth = $i > 4 ? undef : $i - 1);
NEMA_screws(m, M3_pan_screw, n = $i - 2, earth = $i > 6 ? undef : $i - 3);
}
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.
@@ -42,24 +42,24 @@
//! * To get the parameter values make the GUI window square, pose the view with the mouse and then copy the viewport parameters from the Edit menu and paste them into the pose invocation.
//! * Two `pose()` modules can be chained to allow different poses for exploded and assembled views.
//
function bom_mode(n = 1) = $_bom >= n && (is_undef($on_bom) || $on_bom); //! Current BOM mode, 0 = none, 1 = printed and routed parts and assemblies, 2 includes vitamins as well
function exploded() = is_undef($exploded_parent) ? $exploded : 0; //! Returns the value of `$exploded` if it is defined, else `0`
function bom_mode(n = 1) = (is_undef($bom) ? 0 : $bom) >= n && (is_undef($on_bom) || $on_bom); //! Current BOM mode, 0 = none, 1 = printed and routed parts and assemblies, 2 includes vitamins as well
function exploded() = is_undef($exploded_parent) ? is_undef($explode) ? 0 : $explode : 0; //! Returns the value of `$exploded` if it is defined, else `0`
function show_supports() = !$preview || exploded(); //! True if printed support material should be shown
module no_explode() let($exploded_parent = true) children(); //! Prevent children being exploded
module explode(d, explode_children = false, offset = [0,0,0]) { //! Explode children by specified Z distance or vector `d`, option to explode grand children
v = is_list(d) ? d : [0, 0, d];
o = is_list(offset) ? offset : [0, 0, offset];
if($exploded && is_undef($exploded_parent) && norm(v)) {
if(exploded() && norm(v)) {
translate(o) // Draw the line first in case the child is transparent
color("yellow") hull() {
sphere(0.2);
translate(v * $exploded)
translate(v * exploded())
sphere(0.2);
}
translate(v * $exploded)
translate(v * exploded())
let($exploded_parent = explode_children ? undef : true)
children();
}

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

@@ -26,7 +26,7 @@
//
module teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging
module teardrop_2d(r, truncate) {
er = layer_height / 2 - eps; // Extrustion edge radius
er = layer_height / 2 - eps; // Extrusion edge radius
R = plus ? r + er : r; // Corrected radius
offset = plus ? -er : 0; // Offset inwards
hull()

View File

@@ -135,4 +135,4 @@ function involute_worm_profile(m, pa = 20, clearance = undef) = //! Calculate wo
let(tooth = involute_rack_tooth_profile(m),
pitch = PI * m,
y_min = min([for(p = tooth) p.y])
) [for(p = tooth) [p.x - pitch / 2, p.y - y_min, 0]]; // Offset to be positive in y, centred in x and add 0 z ordintate
) [for(p = tooth) [p.x - pitch / 2, p.y - y_min, 0]]; // Offset to be positive in y, centred in x and add 0 z coordinate

View File

@@ -18,7 +18,7 @@
//
//
//! 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.

View File

@@ -25,7 +25,9 @@ include <../utils/core/core.scad>
module ring(or, ir) //! Create a ring with specified external and internal radii
difference() {
circle4n(or);
circle4n(ir);
if(ir > 0)
circle4n(ir);
}
module tube(or, ir, h, center = true) //! Create a tube with specified external and internal radii and height `h`
@@ -69,7 +71,7 @@ module woven_tube(or, ir, h, center= true, colour = grey(30), colour2, warp = 2,
}
}
module rectangular_tube(size, center = true, thickness = 1, fillet = 0.5) { //! Create a retangular tube with filleted corners
module rectangular_tube(size, center = true, thickness = 1, fillet = 0.5) { //! Create a rectangular tube with filleted corners
extrude_if(size.z, center = center)
difference() {
rounded_square([size.x, size.y], fillet);

107
vitamins/7_segment.scad Normal file
View File

@@ -0,0 +1,107 @@
//
// 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/>.
//
//
//! 7 Segment displays
//
include <../utils/core/core.scad>
function 7_segment_size(type) = type[1]; //! Size of the body
function 7_segment_digit_size(type) = type[2]; //! Size of the actual digit and segemnt width and angle
function 7_segment_pins(type) = type[3]; //! [x, y] array of pins
function 7_segment_pin_pitch(type) = type[4]; //! x and y pin pitches and pin diameter
module 7_segment_digit(type, colour = grey(95), pin_length = 6.4) { //! Draw the specified 7 segment digit
size = 7_segment_size(type);
digit = 7_segment_digit_size(type);
pins = 7_segment_pins(type);
pin_pitch = 7_segment_pin_pitch(type);
color(grey(95))
linear_extrude(size.z)
square([size.x - 0.1, size.y], center = true);
color(grey(15))
translate_z(size.z)
cube([size.x - 0.1, size.y, eps], center = true);
color(colour)
translate_z(size.z)
linear_extrude(2 * eps) {
t = digit[2];
a = digit[3];
sq = [digit.x - 2 * t, (digit.y - 3 * t) / 2];
multmatrix([ // Skew
[1, tan(a), 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
])
difference() {
square([digit.x, digit.y], center = true);
for(y = [-1, 1], x = [-1, 1]) {
translate([0, y * (t + sq.y) / 2])
square(sq, center = true);
translate([x * digit.x / 2, y * digit.y / 2])
rotate(-45 * x * y) {
square([10, t], center = true);
square([t / 5, 10], center = true);
}
translate([x * (digit.x - t) / 2, 0])
rotate(45) {
square([t / 5, t * 2], center = true);
square([t * 2, t / 5], center = true);
translate([x * t / 2, -x * t / 2])
square([t, t], center = true);
}
}
}
r = 1.25 * t / 2;
translate([digit.x / 2 - r + digit.y / 2 * tan(a), -digit.y / 2 + r])
circle(r);
}
color(silver)
translate_z(-pin_length)
linear_extrude(pin_length)
for(x = [0 : 1 : pins.x - 1], y = [0 : 1 : pins.y - 1])
translate([(x - (pins.x - 1) / 2) * pin_pitch.x, (y - (pins.y - 1) / 2) * pin_pitch.y])
circle(d = pin_pitch[2], $fn = 16);
}
module 7_segment_digits(type, n, colour = grey(70), pin_length = 6.4, cutout = false) { //! Draw n digits side by side
size = 7_segment_size(type);
if(cutout)
linear_extrude(100)
square([n * size.x, size.y], center = true);
else
for(i = [0 : 1 : n - 1])
translate([(i - (n - 1) / 2) * size.x, 0])
7_segment_digit(type, colour, pin_length);
}

28
vitamins/7_segments.scad Normal file
View File

@@ -0,0 +1,28 @@
//
// 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/>.
//
//
//! 7 Segment displays
//
WT5011BSR = ["WT5011BSR", [12.7, 19, 8.2], [7.2, 12.7, 1.2, 10], [5, 2], [inch(0.1), inch(0.6), 0.4]];
7_segments = [ WT5011BSR ];
use <7_segment.scad>

View File

@@ -57,7 +57,7 @@ function ax_res_colour(type) = type[7]; //! Body colour
module orientate_axial(length, height, pitch, wire_d) { // Orient horizontal or vertical and add the wires
min_pitch = ceil((length + 1) / inch(0.1)) * inch(0.1);
lead_pitch = pitch ? pitch : min_pitch;
if(lead_pitch >= min_pitch) {
if(lead_pitch > min_pitch - eps) {
not_on_bom()
wire_link(wire_d, lead_pitch, height);

View File

@@ -19,21 +19,21 @@
//
//! 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.
//
@@ -60,7 +60,7 @@ module belt(type, points, belt_colour = grey(20), tooth_colour = grey(50), open
info = _belt_points_info(type, points, open, twist, auto_twist, start_twist);
dotwist = info[0]; // array of booleans, true if a twist happen after the position
twisted = info[1]; // array of booleans, true if the belt is twisted at the position
pointsx = info[2]; // array of [x,y,r], r is negative if left-angle (points may have pulleys as third element, but pointsx have radi)
pointsx = info[2]; // array of [x,y,r], r is negative if left-angle (points may have pulleys as third element, but pointsx have radii)
tangents = info[3];
arcs = info[4];
length = ceil(_belt_length(info, open) / pitch) * pitch;

View File

@@ -226,19 +226,21 @@ module BLDC(type) { //! Draw specified BLDC motor
translate_z(height)
tube(or = BLDC_boss_diameter(type)/2, ir = BLDC_shaft_diameter(type)/2, h = BLDC_boss_height(type), center = false);
} // end colour
color(BLDC_prop_shaft_thread_length(type) == 0 ? bldc_shaft_colour : body_colour)
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));
if (BLDC_prop_shaft_thread_length(type) > 0)
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);

View File

@@ -20,7 +20,7 @@
//
//! 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.

View File

@@ -25,7 +25,7 @@ use <pcb.scad>
function camera_pcb(type) = type[2]; //! The PCB part of the camera
function camera_lens_offset(type) = type[3]; //! Offset of the lens center from the PCB centre
function camera_lens(type) = type[4]; //! Stack of lens parts, can be round, rectanular or rounded rectangular, with optional tapered aperture
function camera_lens(type) = type[4]; //! Stack of lens parts, can be round, rectangular or rounded rectangular, with optional tapered aperture
function camera_connector_pos(type) = type[5]; //! The flex connector block for the camera itself's position
function camera_connector_size(type)= type[6]; //! The flex connector block for the camera itself's size

View File

@@ -18,7 +18,7 @@
//
//
//! LCD dispays.
//! LCD displays.
//
include <../utils/core/core.scad>

View File

@@ -53,7 +53,7 @@ LCDS7282BPCB = ["", "", 85, 36, 1.65, 0, 2.56, 0, "green", false, [[-2.5, -2.5],
[]];
LCDS7282B = ["LCDS7282B", "LCD display S-7282B", 73.6, 28.7, 9.6, LCDS7282BPCB,
[-2.5, 0, 0], // pcb offst
[-2.5, 0, 0], // pcb offset
[[-64.5 / 2, -14.5 / 2], [64.5 / 2, 14.5 / 2, 0.6]], // aperture
[], // touch screen
0, // thread length
@@ -73,6 +73,19 @@ SSD1963_4p3 = ["SSD1963_4p3", "LCD display SSD1963 4.3\"", 105.5, 67.2, 3.4, SSD
[[0, -34.5], [12, -31.5]],
];
TFT128x160PCB = ["", "", 56, 35, 1.2, 1, 2.0, 0, "mediumblue", false, [[-2.5, -2.5], [-2.5, 2.5], [2.5, 2.5], [2.5, -2.5]],
[ [2, 17.5, 0, "molex_hdr", 8]
],
[]];
TFT128x160 = ["TFT128x160", "LCD TFT ST7735 display 128x160", 46, 34, 2.1, TFT128x160PCB,
[0, 0, 0], // pcb offset
[[-37 / 2 - 2.5, -30 / 2], [37 / 2 - 2.5, 30 / 2, 0.3]], // aperture
[], // touch screen
0, // thread length
[], // clearance need for the ts ribbon
];
/* Dimensions taken from:
https://github.com/bigtreetech/BIGTREETECH-TFT35-V3.0/blob/master/Hardware/TFT35%20V3.0-SIZE-TOP.pdf
@@ -124,6 +137,6 @@ BigTreeTech_TFT35v3_0 = ["BigTreeTech_TFT35v3_0", "BigTreeTech TFT35 v3.0",
];
displays = [HDMI5, SSD1963_4p3, BigTreeTech_TFT35v3_0, LCD1602A, LCDS7282B];
displays = [HDMI5, SSD1963_4p3, BigTreeTech_TFT35v3_0, LCD1602A, LCDS7282B, TFT128x160];
use <display.scad>

View File

@@ -21,101 +21,116 @@
//
include <../utils/core/core.scad>
function extrusion_width(type) = type[1]; //! Width of extrusion
function extrusion_height(type) = type[2]; //! Height of extrusion
function extrusion_center_hole(type) = type[3]; //! Diameter of center hole
function extrusion_corner_hole(type) = type[4]; //! Diameter of corner hole
function extrusion_center_square(type) = type[5]; //! Size of center square
function extrusion_channel_width(type) = type[6]; //! Channel width
function extrusion_channel_width_internal(type) = type[7]; //! Internal channel width
function extrusion_tab_thickness(type) = type[8]; //! Tab thickness
function extrusion_spar_thickness(type) = type[9]; //! Spar thickness
function extrusion_fillet(type) = type[10]; //! Radius of corner fillet
function extrusion_width(type) = type[1]; //! Width of extrusion
function extrusion_height(type) = type[2]; //! Height of extrusion
function extrusion_center_hole_wd(type) = type[3]; //! Diameter of center hole if -ve or square side if +ve
function extrusion_corner_hole_wd(type) = type[4]; //! Diameter of corner hole if -ve or square side if +ve
function extrusion_center_square_wd(type) = type[5]; //! Size of center square if +ve or tube diameter if -ve
function extrusion_channel_width(type) = type[6]; //! Channel width
function extrusion_channel_width_internal(type) = type[7]; //! Internal channel width
function extrusion_tab_thickness(type) = type[8]; //! Tab thickness
function extrusion_spar_thickness(type) = type[9]; //! Spar thickness
function extrusion_fillet(type) = type[10]; //! Radius of corner fillet
function extrusion_channel_recess(type) = type[11]; //! Channel recess width and depth or false in none
function extrusion_center_hole(type) = abs(extrusion_center_hole_wd(type)); //! Diameter of center hole or side if square
function extrusion_corner_hole(type) = abs(extrusion_corner_hole_wd(type)); //! Diameter of corner hole or side if square
function extrusion_center_square(type) = abs(extrusion_center_square_wd(type)); //! Size of center square or tube
module extrusion_cross_section(type, cornerHole) {
width = extrusion_width(type);
height = extrusion_height(type);
centerSquare = extrusion_center_square(type);
tabThickness = extrusion_tab_thickness(type);
sparThickness = extrusion_spar_thickness(type);
channelWidth = extrusion_channel_width(type);
recess = extrusion_channel_recess(type);
cornerSquare = (width - extrusion_channel_width_internal(type)) / 2;
module squircle(d) // Draw a square if positive else a circle
if(d > 0)
square([d, d], center = true);
else
if(d < 0)
circle(d = -d);
module extrusion_corner(type, cornerHole) {
width = extrusion_width(type);
tabThickness = extrusion_tab_thickness(type);
sparThickness = extrusion_spar_thickness(type);
centerSquare = extrusion_center_square(type);
channelWidth = extrusion_channel_width(type);
fillet = extrusion_fillet(type);
cornerSize = (width-channelWidth)/2;
cornerSquare = (width-extrusion_channel_width_internal(type))/2;
cornerHoleDiameter = extrusion_corner_hole(type);
cornerSize = (width - channelWidth) / 2;
cornerHoleDiameter = abs(extrusion_corner_hole(type));
translate([-width/2,-width/2]) {
translate([-width / 2, -width / 2]) {
difference() {
union() {
translate([fillet,0])
square([cornerSize-fillet,tabThickness]);
translate([0,fillet])
square([tabThickness,cornerSize-fillet]);
translate([fillet,fillet])
translate([fillet, 0])
square([cornerSize - fillet, tabThickness]);
translate([0, fillet])
square([tabThickness, cornerSize - fillet]);
translate([fillet, fillet])
circle(fillet);
translate([fillet,fillet])
square([cornerSquare-fillet,cornerSquare-fillet]);
translate([fillet, fillet])
square([cornerSquare - fillet, cornerSquare - fillet]);
}
if(cornerHole && cornerHoleDiameter > 0)
translate([cornerSquare/2,cornerSquare/2])
circle(d=cornerHoleDiameter);
}
if(cornerHole)
translate([cornerSquare / 2, cornerSquare / 2])
squircle(extrusion_corner_hole_wd(type));
}
}
rotate(-135) translate([centerSquare/2,-sparThickness/2]) square([sqrt(2)*(width-centerSquare-cornerSquare)/2,sparThickness]);
}
module extrusion_center_section(type) {
width = extrusion_width(type);
tabThickness = extrusion_tab_thickness(type);
sparThickness = extrusion_spar_thickness(type);
centerSquare = extrusion_center_square(type);
channelWidth = extrusion_channel_width(type);
for(side = [-1, 1]) {
translate([side * (width / 2 - tabThickness / 2), 0])
square([tabThickness, width - channelWidth], center = true);
translate([0,width/2])
for(angle=[225,315])
rotate(angle)
translate([centerSquare/2,-sparThickness/2])
square([sqrt(2)*(width-centerSquare)/2,sparThickness]);
translate([0,-width/2])
for(angle=[45,135])
rotate(angle)
translate([centerSquare/2,-sparThickness/2])
square([sqrt(2)*(width-centerSquare)/2,sparThickness]);
centerHeight = width-channelWidth;
translate([-width/2,-centerHeight/2])
square([tabThickness,centerHeight]);
translate([width/2-tabThickness,-centerHeight/2])
square([tabThickness,centerHeight]);
l = cornerSquare + sparThickness * tan(22.5) - sparThickness / sqrt(2);
for(end = [-1, 1])
translate([side * (width / 2 - l / 2), end * (cornerSquare - sparThickness / 2)])
square([l, sparThickness], center = true);
}
}
centerSquare = extrusion_center_square(type);
count = height / width - 1;
width = extrusion_width(type);
height = extrusion_height(type);
count = (height-width)/width;
difference() {
union() {
for(i = [0 : count])
translate([0, i * width + (width - height) / 2]) {
difference() {
union() {
squircle(extrusion_center_square_wd(type));
for(i=[0:count])
translate([0,i*width+(width-height)/2])
difference() {
square([centerSquare,centerSquare],center=true);
if(extrusion_center_hole(type)>0)
circle(d=extrusion_center_hole(type));
}
translate([0,(width-height)/2])
for(angle=[0,90])
rotate(angle)
extrusion_corner(type, cornerHole);
translate([0,-(width-height)/2])
for(angle=[180,270])
rotate(angle)
extrusion_corner(type, cornerHole);
if(count>=1)
for(i=[1:count])
translate([0,i*width-height/2])
extrusion_center_section(type);
for(j = [0 : 3])
rotate(45 + 90 * j)
translate([centerSquare / 2 - sparThickness / 2, -sparThickness / 2])
square([width / sqrt(2) - cornerSquare * sqrt(2) - centerSquare / 2 + sparThickness *(1 + tan(22.5)), sparThickness]);
}
squircle(d = extrusion_center_hole_wd(type));
}
}
for(side = [-1, 1])
translate([0, side * (width - height) / 2])
for(angle = [0, 90])
rotate(angle + (side < 0 ? 180 : 0))
extrusion_corner(type, cornerHole);
if(count >= 1)
for(i = [1 : count])
translate([0, i * width - height / 2])
extrusion_center_section(type);
}
if(recess)
for(i = [0 : count], j = [0 : 3])
translate([0, i * width + (width - height) / 2])
rotate(j * 90)
translate([width / 2, 0])
square([recess.y * 2, recess.x], center = true);
}
}
module extrusion(type, length, center = true, cornerHole = false) { //! Draw the specified extrusion

View File

@@ -20,44 +20,65 @@
//! Brackets for joining extrusions at a corner.
include <../core.scad>
use <extrusion.scad>
function extrusion_inner_corner_bracket_size(type) = type[1]; //! Size of inner bracket
function extrusion_inner_corner_bracket_size(type) = type[1]; //! Size of inner bracket
function extrusion_inner_corner_bracket_tnut(type) = type[2]; //! The sliding t-nut it is based on
function extrusion_inner_corner_bracket_extrusion(type) = type[3]; //! Default extrusion this bracket is for
function extrusion_inner_corner_bracket_screw_offsets(type) = type[4]; //! Screw offsets from the ends
module extrusion_inner_corner_bracket(type, grub_screws = true) { //! Inner corner bracket for extrusion
vitamin(str("extrusion_inner_corner_bracket(", type[0], ", ", grub_screws, "): Extrusion inner corner bracket ", type[1].z));
module extrusion_inner_corner_bracket(type, grub_screws = true, backwards = false, extrusion = undef) { //! Inner corner bracket for extrusion
extrusion = is_undef(extrusion) ? extrusion_inner_corner_bracket_extrusion(type) : extrusion;
vitamin(str("extrusion_inner_corner_bracket(", type[0], "): Extrusion inner corner bracket for ", extrusion[0]));
size = extrusion_inner_corner_bracket_size(type);
armLength = size.x;
tnut = extrusion_inner_corner_bracket_tnut(type);
screw_offsets = extrusion_inner_corner_bracket_screw_offsets(type);
bottomTabOffset = 4;
topTabOffset = 10;
sizeBottom = [armLength - bottomTabOffset, 6, size.z];
sizeTop = [armLength - topTabOffset, 6, size.z];
tabSizeY1 = 10;
tabSizeY2 = 6;
tabSizeZ = 3.25;
holeRadius = M4_tap_radius;
sizeBottom = [size.y - bottomTabOffset, nut_square_width(tnut), size.z];
sizeTop = [size.x - topTabOffset, nut_square_width(tnut), size.z];
tab = t_nut_tab(tnut);
tabSizeZ = nut_thickness(tnut);
screw = find_screw(hs_grub, nut_size(tnut));
holeRadius = screw_pilot_hole(screw);
depth = (extrusion_width(extrusion) - extrusion_center_square(extrusion)) / 2;
translate([-size.z - 0.75, -size.z - 0.75, 0])
offset = extrusion_tab_thickness(extrusion) + tabSizeZ;
offset2 = extrusion_tab_thickness(extrusion) - nut_thickness(tnut, true) + nut_thickness(tnut);
translate([backwards ? offset2 : -offset, -offset])
rotate([-90, 0, 0]) {
color("silver") {
translate([(armLength + bottomTabOffset) / 2, 0, tabSizeZ])
translate([(size.y + bottomTabOffset) / 2, 0, tabSizeZ])
rotate([0, 180, 0])
extrusionSlidingNut(sizeBottom, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, (bottomTabOffset - armLength) / 2 + 5);
translate([tabSizeZ, 0, (armLength + topTabOffset) / 2])
extrusionSlidingNut(sizeBottom, tab[0], tab[1], tabSizeZ, holeRadius, (bottomTabOffset - size.y) / 2 + screw_offsets.y);
translate([tabSizeZ, 0, (size.x + topTabOffset) / 2])
rotate([0, -90, 0])
extrusionSlidingNut(sizeTop, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius,-(topTabOffset - armLength) / 2 - 5);
translate([0, -size.z / 2, 0]) {
cube([bottomTabOffset, size.z, size.z]);
cube([size.z, size.z, topTabOffset]);
extrusionSlidingNut(sizeTop, tab[0], tab[0], tabSizeZ, holeRadius, -(topTabOffset - size.x) / 2 - screw_offsets.x);
translate([0, -tab[1] / 2]) {
cube([bottomTabOffset, tab[1], size.z]);
cube([size.z, tab[1], topTabOffset]);
}
}
if(grub_screws)
not_on_bom() no_explode() {
grubScrewLength = 6;
for(angle = [[0, 0, 0], [0, -90, 180]])
rotate(angle)
translate([armLength - 5, 0, size.z])
screw(M3_grub_screw, grubScrewLength);
screw_len = screw_shorter_than(depth);
gap = depth - screw_len;
screw_z = offset - gap;
rotate([0, -90, 180])
if(backwards)
translate([size.x - screw_offsets.x, 0, -offset2 + gap])
vflip()
screw(screw, screw_len);
else
translate([size.x - screw_offsets.x, 0, screw_z])
screw(screw, screw_len);
translate([size.y - screw_offsets.y, 0, screw_z])
screw(screw, screw_len);
}
}
}
@@ -66,24 +87,29 @@ function extrusion_corner_bracket_size(type) = type[1]; //! Size of
function extrusion_corner_bracket_base_thickness(type) = type[2]; //! Thickness of base of bracket
function extrusion_corner_bracket_side_thickness(type) = type[3]; //! Thickness of side of bracket
function extrusion_corner_bracket_hole_offset(type) = type[4]; //! Hole offset from corner
function extrusion_corner_bracket_tnut(type) = type[5]; //! The sliding t-nut to use in the assembly
function extrusion_corner_bracket_extrusion(type) = type[6]; //! Default extrusion this bracket is for
module extrusion_corner_bracket(type) { //! Corner bracket for extrusion
vitamin(str("extrusion_corner_bracket(", type[0], "): Extrusion corner bracket ", type[1].z));
vitamin(str("extrusion_corner_bracket(", type[0], "): Extrusion corner bracket ", type[1].z, "mm for ", extrusion_corner_bracket_extrusion(type)[0]));
eSize = extrusion_corner_bracket_size(type).z;
cbSize = extrusion_corner_bracket_size(type).x;
baseThickness = extrusion_corner_bracket_base_thickness(type);
hole_r = screw_clearance_radius(find_screw(hs_cap, nut_size(extrusion_corner_bracket_tnut(type))));
module base() {
linear_extrude(baseThickness)
difference() {
translate([0, -eSize / 2, 0])
translate([0, -eSize / 2])
square([cbSize, eSize]);
hull() {
translate([extrusion_corner_bracket_hole_offset(type) + 1.5, 0, 0])
circle(r = M5_clearance_radius);
translate([extrusion_corner_bracket_hole_offset(type) - 1.5, 0, 0])
circle(r = M5_clearance_radius);
translate([extrusion_corner_bracket_hole_offset(type) + 1.5, 0])
circle(hole_r);
translate([extrusion_corner_bracket_hole_offset(type) - 1.5, 0])
circle(hole_r);
}
}
}
@@ -91,9 +117,11 @@ module extrusion_corner_bracket(type) { //! Corner bracket for extrusion
color("silver") {
rotate([90, 0, 90])
base();
translate([0, baseThickness, 0])
translate([0, baseThickness])
rotate([90, 0, 0])
base();
sideThickness = extrusion_corner_bracket_side_thickness(type);
for(z = [-eSize / 2, eSize / 2 - sideThickness]) {
translate_z(z) {
@@ -112,25 +140,31 @@ module extrusion_corner_bracket_hole_positions(type) { //! Place children at hol
children();
}
module extrusion_corner_bracket_assembly(type, part_thickness = 2, screw_type = M4_cap_screw, nut_type = M4_sliding_t_nut, max_screw_depth = 6) { //! Assembly with fasteners in place
module extrusion_corner_bracket_assembly(type, part_thickness = undef, screw_type = undef, nut_type = undef, max_screw_depth = undef, extrusion = undef) { //! Assembly with fasteners in place
extrusion_corner_bracket(type);
extrusion = is_undef(extrusion) ? extrusion_corner_bracket_extrusion(type) : extrusion;
screw_washer_thickness = washer_thickness(screw_washer(screw_type));
nut_washer_type = nut_washer(nut_type);
nut = is_undef(nut_type) ? extrusion_corner_bracket_tnut(type) : nut_type;
screw = is_undef(screw_type) ? find_screw(hs_cap, nut_size(nut)) : screw_type;
thickness = is_undef(part_thickness) ? extrusion_tab_thickness(extrusion) : part_thickness;
depth = is_undef(max_screw_depth) ? (extrusion_width(extrusion) - extrusion_center_square(extrusion)) / 2 - eps : max_screw_depth;
screw_washer_thickness = washer_thickness(screw_washer(screw));
nut_washer_type = nut_washer(nut);
nut_washer_thickness = nut_washer_type ? washer_thickness(nut_washer_type) : 0;
nut_offset = extrusion_corner_bracket_base_thickness(type) + part_thickness;
screw_length = max_screw_depth ? screw_shorter_than(extrusion_corner_bracket_base_thickness(type) + screw_washer_thickness + max_screw_depth)
: screw_longer_than(nut_offset + screw_washer_thickness + nut_washer_thickness + nut_thickness(nut_type));
nut_offset = extrusion_corner_bracket_base_thickness(type) + thickness;
screw_length = depth ? screw_shorter_than(extrusion_corner_bracket_base_thickness(type) + screw_washer_thickness + depth)
: screw_longer_than(nut_offset + screw_washer_thickness + nut_washer_thickness + nut_thickness(nut));
extrusion_corner_bracket_hole_positions(type) {
screw_and_washer(screw_type, screw_length);
screw_and_washer(screw, screw_length);
translate_z(-nut_offset)
vflip()
if(nut_washer_type)
nut_and_washer(nut_type);
nut_and_washer(nut);
else
rotate(90)
sliding_t_nut(nut_type);
sliding_t_nut(nut);
}
}

View File

@@ -20,10 +20,11 @@
// Extrusion brackets
//
E20_inner_corner_bracket = [ "E20_inner_corner_bracket", [25, 25, 4.5] ];
E20_inner_corner_bracket = [ "E20_inner_corner_bracket", [26, 25, 4.7], M4_sliding_t_nut, E2020t, [7, 6]];
E40_inner_corner_bracket = [ "E40_inner_corner_bracket", [38, 31, 8.5], M6_sliding_t_nut, E4040t, [13, 10]];
E20_corner_bracket = [ "E20_corner_bracket", [28, 28, 20], 2, 3, 19.5];
E20_corner_bracket = [ "E20_corner_bracket", [28, 28, 20], 2, 3, 19.5, M4_sliding_t_nut, E2020t];
E40_corner_bracket = [ "E40_corner_bracket", [40, 40, 35], 2, 3, 19.5, M8_sliding_ball_t_nut, E4040t];
use <extrusion_bracket.scad>

View File

@@ -19,18 +19,19 @@
//
// Extrusion
//
// W H d1 d2 s cw cwi t st f
E1515 = [ "E1515", 15, 15, 2.5, 0,5.7,3.4, 5.7, 1.1,1.1, 0.5 ];
E2020 = [ "E2020", 20, 20, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
E2040 = [ "E2040", 20, 40, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
E2060 = [ "E2060", 20, 60, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
E2080 = [ "E2080", 20, 80, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
E3030 = [ "E3030", 30, 30, 6.8, 4.2, 12, 8, 16.5, 2, 2, 1 ];
E3060 = [ "E3060", 30, 60, 6.8, 4.2, 12, 8, 16.5, 2, 2, 1 ];
E4040 = [ "E4040", 40, 40, 10.5, 6.0, 15, 10, 20.0, 5.5, 3, 1 ];
E4080 = [ "E4080", 40, 80, 10.5, 6.0, 15, 10, 20.0, 5.5, 3, 1 ];
// W H d1 d2 sq cw cwi t st f recess
E1515 = [ "E1515", 15, 15, -2.5, 0, 5.7, 3.4, 5.7, 1.1, 1.1, 0.5, false ];
E2020 = [ "E2020", 20, 20, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
E2020t = [ "E2020t",20, 20, -5.0, -3, 7.8, 6.2, 11.0, 1.8, 1.5, 1.5, [7.2, 0.5] ];
E2040 = [ "E2040", 20, 40, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
E2060 = [ "E2060", 20, 60, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
E2080 = [ "E2080", 20, 80, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
E3030 = [ "E3030", 30, 30, -6.8, -4.2, 12, 8, 16.5, 2, 2, 1, false ];
E3060 = [ "E3060", 30, 60, -6.8, -4.2, 12, 8, 16.5, 2, 2, 1, false ];
E4040 = [ "E4040", 40, 40, -10.5, -6.0, 15, 10, 20.0, 5.5, 3, 1, false ];
E4040t = [ "E4040t",40, 40, -10, 6.8, -16, 10, 20.0, 4.0, 2.4, 1.5, [12, 1] ];
E4080 = [ "E4080", 40, 80, -10.5, -6.0, 15, 10, 20.0, 5.5, 3, 1, false ];
extrusions = [E1515,E2020,E2040,E2060,E2080,E3030,E3060,E4040,E4080];
extrusions = [E1515, [E2020t, E2020], E2040, E2060, E2080, E3030, E3060, [E4040t, E4040], E4080];
use <extrusion.scad>

View File

@@ -87,7 +87,8 @@ module jack_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm jack
}
}
function jack_4mm_shielded_hole_radius() = 12/2; //! Panel hole radius for 4mm shielded jack
function jack_4mm_shielded_hole_radius() = 12 / 2; //! Panel hole radius for 4mm shielded jack
function jack_4mm_shielded_nut_radius() = 14.4 / 2; //! Largest diameter of 4mm shielded jack
module jack_4mm_shielded(colour, thickness, display_colour = false) { //! Draw a 4mm shielded jack
vitamin(str("jack_4mm_shielded(\"", colour, "\", 3", arg(display_colour, false), "): 4mm shielded jack socket ", colour));

View File

@@ -36,12 +36,17 @@ function leadnut_hole_pitch(type) = type[10]; //! The radial pitch of the
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
function leadnut_flat(type) = type[14]; //! Flat section width
function leadnut_colour(type) = type[15]; //! The colour
function leadnut_shank(type) = leadnut_height(type) - leadnut_flange_t(type) - leadnut_flange_offset(type); //! The length of the shank below the flange
module leadnut_screw_positions(type) { //! Position children at the screw holes
holes = leadnut_holes(type);
for(i = [0 : holes - 1], a = i * 360 / holes + 180)
flat = leadnut_flat(type);
angles = flat ? [let(h = holes / 2, a = 90 / (h - 1)) for(i = [0 : h - 1], side = [-1, 1]) side * (45 + i * a)]
: [for(i = [0 : holes - 1]) i * 360 / holes + 180];
for(a = angles)
rotate(a)
translate([leadnut_hole_pitch(type), 0, leadnut_flange_t(type)])
rotate(45)
@@ -55,8 +60,10 @@ module leadnut(type) { //! Draw specified leadnut
h = leadnut_height(type);
pitch = leadnut_pitch(type);
lead = leadnut_lead(type);
flat = leadnut_flat(type);
flange_d = leadnut_flange_dia(type);
color("dimgrey") vflip()
color(leadnut_colour(type)) vflip()
translate_z(-leadnut_flange_offset(type) - leadnut_flange_t(type)) {
tube(or = leadnut_od(type) / 2, ir = bore_r, h = h, center = false);
@@ -66,12 +73,17 @@ module leadnut(type) { //! Draw specified leadnut
translate_z(leadnut_flange_offset(type))
linear_extrude(leadnut_flange_t(type))
difference() {
circle(d = leadnut_flange_dia(type));
circle(d = flange_d);
circle(bore_r);
leadnut_screw_positions(type)
circle(d = leadnut_hole_dia(type));
if(flat)
for(side = [-1, 1])
translate([side * flange_d / 2, 0])
square([flange_d - flat, flange_d], center = true);
}
}
}

View File

@@ -16,10 +16,18 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
// b s h f f f h h h s p l f c
// o h e l l l o o o c i e l o
// r a i a a a l l l r t a a l
// e n g n n n e e e e c d t o
// k h g g g s w h u
// t e e e d p r
//
// d t o
LSN8x2 = ["LSN8x2", "Leadscrew nut 8 x 2", 8, 10.2, 15, 22, 3.5, 1.5, 4, 3.5, 8, M3_cap_screw, 2, 2, 0, "dimgrey"];
LSN8x8 = ["LSN8x8", "Leadscrew nut 8 x 8 RobotDigg", 8, 12.75,19, 25.4, 4.1, 0, 3, 3.5, 19.05/2, M3_cap_screw, 2, 8, 0, "dimgrey"];
SFU1610 = ["SFU1610", "Leadscrew nut for SFU1610", 16, 28, 42.5, 48, 10, 0, 6, 6, 38/2, M6_cap_screw, 5, 10, 40, "#DFDAC5"];
LSN8x2 = ["LSN8x2", "Leadscrew nut 8 x 2", 8, 10.2, 15, 22, 3.5, 1.5, 4, 3.5, 8, M3_cap_screw, 2, 2];
LSN8x8 = ["LSN8x8", "Leadscrew nut 8 x 8 RobotDigg",8, 12.75,19, 25.4, 4.1, 0, 3, 3.5, 19.05/2, M3_cap_screw, 2, 8];
leadnuts = [LSN8x2, LSN8x8];
leadnuts = [LSN8x2, LSN8x8, SFU1610];
use <leadnut.scad>

View File

@@ -21,7 +21,7 @@
//! 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.
//

View File

@@ -116,7 +116,7 @@ module wingnut(type) { //! Draw a wingnut
polygon([
[hole_rad, 0],
[bottom_rad, 0],
[top_rad,, thickness],
[top_rad, thickness],
[hole_rad, thickness]
]);
for(rot = [0, 180])
@@ -137,18 +137,61 @@ module wingnut(type) { //! Draw a wingnut
}
}
module sliding_t_nut(type) {
hammerNut = type[10];
vitamin(str("sliding_t_nut(", type[0], "): Nut M", nut_size(type), hammerNut ? " hammer" : " sliding T"));
function t_nut_tab(type) = [type[8], type[9]]; //! Sliding t-nut T dimensions
size = [type[7], type[2], nut_thickness(type, true)];
tabSizeY1 = type[8];
tabSizeY2 = type[9];
module sliding_ball_t_nut(size, w, h, r) {
rad = 0.5;
stem = size.z - h;
ball_d = 4;
offset = 12;
module shape()
rotate([90, 0, 90])
translate_z(-offset)
linear_extrude(size.x) {
hull() {
translate([0, h - size.y / 2])
semi_circle(d = size.y);
for(side = [-1, 1])
translate([side * (w / 2 - rad), rad])
circle(rad);
}
rounded_square([size.y, stem * 2], rad / 2, true);
}
render() difference() {
shape();
cylinder(r = r, h = 100, center = true);
}
translate([-offset + ball_d, 0, h - 0.4])
sphere(d = ball_d);
if(show_threads)
render() intersection() {
translate_z(-stem)
female_metric_thread(2 * r, metric_coarse_pitch(2 * r), size.z - 2, center = false);
shape();
}
}
module sliding_t_nut(type) { //! Draw a sliding T nut, T nut with a spring loaded ball or a hammer nut.
hammerNut = type[10];
size = [type[7], nut_square_width(type), nut_thickness(type, true)];
tab = t_nut_tab(type);
tabSizeZ = nut_thickness(type);
holeRadius = nut_size(type) / 2;
vitamin(str("sliding_t_nut(", type[0], "): Nut M", nut_size(type), hammerNut ? " hammer" : " sliding T", !tab[1] ? " with spring loaded ball" : ""));
color(grey(80))
extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, 0, hammerNut);
if(!tab[1])
sliding_ball_t_nut(size, tab[0], tabSizeZ, holeRadius);
else
extrusionSlidingNut(size, tab[0], tab[1], tabSizeZ, holeRadius, 0, hammerNut);
}
module extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, holeOffset = 0, hammerNut = false) {
@@ -171,7 +214,7 @@ module extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, hol
}
linear_extrude(tabSizeZ)
difference() {
square([size.x, tabSizeY2], center = true);
square([size.x, tabSizeY1 == tabSizeY2 ? size.y : tabSizeY2], center = true);
if(holeRadius)
translate([holeOffset, 0])
circle(holeRadius);
@@ -183,15 +226,28 @@ module extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, hol
female_metric_thread(thread_d, metric_coarse_pitch(thread_d), size.z, center = false);
// add the side tabs
tab_h = size.z - 2 * stem_h;
chamfer =tab_h / 4;
for(m = [0, 1])
mirror([0, m, 0])
translate([0, tabSizeY2 / 2]) {
cubeZ = 1;
translate([-size.x / 2, 0])
if(tabSizeY1 == tabSizeY2)
translate([-size.x / 2, size.y / 2])
hull() {
cube([size.x, (tabSizeY1 - size.y) / 2 - chamfer, tab_h]);
translate_z(chamfer)
cube([size.x, (tabSizeY1 - size.y) / 2,tab_h - 2 * chamfer]);
}
else {
dy = (tabSizeY1 - tabSizeY2) / 2;
cubeZ = tabSizeZ - dy;
translate([-size.x / 2, tabSizeY2 / 2])
cube([size.x, (tabSizeY1 - tabSizeY2) / 2, cubeZ]);
translate_z(cubeZ)
translate([0, tabSizeY2 / 2, cubeZ])
rotate([0, -90, 0])
right_triangle(tabSizeZ - cubeZ, (tabSizeY1 - tabSizeY2) / 2, size.x, center = true);
right_triangle(tabSizeZ - cubeZ, dy, size.x, center = true);
}
}

View File

@@ -52,8 +52,12 @@ toggle_nut = ["toggle_nut", 6.1, 9.2, 1.5, 1.5, M6_washer, 1.5,
M4_wingnut = ["M4_wingnut", 4, 10, 3.75,8, M4_washer, 0, 22, 10, 6, 3];
// sx ty1 ty2 hammer
M3_sliding_t_nut = ["M3_sliding_t_nut", 3, 6, 3.0, 4.0, false, 0, 10, 10, 6, false];
M4_sliding_t_nut = ["M4_sliding_t_nut", 4, 6, 3.25,4.5, false, 0, 11, 10, 6, false];
M5_sliding_t_nut = ["M5_sliding_t_nut", 5, 6, 3.25,4.5, false, 0, 11, 10, 7, false];
M4_sliding_t_nut = ["M4_sliding_t_nut", 4, 6, 3.7, 4.7, false, 0, 11, 10, 6, false];
M5_sliding_t_nut = ["M5_sliding_t_nut", 5, 6, 3.7, 4.7, false, 0, 11, 10, 7, false];
M6_sliding_t_nut = ["M6_sliding_t_nut", 6, 8, 6.6, 8.5, false, 0, 16, 18.6,8,2, false];
M8_sliding_ball_t_nut = ["M8_sliding_ball_t_nut",
8, 8, 6.7, 7.6, false, 0, 22, 13.5, 0, false];
M3_hammer_nut = ["M3_hammer_nut", 3, 6, 2.75,4.0, false, 0, 5.5, 10, 6, true];
M4_hammer_nut = ["M4_hammer_nut", 4, 6, 3.25,4.5, false, 0, 5.5, 10, 6, true];

View File

@@ -18,9 +18,9 @@
//
//
//! 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.
//
include <../utils/core/core.scad>
use <../utils/thread.scad>

View File

@@ -23,7 +23,7 @@
//! 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.
//
include <../utils/core/core.scad>

View File

@@ -27,6 +27,7 @@ include <buttons.scad>
include <green_terminals.scad>
include <pin_headers.scad>
use <microswitch.scad>
use <7_segment.scad>
use <../utils/rounded_cylinder.scad>
use <../utils/dogbones.scad>
@@ -37,6 +38,7 @@ use <led.scad>
use <dip.scad>
use <axial.scad>
use <smd.scad>
include <potentiometers.scad>
function pcb_name(type) = type[1]; //! Description
function pcb_length(type) = type[2]; //! Length
@@ -45,12 +47,12 @@ function pcb_thickness(type) = type[4]; //! Thickness
function pcb_radius(type) = type[5]; //! Corner radius
function pcb_hole_d(type) = type[6]; //! Mounting hole diameter
function pcb_land_d(type) = type[7]; //! Pad around mounting hole
function pcb_colour(type) = type[8]; //! Colour of the subtrate
function pcb_colour(type) = type[8]; //! Colour of the substrate
function pcb_parts_on_bom(type) = type[9]; //! True if the parts should be separate BOM items
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
@@ -58,10 +60,11 @@ function pcb_size(type) = [pcb_length(type), pcb_width(type), pcb_thickness(type
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,
-pcb_width(type) / 2 + pcb_grid(type).y + 2.54 * y, pcb_thickness(type) + z];
let(grid = pcb_grid(type))
[-pcb_size(type).x / 2 + grid.x + x * (is_undef(grid[5]) ? 2.54 : grid[5]),
-pcb_size(type).y / 2 + grid.y + y * (is_undef(grid[6]) ? 2.54 : grid[6]),
pcb_size(type).z + z];
module pcb_grid(type, x, y, z = 0) //! Positions children at specified grid position
translate(pcb_grid_pos(type, x, y, z))
@@ -72,7 +75,7 @@ function pcb_coord(type, p) = let(l = pcb_length(type), w = pcb_width(type)) //!
[(p.x >= 0 ? p.x : l + p.x) - l / 2,
(p.y >= 0 ? p.y : w + p.y) - w / 2];
module pcb_hole_positions(type, all = true) { // Positition children at the hole positions, including holes not used for screws
module pcb_hole_positions(type, all = true) { // Position children at the hole positions, including holes not used for screws
holes = pcb_holes(type);
for($i = [0 : 1 : len(holes) - 1]) {
@@ -86,10 +89,13 @@ module pcb_hole_positions(type, all = true) { // Positition children at the hole
module pcb_screw_positions(type) //! Positions children at the mounting hole positions
pcb_hole_positions(type, false) children();
module chip(length, width, thickness, colour, cutout = false) //! Draw a coloured cube to represent a chip, or other rectangular component
module chip(length, width, thickness, colour, cutout = false) //! Draw a coloured cube to represent a chip, or other rectangular component, or cylinder if width is zero
if(!cutout)
color(colour)
translate_z(thickness / 2) cube([length, width, thickness], center = true);
if(width)
translate_z(thickness / 2) cube([length, width, thickness], center = true);
else
cylinder(d = length, h = thickness);
module usb_A_tongue() {
l = 9;
@@ -161,7 +167,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;
@@ -221,6 +227,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;
@@ -303,31 +366,11 @@ module jack(cutout = false) { //! Draw 3.5mm jack
module buzzer(height, diameter, colour) { //! Draw PCB buzzer with specified height, diameter and colour
color (colour)
tube(or = diameter / 2, ir = height > 5 ? 1 : 0.75, h = height, center = false);
color("white")
cylinder(d = 2, h = max(height - 3 , 0.5));
}
module potentiometer(h1, h2) {
color("silver") {
baseSize = [12, 11, 6];
translate_z(baseSize.z / 2)
cube(baseSize, center = true);
translate_z(baseSize.z) {
cylinder(d = 5, h = h1 - 0.5);
if (show_threads)
male_metric_thread(6, metric_coarse_pitch(5), length = h1 - 0.5, center = false);
}
translate_z(baseSize.z + h1 - 0.5)
cylinder(d = 3, h = 0.5);
translate_z(baseSize.z + h1)
linear_extrude(h2)
difference() {
circle(d=5);
square([0.75,5], center = true);
}
}
}
function hdmi_depth(type) = type[2]; //! Front to back depth
function hdmi_width1(type) = type[3]; //! Inside width at the top
function hdmi_width2(type) = type[4]; //! Inside width at the bottom
@@ -816,7 +859,7 @@ module terminal_35(ways, colour = "blue") { //! Draw 3.5mm terminal block
single();
}
module molex_254(ways) { //! Draw molex header
module molex_254(ways, right_angle = 0, skip = undef) { //! Draw molex header, set `right_angle` to 1 for normal right angle version or -1 for inverted right angle version.
vitamin(str("molex_254(", ways, "): Molex KK header ", ways, " way"));
pitch = 2.54;
width = ways * pitch - 0.1;
@@ -826,20 +869,66 @@ module molex_254(ways) { //! Draw molex header
back = 1;
below = 2.3;
above = 9;
pin_w = 0.64;
r = 1;
a = right_angle ? width / 2 - r - pin_w / 2 : above;
ra_offset = 2.72;
color("white")
union() {
translate([ -depth / 2, -width / 2,])
cube([depth, width, base]);
translate(right_angle ? [-ra_offset, 0, depth / 2] : [ 0, 0, 0])
rotate(right_angle ? right_angle > 0 ? [180, 90, 0] : [0, -90, 0] : [ 0, 0, 0])
union() {
translate([ -depth / 2, -width / 2,])
cube([depth, width, base]);
w = width - pitch;
translate([- depth / 2, -w / 2])
cube([back, w, height]);
}
w = width - pitch;
translate([- depth / 2, -w / 2])
cube([back, w, height]);
}
color("silver")
for(i = [0: ways -1])
translate([0, i * pitch - width / 2 + pitch / 2, (above + below) / 2 - below])
cube([0.44, 0.75, above + below], center = true);
for(i = [0 : ways -1])
if(is_undef(skip) || !in(skip, i))
translate([0, i * pitch - width / 2 + pitch / 2]) {
translate_z((a + below) / 2 - below)
cube([pin_w, pin_w, a + below], center = true);
l = above + ra_offset - r - pin_w / 2;
if(right_angle) {
translate([-l / 2 - r - pin_w / 2, 0, width / 2])
cube([l, pin_w, pin_w], center = true);
translate([-r - pin_w / 2, 0, a])
rotate([90, 0, 0])
rotate_extrude(angle = 90)
translate([r + pin_w / 2, 0])
square(pin_w, true);
}
}
}
module vero_pin(cropped = false) { //! Draw a vero pin
vitamin("vero_pin(): Vero board pin");
l = cropped ? 7.5 : 10;
d = 1.03;
spline_d = 1.23;
spline_h = 1.3;
collar_d = 1.72;
collar_h = 0.65;
above = 3.6;
splines = 6;
spline_w = 0.3;
color(silver) {
translate_z(-l + above + collar_h)
cylinder(d = d, h = l, $fn = 32);
cylinder(d = collar_d, h = collar_h);
for(i = [0 : splines - 1])
rotate(360 * i / splines)
translate([d / 2, 0, -spline_h])
rounded_rectangle([spline_d - d, spline_w, spline_h], spline_w / 4, center = false);
}
}
module standoff(h, d, h2, d2) { //! Draw a standoff
@@ -919,6 +1008,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);
@@ -938,7 +1028,9 @@ 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, "7seg")) let(z = param(6, 0)) translate_z(z) 7_segment_digits(comp[4], comp[5], pin_length = z + 3, cutout = cutouts);
if(show(comp, "block")) block(size = [comp[4], comp[5], comp[6]], colour = comp[7], makes_cutout = param(8));
if(!cutouts) {
// Components that don't have a cutout parameter go in this section
@@ -954,16 +1046,19 @@ 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, "molex_hdr")) molex_254(comp[4], param(5, 0), param(6, undef));
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, "potentiometer")) potentiometer(param(4, 5), param(5, 9));
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")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
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]);
if(show(comp, "vero_pin")) vero_pin(param(4, false));
}
}
}
@@ -1001,6 +1096,19 @@ module pcb_components(type, cutouts = false, angle = undef) { //! Draw list of P
}
}
module pcb_grid_components(type, components, cutouts = false, angle = undef) //! Draw list of components on the PCB grid for perf board
for(comp = components) {
p = pcb_grid_pos(type, comp.x, comp.y);
if(comp[3][0] == "-")
translate([p.x, p.y])
vflip()
pcb_component(comp, cutouts, angle);
else
translate([p.x, p.y, pcb_thickness(type)])
pcb_component(comp, cutouts, angle);
}
module pcb_cutouts(type, angle = undef) pcb_components(type, true, angle); //! Make cut outs to clear components on a PCB
module pcb_grid_positions(type) {
@@ -1018,44 +1126,65 @@ 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);
plating_colour = is_undef(grid[4]) ? ((pcb_colour == "green" || pcb_colour == "#2140BE") ? silver : pcb_colour == "sienna" ? copper : gold) : grid[4];
color(plating_colour)
translate_z(-plating)
linear_extrude(fr4 ? t + 2 * plating : plating)
if(Len(grid)) {
@@ -1065,7 +1194,7 @@ module pcb(type) { //! Draw specified PCB
circle(d = 1);
}
if(fr4 && len(grid) < 3) { // oval lands at the ends
if(fr4 && len(grid) < 3 && pcb_holes(type)) { // oval lands at the ends
screw_x = pcb_coord(type, pcb_holes(type)[0]).x;
y0 = pcb_grid(type).y;
rows = round((pcb_width(type) - 2 * y0) / inch(0.1));

View File

@@ -22,6 +22,8 @@ include <leds.scad>
include <axials.scad>
include <smds.scad>
include <green_terminals.scad>
include <7_segments.scad>
include <potentiometers.scad>
//
// l w t r h l c b h
@@ -555,6 +557,28 @@ RPI0 = ["RPI0", "Raspberry Pi Zero", 65, 30, 1.4, 3, 2.75, 6, "gre
[": Micro SD card"],
[32.5 - 9.5 * 2.54, 26.5 - 1.27, 20, 2]];
RPI_Pico = [
"RPI_Pico", "Raspberry Pi Pico",
51, 21, 1.6, // size
0.5, // corner radius
2.1, // mounting hole diameter
0, // pad around mounting hole, pad is actually 3.8, but unplated
"green", // colour
false, // true if parts should be separate BOM items
[ // hole positions
[-2, 4.8], [-2, -4.8], [2, -4.8], [2, 4.8]
],
[ // components
[ 1.75, 21/2, 180, "usb_uA" ],
[ 25, 21/2, 0, "chip", 7, 7, 0.8],
// mock up the reset button
[ 12.75, 7.5, 0, "block", 4.5, 3.35, 2, "DarkGray"],
[ 12.75, 7.5, 0, "block", 3, 2.25, 2.75, "LightGray"],
],
[], // accessories
[1.37, 1.61, 20, 2, gold, 2.54, 17.78], // 20x2 grid of holes
];
EnviroPlus = ["EnviroPlus", "Enviro+", 65, 30.6, 1.6, 3, 2.75, 6, "white", false, [[3.5, 3.8], [-3.5, 3.8], [-3.5, -3.8], [3.5, -3.8]],
[[32.5, -3.8, 0, "-2p54socket", 20, 2, false, 5, true],
[-15.5, 2.5, 0, "-chip", 15, 5, 3, "white"],
@@ -705,6 +729,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 +773,119 @@ 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
];
pcbs_not_shown = [Melzi, Duex2, PSU12V1A, Keyes5p1];
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"],
perfboards = [PERF74x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];
[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
];
ESP32_DOIT_V1 = let(l = 51.45, w = 28.33, pitch = inch(1), pins = 15, poffset = inch(0.05)) [
"ESP32_DOIT_V1", "ESP32 DOIT DEV KIT V1",
l, w, 1.6, // Size
2, // corner radius
3, // mounting hole diameter
0, // pad around mounting hole
grey(20), // color
false, // true if parts should be separate BOM items
[for(x = [-1, 1], y = [-1, 1]) [x * 46.7 / 2 + l / 2, y * 23.4 / 2 + w / 2, false]],
[ // components
[l / 2 + poffset, w / 2 - pitch / 2, 0, "-2p54joiner", pins, 1],
[l / 2 + poffset, w / 2 + pitch / 2, 0, "-2p54joiner", pins, 1],
[1.75, w / 2, 180, "usb_uA" ],
[35, w / 2, 0, "block", 17.7, 16, 3, silver], // can
for(y=[-1,1]) [3.5, y * 6.5, 0, "chip", 4, 3, 1.6, silver], // Mock button surround
for(y=[-1,1]) [3.5, y * 6.5, 0, "chip", 1.8,0, 2.0, grey(20)], // Mock buttons
for(y=[-1,1]) [21.6, y * 9, 0, "smd_led", LED0603, y < 0 ? "red" : "blue"],
[14.8 - 2.5, 8, 0, "chip", 5, 5, 0.8],
[l / 2 + poffset + inch(0.7), w / 2 + pitch / 2 - 2, 90, "smd_cap", CAP1206, 1.75],
],
[], // accessories
[(l - inch(pins - 1) / 10) / 2 + inch(0.05), (w - pitch) / 2, pins, 2, silver, 2.54, pitch], // 15x2 grid of holes
];
ArduinoNano = let(l = 43.18, w = 17.78, pitch = inch(0.6), pins = 15, poffset = -0.05, led_spacing = [1.5, 1.8]) [
"ArduinoNano", "Arduino Nano",
l, w, 1.6, // Size
0, // corner radius
1.85, // mounting hole diameter
0, // pad around mounting hole
"#2140BE", // color
false, // true if parts should be separate BOM items
[for(x = [-1, 1], y = [-1, 1]) [x * 40.64 / 2 + l / 2, y * 15.24 / 2 + w / 2]],
[ // components
[l / 2 + poffset, w / 2 - pitch / 2, 0, "-2p54joiner", pins, 1],
[l / 2 + poffset, w / 2 + pitch / 2, 0, "-2p54joiner", pins, 1],
[l / 2 + poffset + inch(0.75), w / 2, 0, "2p54header", 2, 3],
[1.75, w / 2, 180, "usb_uA" ],
[l / 2 - inch(0.25), w / 2, 45, "chip", 7, 7, 1.3],
[l / 2 + poffset + inch(0.15), w / 2, 0, "chip", 3.5, 6, 1.8, silver ], // mock button
[l / 2 + poffset + inch(0.15), w / 2, 0, "chip", 1.3, 2.6, 2.6, grey(90) ], // mock button
for(y = [-1.5 : 1.5]) [l / 2 + poffset + inch(0.4) - led_spacing.x, w / 2 + y * led_spacing.y, 0, "smd_res", RES0603, "1K"],
for(y = [-1.5 : 1.5]) [l / 2 + poffset + inch(0.4) + led_spacing.x, w / 2 + y * led_spacing.y, 0, "smd_led", LED0603, ["green", "red", "orange", "orange"][y + 1.5]],
],
[], // accessories
[(l - inch(pins - 1) / 10) / 2 + poffset, (w - pitch) / 2, pins, 2, silver, 2.54, pitch], // 15x2 grid of holes
];
KY_040 = ["KY_040", "KY_-040 rotart encoder breakout",
26.3, 19.5, 1.6, 0, 3, 0, grey(20), false,
[
[3.23 + 1.5, 1.3 + 1.5],
[3.23 + 1.5 + 16.775, 1.3 + 1.5]
],
[
[-3, 12, 90, "2p54header", 5, 1, undef, undef, true],
[10.8, 11.3, 0, "potentiometer", KY_040_encoder],
],
[]];
tiny_pcbs = [XIAO, MP1584EN, TP4056, ESP_01, LIPO_fuel_gauge];
pcbs = [RAMPSEndstop, KY_040, MT3608, ZC_A0591, ArduinoNano, RPI_Pico, ESP32_DOIT_V1, 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, PI_IO, ExtruderPCB];
perfboards = [PERF74x51, PERF70x51, PERF70x50, PERF60x40, PERF70x30, PERF80x20];
use <pcb.scad>

Some files were not shown because too many files have changed in this diff Show More