1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-05 21:02:51 +02:00

Compare commits

...

39 Commits

Author SHA1 Message Date
Chris Palmer
06a286dc98 Fixed missing BOM entry for JST connectors.
Fixed default colour for JST connectors.
Corrected BOM entry to show right angle options on Molex and pin headers.
2023-05-08 19:51:29 +01:00
Chris Palmer
f5496c373a Fixed typo in smd_diode(DO214AC) package name. 2023-05-08 19:42:05 +01:00
Chris Palmer
1c6d3d8e95 Updated changelog. 2023-05-01 12:22:10 +01:00
Chris Palmer
5e24a32a0b Added ESP32 camera. 2023-05-01 12:18:12 +01:00
Chris Palmer
fbd8d8c7cd Added smd_coax 2023-05-01 12:14:23 +01:00
Chris Palmer
c77b18ebc9 Updated changelog. 2023-04-29 09:23:57 +01:00
Chris Palmer
b1592f51d4 Fixed bom.py, views.py and tests.py so that vitamin descriptions can contain more than one colon. 2023-04-29 09:22:35 +01:00
Chris Palmer
deb0c14aa2 Updated changelog. 2023-04-23 20:33:27 +01:00
Chris Palmer
cc82cf2a6c Merge branch 'martinbudden-shoulder_screws' 2023-04-23 20:31:18 +01:00
Chris Palmer
61fc194995 Refactored for readability. 2023-04-23 20:30:12 +01:00
Chris Palmer
f8af61568a Updated images and readme. 2023-04-23 17:15:29 +01:00
Chris Palmer
05d16841c4 Fixed thread pitch. 2023-04-23 17:15:02 +01:00
Chris Palmer
61f1dcc509 Merge branch 'shoulder_screws' of https://github.com/martinbudden/NopSCADlib into martinbudden-shoulder_screws 2023-04-22 19:11:39 +01:00
Chris Palmer
5fc70e19ac Added SMD Tantalum caps and 0502 and 0402 resistor and capacitors. 2023-04-22 12:12:12 +01:00
Martin Budden
07e7eb77f7 Added support for shoulder screws. 2023-04-05 12:32:13 +01:00
Chris Palmer
1c5d9a8ef5 Removed utility functions used by invert() from documentation as not generally useful. 2023-03-29 13:21:26 +01:00
Chris Palmer
d3f0bfc17f Fixed typo in resistor comment. 2023-03-29 12:54:07 +01:00
Chris
81f3b084ab Updated changelog. 2023-03-11 18:38:38 +00:00
Chris
62bd2b5597 Merge branch 'dirkjankrijnders-master' 2023-03-11 18:35:11 +00:00
Chris
18cd33c663 Fixed typos, corrected vitamin call, added boilerplate, updated images and readme. 2023-03-11 17:50:16 +00:00
Chris
e899306a13 Merge branch 'master' of https://github.com/dirkjankrijnders/NopSCADlib into dirkjankrijnders-master 2023-03-11 14:10:22 +00:00
Dirkjan Krijnders
ebfb330ac6 Added comments and make holes a linear_extrude result 2023-03-11 15:00:10 +01:00
Chris
07da7d8dc7 Removed Python2.7 from usage.md as no longer works. 2023-03-11 13:57:23 +00:00
Chris
38b52d13ee Merge branch 'master' of https://github.com/dirkjankrijnders/NopSCADlib into dirkjankrijnders-master 2023-03-10 22:03:16 +00:00
Chris
5a3bbf967d Fixed broken cover image. 2023-03-10 22:02:00 +00:00
Chris
ddb2f16b99 Updated changlog. 2023-03-10 21:49:21 +00:00
Chris
9d4d5aba17 veroboard_assembly() renamed veroboard_fastened_assembly().
veroboard_assembly() now doesn't include the fasteners.
2023-03-10 21:24:42 +00:00
Chris
d939401183 Added vero_grid_pos() function. 2023-03-10 21:11:03 +00:00
Chris
584542f87a Added fastons. 2023-03-10 21:09:28 +00:00
Chris
62372a049b The wire() module can now draw wires if a path is specified. 2023-03-10 20:49:41 +00:00
Chris
14698e5203 Added PTFE heatshrink sleeving. 2023-03-10 17:25:26 +00:00
Chris
14f6bb533a Added sleeving_length to al_clad_resistor_assembly(). 2023-03-10 16:04:17 +00:00
Chris
01e9aae698 Added TO220_size() and TO220_lead_pos(i, l). 2023-03-10 15:46:57 +00:00
Dirkjan Krijnders
c5fab08a45 Added photo_interrupter to the test 2023-03-08 16:51:08 +01:00
Dirkjan Krijnders
fecc93746a Added vitamins for photo interrupters 2023-03-08 09:20:14 +01:00
Chris Palmer
27f9b242f2 Added crystal, transistors, diode and LEDs to Arduino Uno. 2023-02-04 00:09:16 +00:00
Chris Palmer
f07fda70cd Wire links can now be sleeved. 2023-02-03 10:02:53 +00:00
Chris Palmer
abf1f1ab3f PCB blocks can now have rounded edges for more realistic cans. 2023-02-01 18:31:33 +00:00
Chris Palmer
df06d1f57f Upated changelog. 2023-02-01 01:33:04 +00:00
52 changed files with 1212 additions and 200 deletions

View File

@@ -3,6 +3,78 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [v21.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.3.1...v21.4.0 "diff with v21.3.1")
* 2023-05-01 [`5e24a32`](https://github.com/nophead/NopSCADlib/commit/5e24a32a0b422e8032c3c5d377c1a756ff6f1022 "show commit") [C.P.](# "Chris Palmer") Added ESP32 camera.
* 2023-05-01 [`fbd8d8c`](https://github.com/nophead/NopSCADlib/commit/fbd8d8c7cdff0bd7de0d42aa74bf0ab6551c205b "show commit") [C.P.](# "Chris Palmer") Added `smd_coax`
#### [v21.3.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.3.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.3.0...v21.3.1 "diff with v21.3.0")
* 2023-04-29 [`b1592f5`](https://github.com/nophead/NopSCADlib/commit/b1592f51d4b16a125d9b28edae56f758fcac2f02 "show commit") [C.P.](# "Chris Palmer") Fixed `bom.py,` `views.py` and `tests.py` so that vitamin descriptions can contain more than one colon.
### [v21.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.2.0...v21.3.0 "diff with v21.2.0")
* 2023-04-23 [`61fc194`](https://github.com/nophead/NopSCADlib/commit/61fc19499524a2b750d17a90627a697bf626bbf0 "show commit") [C.P.](# "Chris Palmer") Refactored for readability.
* 2023-04-23 [`f8af615`](https://github.com/nophead/NopSCADlib/commit/f8af61568a8362cf470bc9eb8de8323c8fc001c7 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2023-04-23 [`05d1684`](https://github.com/nophead/NopSCADlib/commit/05d16841c4d48c5c8f453e438af0ff6eb5bffe53 "show commit") [C.P.](# "Chris Palmer") Fixed thread pitch.
* 2023-04-05 [`07e7eb7`](https://github.com/nophead/NopSCADlib/commit/07e7eb77f73fcaab4291388b49781b0e2de5a64c "show commit") [M.B.](# "Martin Budden") Added support for shoulder screws.
### [v21.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.1.2...v21.2.0 "diff with v21.1.2")
* 2023-04-22 [`5fc70e1`](https://github.com/nophead/NopSCADlib/commit/5fc70e19ac5d320290f4a2151665e83f0829d796 "show commit") [C.P.](# "Chris Palmer") Added SMD Tantalum caps and 0502 and 0402 resistor and capacitors.
#### [v21.1.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.1.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.1.1...v21.1.2 "diff with v21.1.1")
* 2023-03-29 [`1c5d9a8`](https://github.com/nophead/NopSCADlib/commit/1c5d9a8ef5892caf9b2c4d0d84dc3d20eba699d3 "show commit") [C.P.](# "Chris Palmer") Removed utility functions used by `invert()` from documentation as not generally useful.
#### [v21.1.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.1.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.1.0...v21.1.1 "diff with v21.1.0")
* 2023-03-29 [`d3f0bfc`](https://github.com/nophead/NopSCADlib/commit/d3f0bfc17f82b42f2d81f2d72a54c3f0cc375604 "show commit") [C.P.](# "Chris Palmer") Fixed typo in resistor comment.
### [v21.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.0.1...v21.1.0 "diff with v21.0.1")
* 2023-03-11 [`18cd33c`](https://github.com/nophead/NopSCADlib/commit/18cd33c66388d4d4e7be664c0f883cff0854524b "show commit") [C.](# "Chris") Fixed typos, corrected vitamin call, added boilerplate, updated images and readme.
* 2023-03-11 [`ebfb330`](https://github.com/nophead/NopSCADlib/commit/ebfb330ac69f4e90de84ecffea94ce067d041031 "show commit") [D.K.](# "Dirkjan Krijnders") Added comments and make holes a `linear_extrude` result
* 2023-03-08 [`c5fab08`](https://github.com/nophead/NopSCADlib/commit/c5fab08a454383b295be2b151fd715ee79b85db3 "show commit") [D.K.](# "Dirkjan Krijnders") Added `photo_interrupter` to the test
* 2023-03-08 [`fecc937`](https://github.com/nophead/NopSCADlib/commit/fecc93746ab80ad1fc74f0fe3465de92ffee7b36 "show commit") [D.K.](# "Dirkjan Krijnders") Added vitamins for photo interrupters
#### [v21.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.0.0...v21.0.1 "diff with v21.0.0")
* 2023-03-11 [`07da7d8`](https://github.com/nophead/NopSCADlib/commit/07da7d8dc7d3fb769e57a6b9ca86465357007b6c "show commit") [C.](# "Chris") Removed `Python2.7` from `usage.md` as no longer works.
* 2023-03-10 [`5a3bbf9`](https://github.com/nophead/NopSCADlib/commit/5a3bbf967dc967eca4726af517382e7eb875dde1 "show commit") [C.](# "Chris") Fixed broken cover image.
## [v21.0.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.0.0 "show release") Breaking Changes [...](https://github.com/nophead/NopSCADlib/compare/v20.24.0...v21.0.0 "diff with v20.24.0")
* 2023-03-10 [`9d4d5ab`](https://github.com/nophead/NopSCADlib/commit/9d4d5aba17974e7b5911e723d48d7b9403a4bcb4 "show commit") [C.](# "Chris") `veroboard_assembly()` renamed `veroboard_fastened_assembly()`.
`veroboard_assembly()` now doesn't include the fasteners.
### [v20.24.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.24.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.23.0...v20.24.0 "diff with v20.23.0")
* 2023-03-10 [`d939401`](https://github.com/nophead/NopSCADlib/commit/d939401183d12af3452e17aa5b020dab50f8edb0 "show commit") [C.](# "Chris") Added `vero_grid_pos()` function.
* 2023-03-10 [`584542f`](https://github.com/nophead/NopSCADlib/commit/584542f87a27efe06ff3ba597dbaff1f3c32c4fd "show commit") [C.](# "Chris") Added fastons.
* 2023-03-10 [`62372a0`](https://github.com/nophead/NopSCADlib/commit/62372a049b9ac7a0fecebfd3618df91ff6ffa87a "show commit") [C.](# "Chris") The `wire()` module can now draw wires if a path is specified.
* 2023-03-10 [`14698e5`](https://github.com/nophead/NopSCADlib/commit/14698e5203e1e860230ddb3729816730e221f49c "show commit") [C.](# "Chris") Added PTFE heatshrink sleeving.
* 2023-03-10 [`14f6bb5`](https://github.com/nophead/NopSCADlib/commit/14f6bb533a3dcc1d36b2b764906cdca7d8d24484 "show commit") [C.](# "Chris") Added `sleeving_length` to `al_clad_resistor_assembly()`.
* 2023-03-10 [`01e9aae`](https://github.com/nophead/NopSCADlib/commit/01e9aae698f57bac6046d1a04aaa11b0c88006b5 "show commit") [C.](# "Chris") Added `TO220_size()` and `TO220_lead_pos(i,` l).
* 2023-02-04 [`27f9b24`](https://github.com/nophead/NopSCADlib/commit/27f9b242f250c0083344a05527055bb2fbb56f91 "show commit") [C.P.](# "Chris Palmer") Added crystal, transistors, diode and LEDs to Arduino Uno.
* 2023-02-03 [`f07fda7`](https://github.com/nophead/NopSCADlib/commit/f07fda70cdfc743cd2462636fcc1eb13a092f9e4 "show commit") [C.P.](# "Chris Palmer") Wire links can now be sleeved.
* 2023-02-01 [`abf1f1a`](https://github.com/nophead/NopSCADlib/commit/abf1f1ab3f3eddc2f274df649e8481a4117901eb "show commit") [C.P.](# "Chris Palmer") PCB blocks can now have rounded edges for more realistic cans.
* 2023-02-01 [`df06d1f`](https://github.com/nophead/NopSCADlib/commit/df06d1f57fff64cd6da20684f8371da204f69a82 "show commit") [C.P.](# "Chris Palmer") Updated changelog.
### [v20.23.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.23.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.22.0...v20.23.0 "diff with v20.22.0")
* 2023-02-01 [`470d6d6`](https://github.com/nophead/NopSCADlib/commit/470d6d6216b1cef8ce6cafd4b14300edb62eac4a "show commit") [C.P.](# "Chris Palmer") Started radial components with crystals.
* 2023-02-01 [`0e5e15a`](https://github.com/nophead/NopSCADlib/commit/0e5e15a747fed6b4ef434c9796bef6cb9e658c0e "show commit") [C.P.](# "Chris Palmer") Added SOIC14 package.
* 2023-02-01 [`3f84912`](https://github.com/nophead/NopSCADlib/commit/3f84912e555cd4f7e97e7cac3091260fe969df4c "show commit") [C.P.](# "Chris Palmer") Added `rounded_top_rectangle()`.
### [v20.22.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.22.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.21.0...v20.22.0 "diff with v20.21.0")
* 2023-01-29 [`01eeafb`](https://github.com/nophead/NopSCADlib/commit/01eeafb2552a4fcc735e85e8d0e7c0855c18be8c "show commit") [C.P.](# "Chris Palmer") Updated images and readme.

View File

@@ -2,7 +2,7 @@
## Requirements
1. OpenSCAD 2021.01 or later, download it from here: https://www.openscad.org/downloads.html
1. Python 2.7+ or 3.6+ from https://www.python.org/downloads/
1. Python 3.6+ from https://www.python.org/downloads/
1. ImageMagick 7 www.imagemagick.org
These are all cross platform tools so NopSCADlib should work on any platform that supports them, although it has currently only been tested on Win7.

View File

@@ -37,6 +37,7 @@ include <vitamins/components.scad>
include <vitamins/displays.scad>
include <vitamins/extrusions.scad>
include <vitamins/extrusion_brackets.scad>
include <vitamins/fastons.scad>
include <vitamins/geared_steppers.scad>
include <vitamins/hot_ends.scad>
include <vitamins/inserts.scad>
@@ -48,6 +49,7 @@ include <vitamins/magnets.scad>
include <vitamins/mains_sockets.scad>
include <vitamins/modules.scad>
include <vitamins/panel_meters.scad>
include <vitamins/photo_interrupters.scad>
include <vitamins/pillars.scad>
include <vitamins/pillow_blocks.scad>
include <vitamins/pin_headers.scad>
@@ -99,3 +101,4 @@ use <utils/round.scad>
use <utils/offset.scad>
use <utils/sector.scad>
use <utils/thread.scad>
use <vitamins/photo_interrupter.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 973 KiB

After

Width:  |  Height:  |  Size: 972 KiB

View File

@@ -63,6 +63,7 @@ use <tests/drag_chain.scad>
use <tests/extrusions.scad>
use <tests/extrusion_brackets.scad>
use <tests/fans.scad>
use <tests/fastons.scad>
use <tests/fuseholder.scad>
use <tests/geared_steppers.scad>
use <tests/hot_ends.scad>
@@ -84,6 +85,7 @@ use <tests/o_ring.scad>
use <tests/opengrab.scad>
use <tests/panel_meters.scad>
use <tests/PCBs.scad>
use <tests/photo_interrupters.scad>
use <tests/pillars.scad>
use <tests/pillow_blocks.scad>
use <tests/potentiometers.scad>
@@ -223,7 +225,7 @@ inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 120;
screws_y = washers_y + 120;
circlips_y = screws_y + 160;
circlips_y = screws_y + 180;
springs_y = circlips_y + 20;
o_rings_y = springs_y;
sealing_strip_y = springs_y + 20;
@@ -336,9 +338,10 @@ leds_y = 0;
carriers_y = leds_y + 40;
magnets_y = carriers_y + 40;
spades_y = magnets_y + 20;
buttons_y = spades_y + 20;
jacks_y = buttons_y + 40;
microswitches_y = jacks_y + 40;
fastons_y = spades_y + 20;
buttons_y = fastons_y + 20;
jacks_y = buttons_y + 30;
microswitches_y = jacks_y + 30;
rockers_y = microswitches_y + 40;
toggles_y = rockers_y + 60;
components_y = toggles_y + 40;
@@ -364,6 +367,9 @@ translate([x2 + 70, leds_y])
translate([x2, spades_y])
spades();
translate([x2, fastons_y])
fastons();
translate([x2, buttons_y])
buttons();
@@ -396,21 +402,21 @@ extrusions_y = panel_meters_y + 80;
translate([x3, veroboard_y])
veroboard_test();
translate([x3 + 60, veroboard_y + 20])
translate([x3 + 50, veroboard_y + 20])
geared_steppers();
translate([x3 + 160, ssrs_y])
pcb_mounts();
translate([x3 + 170, veroboard_y + 16])
translate([x3 + 145, veroboard_y + 16])
cameras();
translate([x3 + 145, d_connectors_y - 10])
camera_housings();
translate([x3, d_connectors_y])
d_connectors();
translate([x3 + 170, d_connectors_y - 10])
camera_housings();
translate([x3, iecs_y])
iecs();
@@ -423,6 +429,9 @@ translate([x3 + 60, modules_y])
translate([x3 + 90, modules_y])
modules();
translate([x3 + 150, modules_y])
photo_interrupters();
translate([x3, ssrs_y]) {
ssrs();

219
readme.md
View File

@@ -42,12 +42,12 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Terminals">Terminals</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td></td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Fastons">Fastons</a> </td><td> <a href = "#Photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Potentiometers">Potentiometers</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
</table>
@@ -110,7 +110,7 @@ Axial components for PCBs.
| Module | Description |
|:--- |:--- |
| `ax_res(type, value, tol = 5, pitch = 0)` | Through hole axial resistor. If `pitch` is zero the minimum is used. If below the minimum the resistor is placed vertical. |
| `wire_link(d, l, h = 1, tail = 3)` | Draw a wire jumper link. If `l` is zero then a vertical wire is drawn. |
| `wire_link(d, l, h = 1, tail = 3, sleeve = false)` | Draw a wire jumper link. `sleeve` can be a list with the diameter and colour. If `l` is zero then a vertical wire is drawn. |
![axials](tests/png/axials.png)
@@ -124,6 +124,7 @@ Axial components for PCBs.
| 1 | `ax_res(res1_4, 47000)` | Resistor 47000 Ohms 5% 0.25W |
| 1 | `ax_res(res1_2, 8200)` | Resistor 8200 Ohms 5% 0.5W |
| 1 | `ax_res(res1_2, 8250, tol = 1)` | Resistor 8250 Ohms 1% 0.5W |
| 1 | `wire_link(0.8, 7.62, h = 0.75, sleeve = [1.5, "red"])` | Wire link 0.8mm x 0.3" with red sleeving |
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
@@ -710,6 +711,7 @@ PCB cameras.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `camera(ESP32_CAM)` | ESP32-CAM Camera module |
| 1 | `camera(rpi_camera_v1)` | Raspberry Pi camera V1 |
| 1 | `camera(rpi_camera_v2)` | Raspberry Pi camera V2 |
| 1 | `camera(rpi_camera)` | Raspberry Pi focusable camera |
@@ -805,6 +807,8 @@ Various electronic components used in hot ends and heated beds.
### Functions
| Function | Description |
|:--- |:--- |
| `TO220_lead_pos(i, l)` | Position of ith lead end when length = l |
| `TO220_size()` | Size of a TO220 |
| `TO220_thickness()` | Thickness of the tab of a TO220 |
| `TO247_size()` | Body dimensions of a T247, hole offset, lead height and lead wide length |
| `fack2spm_bezel_size()` | FACK2SPM Bezel dimensions |
@@ -816,6 +820,7 @@ Various electronic components used in hot ends and heated beds.
| ` TO220(description, leads = 3, lead_length = 16)` | Draw a TO220 package, use `description` to describe what it is |
| ` TO247(description, lead_length = 20)` | Draw a TO247 package, use `description` to describe what it is |
| `al_clad_resistor(type, value, leads = true)` | Draw an aluminium clad resistor |
| `al_clad_resistor_assembly(type, value, sleeved = true, sleeving = HSHRNK32, sleeving_length = 15)` | Draw aluminium clad resistor with optional sleaving, positions children at the screw positions |
| `al_clad_resistor_hole_positions(type)` | Position children at the screw holes of an aluminium clad resistor |
| `al_clad_resistor_holes(type, h = 100)` | Drill screw holes for an aluminium clad resistor |
| `fack2spm()` | Draw a FACK2SPM Cat5E RJ45 shielded panel mount coupler |
@@ -824,7 +829,7 @@ Various electronic components used in hot ends and heated beds.
| `panel_USBA()` | Draw a panel mount USBA connector |
| `panel_USBA_hole_positions()` | Place children at hole positions |
| `panel_USBA_holes(h = 100)` | Make holes for USBA connector |
| `resistor(type)` | Draw specified type of resitor |
| `resistor(type)` | Draw specified type of resistor |
| `sleeved_resistor(type, sleeving, bare = 5, heatshrink = false)` | Draw a resistor with sleeved leads and option heatshrink |
| `thermal_cutout(type)` | Draw specified thermal cutout |
| `thermal_cutout_hole_positions(type)` | Place children at hole positions |
@@ -1191,6 +1196,56 @@ Can draw three styles: solid, open frame and open frame with screw bosses.
| 32 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
<a href="#top">Top</a>
---
<a name="Fastons"></a>
## Fastons
Faston receptacles to mate with spade connectors
[vitamins/fastons.scad](vitamins/fastons.scad) Object definitions.
[vitamins/faston.scad](vitamins/faston.scad) Implementation.
[tests/fastons.scad](tests/fastons.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| `faston_d_bot(type)` | Radius of bottom corners |
| `faston_d_top(type)` | Radius of the clips |
| `faston_fillet_d(type)` | Fillets at the transition |
| `faston_insul_crimp_d(type)` | Outside diameter of the insulation crimp |
| `faston_insul_crimp_l(type)` | Length of the insulation crimp |
| `faston_insul_crimp_o(type)` | Offset of insulation crimp |
| `faston_insul_crimp_p(type)` | Position of the tip of the insulation crimp |
| `faston_size(type)` | Size of the receptical part |
| `faston_t(type)` | Thickness |
| `faston_wall_h(type)` | Height of transition web wall |
| `faston_width(type)` | Width of matching spade |
| `faston_wire_crimp_d(type)` | Outside diameter of the wire crimp |
| `faston_wire_crimp_l(type)` | Length of the wire crimp |
| `faston_wire_crimp_p(type)` | Position of the tip of the wire crimp |
### Functions
| Function | Description |
|:--- |:--- |
| `faston_insul_stop(type)` | Position where insulation stops |
| `faston_length(type)` | Total length of crimp |
### Modules
| Module | Description |
|:--- |:--- |
| `faston(type, closed = false)` | Draw specified faston |
![fastons](tests/png/fastons.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | `faston(5_160430_7)` | Faston part no 5_160430_7 to fit 4.75mm spade |
<a href="#top">Top</a>
---
@@ -2394,7 +2449,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Module | Description |
|:--- |:--- |
| `barrel_jack(cutout = false)` | Draw barrel power jack |
| `block(size, colour, makes_cutout, cutouts)` | Draw a coloured cube to represent a random PCB component |
| `block(size, colour, makes_cutout, cutouts, r = 0, rtop = 0)` | Draw a coloured cube to represent a random PCB component |
| `buzzer(height, diameter, colour)` | Draw PCB buzzer with specified height, diameter and colour |
| `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 |
| `flat_flex(type, cutout = false)` | Draw flat flexistrip connector as used on RPI0 |
@@ -2444,12 +2499,15 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `rd_xtal(HC49_4H, "10MHz")` | Crystal HC49_4H 10MHz |
| 1 | `d_plug(DCONN9, pcb = true)` | D-type 9 way PCB mount plug |
| 1 | `dil_socket(12, 15.24)` | DIL socket 24 x 0.6" |
| 1 | `smd_diode(DO241AC)` | DO241AC package SS34 |
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
| 1 | `hdmi(hdmi_full)` | HDMI socket |
| 1 | `pdip(24, 27C32, w = 15.24)` | IC 27C32 PDIP24 |
| 1 | `pdip(8, NE555)` | IC NE555 PDIP8 |
| 1 | `idc_transition(2p54header, 5)` | IDC transition header 5 x 2 |
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
| 1 | `jst_xh_header(jst_ph_header, 2)` | JST PH connector 2 way |
| 1 | `jst_xh_header(jst_xh_header, 2)` | JST XH connector 2 way |
| 1 | `jst_xh_header(jst_zh_header, 2)` | JST ZH connector 2 way |
| 1 | `potentiometer(KY_040_encoder)` | KY_040_encoder |
| 1 | `led(LED10mm, "yellow")` | LED 10 mm yellow |
| 1 | `led(LED3mm)` | LED 3 mm red |
@@ -2458,8 +2516,11 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `microswitch(small_microswitch)` | Microswitch DM1-00P-110-3 |
| 1 | `hdmi(hdmi_mini)` | Mini HDMI socket |
| 1 | `molex_254(2)` | Molex KK header 2 way |
| 1 | `molex_254(2, right_angle = 1)` | Molex KK header 2 way right angle |
| 1 | `molex_254(2, right_angle = -1)` | Molex KK header 2 way right angle |
| 1 | `pin_header(2p54header, 4, 1)` | Pin header 4 x 1 |
| 1 | `pin_header(2p54header, 5, 1)` | Pin header 5 x 1 |
| 1 | `pin_header(2p54header, 5, 1, right_angle = true)` | Pin header 5 x 1 right_angle |
| 1 | `pin_socket(2p54header, 4, 1)` | Pin socket 4 x 1 |
| 1 | `pin_socket(2p54header, 6, 1)` | Pin socket 6 x 1 |
| 2 | `pin_socket(2p54header, 8, 1)` | Pin socket 8 x 1 |
@@ -2472,12 +2533,20 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 10V |
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 16V |
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 10nF |
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 10nF |
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 10nF |
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 100nF |
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 1uF |
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
| 1 | `smd_resistor(RES0402, 1)` | SMD resistor 0402 1 0.0625W |
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
| 1 | `smd_resistor(RES1206, 1K)` | SMD resistor 1206 1K 0.25W |
| 1 | `smd_resistor(RES1206, 1M)` | SMD resistor 1206 1M 0.25W |
| 1 | `smd_soic(SOIC14)` | SOIC14 package 74HC00 |
| 1 | `smd_soic(SOIC16)` | SOIC16 package ICL323 |
| 1 | `smd_soic(SOIC18)` | SOIC18 package PIC18F88 |
@@ -2501,6 +2570,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 2 | `vero_pin()` | Vero board pin |
| 1 | `wire_link(0.8, 5.08, h = 10.16)` | Wire link 0.8mm x 0.2" |
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
| 1 | `wire_link(0.8, 10.16, h = 0.75, sleeve = [1.5, "red"])` | Wire link 0.8mm x 0.4" with red sleeving |
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
@@ -2560,7 +2630,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Module | Description |
|:--- |:--- |
| `barrel_jack(cutout = false)` | Draw barrel power jack |
| `block(size, colour, makes_cutout, cutouts)` | Draw a coloured cube to represent a random PCB component |
| `block(size, colour, makes_cutout, cutouts, r = 0, rtop = 0)` | Draw a coloured cube to represent a random PCB component |
| `buzzer(height, diameter, colour)` | Draw PCB buzzer with specified height, diameter and colour |
| `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 |
| `flat_flex(type, cutout = false)` | Draw flat flexistrip connector as used on RPI0 |
@@ -2699,6 +2769,49 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 4 | pcb_spacer4090.stl |
<a href="#top">Top</a>
---
<a name="Photo_interrupters"></a>
## Photo_interrupters
Photo interrupter modules popular in robot kits and from China.
[vitamins/photo_interrupters.scad](vitamins/photo_interrupters.scad) Object definitions.
[vitamins/photo_interrupter.scad](vitamins/photo_interrupter.scad) Implementation.
[tests/photo_interrupters.scad](tests/photo_interrupters.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| `pi_base_height(type)` | Height of the base |
| `pi_base_length(type)` | Length of the base |
| `pi_base_width(type)` | Width of the base |
| `pi_color(type)` | Color of photo interrupter |
| `pi_gap_height(type)` | Height of the gap where the light can be interrupted |
| `pi_gap_width(type)` | Width of the gap |
| `pi_hole_diameter(type)` | Diameter of the mounting holes |
| `pi_pcb(type)` | Parameter for the support PCB, created with pi_pcb |
| `pi_stem_width(type)` | Width of the stems |
### Modules
| Module | Description |
|:--- |:--- |
| `photo_interrupter(type)` | Draw the photo interrupter, with PCB |
| `pi_cutout(type)` | Shape to subtract for fitting a photo interrupter |
| `pi_hole_locations(type)` | Locations of photo interrupter mounting holes |
| `pi_pcb(type)` | Draw the support PCB |
| `pi_pcb_hole_locations(pcb)` | Locations of the PCB holes |
![photo_interrupters](tests/png/photo_interrupters.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `photo_interrupter(PH1)` | PH1 Photo interrupter |
<a href="#top">Top</a>
---
@@ -2833,7 +2946,7 @@ Pin headers and sockets, etc.
|:--- |:--- |
| `box_header(type, cols = 1, rows = 1, smt = false, cutout = false)` | Draw box header |
| `idc_transition(type, cols = 5, skip = [], cutout = false)` | Draw IDC transition header |
| `jst_xh_header(type, pin_count, right_angle = false, colour = false, pin_colour = false, smt = false)` | Draw JST XH connector |
| `jst_xh_header(type, pin_count, right_angle = false, colour = false, pin_colour = false, smt = false)` | Draw JST XH, PH or ZH connector |
| `pin(type, length = undef)` | Draw a header pin |
| `pin_header(type, cols = 1, rows = 1, smt = false, right_angle = false, cutout = false, colour)` | Draw pin header |
| `pin_socket(type, cols = 1, rows = 1, right_angle = false, height = 0, smt = false, cutout = false, colour)` | Draw pin socket |
@@ -2846,6 +2959,18 @@ Pin headers and sockets, etc.
| 1 | `box_header(2p54header, 10, 2)` | Box header 10 x 2 |
| 1 | `box_header(2p54header, 8, 1)` | Box header 8 x 1 |
| 1 | `idc_transition(2p54header, 10)` | IDC transition header 10 x 2 |
| 1 | `jst_xh_header(jst_ph_header, 2)` | JST PH connector 2 way |
| 1 | `jst_xh_header(jst_ph_header, 2, right_angle = true)` | JST PH connector 2 way right_angle |
| 1 | `jst_xh_header(jst_ph_header, 5)` | JST PH connector 5 way |
| 1 | `jst_xh_header(jst_ph_header, 5, right_angle = true)` | JST PH connector 5 way right_angle |
| 1 | `jst_xh_header(jst_xh_header, 2)` | JST XH connector 2 way |
| 1 | `jst_xh_header(jst_xh_header, 2, right_angle = true)` | JST XH connector 2 way right_angle |
| 1 | `jst_xh_header(jst_xh_header, 5)` | JST XH connector 5 way |
| 1 | `jst_xh_header(jst_xh_header, 5, right_angle = true)` | JST XH connector 5 way right_angle |
| 1 | `jst_xh_header(jst_zh_header, 2)` | JST ZH connector 2 way |
| 1 | `jst_xh_header(jst_zh_header, 2, right_angle = true)` | JST ZH connector 2 way right_angle |
| 1 | `jst_xh_header(jst_zh_header, 5)` | JST ZH connector 5 way |
| 1 | `jst_xh_header(jst_zh_header, 5, right_angle = true)` | JST ZH connector 5 way right_angle |
| 1 | `pin_header(2p54header, 10, 2)` | Pin header 10 x 2 |
| 1 | `pin_header(2p54header, 3, 1, right_angle = true)` | Pin header 3 x 1 right_angle |
| 1 | `pin_header(2p54header, 3, 2, right_angle = true)` | Pin header 3 x 2 right_angle |
@@ -3379,6 +3504,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
| `screw_radius(type)` | Nominal radius |
| `screw_socket_af(type)` | Socket across flats |
| `screw_socket_depth(type)` | Socket or slot depth |
| `screw_thread_diameter(type)` | Thread diameter, if different from nominal diamter |
| `screw_washer(type)` | Default washer |
### Functions
@@ -3421,12 +3547,14 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
| 1 | `screw(M3_hex_screw, 10)` | Screw M3 hex x 10mm |
| 1 | `screw(M3_low_cap_screw, 10)` | Screw M3 low cap x 10mm |
| 1 | `screw(M3_pan_screw, 10)` | Screw M3 pan x 10mm |
| 1 | `screw(M3_shoulder_screw, 12)` | Screw M3 shoulder x 12mm |
| 1 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
| 1 | `screw(M4_cs_cap_screw, 25)` | Screw M4 cs cap x 25mm |
| 1 | `screw(M4_dome_screw, 25)` | Screw M4 dome x 25mm |
| 1 | `screw(M4_grub_screw, 8)` | Screw M4 grub x 8mm |
| 1 | `screw(M4_hex_screw, 30)` | Screw M4 hex x 30mm |
| 1 | `screw(M4_pan_screw, 30)` | Screw M4 pan x 30mm |
| 1 | `screw(M4_shoulder_screw, 16)` | Screw M4 shoulder x 16mm |
| 1 | `screw(M5_cap_screw, 30)` | Screw M5 cap x 30mm |
| 1 | `screw(M5_cs_cap_screw, 30)` | Screw M5 cs cap x 30mm |
| 1 | `screw(M5_dome_screw, 30)` | Screw M5 dome x 30mm |
@@ -3714,6 +3842,21 @@ SK shaft support brackets
## SMDs
Surface mount components for PCBs.
Note that the value string for tantalum capacitors is the the capacitance in pico farads expressed as two digits plus an exponent plus a single letter voltage code.
E.g. 475A is 4.7uF 10V on the parts list.
| Code | Voltage |
| ---- | ------- |
| e | 2.5 |
| G | 4 |
| J | 6.3 |
| A | 10 |
| C | 16 |
| D | 20 |
| E | 25 |
| V | 35 |
| H | 50 |
[vitamins/smds.scad](vitamins/smds.scad) Object definitions.
[vitamins/smd.scad](vitamins/smd.scad) Implementation.
@@ -3725,6 +3868,14 @@ Surface mount components for PCBs.
|:--- |:--- |
| `smd_cap_end_cap(type)` | End cap width |
| `smd_cap_size(type)` | Body length, width |
| `smd_coax_base_r(type)` | Corner radius of the base |
| `smd_coax_base_size(type)` | Size of the insulating base |
| `smd_coax_groove(type)` | Groove id, width and z |
| `smd_coax_lug_size(type)` | lug size |
| `smd_coax_pin_d(type)` | Central pin diameter |
| `smd_coax_tube(type)` | OD, ID, height |
| `smd_contact_size(type)` | contact size |
| `smd_diode_colour(type)` | Body colour |
| `smd_diode_lead_z(type)` | Top of lead frame from top |
| `smd_diode_leads(type)` | Lead extent in x, width, thickness and gap |
| `smd_diode_size(type)` | Body length, width and height |
@@ -3757,6 +3908,11 @@ Surface mount components for PCBs.
| `smd_sot_size(type)` | Body length, width and height |
| `smd_sot_tab_width(type)` | The wide lead at the top |
| `smd_sot_z(type)` | Height above PCB surface |
| `smd_tant_colours(type)` | Colours of body and stripe |
| `smd_tant_lead_z(type)` | Top of lead frame from top |
| `smd_tant_leads(type)` | Lead extent in x, width, thickness and gap |
| `smd_tant_size(type)` | Body length, width and height |
| `smd_tant_z(type)` | Height above PCB surface |
### Functions
| Function | Description |
@@ -3769,6 +3925,7 @@ Surface mount components for PCBs.
| Module | Description |
|:--- |:--- |
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
| `smd_coax(type)` | Draw an SMD coaxial connector |
| `smd_diode(type, value)` | Draw an SMD diode |
| `smd_inductor(type, value)` | Draw an SMD inductor |
| `smd_led(type, colour, cutout)` | Draw an SMD LED with specified `colour` |
@@ -3776,21 +3933,30 @@ Surface mount components for PCBs.
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
| `smd_soic(type, value)` | Draw an SMD SOIC |
| `smd_sot(type, value)` | Draw an SMD transistor |
| `smd_tant(type, value)` | Draw an SMD tantalum capacitor |
![smds](tests/png/smds.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `smd_diode(DO241AC)` | DO241AC package SS34 |
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 6.3V |
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 10V |
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 |
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 |
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
| 1 | `smd_resistor(RES0402, 1R0)` | SMD resistor 0402 1R0 0.0625W |
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
| 1 | `smd_soic(SOIC14)` | SOIC14 package SOIC14 |
@@ -4274,6 +4440,8 @@ Tubing and sleeving. The internal diameter can be forced to stretch it over some
| 1 | `tubing(HSHRNK24)` | Heatshrink sleeving ID 2.4mm x 15mm |
| 1 | `tubing(HSHRNK64)` | Heatshrink sleeving ID 6.4mm x 15mm |
| 1 | `tubing(NEOP85)` | Neoprene tubing OD 8mm ID 5mm x 15mm |
| 1 | `tubing(STFE4_3p2_CLR)` | PTFE heatshrink sleeving OD 3.7mm ID 3.2mm x 15mm |
| 1 | `tubing(STFE4_6p4_CLR)` | PTFE heatshrink sleeving OD 7mm ID 6.4mm x 15mm |
| 1 | `tubing(PTFE07)` | PTFE sleeving OD 1.2mm ID 0.71mm x 15mm |
| 1 | `tubing(PTFE20)` | PTFE sleeving OD 2.6mm ID 2mm x 15mm |
| 1 | `tubing(PTFE2_3)` | PTFE tubing OD 3mm ID 2mm x 15mm |
@@ -4367,6 +4535,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
| Function | Description |
|:--- |:--- |
| `vero(name, assembly, holes, strips, pitch = 2.54, fr4 = false, screw = M3_cap_screw, mounting_holes = [], breaks = [], no_tracks = [], components = [], joints = [])` | Constructor |
| `vero_grid_pos(type, x, y)` | Convert grid position to offset from the centre |
| `vero_length(type)` | Length of the board |
| `vero_size(type)` | Board size |
| `vero_thickness(type)` | Thickness of the substrate |
@@ -4383,7 +4552,9 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
| `vero_mounting_hole_positions(type)` | Positions children at the mounting holes |
| `vero_mounting_holes(type, h = 100)` | Drill mounting holes in a panel |
| `veroboard(type)` | Draw specified veroboard with missing tracks and track breaks |
| `veroboard_assembly(type, height, thickness, flip = false, ngb = false)` | Draw the assembly with components and fasteners in place |
| `veroboard_assembly(type, ngb = false)` | Draw the assembly with components |
| `veroboard_fastened_assembly(type, height, thickness, flip = false, ngb = false)` | Draw the assembly with components and fasteners in place |
| `veroboard_fasteners(type, height, thickness, flip = false)` | Draw the fasteners in place |
![veroboard](tests/png/veroboard.png)
@@ -4391,16 +4562,16 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 2 | `idc_transition(2p54header, 10)` | IDC transition header 10 x 2 |
| 4 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
| 4 | `screw(M3_dome_screw, 25)` | Screw M3 dome x 25mm |
| 2 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
| 2 | `screw(M3_dome_screw, 25)` | Screw M3 dome x 25mm |
| 2 | `green_terminal(gt_2p54, 10)` | Terminal block 10 way 0.1" |
| 2 | `veroboard(z_vb)` | Veroboard 5 holes x 22 strips |
| 8 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 4 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
### Printed
| Qty | Filename |
| ---:|:--- |
| 4 | pcb_spacer30120.stl |
| 2 | pcb_spacer30120.stl |
### Assemblies
| Qty | Name |
@@ -4538,7 +4709,7 @@ Utilities for adding wires to the BOM and optionally drawing them and cable bund
| `cable_tie_holes(cable_r, h = 100)` | Holes to thread a ziptie through a panel to make a cable tie. |
| `mouse_hole(cable, h = 100, teardrop = false)` | A mouse hole to allow a panel to go over a wire bundle. |
| `ribbon_cable(ways, length)` | Add ribbon cable to the BOM |
| `wire(colour, strands, length, strand = 0.2)` | Add stranded wire to the BOM |
| `wire(colour, strands, length, strand = 0.2, d = 0, path = [])` | Add stranded wire to the BOM and draw it if diameter and path specified |
![wire](tests/png/wire.png)
@@ -6647,7 +6818,6 @@ Maths utilities for manipulating vectors and matrices.
| `argcoth(x)` | inverse hyperbolic cotangent |
| `argsinh(x)` | inverse hyperbolic sine |
| `argtanh(x)` | inverse hyperbolic tangent |
| `augment(m)` | Augment a matrix by adding an identity matrix to the right |
| `circle_intersect(c1, r1, c2, r2)` | Calculate one point where two circles in the X-Z plane intersect, clockwise around c1 |
| `cosh(x)` | hyperbolic cosine |
| `coth(x)` | hyperbolic cotangent |
@@ -6667,11 +6837,8 @@ Maths utilities for manipulating vectors and matrices.
| `rot2_z(a)` | Generate a 2x2 matrix to rotate around z |
| `rot3_z(a)` | Generate a 3x3 matrix to rotate around z |
| `rotate(a, v)` | Generate a 4x4 rotation matrix, `a` can be a vector of three angles or a single angle around `z`, or around axis `v` |
| `rowswap(m, i, j)` | Swap two rows of a matrix |
| `scale(v)` | Generate a 4x4 matrix that scales by `v`, which can be a vector of xyz factors or a scalar to scale all axes equally |
| `sinh(x)` | hyperbolic sine |
| `solve(m, i = 0, j = 0)` | Solve each row ensuring diagonal is not zero |
| `solve_row(m, i)` | Make diagonal one by dividing the row by it and subtract from other rows to make column zero |
| `sqr(x)` | Square x |
| `sumv(v)` | sum a vector of values that can be added with "+" |
| `tanh(x)` | hyperbolic tangent |

View File

@@ -140,7 +140,7 @@ class BOM:
for part in sorted(self.vitamins):
i += 1
if ': ' in part:
part_no, description = part.split(': ')
part_no, description = part.split(': ', 1)
else:
part_no, description = "", part
qty = self.vitamins[part].count
@@ -183,7 +183,7 @@ class BOM:
for part in sorted(self.vitamins):
if ': ' in part:
part_no, description = part.split(': ')
part_no, description = part.split(': ', 1)
else:
part_no, description = "", part
if breakdown:

View File

@@ -259,11 +259,11 @@ def tests(tests):
things = BOM[thing]
if things:
body += ['### %s\n| Qty | %s |\n| ---:|:--- |%s' % (thing.title(), heading, ':---|' if '|' in heading else '')]
for item in sorted(things, key = lambda s: s.split(":")[-1]):
for item in sorted(things, key = lambda s: s.split(":",1)[-1]):
name = item
desc = ''
if thing == "vitamins":
vit = item.split(':')
vit = item.split(':', 1)
name = '`' + vit[0] + '`' if vit[0] else ''
while '[[' in name and ']]' in name:
i = name.find('[[')

View File

@@ -303,7 +303,7 @@ def views(target, do_assemblies = None):
grand_total2 = 0
heading = headings[t][0].upper() + headings[t][1:]
print(('| ' * len(global_bom) + '| | **%s** |') % heading, file = doc_file)
for thing in sorted(things[t], key = lambda s: s.split(":")[-1]):
for thing in sorted(things[t], key = lambda s: s.split(":",1)[-1]):
for ass in global_bom:
count = ass[t][thing]["count"] if thing in ass[t] else 0
print('| %s ' % pad(count if count else '.', 2, 1), file = doc_file, end = '')
@@ -313,7 +313,7 @@ def views(target, do_assemblies = None):
else:
totals[name] = count
grand_total2 += count
print('| %s | %s |' % (pad(things[t][thing], 2, 1), pad(thing.split(":")[-1], 2)), file = doc_file)
print('| %s | %s |' % (pad(things[t][thing], 2, 1), pad(thing.split(":",1)[-1], 2)), file = doc_file)
grand_total = 0
for ass in global_bom:
@@ -344,8 +344,8 @@ def views(target, do_assemblies = None):
print("### Vitamins", file = doc_file)
print("|Qty|Description|", file = doc_file)
print("|---:|:----------|", file = doc_file)
for v in sorted(vitamins, key = lambda s: s.split(":")[-1]):
print("|%d|%s|" % (vitamins[v]["count"], v.split(":")[1]), file = doc_file)
for v in sorted(vitamins, key = lambda s: s.split(":",1)[-1]):
print("|%d|%s|" % (vitamins[v]["count"], v.split(":",1)[1]), file = doc_file)
print("\n", file = doc_file)
printed = ass["printed"]

View File

@@ -62,19 +62,28 @@ test_pcb = ["test_pcb", "Test PCB",
[
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 90, "trimpot10", true],
[ 7, 2, 90, "smd_led", LED1206, "blue"],
[ 10, 2, 90, "smd_led", LED0805, "red"],
[ 19, 2, 90, "smd_led", LED1206, "blue"],
[ 16, 2, 90, "smd_led", LED0805, "red"],
[ 13, 2, 90, "smd_led", LED0603, "orange"],
[ 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, "1uF"],
[ 28, 2, 90, "smd_cap", CAP0805, 1.0, "100nF"],
[ 31, 2, 90, "smd_cap", CAP0603, 0.7, "10nF"],
[ 34, 3, 90, "smd_diode",DO241AC, "SS34"],
[ 21, 6, -90, "smd_pot", TC33X1, "10K"],
[ 16, 6, -90, "smd_sot", SOT23, "2N7000"],
[ 28, 8, -90, "smd_sot", SOT223, "LM117"],
[ 19, 6, -90, "smd_res", RES1206, "1M"],
[ 16, 6, -90, "smd_res", RES0805, "1K"],
[ 13, 6, -90, "smd_res", RES0603, "100"],
[ 10, 6, -90, "smd_res", RES0502, "10"],
[ 7, 6, -90, "smd_res", RES0402, "1"],
[ 19, 10, 90, "smd_cap", CAP1206, 1.5, "1uF"],
[ 16, 10, 90, "smd_cap", CAP0805, 1.0, "100nF"],
[ 13, 10, 90, "smd_cap", CAP0603, 0.7, "10nF"],
[ 10, 10, 90, "smd_cap", CAP0502, 0.6, "10nF"],
[ 7, 10, 90, "smd_cap", CAP0402, 0.5, "10nF"],
[ 19, 16, -90, "smd_tant", TANT_C, "107C"],
[ 13, 16, -90, "smd_tant", TANT_B, "106A"],
[ 7, 16, -90, "smd_tant", TANT_A, "105e"],
[ 32, 3, -90, "smd_diode",DO214AC, "SS34"],
[ 26, 2, -90, "smd_pot", TC33X1, "10K"],
[ 26, 6, -90, "smd_coax",U_FL_R_SMT_1],
[ 26, 10, -90, "smd_sot", SOT23, "2N7000"],
[ 28, 16, -90, "smd_sot", SOT223, "LM117"],
[ 45, 35, 0, "2p54header", 4, 1],
[ 60, 35, 0, "2p54header", 5, 1, false, "blue" ],
@@ -82,10 +91,10 @@ test_pcb = ["test_pcb", "Test PCB",
[ 45, 30, 0, "2p54socket", 4, 1, false, 0, false, "red" ],
[ 60, 30, 0, "2p54socket", 6, 1],
[ 59, 50, 180, "led", LED3mm, "red"],
[ 66, 50, 180, "led", LED5mm, "orange"],
[ 77, 50, 180, "led", LED8mm, "blue"],
[ 90, 50, 180, "led", LED10mm, "yellow"],
[ 59, 60, 180, "led", LED3mm, "red"],
[ 66, 60, 180, "led", LED5mm, "orange"],
[ 77, 60, 180, "led", LED8mm, "blue"],
[ 90, 60, 180, "led", LED10mm, "yellow"],
[ 10, 35, 180, "rj45"],
[ 7, 50, 180, "usb_vAx1"],
[ 8, 65, 180, "usb_A"],
@@ -105,18 +114,19 @@ test_pcb = ["test_pcb", "Test PCB",
[ 25, 200, 0, "buzzer", 4.5, 8.5],
[ 25, 218, 0, "buzzer"],
[ 65, 9, 0, "link", inch(0.4)], // flat link
[ 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],
[ 55, 9, 0, "link", 0, 5], // Vertical wire
[ 45, 5, 0, "link", inch(0.4), 0.75, undef, undef, [1.5, "red"]], // Sleeved link
[ 45, 9, 0, "link", inch(0.4)], // Flat link
[ 45, 12, 0, "ax_res", res1_8, 1000],
[ 45, 17, 0, "ax_res", res1_4, 10000],
[ 45, 22, 0, "ax_res", res1_2, 100000],
[ 35, 22, 0, "vero_pin"],
[ 35, 17, 0, "vero_pin", true],
[ 35, 9, 0, "link", 0, 5], // Vertical wire
[ 80, 9, 0, "link", inch(0.2), inch(0.4)], // Raised link
[ 80, 12, 0, "ax_res", res1_8, 1000000, 1, inch(0.1)],
[ 80, 17, 0, "ax_res", res1_4, 100, 2, inch(0.1)],
[ 80, 22, 0, "ax_res", res1_2, 10, 10, inch(0.2)],
[ 60, 9, 0, "link", inch(0.2), inch(0.4)], // Raised link
[ 60, 12, 0, "ax_res", res1_8, 1000000, 1, inch(0.1)],
[ 60, 17, 0, "ax_res", res1_4, 100, 2, inch(0.1)],
[ 60, 22, 0, "ax_res", res1_2, 10, 10, inch(0.2)],
[ 33, 110, -90, "rd_xtal", HC49, "4MHz" ],
[ 28, 110, -90, "rd_xtal", HC49_4H, "10MHz" ],
@@ -125,15 +135,20 @@ test_pcb = ["test_pcb", "Test PCB",
[ 30, 130,-90, "rd_xtal", ACT1100, "40MHz", 0.5 ],
[ 30, 150,-90, "rd_xtal", ACT1700, "80MHz", 0.5 ],
[ 60, 3, 0, "flex"],
[ 50, 15, -90, "flat_flex"],
[ 40, 15, -90, "flat_flex", true],
[ 77, 15, -90, "flex"],
[ 95, 15, -90, "flat_flex"],
[ 87, 15, -90, "flat_flex", true],
[ 50, 50, 0, "molex_hdr", 2],
[ 50, 60, 0, "jst_xh", 2],
[ 50, 70, 180, "term254", 3],
[ 63, 70, 180, "term254", 3, undef, grey(20)],
[ 75, 70, 180, "gterm508",2, undef, "blue"],
[ 47, 55, 0, "molex_hdr", 2],
[ 51, 48, 0, "molex_hdr", 2, 1],
[ 51, 41, 0, "molex_hdr", 2, -1],
[ 45, 65, 0, "jst_xh", 2],
[ 54, 65, 0, "jst_ph", 2],
[ 61, 65, 0, "jst_zh", 2],
[ 50, 75, 180, "term254", 3],
[ 63, 75, 180, "term254", 3, undef, grey(20)],
[ 75, 75, 180, "gterm508",2, undef, "blue"],
[ 50, 90, 180, "gterm35", 4, [1,2]],
[ 63, 90, 180, "gterm35", 4, [1,2], "red"],

View File

@@ -23,7 +23,7 @@ include <../vitamins/smds.scad>
module smds() {
layout([for(r = smd_resistors) smd_res_size(r).x], 1)
smd_resistor(smd_resistors[$i], ["1R0", "10M", "100K"][$i % 3]);
smd_resistor(smd_resistors[$i], ["1R0", "10", "100", "10M", "100K"][$i % 5]);
translate([0, 3])
layout([for(l = smd_leds) smd_led_size(l).x], 1)
@@ -35,27 +35,37 @@ module smds() {
smd_capacitor(c, smd_cap_size(c).y * 0.8);
translate([0, 9])
layout([for(d = smd_diodes) smd_diode_size(d).x], 1)
layout([for(t = smd_tants) smd_tant_leads(t).x], 1)
let(t = smd_tants[$i])
smd_tant(t, ["105e","106J", "107A"][$i]);
translate([0, 12.5])
layout([for(d = smd_diodes) smd_diode_leads(d).x], 1)
let(d = smd_diodes[$i])
smd_diode(d, ["SS34"][$i]);
translate([0, 15])
translate([0, 24])
layout([for(s = smd_sots) smd_sot_size(s).x], 1)
let(s = smd_sots[$i])
smd_sot(s, ["2N7000", "FZT851"][$i]);
translate([0, 21])
translate([0, 18])
layout([for(p = smd_pots) smd_pot_size(p).x], 1)
let(p = smd_pots[$i])
smd_pot(p, "10K");
translate([0, 28])
translate([6, 18])
layout([for(c = smd_coaxs) smd_coax_base_size(c).x], 1)
let(c = smd_coaxs[$i])
smd_coax(c);
translate([0, 31])
layout([for(s = smd_soics) smd_soic_size(s).x], 1)
let(s = smd_soics[$i])
smd_soic(s, s[0]);
translate([0, 36])
layout([for(i = smd_inductors) smd_inductor_size(i).x], 1)
translate([0, 39])
layout([for(i = smd_inductors) smd_inductor_leads(i).x], 1)
let(i = smd_inductors[$i])
smd_inductor(i, "4R7");
}

View File

@@ -28,6 +28,10 @@ module axials() {
rotate(90)
wire_link(0.8, inch(0.4));
pcb_grid(pcb, 1, 1.5)
rotate(90)
wire_link(0.8, inch(0.3), 0.75, sleeve = [1.5, "red"]);
pcb_grid(pcb, 0, 7)
wire_link(0.8, 0, 5);

View File

@@ -26,8 +26,9 @@ include <../vitamins/cameras.scad>
use <../vitamins/pcb.scad>
module camera_housings()
layout([for(c = cameras) pcb_length(camera_pcb(c))], 15, false) let(c = cameras[$i])
camera_fastened_assembly(c, 3);
layout([for(c = cameras) pcb_length(camera_pcb(c))], 10, false) let(c = cameras[$i])
if(pcb_screw(camera_pcb(c)))
camera_fastened_assembly(c, 3);
if($preview)
camera_housings();

35
tests/fastons.scad Normal file
View File

@@ -0,0 +1,35 @@
//
// NopSCADlib Copyright Chris Palmer 2023
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../utils/core/core.scad>
include <../vitamins/fastons.scad>
module fastons()
for(i = [0, len(fastons) - 1])
translate([i * 20, 0])
let(f = fastons[i]) {
rotate(180)
faston(f);
translate([10, 0])
rotate(180)
faston(f, true);
}
fastons();

View File

@@ -0,0 +1,28 @@
//
// NopSCADlib Copyright Chris Palmer 2023
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../utils/core/core.scad>
include <../vitamins/photo_interrupters.scad>
use <../utils/layout.scad>
module photo_interrupters()
layout([for(l = photo_interrupters) pi_base_length(l)], 5, true)
photo_interrupter(photo_interrupters[$i]);
photo_interrupters();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

BIN
tests/png/fastons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 KiB

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 171 KiB

View File

@@ -56,7 +56,7 @@ module screws() {
screw(screw, length);
}
}
translate([20, 40, -15])
translate([20, 60, -15])
polysink_stl();
}

View File

@@ -22,7 +22,7 @@ use <../utils/layout.scad>
include <../vitamins/tubings.scad>
module tubings()
layout([for(t = tubings) tubing_od(t)], 8)
layout([for(t = tubings) tubing_od(t)], 5)
tubing(tubings[$i]);
if($preview)

View File

@@ -36,11 +36,11 @@ z_vb = ["z_vb", "z_bed_terminal", 5, z_cable_ways / 2 + 12, inch(0.1), false, M3
module veroboard_test() translate([vero_length(z_vb) / 2, vero_width(z_vb) / 2]) {
vflip()
veroboard_assembly(z_vb, 12, 3);
veroboard_assembly(z_vb);
translate([30, 0])
rotate(180)
veroboard_assembly(z_vb, 12, 3);
veroboard_fastened_assembly(z_vb, 12, 3);
}
if($preview)

View File

@@ -118,24 +118,24 @@ module position_children(list, t) //! Position children if they are on the Z = 0
// Matrix inversion: https://www.mathsisfun.com/algebra/matrix-inverse-row-operations-gauss-jordan.html
function augment(m) = let(l = len(m), n = identity(l)) [ //! Augment a matrix by adding an identity matrix to the right
function augment(m) = let(l = len(m), n = identity(l)) [ // Augment a matrix by adding an identity matrix to the right
for(i = [0 : l - 1])
concat(m[i], n[i])
];
function rowswap(m, i, j) = [ //! Swap two rows of a matrix
function rowswap(m, i, j) = [ // Swap two rows of a matrix
for(k = [0 : len(m) - 1])
k == i ? m[j] : k == j ? m[i] : m[k]
];
function solve_row(m, i) = let(diag = m[i][i]) [ //! Make diagonal one by dividing the row by it and subtract from other rows to make column zero
function solve_row(m, i) = let(diag = m[i][i]) [ // Make diagonal one by dividing the row by it and subtract from other rows to make column zero
for(j = [0 : len(m) - 1])
i == j ? m[j] / diag : m[j] - m[i] * m[j][i] / diag
];
function nearly_zero(x) = abs(x) < 1e-5; //! True if x is close to zero
function solve(m, i = 0, j = 0) = //! Solve each row ensuring diagonal is not zero
function solve(m, i = 0, j = 0) = // Solve each row ensuring diagonal is not zero
i < len(m) ?
assert(i + j < len(m), "matrix is singular")
solve(!nearly_zero(m[i + j][i]) ? solve_row(j ? rowswap(m, i, i + j) : m, i) : solve(m, i, j + 1), i + 1)

View File

@@ -23,8 +23,9 @@
include <../utils/core/core.scad>
include <../utils/round.scad>
module wire_link(d, l, h = 1, tail = 3) { //! Draw a wire jumper link. If `l` is zero then a vertical wire is drawn.
vitamin(str("wire_link(", d, ", ", l, arg(h, 1, "h"), arg(tail, 3, "tail"), "): Wire link ", d, "mm x ", l ? str(l / inch(1), "\"") : str(h + tail,"mm")));
module wire_link(d, l, h = 1, tail = 3, sleeve = false) { //! Draw a wire jumper link. `sleeve` can be a list with the diameter and colour. If `l` is zero then a vertical wire is drawn.
vitamin(str("wire_link(", d, ", ", l, arg(h, 1, "h"), arg(tail, 3, "tail"), arg(sleeve, false, "sleeve"),
"): Wire link ", d, "mm x ", l ? str(l / inch(1), "\"") : str(h + tail,"mm"), sleeve ? str(" with ", sleeve[1], " sleeving") : ""));
r = d;
$fn = 32;
@@ -48,6 +49,12 @@ module wire_link(d, l, h = 1, tail = 3) { //! Draw a wire jumper link. If `l` is
else
translate_z(-tail)
cylinder(d = d, h = tail + h);
if(sleeve)
color(sleeve[1])
translate_z(h)
rotate([0, 90, 0])
cylinder(d = sleeve[0], h = l - 2 * r, center = true);
}
function ax_res_wattage(type) = type[1]; //! Power rating

View File

@@ -91,7 +91,7 @@ module camera(type, show_lens = true, fov_distance = 0, fov = undef) {
color("orange")
hull() {
translate_z(flex.y /2)
translate(camera_lens_offset(type) + [0, camera_lens(type)[0][0].y / 2])
translate(camera_lens_offset(type) + [0, sign(pos.y) * camera_lens(type)[0][0].y / 2, 0])
cube([flex.x, eps, flex.y], center = true);
translate_z(conn.z - flex.y)

View File

@@ -70,6 +70,92 @@ rpi_camera = ["rpi_camera", "Raspberry Pi focusable camera", rpi_camera_pcb, [0,
[0, 18 - 1.5 - 2.5], [8, 5, 1.6]
];
cameras = [rpi_camera_v1, rpi_camera_v2, rpi_camera];
esp32_cam_x = 1; // Seems to vary as mine is offset but pictures on the web show it more centered.
ESP32_module = ["", "", 18, 26, 0.8, 0, 0.7, [1.1, 1.1, 0, gold], grey(18), false, [
for(x = [0,1], y = [0:13]) [x * 18, y * 1.27 + 1.4], // Hole positions on the edge
for(x = [0:9]) [18 / 2 + (x - 4.5) * 1.27, 0],
],
[
[18 / 2, 9.7 - 3.4 / 2 , 0, "block", 15.75, 17.6 - 3.4, 2.2, silver, false, 0.3, 0.3], // can
[18 / 2 - 2.65, 9.7 , 0, "block", 10.4, 17.6, 2.2, silver, false, 0.3, 0.3], // can
[12.7, -6.5, 45, "smd_res", RES0502],
[15.15, -8.3, -90, "smd_coax", U_FL_R_SMT_1],
// Antenna
let(x = [0.9, 3.2, 5.7, 8.1, 10.6, 12.8, 15, 15.2])
each [
for(i = [0, 5,6,7]) [x[i], -2.8, 0, "block", 0.6, 4.8, 0.2, gold], // long verticals
for(i = [1: 4]) [x[i], -2.05, 0, "block", 0.6, 3.3, 0.2, gold], // short verticals
for(i = [0, 2, 4,5])[(x[i] + x[i + 1]) / 2, -0.7, 0, "block", x[i + 1] - x[i], 0.6, 0.2, gold], // top horizontals
for(i = [1, 3]) [(x[i] + x[i + 1]) / 2, -3.4, 0, "block", x[i + 1] - x[i], 0.6, 0.2, gold], // lower horizontals
]
],
];
ESP32_CAM_pcb = ["", "", 27, 40, 1.7, 2.5, 0, 0, grey(15), false, [],
[
[27 / 2, 26 / 2, 0, "-pcb", 0, ESP32_module],
for(side = [-1, 1]) [side * inch(0.45) + 27 / 2, -(4.2 + inch(.35)), 0, "-2p54header", 1, 8],
[ 27 / 2, -8, 90, "uSD", [14.85, 14.65, 1.8]],
[ 27 / 2 + 1, 15, 0, "flat_flex", false],
[ 27 / 2 + inch(0.45), 10.5, 0, "block", 3, 3, 0.8, grey(90)],
[ 27 / 2 + inch(0.45), 10.5, 0, "block", 2.9, 2.9, 0.81, "yellow", true, 2.9 / 2 - eps],
[ 27 / 2, 3, 0, "text", 15, 2, "ESP32-CAM", "Liberation Sans:style=Bold"],
[0.5, -(4.7 + inch(.35)), 90, "text", inch(0.75), 0.9, "IO4 IO2 IO14 IO15 IO13 IO12 GND 5V", "Liberation Sans:style=Bold"],
[26.5, -(4.6 + inch(.35)), -90, "text", inch(0.77), 0.9, "3V3 1O16 IO0 GND VCC U0R U0T GND", "Liberation Sans:style=Bold"],
[5.5, -3.3, 90, "-chip", 4, 3, 1.6, silver], // Mock button surround
[5.5, -3.3, 90, "-chip", 1.8,0, 2.0, grey(20)], // Mock button
[10, -10.8, 0, "-smd_led", LED0603, "red"],
[-6.5, -5, 0, "-smd_soic", SOIC8],
[12.2, -4.5, 180, "-smd_sot", SOT223, "AMS1117"],
[25.3, 14, 0, "smd_sot", SOT23],
[3.0, 14, 0, "smd_sot", SOT23],
[8, 20, 90, "smd_sot", SOT23],
[16, 20, 90, "smd_sot", SOT23],
[3.0, 11.5,0, "smd_res", RES0502],
[2.9, 10.3,0, "smd_res", RES0502],
[5.4, 20, 90, "smd_cap", CAP0603, 0.5],
[11.5, 20, 90, "smd_cap", CAP0603, 0.5],
[18.7, 20, 90, "smd_cap", CAP0603, 0.5],
[19.9, 20, 90, "smd_cap", CAP0402, 0.3],
for(i = [0, 1, 2, 4]) [7.6 + i * 1.09, 8.8, 90, "smd_res", RES0502],
for(i = [0 : 3]) [-4.8, 20 + i * 1.09, 0, "smd_res", RES0502],
for(i = [3, 5, 8]) [7.6 + i * 1.09, 8.8, 90, "smd_cap", CAP0502, 0.5],
[-8.1, 23, 90, "smd_res", RES0502],
[-9.2, 23, 90, "smd_res", RES0502],
[-6.3, 23.3, 180, "text", 0.8, 0.7, "5V", "Liberation Sans:style=Bold"],
[-6.5, 22.2, 180, "text", 1.2, 0.7, "3V3", "Liberation Sans:style=Bold"],
[8, -3.3, 90, "-smd_cap", CAP0603, 0.5],
[2, -2, 0, "-text", 2.3, 1, "RST", "Liberation Sans:style=Bold"],
[10,-9.4, 0, "-text", 3.1, 1, "LED1", "Liberation Sans:style=Bold"],
[12.4, -10.8, 0, "-smd_res", RES0502],
[13.7, -9.4, 0, "-smd_cap", CAP0603, 0.5],
[17.2,-9.4, 0, "-smd_cap", CAP0502, 0.4],
[22.1, -10.8, 0, "-smd_res", RES0502],
[16.9, -4.8, 90, "-smd_res", RES0502],
[2.2, 9.0, 90, "-smd_cap", CAP0502, 0.4],
[2.2, 11.6, 90, "-smd_cap", CAP0502, 0.4],
[2.2, 14.2, 90, "-smd_res", RES0502],
[5.9, -9.4, 90, "-smd_tant", TANT_B, "107A"],
],
[],
[(27 - inch(0.9)) / 2, 40 - 4.2 - inch(0.7), 2, 8, silver, inch(0.9), inch(0.1)], // 8x2 grid of holes
];
ESP32_CAM = ["ESP32_CAM", "ESP32-CAM Camera module", ESP32_CAM_pcb, [esp32_cam_x, pcb_width(ESP32_CAM_pcb) / 2 - 12, 1.8],
[
[[8, 8, 2.4], 0],
[[0, 0, 4.2], 4],
[[0, 0, 6.3], 3.5, [1, 1, 0.5]],
],
[1, -4], [15, 2.2, 1],
[54, 41] // FOV
];
cameras = [rpi_camera_v1, rpi_camera_v2, rpi_camera, ESP32_CAM];
use <camera.scad>

View File

@@ -41,7 +41,7 @@ function resistor_sleeved(type) = type[9]; //! Are the leads sleeved
splay_angle = 2; // radial lead splay angle
module resistor(type) { //! Draw specified type of resitor
module resistor(type) { //! Draw specified type of resistor
length = resistor_length(type);
dia = resistor_diameter(type);
@@ -190,10 +190,7 @@ module al_clad_resistor(type, value, leads = true) { //! Draw an aluminium clad
cylinder(r = leads ? 3 : height / 2 - 2, h = length + eps, center = true);
}
module al_clad_resistor_assembly(type, value, sleeved = true) { //* Draw aluminium clad resistor with optional sleaving, positions children at the screw positions
sleeving_length = 15;
sleeving = HSHRNK32;
module al_clad_resistor_assembly(type, value, sleeved = true, sleeving = HSHRNK32, sleeving_length = 15) { //! Draw aluminium clad resistor with optional sleaving, positions children at the screw positions
al_clad_resistor(type, value);
if(sleeved)
@@ -207,52 +204,55 @@ module al_clad_resistor_assembly(type, value, sleeved = true) { //* Draw alumini
children();
}
TO220_hole_y = 2.9; // Distance to hole from top of tab
function TO220_size() = [10.2, 15, 4.4]; //! Size of a TO220
function TO220_thickness() = 1.5; //! Thickness of the tab of a TO220
function TO220_lead_pos(i, l) = //! Position of ith lead end when length = l
[i * inch(0.1), -TO220_size().y + TO220_hole_y - l, 1.9];
module TO220(description, leads = 3, lead_length = 16) { //! Draw a TO220 package, use `description` to describe what it is
width = 10.2;
s = TO220_size();
inset = 1.5;
hole = 3.3;
length = 15;
height = 4.4;
lead_height = 1.9;
lead_t = 0.4;
lead_w = 0.7;
lead_w2 = 1.4;
lead_l = 4.2;
body = 8;
hole_y = 2.9;
vitamin(str("TO220(\"", description, "\"", arg(leads, 3, "leads"), "): ", description));
translate([0, -length + hole_y]) {
color("silver") {
translate([0, -s.y + TO220_hole_y]) {
color("silver")
linear_extrude(TO220_thickness())
difference() {
translate([-width / 2, inset])
square([width, length - inset]);
translate([-s.x / 2, inset])
square([s.x, s.y - inset]);
translate([0, length - hole_y])
translate([0, s.y - TO220_hole_y])
circle(d = hole);
for(side = [-1, 1])
translate([side * width / 2, 0])
translate([side * s.x / 2, 0])
square([inset * 2, body * 2], center = true);
}
for(i = [-1 : 1])
if(i || leads == 3) {
translate([inch(0.1) * i, -lead_length / 2, lead_height])
cube([lead_w, lead_length, lead_t], center = true);
translate([inch(0.1) * i, -lead_l / 2, lead_height])
cube([lead_w2, lead_l, lead_t], center = true);
}
}
color("dimgrey")
translate([-width / 2, 0, eps])
cube([width, body, height]);
translate([-s.x / 2, 0, eps])
cube([s.x, body, s.z]);
}
color(silver)
for(i = [-1 : 1])
if(i || leads == 3) {
translate(TO220_lead_pos(i, lead_length / 2))
cube([lead_w, lead_length, lead_t], center = true);
translate(TO220_lead_pos(i, lead_l / 2))
cube([lead_w2, lead_l, lead_t], center = true);
}
translate_z(TO220_thickness())
children();
}

219
vitamins/faston.scad Normal file
View File

@@ -0,0 +1,219 @@
//
// NopSCADlib Copyright Chris Palmer 2023
// 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/>.
//
//
//! Faston receptacles to mate with spade connectors
//
include <../utils/core/core.scad>
include <../utils/sector.scad>
function faston_width(type) = type[1]; //! Width of matching spade
function faston_size(type) = type[2]; //! Size of the receptical part
function faston_d_top(type) = type[3]; //! Radius of the clips
function faston_d_bot(type) = type[4]; //! Radius of bottom corners
function faston_t(type) = type[5]; //! Thickness
function faston_wire_crimp_l(type) = type[6]; //! Length of the wire crimp
function faston_wire_crimp_d(type) = type[7]; //! Outside diameter of the wire crimp
function faston_wire_crimp_p(type) = type[8]; //! Position of the tip of the wire crimp
function faston_fillet_d(type) = type[9]; //! Fillets at the transition
function faston_wall_h(type) = type[10]; //! Height of transition web wall
function faston_insul_crimp_l(type) = type[11]; //! Length of the insulation crimp
function faston_insul_crimp_d(type) = type[12]; //! Outside diameter of the insulation crimp
function faston_insul_crimp_p(type) = type[13]; //! Position of the tip of the insulation crimp
function faston_insul_crimp_o(type) = type[14]; //! Offset of insulation crimp
function faston_length(type) = //! Total length of crimp
faston_insul_crimp_p(type).z + faston_insul_crimp_l(type);
function faston_insul_stop(type) = //! Position where insulation stops
faston_wire_crimp_p(type).z + faston_wire_crimp_l(type);
module faston(type, closed = false) { //! Draw specified faston
vitamin(str("faston(", type[0], "): Faston part no ", type[0], " to fit ", faston_width(type), "mm spade"));
s = faston_size(type);
r_top = faston_d_top(type) / 2;
r_bot = faston_d_bot(type) / 2;
t = faston_t(type);
wc_l = faston_wire_crimp_l(type);
wc_r = faston_wire_crimp_d(type) / 2;
wc_p = faston_wire_crimp_p(type);
fillet_r = faston_fillet_d(type) / 2;
wall_h = faston_wall_h(type);
ic_l = faston_insul_crimp_l(type);
ic_r = faston_insul_crimp_d(type) / 2;
ic_p = faston_insul_crimp_p(type);
ic_o = faston_insul_crimp_o(type);
$fn = 64;
// Receptical
module reciptical_shape()
for(side = [-1, 1]) mirror([side < 0 ? 1 : 0, 0]) {
translate([s.x / 2 - r_top, s.y - r_top])
difference() {
sector(r_top, 0, 180);
sector(r_top - t, 0, 180);
}
translate([s.x / 2 - r_bot, r_bot])
difference() {
sector(r_bot, -90, 0);
sector(r_bot - t, -90, 0);
}
translate([s.x / 2 - t, r_bot])
square([t, s.y - r_top - r_bot]);
square([s.x / 2 - r_bot, t]);
}
module crimp_shape(p, r, offset = 0) {
hpot = norm([p.x, p.y] - [0, r + offset]);
opp = sqrt(sqr(hpot) - sqr(r));
angle = atan((p.y - (r + offset)) / p.x) - acos(r / hpot);
r_crimp = r / 2 - eps;
lift = -0.1;
z = (opp - r * 2 * PI / -angle / 360 - PI * r_crimp) / 2 + lift / 2;
for(side = [-1, 1]) mirror([side < 0 ? 1 : 0, 0])
translate([0, r + offset]) {
difference() {
sector(r, 270, 360 + (closed ? 0 : angle));
circle(r - t);
}
if(!closed)
rotate(angle)
translate([r - t, -eps])
square([t, opp]);
else {
translate([r - r_crimp, z])
difference() {
sector(r_crimp, 0, 180);
circle(r_crimp - t);
}
translate([r - t, 0])
square([t, z]);
translate([r - 2 * r_crimp, lift])
square([t, z - lift]);
}
}
}
// Wire crimp
module wire_crimp_shape() crimp_shape(wc_p, wc_r);
// Insulation crimp
module insul_crimp_shape() crimp_shape(ic_p, ic_r, ic_o);
module crop(z = 0)
intersection() {
children();
square([s.x, 2 * (wall_h + fillet_r + z)], center = true);
}
color(silver) translate([0, -t]) {
// Transition from reciptical to wire crimp
render() difference() {
hull() {
translate_z(s.z)
linear_extrude(eps)
crop()
reciptical_shape();
translate_z(wc_p.z - eps)
linear_extrude(eps)
crop()
wire_crimp_shape();
}
translate([0, s.y, (s.z + wc_p.z) / 2])
rotate([0, 90, 0])
rounded_rectangle([wc_p.z - s.z, 2 * (s.y - wall_h), s.x + 1], fillet_r, center = true);
hull() {
translate_z(s.z - eps)
linear_extrude(eps)
offset(-t)
crop(t)
hull()
reciptical_shape();
translate_z(wc_p.z + eps / 8)
linear_extrude(eps / 8)
offset(-t)
crop(t)
hull()
wire_crimp_shape();
}
}
// Transition from wire crimp to insulation crimp
render() difference() {
hull() {
translate_z(wc_p.z + wc_l)
linear_extrude(eps)
wire_crimp_shape();
translate_z(ic_p.z - eps)
linear_extrude(eps)
insul_crimp_shape();
}
gap = ic_p.z - wc_p.z - wc_l;
d = gap * 2 / 3;
translate([0, wall_h + fillet_r - gap / 2, ic_p.z - d / 2])
hull() {
rotate([0, 90, 0])
cylinder(d = d, h = 10, center = true);
translate([-5, d / 2, d / 2 - gap])
cube([10, 10, gap]);
}
hull() {
translate_z(wc_p.z + wc_l - eps)
linear_extrude(eps)
offset(-t)
hull()
wire_crimp_shape();
translate_z(ic_p.z + eps / 8)
linear_extrude(eps / 8)
offset(-t)
hull()
insul_crimp_shape();
}
}
linear_extrude(s.z)
reciptical_shape();
translate_z(wc_p.z)
linear_extrude(wc_l)
wire_crimp_shape();
translate_z(ic_p.z)
linear_extrude(ic_l)
insul_crimp_shape();
}
}

28
vitamins/fastons.scad Normal file
View File

@@ -0,0 +1,28 @@
//
// NopSCADlib Copyright Chris Palmer 2023
// 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/>.
//
//
//! Faston receptacles to mate with spade connectors
//
5_160430_7 = ["5_160430_7", 4.75, [5.6, 2.56, 6.3], 2.25, 1.13, 0.32, 3.2, 1.64, [1.64, 3.09, 9], 0.5, 0.96, 1.7, 3.53, [2.08, 4.47, 13.3], -0.4];
fastons = [5_160430_7];
use <faston.scad>

View File

@@ -1071,7 +1071,7 @@ module trimpot10(vertical, cutout = false) { //! Draw a ten turn trimpot
}
}
module block(size, colour, makes_cutout, cutouts) //! Draw a coloured cube to represent a random PCB component
module block(size, colour, makes_cutout, cutouts, r = 0, rtop = 0) //! Draw a coloured cube to represent a random PCB component
if(cutouts) {
if(makes_cutout)
translate([-50, 0, size.z / 2 - panel_clearance])
@@ -1079,8 +1079,10 @@ module block(size, colour, makes_cutout, cutouts) //! Draw a coloured cube to re
}
else
color(colour)
translate_z(size.z / 2)
cube(size, center = true);
if(rtop)
let($fn = 32) rounded_top_rectangle(size, r, rtop);
else
rounded_rectangle(size, r);
module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb component from description
function show(comp, part) = (comp[3] == part || comp[3] == str("-",part)) && (!cutouts || angle == undef || angle == comp.z);
@@ -1116,7 +1118,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
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(show(comp, "block")) block(size = [comp[4], comp[5], comp[6]], colour = comp[7], makes_cutout = param(8), r = param(9, 0), rtop = param(10, 0));
if(!cutouts) {
// Components that don't have a cutout parameter go in this section
if(show(comp, "button_6mm")) square_button(button_6mm);
@@ -1135,7 +1137,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
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, "rd_xtal")) rd_xtal(type = comp[4], value = param(5, undef), z = param(6, 0), pitch = param(7, undef)); // type, value, z, forced pitch
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, "link")) wire_link(l = comp[4], h = param(5, 1), d = param(6, 0.8), tail = param(7, 3), sleeve = param(8, false));
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], 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));
@@ -1144,11 +1146,13 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
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], param(6, undef));
if(show(comp, "smd_tant")) smd_tant(comp[4], param(5, undef));
if(show(comp, "smd_sot")) smd_sot(comp[4], comp[5]);
if(show(comp, "smd_soic")) smd_soic(comp[4], comp[5]);
if(show(comp, "smd_diode")) smd_diode(comp[4], comp[5]);
if(show(comp, "smd_inductor")) smd_inductor(comp[4], comp[5]);
if(show(comp, "smd_pot")) smd_pot(comp[4], comp[5]);
if(show(comp, "smd_coax")) smd_coax(comp[4]);
if(show(comp, "vero_pin")) vero_pin(param(4, false));
if(show(comp, "terminal")) terminal_block(comp[5], comp[4]);
if(show(comp, "text")) color("white") linear_extrude(eps) resize([comp[4], comp[5]]) text(comp[6], font = param(7, "Liberation Mono"), valign = "center", halign = "center");

View File

@@ -659,6 +659,14 @@ ArduinoUno3 = ["ArduinoUno3", "Arduino Uno R3", 68.58, 53.34, 1.6, 0, 3.3, 0, "#
[4.7625, 7.62, 180,"barrel_jack"],
[1.5875, 37.78, 180,"usb_B"],
[46.99, 17, 270,"pdip", 28, "ATMEGA328", true],
[18.7, 25.8, 0, "rd_xtal", HC49_4H],
[7.5, 17.2, 90, "smd_sot", SOT223],
[7.9, 26.5, 90, "smd_sot", SOT23],
[21.3, 2.7, 0, "smd_diode", DO214AC],
[27.8, 34.6, 0, "smd_led", LED0805, "red"],
[27.8, 37, 0, "smd_led", LED0805, "red"],
[27.8, 42.3, 0, "smd_led", LED0805, "red"],
[58.8, 37.1, 0, "smd_led", LED0805, "red"],
],
[],[],
inch([
@@ -788,7 +796,7 @@ MP1584EN = ["MP1584EN", "MP1584EN 3A buck converter", 22, 17, 1.25, 0, 1, [2, 2]
[6.2, 2.1, 0, "smd_cap", CAP0603, 0.5],
[9.2, 3.5, 0, "smd_res", RES0603, "104"],
[9.2, 2.1, 0, "smd_res", RES0603, "104"],
[6.3, 14.4, 0, "smd_diode",DO241AC, "SS34"],
[6.3, 14.4, 0, "smd_diode",DO214AC, "SS34"],
[12.1, 4.9, 0, "smd_cap", CAP0603, 0.5],
[15.8, 4.9, 0, "smd_cap", CAP0603, 0.5],
[14.5, 10, 90, "smd_inductor", IND2525, "4R7"],
@@ -864,7 +872,7 @@ XIAO = [
[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
[7.6, 9, 0, "block", 12.3, 12, 2.41, silver, false, 0.3, 0.3], // can
[21 + 1.76 - 7.35 / 2, 9, 0, "usb_C"],
],
[] // accessories
@@ -913,7 +921,7 @@ ESP32_DOIT_V1 = let(l = 51.45, w = 28.33, pitch = inch(1), pins = 15, poffset =
[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
[35, w / 2, 0, "block", 17.7, 16, 3, silver, false, 0.3, 0.3], // 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"],

View File

@@ -0,0 +1,103 @@
//
// NopSCADlib Copyright Chris Palmer 2023
// 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/>.
//
//
//! Photo interrupter modules popular in robot kits and from China.
//
include <../utils/core/core.scad>
include <../utils/rounded_polygon.scad>
function pi_base_width(type) = type[1]; //! Width of the base
function pi_base_length(type) = type[2]; //! Length of the base
function pi_base_height(type) = type[3]; //! Height of the base
function pi_gap_height(type) = type[4]; //! Height of the gap where the light can be interrupted
function pi_gap_width(type) = type[6]; //! Width of the gap
function pi_stem_width(type) = type[5]; //! Width of the stems
function pi_hole_diameter(type) = type[7]; //! Diameter of the mounting holes
function pi_color(type) = type[8]; //! Color of photo interrupter
function pi_pcb(type) = type[9]; //! Parameter for the support PCB, created with pi_pcb
module pi_hole_locations(type) { //! Locations of photo interrupter mounting holes
translate([0, -(pi_base_length(type) - pi_base_width(type)) / 2, 0])
children();
translate([0, (pi_base_length(type) - pi_base_width(type)) / 2, 0])
children();
}
module pi_pcb_hole_locations(pcb) { //! Locations of the PCB holes
for (xy = pcb[7]) {
translate([xy[0], xy[1], 0])
children();
}
}
module pi_pcb(type) { //! Draw the support PCB
pcb = pi_pcb(type);
color(pcb[6]) {
translate([0, 0, -pcb[2]]) {
linear_extrude(pcb[2]) {
difference() {
rounded_polygon([[0, -(pi_base_length(type) - pi_base_width(type)) / 2, -pi_base_width(type) / 2],
[pi_base_width(type) / 2, -pcb[1]/2, eps],
[pcb[0]+1, -pcb[1]/2, eps],
[pcb[0]+1, pcb[1]/2, eps],
[pi_base_width(type) / 2, pcb[1]/2, eps],
[0, (pi_base_length(type) - pi_base_width(type)) / 2, -pi_base_width(type) / 2]
]);
pi_pcb_hole_locations(pcb)
circle(d = pcb[8]);
pi_hole_locations(type)
circle(d=pi_hole_diameter(type));
}
}
}
}
}
module photo_interrupter(type) { //! Draw the photo interrupter, with PCB
vitamin(str("photo_interrupter(", type[0], "): ", type[0], " Photo interrupter"));
color(pi_color(type)) {
linear_extrude(pi_base_height(type)) {
difference() {
hull() {
pi_hole_locations(type)
circle(d = pi_base_width(type));
}
pi_hole_locations(type)
circle(d = pi_hole_diameter(type));
}
}
translate([-pi_base_width(type)/2, -(pi_gap_width(type)/2 + pi_stem_width(type)), 0])
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
translate([-pi_base_width(type)/2, pi_gap_width(type)/2, 0])
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
}
pi_pcb(type);
}
module pi_cutout(type) { //! Shape to subtract for fitting a photo interrupter
hull() {
pi_hole_locations(type)
cylinder(h = pi_base_height(type), d = pi_base_width(type));
}
translate([-pi_base_width(type)/2, -(pi_gap_width(type)/2 + pi_stem_width(type)), 0])
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
translate([-pi_base_width(type)/2, pi_gap_width(type)/2, 0])
cube([pi_base_width(type), pi_stem_width(type), pi_gap_height(type) + pi_base_height(type)]);
};

View File

@@ -0,0 +1,23 @@
//
// NopSCADlib Copyright Chris Palmer 2023
// 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/>.
//
PH1 = ["PH1", 6.4, 25.9 , 3.5, 8.6, 4.1, 5.9, 3, grey(20), [22, 20, 1.6, true, 11-3.2, 0, "blue",[[8.3, -7.5], [8.3, 7.5]], 3]];
photo_interrupters = [PH1];
use <photo_interrupter.scad>

View File

@@ -242,9 +242,11 @@ module pin_socket(type, cols = 1, rows = 1, right_angle = false, height = 0, smt
}
}
module jst_xh_header(type, pin_count, right_angle = false, colour = false, pin_colour = false, smt = false) { //! Draw JST XH connector
colour = colour ? colour : hdr_base_colour(type);
pin_colour = pin_colour ? pin_colour : hdr_pin_colour(type);
module jst_xh_header(type, pin_count, right_angle = false, colour = false, pin_colour = false, smt = false) { //! Draw JST XH, PH or ZH connector
series = chr([ord(type[0][4]) - 32, ord(type[0][5]) - 32]);
vitamin(str("jst_xh_header(", type[0], ", ", pin_count, arg(right_angle, false, "right_angle"), arg(colour, false, "colour"), arg(smt, false, "smt"), "): JST ", series, " connector ",
pin_count, " way", right_angle ? " right_angle" :""));
pitch = hdr_pitch(type);
size = hdr_box_size(type) + [(pin_count - 1) * pitch, 0, 0];
pinOffsetX = hdr_box_size(type).x / 2; // Offset from last pin to box edge
@@ -255,6 +257,7 @@ module jst_xh_header(type, pin_count, right_angle = false, colour = false, pin_c
ra_z = ra_h - size.y / 2;
ra_extra = ra_h - size.y; // thicker base for right angle version
pinWidth = hdr_pin_width(type);
pin_colour = pin_colour ? pin_colour : hdr_pin_colour(type);
module jst_xh_socket(type, pin_count, ra = false) {
module wall() {
@@ -308,7 +311,7 @@ module jst_xh_header(type, pin_count, right_angle = false, colour = false, pin_c
}
} // end module
color(colour)
color(colour ? colour : hdr_base_colour(type))
if(right_angle)
translate([0, -ra_box_offset, ra_z])
rotate([-90, 0, 180])

View File

@@ -27,9 +27,9 @@
2p54header = ["2p54header", 2.54, 11.6, 3.2, 0.66, gold, grey(20), 8.5, [0, 0, 8.7], 2.4, 0, 0, 0 ];
2p54joiner = ["2p54joiner", 2.54, 6.86, 2.5, 0.66, gold, grey(20), 8.5, [0, 0, 8.7], 2.4, 0, 0, 0 ]; // Cropped pins for joining PCBs
jst_xh_header = ["jst_xh_header",2.5, 10, 3.4, 0.64, gold, grey(90), 0, [4.9, 5.75, 7], 0.8, 0.525, 0.6, 6.1];
jst_ph_header = ["jst_ph_header",2.0, 9, 3.4, 0.64, silver, grey(90), 0, [3.9, 4.5, 6], 0.6, 0.55, 0.25, 4.8];
jst_zh_header = ["jst_zh_header",1.5, 7.4, 3.4, 0.5 , silver, grey(90), 0, [3.0, 3.5,4.5], 0.5, 0.45, 0.25, 3.7];
jst_xh_header = ["jst_xh_header",2.5, 10, 3.4, 0.64, gold, "white", 0, [4.9, 5.75, 7], 0.8, 0.525, 0.6, 6.1];
jst_ph_header = ["jst_ph_header",2.0, 9, 3.4, 0.64, silver, "white", 0, [3.9, 4.5, 6], 0.6, 0.55, 0.25, 4.8];
jst_zh_header = ["jst_zh_header",1.5, 7.4, 3.4, 0.5 , silver, "white", 0, [3.0, 3.5,4.5], 0.5, 0.45, 0.25, 3.7];
pin_headers = [ 2p54header ];

View File

@@ -41,6 +41,7 @@ function screw_washer(type) = type[9]; //! Default washer
function screw_nut(type) = type[10]; //! Default nut
function screw_pilot_hole(type) = type[11]; //! Pilot hole radius for wood screws, tap radius for machine screws
function screw_clearance_radius(type) = type[12]; //! Clearance hole radius
function screw_thread_diameter(type) = type[13]; //! Thread diameter, if different from nominal diamter
function screw_nut_radius(type) = screw_nut(type) ? nut_radius(screw_nut(type)) : 0; //! Radius of matching nut
function screw_boss_diameter(type) = max(washer_diameter(screw_washer(type)) + 1, 2 * (screw_nut_radius(type) + 3 * extrusion_width)); //! Boss big enough for nut trap and washer
function screw_head_depth(type, d = 0) = //! How far a counter sink head will go into a straight hole diameter d
@@ -87,47 +88,50 @@ module screw(type, length, hob_point = 0, nylon = false) { //! Draw specified sc
vitamin(str("screw(", type[0], "_screw, ", length, arg(hob_point, 0, "hob_point"), arg(nylon, false, "nylon"), "): ", description));
head_type = screw_head_type(type);
rad = screw_radius(type) - eps;
shaft_rad = screw_radius(type) - eps;
head_rad = screw_head_radius(type);
head_height = screw_head_height(type);
socket_af = screw_socket_af(type);
socket_depth= screw_socket_depth(type);
socket_rad = socket_af / cos(30) / 2;
max_thread = screw_max_thread(type);
has_shoulder = !is_undef(screw_thread_diameter(type));
thread_rad = has_shoulder ? screw_thread_diameter(type) / 2 : screw_radius(type);
thread = max_thread ? length >= max_thread + 5 ? max_thread
: length
: length;
d = 2 * screw_radius(type);
pitch = metric_coarse_pitch(d);
thread_offset = has_shoulder ? thread : 0;
thread_d = 2 * thread_rad;
pitch = metric_coarse_pitch(thread_d);
colour = nylon || head_type == hs_grub ? grey(40) : grey(80);
module shaft(socket = 0, headless = false) {
point = screw_nut(type) ? 0 : 3 * rad;
shank = length - thread - socket;
point = screw_nut(type) ? 0 : 3 * shaft_rad;
shank = length - socket - (has_shoulder ? 0 : thread);
if(show_threads && !point && pitch)
translate_z(-length)
male_metric_thread(d, pitch, thread - (shank > 0 || headless ? 0 : socket), false, top = headless ? -1 : 0, solid = !headless, colour = colour);
translate_z(-length - thread_offset)
male_metric_thread(thread_d, pitch, thread - (shank > 0 || headless ? 0 : socket), false, top = headless ? -1 : 0, solid = !headless, colour = colour);
else
color(colour * 0.9)
rotate_extrude() {
translate([0, -length + point])
square([rad, length - socket - point]);
translate([0, -length + point - thread_offset])
square([thread_rad - eps, length - socket - point]);
if(point)
polygon([
[0.4, -length], [0, point - length], [rad, point - length]
[0.4, -length], [0, point - length], [shaft_rad, point - length]
]);
}
if(shank > 0)
color(colour)
translate_z(-shank - socket)
cylinder(r = rad + eps, h = shank);
cylinder(r = shaft_rad + eps, h = shank);
}
module cs_head(socket_rad, socket_depth) {
head_t = rad / 5;
head_t = shaft_rad / 5;
head_height = head_rad + head_t;
color(colour) {
@@ -173,7 +177,7 @@ module screw(type, length, hob_point = 0, nylon = false) { //! Draw specified sc
}
if(head_type == hs_grub) {
color(colour) {
r = show_threads ? rad - pitch / 2 : rad;
r = show_threads ? shaft_rad - pitch / 2 : shaft_rad;
translate_z(-socket_depth)
linear_extrude(socket_depth)
difference() {

View File

@@ -103,6 +103,9 @@ M8_hex_screw = ["M8_hex", "M8 hex", hs_hex, 8, 15, 5.65, 0, 0
M3_low_cap_screw = ["M3_low_cap", "M3 low cap", hs_cap, 3, 5.5, 2, 1.5, 2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
M3_shoulder_screw= ["M3_shoulder", "M3 shoulder",hs_cap, 4, 7.0, 2.4, 1.5, 3.0, 6, M4_washer, M3_nut, M3_tap_radius, 2, 3];
M4_shoulder_screw= ["M4_shoulder", "M4 shoulder",hs_cap, 5, 9.0, 2.4, 1.5, 3.0, 8, M5_washer, M4_nut, M4_tap_radius, 2.5, 4];
M3_grub_screw = ["M3_grub", "M3 grub", hs_grub, 3, 0, 0, 2.5, 1.5, 0, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
M4_grub_screw = ["M4_grub", "M4 grub", hs_grub, 4, 0, 0, 2.4, 2.0, 0, M4_washer, M4_nut, M4_tap_radius, M4_clearance_radius];
M5_grub_screw = ["M5_grub", "M5 grub", hs_grub, 5, 0, 0, 2.4, 2.5, 0, M5_washer, M5_nut, M5_tap_radius, M5_clearance_radius];
@@ -117,6 +120,7 @@ No8_screw = ["No8", "No8 pan wood", hs_pan, 4.2, 8.2, 3.05, 0, 0
screw_lists = [
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
[ 0, 0, M3_low_cap_screw],
[ 0, 0, M3_shoulder_screw, M4_shoulder_screw],
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw, M5_cs_cap_screw, M6_cs_cap_screw, M8_cs_cap_screw],
[ M2_dome_screw, M2p5_dome_screw,M3_dome_screw, M4_dome_screw, M5_dome_screw],
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],

View File

@@ -19,6 +19,21 @@
//
//! Surface mount components for PCBs.
//!
//! Note that the value string for tantalum capacitors is the the capacitance in pico farads expressed as two digits plus an exponent plus a single letter voltage code.
//! E.g. 475A is 4.7uF 10V on the parts list.
//!
//! | Code | Voltage |
//! | ---- | ------- |
//! | e | 2.5 |
//! | G | 4 |
//! | J | 6.3 |
//! | A | 10 |
//! | C | 16 |
//! | D | 20 |
//! | E | 25 |
//! | V | 35 |
//! | H | 50 |
//
include <../utils/core/core.scad>
@@ -234,6 +249,7 @@ function smd_diode_size(type) = type[1]; //! Body length, width and height
function smd_diode_z(type) = type[2]; //! Height above PCB surface
function smd_diode_lead_z(type) = type[3]; //! Top of lead frame from top
function smd_diode_leads(type) = type[4]; //! Lead extent in x, width, thickness and gap
function smd_diode_colour(type) = type[5]; //! Body colour
module smd_diode(type, value) { //! Draw an SMD diode
vitamin(str("smd_diode(", type[0], "): ", type[0], " package ", value));
@@ -248,7 +264,7 @@ module smd_diode(type, value) { //! Draw an SMD diode
gap = leads[3];
gap2 = gap - leads.z * 2;
color(grey(20))
color(smd_diode_colour(type))
difference() {
hull()
for(z = [z0, z1, z2], inset = abs(z - z1) * tan(slant))
@@ -287,6 +303,75 @@ module smd_diode(type, value) { //! Draw an SMD diode
}
function smd_tant_size(type) = type[1]; //! Body length, width and height
function smd_tant_z(type) = type[2]; //! Height above PCB surface
function smd_tant_lead_z(type) = type[3]; //! Top of lead frame from top
function smd_tant_leads(type) = type[4]; //! Lead extent in x, width, thickness and gap
function smd_tant_colours(type)= type[5]; //! Colours of body and stripe
module smd_tant(type, value) { //! Draw an SMD tantalum capacitor
function dig(c) = let(x = ord(c) - ord("0")) assert(x >= 0 && x <= 9, "expected value in the form 475A for 4.7uF 10V") x;
uF = is_undef(value) ? "" : str(" ,", (dig(value[0]) * 10 + dig(value[1])) * 10 ^ dig(value[2]) / 10^6, "uF");
codes = "eGJACDEVH";
voltages = [2.5, 4, 6.3, 10, 16, 20, 25, 35, 50];
volts = is_undef(value) ? "" : let(c = value[3])
assert(in(codes, c), str("expected the 4th character of value to be a voltage code: ", codes, ", got ", c))
str(", ", voltages[search(c, codes)[0]], "V");
vitamin(str("smd_tant(", type[0], "): SMD Tantalum capacitor package ", type[0][len(type[0]) -1], uF, volts));
size = smd_tant_size(type);
slant = 5; //! 5 degree body draft angle
z0 = smd_tant_z(type);
z2 = z0 + size.z;
z1 = z2 - smd_tant_lead_z(type);
stripe = size.x / 5;
leads = smd_tant_leads(type);
gap = leads[3];
gap2 = gap - leads.z * 2;
colours = smd_tant_colours(type);
inset = (z2 - z1) * tan(slant);
color(colours[0])
difference() {
hull()
for(z = [z0, z1, z2], inset = abs(z - z1) * tan(slant))
translate_z(z)
cube([size.x - 2 * inset, size.y - 2 * inset, eps], center = true);
for(side = [-1, 1])
translate([side * (size.x / 2 - (size.x - gap2) / 4), 0, eps])
cube([(size.x - gap2) / 2, size.y, 3 * leads.z], center = true);
}
color("white") {
w = 0.9 * (size.x - stripe - inset);
translate([-size.x / 2 + inset + stripe + w / 2, 0, z2])
linear_extrude(eps)
resize([w, size.y / 2])
text(value, halign = "center", valign = "center");
}
color(colours[1]) {
translate([-size.x / 2 + stripe * 0.2, -size.y / 2 + inset, z2])
cube([(stripe - inset) * 0.8, size.y - 2 * inset, eps]);
}
color(silver)
translate_z(z1 / 2)
rotate([90, 0, 0])
linear_extrude(leads.y, center = true, convexity = 3) let($fn = 32)
difference() {
rounded_square([leads.x, z1], 2 * leads.z);
rounded_square([leads.x - 2 * leads.z, z1 - 2 * leads.z], leads.z);
translate([0, - z1 / 2])
square([gap, leads.z * 2 + eps], center = true);
}
}
function smd_inductor_size(type) = type[1]; //! Body length, width and height
function smd_inductor_z(type) = type[2]; //! Height above PCB surface
function smd_inductor_lead_z(type) = type[3]; //! Top of lead frame from top
@@ -431,3 +516,65 @@ module smd_pot(type, value) { //! Draw an SMD pot
square([track_w, track_l], center = true);
}
}
function smd_coax_base_size(type) = type[1]; //! Size of the insulating base
function smd_coax_base_r(type) = type[2]; //! Corner radius of the base
function smd_coax_tube(type) = type[3]; //! OD, ID, height
function smd_coax_groove(type) = type[4]; //! Groove id, width and z
function smd_coax_pin_d(type) = type[5]; //! Central pin diameter
function smd_coax_lug_size(type) = type[6]; //! lug size
function smd_contact_size(type) = type[7]; //! contact size
module smd_coax(type) { //! Draw an SMD coaxial connector
vitamin(str("smd_coax(", type[0], "): SMD coax connector type: ", type[0]));
size = smd_coax_base_size(type);
t = smd_coax_tube(type);
g = smd_coax_groove(type);
chamfer = (t.x - g.x) / 2;
pin_r = smd_coax_pin_d(type) / 2;
lug = smd_coax_lug_size(type);
contact = smd_contact_size(type);
$fn = 64;
color(grey(90))
translate_z(eps)
rounded_rectangle(size, smd_coax_base_r(type));
color(gold) {
rotate_extrude() {
polygon([
[t.y / 2, 0.1],
[t.y / 2, t.z],
[g.x / 2, t.z],
[t.x / 2, t.z - chamfer],
[t.x / 2, g.z + g.y / 2 + chamfer],
[g.x / 2, g.z + g.y / 2],
[g.x / 2, g.z - g.y / 2],
[t.x / 2, g.z - g.y / 2 - chamfer],
[t.x / 2, 0.1],
]);
}
hull() {
translate_z(t.z - pin_r)
sphere(pin_r);
translate_z(0.1)
cylinder(r = pin_r, h = eps);
}
for(side = [-1, 1])
translate([side * size.x / 2, 0, lug.z / 2])
cube(lug, center = true);
rotate(180)
translate([-contact.x / 2, 0])
cube([contact.x, contact.y / 2, contact.z]);
cylinder(r = pin_r * 9 / 5, h = 0.1);
tube_wall = (t.x - t.y) / 2;
translate([-contact.x / 2, 0, (size.z - tube_wall) / 2])
cube([contact.x, contact.y / 2, tube_wall]);
}
}

View File

@@ -27,33 +27,43 @@ LED1206 = ["LED1206", [3.2, 1.6, 0.5], [2.0, 1.6, .6]];
smd_leds = [LED0603, LED0805, LED1206];
RES0402 = ["RES0402", [1.0, 0.5, 0.35], 0.2, 1/16];
RES0502 = ["RES0502", [1.3, 0.6, 0.38], 0.2, 1/20];
RES0603 = ["RES0603", [1.6, 0.8, 0.45], 0.3, 1/10];
RES0805 = ["RES0805", [2.0, 1.2, 0.45], 0.4, 1/8];
RES1206 = ["RES1206", [3.1, 1.6, 0.6], 0.5, 1/4];
smd_resistors = [RES0603, RES0805, RES1206];
smd_resistors = [RES0402, RES0502, RES0603, RES0805, RES1206];
CAP0402 = ["CAP0402", [1.0, 0.5], 0.2];
CAP0502 = ["CAP0502", [1.3, 0.6], 0.2];
CAP0603 = ["CAP0603", [1.6, 0.8], 0.3];
CAP0805 = ["CAP0805", [2.0, 1.2], 0.4];
CAP1206 = ["CAP1206", [3.1, 1.6], 0.5];
smd_capacitors = [CAP0603, CAP0805, CAP1206];
smd_capacitors = [CAP0402, CAP0502, CAP0603, CAP0805, CAP1206];
SOT23 = ["SOT23", [3, 1.4, 1.0], 0.05, 0.66, 1.9, 2.6, [0.4, 0.45, 0.15], 0.4];
SOT223 = ["SOT223", [6.5, 3.5, 1.6], 0.05, 0.89, 2.3, 7.0, [0.7, 0.95, 0.25], 3];
smd_sots = [SOT23, SOT223];
SOIC8 = ["SOIC8", [4.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
SOIC14 = ["SOIC14", [8.70, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
SOIC16 = ["SOIC16", [9.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
SOIC8 = ["SOIC8", [4.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
SOIC14 = ["SOIC14", [8.70, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
SOIC16 = ["SOIC16", [9.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
SOIC18 = ["SOIC18", [11.40,7.50, 2.00], 0.10, 1.20, 1.27, 10.30, [0.31, .50, 0.20]];
smd_soics = [SOIC8, SOIC14, SOIC16, SOIC18];
DO241AC = ["DO241AC", [4.0, 2.5, 2.0], 0.1, 1, [4.8, 1.2, 0.15, 2]];
DO214AC = ["DO214AC", [4.0, 2.5, 2.0], 0.1, 1, [4.8, 1.2, 0.15, 2], grey(20)];
smd_diodes = [DO241AC];
smd_diodes = [DO214AC];
TANT_A = ["TANT_A", [3.0, 1.6, 1.6], 0.1, 0.8, [3.2, 1.2, 0.08, 1.1], ["#E9D769", "#E9B44A"]];
TANT_B = ["TANT_B", [3.3, 2.8, 1.9], 0.1, 0.95, [3.5, 2.2, 0.08, 1.4], ["#E9D769", "#E9B44A"]];
TANT_C = ["TANT_C", [5.8, 3.2, 2.6], 0.1, 1.3, [6.0, 2.2, 0.08, 2.9], ["#E9D769", "#E9B44A"]];
smd_tants = [TANT_A, TANT_B, TANT_C];
IND2525 = ["IND2525", [6.75, 6.75, 2], 0.1, 1.75, [7.24, 3.2, 0.15, 4.4], grey(50)];
@@ -63,4 +73,9 @@ TC33X1 = ["TC33X1", [3.0, 3.8, 0.5], [0.95, 0.9, 0.88, 1.5, 0.2, 0.75],[3.0, 0.1
smd_pots = [TC33X1];
U_FL_R_SMT_1 = ["U_FL_R_SMT_1", [2.6, 2.6, 0.35], 0.2, [2, 1.7, 1.25], [1.86, 0.09, 0.6], 0.5, [0.4, 1.8, 0.2], [0.6, 3.1, 0.2]];
smd_coaxs = [U_FL_R_SMT_1];
use <smd.scad>

View File

@@ -19,23 +19,25 @@
//
// Tubing and sleeving
// Description OD ID Colour
PVC64 = ["PVC64", "PVC aquarium tubing", 6, 4, [0.8, 0.8, 0.8, 0.75 ]];
PVC85 = ["PVC85", "PVC aquarium tubing", 8, 5, [0.8, 0.8, 0.8, 0.75 ]];
NEOP85 = ["NEOP85", "Neoprene tubing", 8, 5, [0.2,0.2,0.2]];
PTFE07 = ["PTFE07", "PTFE sleeving", 1.2, 0.71, [0.95, 0.95, 0.95, 0.9]];
PTFE20 = ["PTFE20", "PTFE sleeving", 2.6, 2, [0.95, 0.95, 0.95, 0.9]];
PTFE2_4 = ["PTFE2_4", "PTFE tubing", 4, 2, [0.95, 0.95, 0.95, 0.9]];
PTFE2_3 = ["PTFE2_3", "PTFE tubing", 3, 2, [0.95, 0.95, 0.95, 0.9]];
PTFE4_6 = ["PTFE4_6", "PTFE tubing", 6, 4, [0.95, 0.95, 0.95, 0.9]];
PF7 = ["PF7", "PTFE tubing", 46/10, 3.84, [0.95, 0.95, 0.95, 0.9]];
HSHRNK16 = ["HSHRNK16", "Heatshrink sleeving", 2.0, 1.6, "grey"];
HSHRNK24 = ["HSHRNK24", "Heatshrink sleeving", 2.8, 2.4, "grey"];
HSHRNK32 = ["HSHRNK32", "Heatshrink sleeving", 3.6, 3.2, "grey"];
HSHRNK64 = ["HSHRNK64", "Heatshrink sleeving", 6.8, 6.4, "grey"];
HSHRNK100 = ["HSHRNK100", "Heatshrink sleeving",10.4, 10.0, [0.2,0.2,0.2]];
CARBONFIBER10 = ["CBNFIB10", "Carbon fiber", 10.0, 8.0, [0.3,0.3,0.3]];
// Description OD ID Colour
PVC64 = ["PVC64", "PVC aquarium tubing", 6, 4, [0.8, 0.8, 0.8, 0.75 ]];
PVC85 = ["PVC85", "PVC aquarium tubing", 8, 5, [0.8, 0.8, 0.8, 0.75 ]];
NEOP85 = ["NEOP85", "Neoprene tubing", 8, 5, [0.2,0.2,0.2]];
PTFE07 = ["PTFE07", "PTFE sleeving", 1.2, 0.71, [0.95, 0.95, 0.95, 0.9]];
PTFE20 = ["PTFE20", "PTFE sleeving", 2.6, 2, [0.95, 0.95, 0.95, 0.9]];
PTFE2_4 = ["PTFE2_4", "PTFE tubing", 4, 2, [0.95, 0.95, 0.95, 0.9]];
PTFE2_3 = ["PTFE2_3", "PTFE tubing", 3, 2, [0.95, 0.95, 0.95, 0.9]];
PTFE4_6 = ["PTFE4_6", "PTFE tubing", 6, 4, [0.95, 0.95, 0.95, 0.9]];
PF7 = ["PF7", "PTFE tubing", 46/10, 3.84, [0.95, 0.95, 0.95, 0.9]];
HSHRNK16 = ["HSHRNK16", "Heatshrink sleeving", 2.0, 1.6, "grey"];
HSHRNK24 = ["HSHRNK24", "Heatshrink sleeving", 2.8, 2.4, "grey"];
HSHRNK32 = ["HSHRNK32", "Heatshrink sleeving", 3.6, 3.2, "grey"];
HSHRNK64 = ["HSHRNK64", "Heatshrink sleeving", 6.8, 6.4, "grey"];
HSHRNK100 = ["HSHRNK100", "Heatshrink sleeving", 10.4, 10.0, [0.2,0.2,0.2]];
STFE4_3p2_CLR = ["STFE4_3p2_CLR", "PTFE heatshrink sleeving", 3.7, 3.2, [0.95, 0.95, 0.95, 0.5]];
STFE4_6p4_CLR = ["STFE4_6p4_CLR", "PTFE heatshrink sleeving", 7.0, 6.4, [0.95, 0.95, 0.95, 0.5]];
CARBONFIBER10 = ["CBNFIB10", "Carbon fiber", 10.0, 8.0, [0.3,0.3,0.3]];
tubings = [PVC64, PVC85, NEOP85, PTFE07, PTFE20, PF7, PTFE2_3, PTFE2_4, PTFE4_6, HSHRNK16, HSHRNK24, HSHRNK64, HSHRNK100, CARBONFIBER10];
tubings = [PVC64, PVC85, NEOP85, PTFE07, PTFE20, PF7, PTFE2_3, PTFE2_4, PTFE4_6, HSHRNK16, HSHRNK24, HSHRNK64, HSHRNK100, STFE4_3p2_CLR, STFE4_6p4_CLR, CARBONFIBER10];
use <tubing.scad>

View File

@@ -60,13 +60,14 @@ module solder_meniscus(type, ir = 0.3, r = undef) { //! Draw a solder meniscus
}
}
module vero_grid_pos(type, x, y) { //! Convert grid position to offset from the centre
holes = vero_holes(type);
strips = vero_strips(type);
translate([((x + holes) % holes) - holes / 2 + 0.5,
((y + strips) % strips) - strips / 2 + 0.5] * vero_pitch(type))
function vero_grid_pos(type, x, y) = //! Convert grid position to offset from the centre
let(holes = vero_holes(type), strips = vero_strips(type))
[((x + holes) % holes) - holes / 2 + 0.5,
((y + strips) % strips) - strips / 2 + 0.5] * vero_pitch(type);
module vero_grid_pos(type, x, y) //! Convert grid position to offset from the centre
translate(vero_grid_pos(type, x, y))
children();
}
module vero_mounting_hole_positions(type) //! Positions children at the mounting holes
for(p = vero_mounting_holes(type))
@@ -147,23 +148,25 @@ module vero_components(type, cutouts = false, angle = undef)
module vero_cutouts(type, angle = undef) //! Make cutouts to clear components
vero_components(type, true, angle);
module veroboard_assembly(type, height, thickness, flip = false, ngb = false) //! Draw the assembly with components and fasteners in place
module veroboard_assembly(type, ngb = false) //! Draw the assembly with components
pose_vflip(exploded = true)
assembly(vero_assembly(type), ngb = ngb) {
veroboard(type);
vero_components(type);
for(r = vero_joints(type))
for(x = r.x, y = r.y)
vero_grid_pos(type, x, y)
vflip()
solder_meniscus(type);
}
module veroboard_fasteners(type, height, thickness, flip = false) { //! Draw the fasteners in place
screw = vero_screw(type);
nut = screw_nut(screw);
screw_length = screw_length(screw, height + thickness + vero_thickness(type), 2, nyloc = true);
translate_z(height) {
veroboard(type);
vero_components(type);
for(r = vero_joints(type))
for(x = r.x, y = r.y)
vero_grid_pos(type, x, y)
vflip()
solder_meniscus(type);
}
vero_mounting_hole_positions(type) {
translate_z(height + vero_thickness(type))
if(flip)
@@ -181,3 +184,11 @@ assembly(vero_assembly(type), ngb = ngb) {
nut_and_washer(nut, true);
}
}
module veroboard_fastened_assembly(type, height, thickness, flip = false, ngb = false) { //! Draw the assembly with components and fasteners in place
translate_z(height)
veroboard_assembly(type, ngb = ngb);
veroboard_fasteners(type, height, thickness, flip);
}

View File

@@ -25,8 +25,12 @@ use <../utils/sweep.scad>
use <../utils/maths.scad>
include <zipties.scad>
module wire(colour, strands, length, strand = 0.2) //! Add stranded wire to the BOM
vitamin(str(": Wire ", colour, " ", strands, "/", strand, "mm strands, length ",length, "mm"));
module wire(colour, strands, length, strand = 0.2, d = 0, path = []) { //! Add stranded wire to the BOM and draw it if diameter and path specified
vitamin(str(": Wire ", colour, " ", strands, "/", strand, "mm strands, length ", ceil(length + path_length(path)), "mm"));
if(path && d)
color(colour) sweep(path, circle_points(r = d / 2));
}
module ribbon_cable(ways, length) //! Add ribbon cable to the BOM
vitamin(str(": Ribbon cable ", ways, " way ", length, "mm"));