Compare commits
53 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
bc7f294f99 | ||
|
a974e4fa9d | ||
|
dc1c3f1d5e | ||
|
07866f7284 | ||
|
ad74378e7e | ||
|
53d1ea93cd | ||
|
7eaca85e96 | ||
|
b00709da82 | ||
|
c76be23867 | ||
|
f6f348b76e | ||
|
11a1f65158 | ||
|
870b396574 | ||
|
00c19b08f1 | ||
|
22bbb85899 | ||
|
c1fdb2e701 | ||
|
728d5d32a9 | ||
|
771ba04e18 | ||
|
dbf930fd36 | ||
|
97cea65f41 | ||
|
c7e912cd77 | ||
|
f563645e45 | ||
|
2840cc2390 | ||
|
a5b2018008 | ||
|
cbe2c085b7 | ||
|
7a395e475e | ||
|
7b7348d98f | ||
|
19dadcb58d | ||
|
60a2ef8976 | ||
|
188b3f706d | ||
|
5579c0d988 | ||
|
67408f8422 | ||
|
929abbefda | ||
|
c7727e7106 | ||
|
1dbba5a650 | ||
|
db2a9a8a24 | ||
|
6ced9c871c | ||
|
d6b00fbf57 | ||
|
2c996bb7a1 | ||
|
c565f2912e | ||
|
dbd3004021 | ||
|
fb656c8fad | ||
|
fdb92ec263 | ||
|
cff4c71909 | ||
|
db917ef2bc | ||
|
a2d98f9d3a | ||
|
30c67e742b | ||
|
2506e5aa31 | ||
|
1f313aa4ac | ||
|
63a4271c4c | ||
|
0edf3a2f75 | ||
|
f6404b939f | ||
|
efb1153e22 | ||
|
a3b27a736e |
88
CHANGELOG.md
@@ -3,6 +3,94 @@
|
|||||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||||
|
|
||||||
|
|
||||||
|
#### [v21.24.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.24.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.24.0...v21.24.1 "diff with v21.24.0")
|
||||||
|
* 2024-06-30 [`07866f7`](https://github.com/nophead/NopSCADlib/commit/07866f72845c9e08c90e371c92315bab54f003c6 "show commit") [H.](# "Hermann-SW") Add `PT_camera` to examples and gallery
|
||||||
|
|
||||||
|
### [v21.24.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.24.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.23.2...v21.24.0 "diff with v21.23.2")
|
||||||
|
* 2024-06-30 [`53d1ea9`](https://github.com/nophead/NopSCADlib/commit/53d1ea93cd339d3fb6e085be9314d7ec0b547796 "show commit") [C.P.](# "Chris Palmer") Can now specify a rotation angle for a `geared_stepper's` shaft.
|
||||||
|
|
||||||
|
#### [v21.23.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.23.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.23.1...v21.23.2 "diff with v21.23.1")
|
||||||
|
* 2024-06-12 [`b00709d`](https://github.com/nophead/NopSCADlib/commit/b00709da820e1241422b6e156b0c61157c18d63d "show commit") [C.P.](# "Chris Palmer") Image edge pixel changes due to new PC.
|
||||||
|
|
||||||
|
* 2024-06-12 [`c76be23`](https://github.com/nophead/NopSCADlib/commit/c76be2386715b80bbbc9a71c99214df7f3c71bc7 "show commit") [C.P.](# "Chris Palmer") Fixed thread bug on threaded inserts revealed by latest OpenSCAD snapshot.
|
||||||
|
|
||||||
|
* 2024-06-12 [`f6f348b`](https://github.com/nophead/NopSCADlib/commit/f6f348b76e7986927a571e1c07c3f866bcbeeafe "show commit") [C.P.](# "Chris Palmer") Fixed rocker slot height.
|
||||||
|
|
||||||
|
#### [v21.23.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.23.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.23.0...v21.23.1 "diff with v21.23.0")
|
||||||
|
* 2024-05-08 [`870b396`](https://github.com/nophead/NopSCADlib/commit/870b396574935603305462f1fea88564c909aad8 "show commit") [C.](# "Chris") Revoved strailing comma in `let()` in `splines.scad`.
|
||||||
|
|
||||||
|
### [v21.23.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.23.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.22.0...v21.23.0 "diff with v21.22.0")
|
||||||
|
* 2024-04-21 [`c1fdb2e`](https://github.com/nophead/NopSCADlib/commit/c1fdb2e701672b2404e34f224e77f21fb2ff34da "show commit") [C.P.](# "Chris Palmer") Dpdated images and readme.
|
||||||
|
|
||||||
|
* 2024-04-20 [`cbe2c08`](https://github.com/nophead/NopSCADlib/commit/cbe2c085b72d0e5d9f0c6485d5fa7df0e172a4cc "show commit") [V.](# "V.Shcriabets") Add RCWL-0516 PCB
|
||||||
|
|
||||||
|
### [v21.22.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.22.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.21.0...v21.22.0 "diff with v21.21.0")
|
||||||
|
* 2024-04-21 [`dbf930f`](https://github.com/nophead/NopSCADlib/commit/dbf930fd366c28aa9e581d9fe01e3654b882923a "show commit") [C.P.](# "Chris Palmer") Added cubic splines and Catmull Rom splines.
|
||||||
|
|
||||||
|
### [v21.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.20.0...v21.21.0 "diff with v21.20.0")
|
||||||
|
* 2024-04-21 [`97cea65`](https://github.com/nophead/NopSCADlib/commit/97cea65f41714acd31a3a3b968d8c133ce1a91d2 "show commit") [C.P.](# "Chris Palmer") Cable clips can now use inserts or nut traps.
|
||||||
|
|
||||||
|
### [v21.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.19.2...v21.20.0 "diff with v21.19.2")
|
||||||
|
* 2024-04-21 [`c7e912c`](https://github.com/nophead/NopSCADlib/commit/c7e912cd77e189ef729f94956245f1c6a9f72012 "show commit") [C.P.](# "Chris Palmer") A optional path can now be specified for tubing.
|
||||||
|
|
||||||
|
#### [v21.19.2](https://github.com/nophead/NopSCADlib/releases/tag/v21.19.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.19.1...v21.19.2 "diff with v21.19.1")
|
||||||
|
* 2024-04-21 [`f563645`](https://github.com/nophead/NopSCADlib/commit/f563645e45817a4f89ef3cb1be9d932310c485c6 "show commit") [C.P.](# "Chris Palmer") Corrected M2 `nut_trap_depth,` was too big.
|
||||||
|
|
||||||
|
#### [v21.19.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.19.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.19.0...v21.19.1 "diff with v21.19.0")
|
||||||
|
* 2024-04-21 [`2840cc2`](https://github.com/nophead/NopSCADlib/commit/2840cc2390a8e776add8ca3ef715abfc8d15dadc "show commit") [C.P.](# "Chris Palmer") Washer now uses `sweep.scad` instead of including it, leaking its interface.
|
||||||
|
|
||||||
|
### [v21.19.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.19.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.18.0...v21.19.0 "diff with v21.18.0")
|
||||||
|
* 2024-04-21 [`a5b2018`](https://github.com/nophead/NopSCADlib/commit/a5b20180083ba8d3014bc298cf0e28c20e6be437 "show commit") [C.P.](# "Chris Palmer") Added `offset_paths()` to `sweep.scad`.
|
||||||
|
`show_path()` now takes an optional radius.
|
||||||
|
|
||||||
|
### [v21.18.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.18.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.17.0...v21.18.0 "diff with v21.17.0")
|
||||||
|
* 2024-03-14 [`19dadcb`](https://github.com/nophead/NopSCADlib/commit/19dadcb58db0dd7408726c69d46cf2b7b26c764b "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||||
|
|
||||||
|
* 2024-03-14 [`c565f29`](https://github.com/nophead/NopSCADlib/commit/c565f2912e7319575fc6ec3262699b73305c46b4 "show commit") [V.](# "V.Shkriabets") Update MT3608 pcb module
|
||||||
|
|
||||||
|
### [v21.17.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.17.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.16.1...v21.17.0 "diff with v21.16.1")
|
||||||
|
* 2024-03-14 [`5579c0d`](https://github.com/nophead/NopSCADlib/commit/5579c0d988c6d7983d3884afa7e42fdb283109a8 "show commit") [C.P.](# "Chris Palmer") Fixed `box_shelf_bracket()` horizontal holes.
|
||||||
|
Added a third child to `box_shelf_bracket()` to allow custom additions.
|
||||||
|
|
||||||
|
* 2024-03-14 [`67408f8`](https://github.com/nophead/NopSCADlib/commit/67408f8422918416c617ec7389dbc09b2c62a2ae "show commit") [C.P.](# "Chris Palmer") Added `d_hole()` module.
|
||||||
|
|
||||||
|
* 2024-03-14 [`929abbe`](https://github.com/nophead/NopSCADlib/commit/929abbefda2c380b121c775371f197860c6c3aff "show commit") [C.P.](# "Chris Palmer") Updated front page image.
|
||||||
|
|
||||||
|
* 2024-03-14 [`c7727e7`](https://github.com/nophead/NopSCADlib/commit/c7727e7106e3829a6b5f6c501b1a082d540a4a68 "show commit") [C.P.](# "Chris Palmer") Added Sellotape to sheets.
|
||||||
|
|
||||||
|
* 2024-03-14 [`1dbba5a`](https://github.com/nophead/NopSCADlib/commit/1dbba5a650f8dac2d05a5668008e61a5ec22ea4f "show commit") [C.P.](# "Chris Palmer") Added `camera_lens_height()` function.
|
||||||
|
|
||||||
|
#### [v21.16.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.16.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.16.0...v21.16.1 "diff with v21.16.0")
|
||||||
|
* 2024-03-14 [`db2a9a8`](https://github.com/nophead/NopSCADlib/commit/db2a9a8a24966f098d4c0c8157de98a885b79a85 "show commit") [C.P.](# "Chris Palmer") Ziptie test can now show wires with t `=` 0.
|
||||||
|
|
||||||
|
* 2024-03-14 [`6ced9c8`](https://github.com/nophead/NopSCADlib/commit/6ced9c871c5a637dbe8494836a4233e1f6cd4971 "show commit") [C.P.](# "Chris Palmer") Fixed FOV for ESP32 camera being rotated.
|
||||||
|
Shortened the ESP32 camera header pins.
|
||||||
|
|
||||||
|
* 2024-03-14 [`d6b00fb`](https://github.com/nophead/NopSCADlib/commit/d6b00fbf5719239adc5e8b66f863c003a50806d3 "show commit") [C.P.](# "Chris Palmer") Removed unused test code.
|
||||||
|
|
||||||
|
* 2024-03-14 [`2c996bb`](https://github.com/nophead/NopSCADlib/commit/2c996bb7a143a85c21833a69f56f2f47afabe072 "show commit") [C.P.](# "Chris Palmer") Fixed random error caused by not running bom first.
|
||||||
|
|
||||||
|
### [v21.16.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.16.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.15.0...v21.16.0 "diff with v21.15.0")
|
||||||
|
* 2024-02-19 [`fdb92ec`](https://github.com/nophead/NopSCADlib/commit/fdb92ec263d60a42e04f06abfeec5e1648a12b6b "show commit") [C.P.](# "Chris Palmer") Improved layout to fit into front page view.
|
||||||
|
|
||||||
|
* 2024-02-18 [`f6404b9`](https://github.com/nophead/NopSCADlib/commit/f6404b939f714b3121dc6e9737cc24f3b9c64ebb "show commit") [J.R.](# "Jeroen Roos") Added T-Tracks and accessories
|
||||||
|
|
||||||
|
### [v21.15.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.15.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.14.0...v21.15.0 "diff with v21.14.0")
|
||||||
|
* 2024-02-19 [`30c67e7`](https://github.com/nophead/NopSCADlib/commit/30c67e742bb3603fa41b41e1a144989947e58ad7 "show commit") [C.P.](# "Chris Palmer") Updated the front page image.
|
||||||
|
|
||||||
|
* 2024-02-12 [`efb1153`](https://github.com/nophead/NopSCADlib/commit/efb1153e2245fa67193cd7b49ac0926239c3b703 "show commit") [J.R.](# "Jeroen Roos") Add threaded inserts
|
||||||
|
|
||||||
|
### [v21.14.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.14.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.13.1...v21.14.0 "diff with v21.13.1")
|
||||||
|
* 2024-02-18 [`63a4271`](https://github.com/nophead/NopSCADlib/commit/63a4271c4c1bc97e93e67e8178515be1cfda9e43 "show commit") [C.P.](# "Chris Palmer") Updated libtest image.
|
||||||
|
|
||||||
|
* 2024-02-18 [`0edf3a2`](https://github.com/nophead/NopSCADlib/commit/0edf3a2f75d729aa663836878d278226e7bd8094 "show commit") [C.P.](# "Chris Palmer") Cable clips can now handle up to 9 wires, have the nut and bolt flipped or use an insert.
|
||||||
|
`cable_radius()` now handles cables with up to 20 wires.
|
||||||
|
`cable_bundle()` and `cable_bundle_positions()` now handle bundles up to 9 wires.
|
||||||
|
Added `cable_merge()`.
|
||||||
|
|
||||||
|
#### [v21.13.1](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v21.13.0...v21.13.1 "diff with v21.13.0")
|
||||||
|
* 2024-02-10 [`8540e04`](https://github.com/nophead/NopSCADlib/commit/8540e04a10d83be4ff454fa8999614e5137dd0ab "show commit") [C.P.](# "Chris Palmer") Metal hex pillars now chamfered.
|
||||||
|
|
||||||
### [v21.13.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.12.0...v21.13.0 "diff with v21.12.0")
|
### [v21.13.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.13.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.12.0...v21.13.0 "diff with v21.12.0")
|
||||||
* 2024-02-10 [`7947810`](https://github.com/nophead/NopSCADlib/commit/79478104d6b3a8673ae405606d2576ad98c4e90e "show commit") [C.P.](# "Chris Palmer") Dome option added to nut to draw acorn nuts.
|
* 2024-02-10 [`7947810`](https://github.com/nophead/NopSCADlib/commit/79478104d6b3a8673ae405606d2576ad98c4e90e "show commit") [C.P.](# "Chris Palmer") Dome option added to nut to draw acorn nuts.
|
||||||
Chamfers added to nuts and hex head screws when manifold is used.
|
Chamfers added to nuts and hex head screws when manifold is used.
|
||||||
|
54
examples/PT_camera/PT_camera.scad
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
include <../../vitamins/geared_steppers.scad>
|
||||||
|
include <../../core.scad>
|
||||||
|
include <../../vitamins/cameras.scad>
|
||||||
|
use <../../vitamins/pcb.scad>
|
||||||
|
|
||||||
|
module ptc(ang2) {
|
||||||
|
rotate([180,0,0])
|
||||||
|
union(){
|
||||||
|
geared_stepper(28BYJ_48,ang2);
|
||||||
|
rotate([90,0,180-ang2])
|
||||||
|
translate([9.8,-16.5,1.7])
|
||||||
|
rotate([0,0,90])
|
||||||
|
camera(cameras[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module pt(ang,ang2) {
|
||||||
|
rotate([180,0,0]) geared_stepper(28BYJ_48,ang);
|
||||||
|
rotate([0,0,ang]) rotate([270,0,0]) translate([0,-29.0,-1.5]) ptc(ang2);
|
||||||
|
}
|
||||||
|
|
||||||
|
deg=90;
|
||||||
|
c=90;
|
||||||
|
|
||||||
|
if($t<0.125){
|
||||||
|
a=180+$t/0.125*deg;
|
||||||
|
pt(a,c);
|
||||||
|
}else if ($t<0.25){
|
||||||
|
a=180+deg-($t-0.125)/0.125*deg;
|
||||||
|
pt(a,c);
|
||||||
|
}else if ($t<0.375){
|
||||||
|
b=c+($t-0.25)/0.125*deg;
|
||||||
|
pt(180,b);
|
||||||
|
}else if ($t<0.5){
|
||||||
|
b=c+deg-($t-0.375)/0.125*deg;
|
||||||
|
pt(180,b);
|
||||||
|
}
|
||||||
|
else if($t<0.625){
|
||||||
|
a=180+($t-0.5)/0.125*deg;
|
||||||
|
b=c+deg-90+($t-0.5)/0.125*deg;
|
||||||
|
pt(a,b);
|
||||||
|
}else if ($t<0.75){
|
||||||
|
a=180+deg-($t-0.625)/0.125*deg;
|
||||||
|
b=c+deg-($t-0.625)/0.125*deg;
|
||||||
|
pt(a,b);
|
||||||
|
}else if ($t<0.875){
|
||||||
|
a=180-($t-0.75)/0.125*deg;
|
||||||
|
b=c-($t-0.75)/0.125*deg;
|
||||||
|
pt(a,b);
|
||||||
|
}else{
|
||||||
|
a=90+($t-0.875)/0.125*deg;
|
||||||
|
b=c+deg-180+($t-0.875)/0.125*deg;
|
||||||
|
pt(a,b);
|
||||||
|
}
|
BIN
gallery/PT_camera.anim.gif
Normal file
After Width: | Height: | Size: 1.5 MiB |
@@ -106,6 +106,10 @@ A base and shroud to make PSU safe to sit on a desk
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## PT_camera
|
||||||
|
Two 28BYJ_48 geared stepper motors and a Raspberry v1 camera, combined with [4 drops of superglue](https://forums.raspberrypi.com/viewtopic.php?p=1810000#p1810000). Script [PT_camera.scad](../examples/PT_camera/PT_camera.scad) nicely demonstrates new 2nd optional arg (motor shaft angle) of ```geared_stepper()```.
|
||||||
|

|
||||||
|
|
||||||
## PotBox
|
## PotBox
|
||||||
Potentiometer box with course and fine controls and three 4mm binding posts
|
Potentiometer box with course and fine controls and three 4mm binding posts
|
||||||
|
|
||||||
|
1
lib.scad
@@ -97,6 +97,7 @@ use <utils/hanging_hole.scad>
|
|||||||
use <utils/fillet.scad>
|
use <utils/fillet.scad>
|
||||||
use <utils/rounded_polygon.scad>
|
use <utils/rounded_polygon.scad>
|
||||||
use <utils/rounded_triangle.scad>
|
use <utils/rounded_triangle.scad>
|
||||||
|
use <utils/splines.scad>
|
||||||
use <utils/layout.scad>
|
use <utils/layout.scad>
|
||||||
use <utils/round.scad>
|
use <utils/round.scad>
|
||||||
use <utils/offset.scad>
|
use <utils/offset.scad>
|
||||||
|
BIN
libtest.png
Before Width: | Height: | Size: 977 KiB After Width: | Height: | Size: 1002 KiB |
18
libtest.scad
@@ -112,6 +112,7 @@ use <tests/stepper_motors.scad>
|
|||||||
use <tests/Swiss_clips.scad>
|
use <tests/Swiss_clips.scad>
|
||||||
use <tests/toggles.scad>
|
use <tests/toggles.scad>
|
||||||
use <tests/transformers.scad>
|
use <tests/transformers.scad>
|
||||||
|
use <tests/ttracks.scad>
|
||||||
use <tests/tubings.scad>
|
use <tests/tubings.scad>
|
||||||
use <tests/veroboard.scad>
|
use <tests/veroboard.scad>
|
||||||
use <tests/washers.scad>
|
use <tests/washers.scad>
|
||||||
@@ -220,15 +221,12 @@ translate([950, box_y])
|
|||||||
box_test();
|
box_test();
|
||||||
|
|
||||||
|
|
||||||
translate([950, 1525])
|
|
||||||
rotate(-90)
|
|
||||||
bbox_test();
|
|
||||||
|
|
||||||
inserts_y = 0;
|
inserts_y = 0;
|
||||||
nuts_y = inserts_y + 20;
|
nuts_y = inserts_y + 20;
|
||||||
washers_y = nuts_y + 140;
|
washers_y = nuts_y + 140;
|
||||||
screws_y = washers_y + 120;
|
screws_y = washers_y + 120;
|
||||||
circlips_y = screws_y + 180;
|
threaded_inserts_y = screws_y + 180;
|
||||||
|
circlips_y = threaded_inserts_y + 30;
|
||||||
springs_y = circlips_y + 20;
|
springs_y = circlips_y + 20;
|
||||||
o_rings_y = springs_y;
|
o_rings_y = springs_y;
|
||||||
sealing_strip_y = springs_y + 20;
|
sealing_strip_y = springs_y + 20;
|
||||||
@@ -246,6 +244,10 @@ fans_y = displays_y + 110;
|
|||||||
transformers_y = fans_y + 120;
|
transformers_y = fans_y + 120;
|
||||||
psus_y = transformers_y + 190;
|
psus_y = transformers_y + 190;
|
||||||
|
|
||||||
|
ttracks_y = pcbs_y + 150;
|
||||||
|
translate([840, ttracks_y])
|
||||||
|
ttracks();
|
||||||
|
|
||||||
translate([x0 + 35, inserts_y])
|
translate([x0 + 35, inserts_y])
|
||||||
inserts();
|
inserts();
|
||||||
|
|
||||||
@@ -258,6 +260,9 @@ translate([x0, nuts_y])
|
|||||||
translate([x0, washers_y])
|
translate([x0, washers_y])
|
||||||
washers();
|
washers();
|
||||||
|
|
||||||
|
translate([x0, threaded_inserts_y])
|
||||||
|
threaded_inserts();
|
||||||
|
|
||||||
translate([x0, screws_y])
|
translate([x0, screws_y])
|
||||||
screws();
|
screws();
|
||||||
|
|
||||||
@@ -467,6 +472,9 @@ translate([370, transformers_y])
|
|||||||
translate([x4, transformers_y])
|
translate([x4, transformers_y])
|
||||||
no_explode() socket_boxes();
|
no_explode() socket_boxes();
|
||||||
|
|
||||||
|
translate([950, transformers_y + 110])
|
||||||
|
rotate(-90)
|
||||||
|
bbox_test();
|
||||||
|
|
||||||
belts_y = 0;
|
belts_y = 0;
|
||||||
rails_y = belts_y + 200;
|
rails_y = belts_y + 200;
|
||||||
|
@@ -494,7 +494,8 @@ module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = un
|
|||||||
for(p = screw_positions)
|
for(p = screw_positions)
|
||||||
multmatrix(p)
|
multmatrix(p)
|
||||||
translate_z(thickness)
|
translate_z(thickness)
|
||||||
children();
|
let($horizontal = true)
|
||||||
|
children();
|
||||||
|
|
||||||
r = box_boss_r(type);
|
r = box_boss_r(type);
|
||||||
inset = box_intrusion(type) - r + (r + insert_boss_radius(insert, w) + bezel_clearance / 2) / sqrt(2);
|
inset = box_intrusion(type) - r + (r + insert_boss_radius(insert, w) + bezel_clearance / 2) / sqrt(2);
|
||||||
@@ -503,10 +504,11 @@ module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = un
|
|||||||
for(x = [-1, 1], y = [-1, 1])
|
for(x = [-1, 1], y = [-1, 1])
|
||||||
translate([x * (box_width(type) / 2 - inset), y * (box_depth(type) / 2 - inset)])
|
translate([x * (box_width(type) / 2 - inset), y * (box_depth(type) / 2 - inset)])
|
||||||
rotate(45 * x * (2 + y))
|
rotate(45 * x * (2 + y))
|
||||||
children();
|
let($horizontal = false)
|
||||||
|
children();
|
||||||
}
|
}
|
||||||
|
|
||||||
module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts
|
module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts, third child is 3D additions.
|
||||||
w = is_undef(wall) ? box_wall(type) : wall;
|
w = is_undef(wall) ? box_wall(type) : wall;
|
||||||
insert = box_shelf_insert(type);
|
insert = box_shelf_insert(type);
|
||||||
lip = 2 * insert_boss_radius(insert, w);
|
lip = 2 * insert_boss_radius(insert, w);
|
||||||
@@ -561,9 +563,13 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
|
|||||||
children(0);
|
children(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
hflip()
|
hflip() {
|
||||||
box_shelf_screw_positions(type, screw_positions, 0, w)
|
box_shelf_screw_positions(type, screw_positions, 0, w)
|
||||||
boss();
|
boss();
|
||||||
|
|
||||||
|
if($children > 2)
|
||||||
|
children(2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if($children > 1)
|
if($children > 1)
|
||||||
hflip()
|
hflip()
|
||||||
@@ -571,7 +577,7 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
|
|||||||
|
|
||||||
hflip()
|
hflip()
|
||||||
box_shelf_screw_positions(type, screw_positions, 0, w)
|
box_shelf_screw_positions(type, screw_positions, 0, w)
|
||||||
insert_hole(insert, counterbore = 1, horizontal = true);
|
insert_hole(insert, counterbore = 1, horizontal = $horizontal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,100 +18,137 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
//! Cable clips to order. Can be for one or two cables of different sizes.
|
//! Cable clips to order. Can be for one or two cables of different sizes. Can use an insert and a screw from below or a screw and nut, nyloc or plain, either way up.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../vitamins/wire.scad>
|
use <../vitamins/wire.scad>
|
||||||
use <../utils/fillet.scad>
|
use <../utils/fillet.scad>
|
||||||
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
wall = 2;
|
wall = 2;
|
||||||
|
|
||||||
function cable_clip_width(screw) = max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw))); //! Width given the `screw`.
|
function cable_clip_insert(screw, insert = true) = //! Insert type for clip, given screw.
|
||||||
function cable_clip_height(cable) = cable_height(cable) + wall; //! Height given the `cable`.
|
is_list(insert) ? insert : insert ? screw_insert(screw, true) : false;
|
||||||
function cable_clip_extent(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) + wall; //! How far it extends from the screw.
|
|
||||||
function cable_clip_offset(screw, cable) = screw_clearance_radius(screw) + wall + cable_width(cable) / 2; //! The offset of the cable from the screw
|
|
||||||
|
|
||||||
module single_cable_clip(screw, cable, h = 0) {
|
function cable_clip_width(screw, insert = false, nut = false) = //! Width given the `screw` and possibly insert or nut.
|
||||||
screw_dia = 2 * screw_clearance_radius(screw);
|
let(insert = cable_clip_insert(screw, insert))
|
||||||
height = cable_clip_width(screw);
|
insert ? 2 * (insert_hole_radius(insert) + wall) :
|
||||||
depth = h ? h : cable_height(cable) + wall;
|
nut ? 2 * (nut_radius(screw_nut(screw)) + wall) :
|
||||||
|
max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw)));
|
||||||
|
|
||||||
|
function cable_clip_height(cable, screw = false, insert = false, nut = false) = //! Height given the `cable`.
|
||||||
|
let(insert = cable_clip_insert(screw, insert))
|
||||||
|
max(cable_height(cable) + wall, insert ? insert_hole_length(insert) + 1 : 0, nut ? nut_trap_depth(screw_nut(screw)) + wall : 0);
|
||||||
|
|
||||||
|
function cable_clip_extent(screw, cable, insert = false, nut = false) = cable_clip_width(screw, insert, nut) / 2 + cable_width(cable) + wall; //! How far it extends from the screw.
|
||||||
|
function cable_clip_offset(screw, cable, insert = false, nut = false) = cable_clip_width(screw, insert, nut) / 2 + cable_width(cable) / 2; //! The offset of the cable from the screw.
|
||||||
|
|
||||||
|
module single_cable_clip(screw, cable, h = 0, insert = false, nut = false) {
|
||||||
|
insert = cable_clip_insert(screw, insert);
|
||||||
|
height = cable_clip_width(screw, insert, nut);
|
||||||
|
depth = h ? h : cable_clip_height(cable, screw, insert, nut);
|
||||||
w = cable_width(cable);
|
w = cable_width(cable);
|
||||||
width = wall + w + wall + screw_dia + wall;
|
width = wall + w + height;
|
||||||
hole_x = wall + w + wall + screw_dia / 2;
|
hole_x = wall + w + height / 2;
|
||||||
rad = min(wall + cable_wire_size(cable) / 2, depth / 2);
|
rad = min(wall + cable_wire_size(cable) / 2, depth / 2);
|
||||||
r = extrusion_width - eps;
|
r = extrusion_width - eps;
|
||||||
translate([-hole_x, 0]) difference() {
|
the_nut = screw_nut(screw);
|
||||||
linear_extrude(height)
|
translate([-hole_x, 0])
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
linear_extrude(height)
|
||||||
rounded_square([width, 1], r, center = false);
|
difference() {
|
||||||
|
|
||||||
translate([width - 1, 0])
|
|
||||||
rounded_square([1, depth], r, center = false);
|
|
||||||
|
|
||||||
translate([rad, depth - rad])
|
|
||||||
circle(r = rad);
|
|
||||||
}
|
|
||||||
|
|
||||||
translate([wall + cable_width(cable) / 2, 0]) {
|
|
||||||
hull() {
|
hull() {
|
||||||
for(p = cable_bundle_positions(cable))
|
rounded_square([width, 1], r, center = false);
|
||||||
translate(p)
|
|
||||||
circle(d = cable_wire_size(cable));
|
|
||||||
|
|
||||||
square([w, eps], center = true);
|
translate([width - 1, 0])
|
||||||
|
rounded_square([1, depth], r, center = false);
|
||||||
|
|
||||||
|
translate([rad, depth - rad])
|
||||||
|
circle(r = rad);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([wall + cable_width(cable) / 2, 0]) {
|
||||||
|
hull() {
|
||||||
|
for(p = cable_bundle_positions(cable))
|
||||||
|
translate(p)
|
||||||
|
circle(d = cable_wire_size(cable));
|
||||||
|
|
||||||
|
square([w, eps], center = true);
|
||||||
|
}
|
||||||
|
for(side = [-1, 1])
|
||||||
|
translate([side * w / 2, 0])
|
||||||
|
hflip(side < 0)
|
||||||
|
fillet(r = r, h = 0);
|
||||||
}
|
}
|
||||||
for(side = [-1, 1])
|
|
||||||
translate([side * w / 2, 0])
|
|
||||||
hflip(side < 0)
|
|
||||||
fillet(r = r, h = 0);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
translate([hole_x, depth / 2, height / 2])
|
translate([hole_x, depth, height / 2])
|
||||||
rotate([90,0,0])
|
rotate([90, 0, 0])
|
||||||
teardrop_plus(h = depth + 1, r = screw_dia / 2, center = true);
|
if(insert)
|
||||||
}
|
insert_hole(insert, 10, horizontal = true);
|
||||||
|
else
|
||||||
|
if(nut) {
|
||||||
|
translate_z(depth - wall - nut_trap_depth(the_nut))
|
||||||
|
nut_trap(screw, the_nut, horizontal = true);
|
||||||
|
nut_trap(screw, the_nut, horizontal = true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
teardrop_plus(h = 2 * depth + 1, r = screw_clearance_radius(screw), center = true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
module double_cable_clip(screw, cable1, cable2) {
|
module double_cable_clip(screw, cable1, cable2, insert = false, nut = false) {
|
||||||
h = max(cable_clip_height(cable1), cable_clip_height(cable2));
|
h = max(cable_clip_height(cable1, screw, insert, nut), cable_clip_height(cable2, screw, insert, nut));
|
||||||
union() {
|
union() {
|
||||||
single_cable_clip(screw, cable1, h);
|
single_cable_clip(screw, cable1, h, insert, nut);
|
||||||
|
|
||||||
mirror([1,0,0]) single_cable_clip(screw, cable2, h);
|
mirror([1,0,0]) single_cable_clip(screw, cable2, h, insert, nut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module cable_clip(screw, cable1, cable2 = 0) { //! Create the STL for a single cable or two cable clip
|
module cable_clip(screw, cable1, cable2 = 0, insert = false, nut = false) { //! Create the STL for a single cable or two cable clip
|
||||||
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20);
|
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20, insert ? "I" : nut ? "N" : "");
|
||||||
function cable_str(cable) = str("_", cable_wires(cable), "_", round(cable_wire_size(cable) * 10));
|
function cable_str(cable) = str("_", cable_wires(cable), "_", round(cable_wire_size(cable) * 10));
|
||||||
|
assert(!(insert && nut), "insert and nut mutually exclusive");
|
||||||
if(cable2) {
|
if(cable2)
|
||||||
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)));
|
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)))
|
||||||
|
double_cable_clip(screw, cable1, cable2, insert, nut);
|
||||||
double_cable_clip(screw, cable1, cable2);
|
else
|
||||||
}
|
stl(str(clip_str(screw), cable_str(cable1)))
|
||||||
else {
|
single_cable_clip(screw, cable1, h = 0, insert = insert, nut = nut);
|
||||||
stl(str(clip_str(screw), cable_str(cable1)));
|
|
||||||
|
|
||||||
single_cable_clip(screw, cable1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false, nut = false, nyloc = true) { //! Cable clip with the fasteners
|
||||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0) { //! Cable clip with the fasteners
|
flip = flip || insert || nut; // Screw must be below if using an insert or nut
|
||||||
height = max(cable_clip_height(cable1), cable2 ? cable_clip_height(cable2) : 0);
|
insert = cable_clip_insert(screw, insert);
|
||||||
|
height = max(cable_clip_height(cable1, screw, insert, nut), cable2 ? cable_clip_height(cable2, screw, insert, nut) : 0);
|
||||||
|
|
||||||
stl_colour(pp1_colour) render()
|
stl_colour(pp1_colour) render()
|
||||||
translate([0, cable_clip_width(screw) / 2]) rotate([90, 0, 0])
|
translate([0, cable_clip_width(screw, insert, nut) / 2])
|
||||||
cable_clip(screw, cable1, cable2);
|
rotate([90, 0, 0])
|
||||||
|
cable_clip(screw, cable1, cable2, insert, nut);
|
||||||
|
|
||||||
|
the_nut = screw_nut(screw);
|
||||||
|
screw_len = nut ? screw_length(screw, thickness + wall, nyloc ? 1 : 2, nyloc = nyloc, nut = !nyloc)
|
||||||
|
: screw_length(screw, thickness + height, 2, nut = !nyloc && !insert, nyloc = !insert && nyloc, insert = insert);
|
||||||
translate_z(height)
|
translate_z(height)
|
||||||
screw_and_washer(screw, screw_length(screw, height + thickness, 2, nyloc = true));
|
if(flip)
|
||||||
|
if(insert)
|
||||||
|
insert(insert);
|
||||||
|
else
|
||||||
|
if(nut)
|
||||||
|
translate_z(-height + wall)
|
||||||
|
nut(the_nut, nyloc);
|
||||||
|
else
|
||||||
|
nut_and_washer(the_nut, nyloc);
|
||||||
|
else
|
||||||
|
screw_and_washer(screw, screw_len);
|
||||||
|
|
||||||
translate_z(-thickness)
|
translate_z(-thickness)
|
||||||
vflip()
|
vflip()
|
||||||
nut_and_washer(screw_nut(screw), true);
|
if(flip)
|
||||||
|
screw_and_washer(screw, screw_len, insert || !nyloc);
|
||||||
|
else
|
||||||
|
nut_and_washer(the_nut, nyloc);
|
||||||
}
|
}
|
||||||
|
@@ -383,9 +383,3 @@ module camera_housing(cam) {
|
|||||||
rotate(90)
|
rotate(90)
|
||||||
camera_bracket(cam);
|
camera_bracket(cam);
|
||||||
}
|
}
|
||||||
|
|
||||||
cam = rpi_camera_v2;
|
|
||||||
if($preview)
|
|
||||||
camera_fastened_assembly(cam, 3);
|
|
||||||
else
|
|
||||||
camera_housing(cam);
|
|
||||||
|
306
readme.md
@@ -40,16 +40,16 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
|||||||
<tr><td> <a href = "#dip">DIP</a> </td><td> <a href = "#opengrab">Opengrab</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#led_bezel">LED_bezel</a> </td><td> <a href = "#rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
<tr><td> <a href = "#dip">DIP</a> </td><td> <a href = "#opengrab">Opengrab</a> </td><td> <a href = "#springs">Springs</a> </td><td> <a href = "#led_bezel">LED_bezel</a> </td><td> <a href = "#rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#d_connectors">D_connectors</a> </td><td> <a href = "#pcb">PCB</a> </td><td> <a href = "#stepper_motors">Stepper_motors</a> </td><td> <a href = "#pcb_mount">PCB_mount</a> </td><td> <a href = "#rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
<tr><td> <a href = "#d_connectors">D_connectors</a> </td><td> <a href = "#pcb">PCB</a> </td><td> <a href = "#stepper_motors">Stepper_motors</a> </td><td> <a href = "#pcb_mount">PCB_mount</a> </td><td> <a href = "#rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#displays">Displays</a> </td><td> <a href = "#pcbs">PCBs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#psu_shroud">PSU_shroud</a> </td><td> <a href = "#sector">Sector</a> </td><td></td></tr>
|
<tr><td> <a href = "#displays">Displays</a> </td><td> <a href = "#pcbs">PCBs</a> </td><td> <a href = "#swiss_clips">Swiss_clips</a> </td><td> <a href = "#psu_shroud">PSU_shroud</a> </td><td> <a href = "#sector">Sector</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#psus">PSUs</a> </td><td> <a href = "#terminals">Terminals</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
|
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#psus">PSUs</a> </td><td> <a href = "#terminals">Terminals</a> </td><td> <a href = "#pocket_handle">Pocket_handle</a> </td><td> <a href = "#splines">Splines</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#toggles">Toggles</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#thread">Thread</a> </td><td></td></tr>
|
<tr><td> <a href = "#extrusions">Extrusions</a> </td><td> <a href = "#panel_meters">Panel_meters</a> </td><td> <a href = "#toggles">Toggles</a> </td><td> <a href = "#press_fit">Press_fit</a> </td><td> <a href = "#sweep">Sweep</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#transformers">Transformers</a> </td><td> <a href = "#printed_box">Printed_box</a> </td><td> <a href = "#tube">Tube</a> </td><td></td></tr>
|
<tr><td> <a href = "#fans">Fans</a> </td><td> <a href = "#photo_interrupters">Photo_interrupters</a> </td><td> <a href = "#transformers">Transformers</a> </td><td> <a href = "#printed_box">Printed_box</a> </td><td> <a href = "#thread">Thread</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#tubings">Tubings</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#fastons">Fastons</a> </td><td> <a href = "#pillars">Pillars</a> </td><td> <a href = "#ttracks">Ttracks</a> </td><td> <a href = "#printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#tube">Tube</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#variacs">Variacs</a> </td><td> <a href = "#ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#fuseholder">Fuseholder</a> </td><td> <a href = "#pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#tubings">Tubings</a> </td><td> <a href = "#ribbon_clamp">Ribbon_clamp</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</a> </td><td> <a href = "#veroboard">Veroboard</a> </td><td> <a href = "#ssr_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#gear_motors">Gear_motors</a> </td><td> <a href = "#pin_headers">Pin_headers</a> </td><td> <a href = "#variacs">Variacs</a> </td><td> <a href = "#ssr_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</a> </td><td> <a href = "#washers">Washers</a> </td><td> <a href = "#screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#geared_steppers">Geared_steppers</a> </td><td> <a href = "#potentiometers">Potentiometers</a> </td><td> <a href = "#veroboard">Veroboard</a> </td><td> <a href = "#screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</a> </td><td> <a href = "#wire">Wire</a> </td><td> <a href = "#socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#green_terminals">Green_terminals</a> </td><td> <a href = "#pulleys">Pulleys</a> </td><td> <a href = "#washers">Washers</a> </td><td> <a href = "#socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#zipties">Zipties</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#hot_ends">Hot_ends</a> </td><td></td><td> <a href = "#wire">Wire</a> </td><td> <a href = "#strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#hygrometer">Hygrometer</a> </td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#hygrometer">Hygrometer</a> </td><td></td><td> <a href = "#zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -779,6 +779,11 @@ PCB cameras.
|
|||||||
| `camera_lens_offset(type)` | Offset of the lens center from the PCB centre |
|
| `camera_lens_offset(type)` | Offset of the lens center from the PCB centre |
|
||||||
| `camera_pcb(type)` | The PCB part of the camera |
|
| `camera_pcb(type)` | The PCB part of the camera |
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `camera_lens_height(type)` | The height of the lens stack |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
@@ -982,6 +987,7 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
|
|||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `d_connector_holes(type)` | Place children at the screw hole positions |
|
| `d_connector_holes(type)` | Place children at the screw hole positions |
|
||||||
|
| `d_hole(type, h = 0, center = true, clearance = 0.2)` | Make a hole to clear the back of d-connector |
|
||||||
| `d_pillar()` | Draw a pillar for a D-connector |
|
| `d_pillar()` | Draw a pillar for a D-connector |
|
||||||
| `d_plug(type, socket = false, pcb = false, idc = false)` | Draw specified D plug, which can be IDC, PCB or plain solder bucket |
|
| `d_plug(type, socket = false, pcb = false, idc = false)` | Draw specified D plug, which can be IDC, PCB or plain solder bucket |
|
||||||
| `d_plug_D(length, width, rad)` | D plug D shape |
|
| `d_plug_D(length, width, rad)` | D plug D shape |
|
||||||
@@ -1453,7 +1459,7 @@ Geared tin can steppers
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `geared_stepper(type)` | Draw the specified geared stepper |
|
| `geared_stepper(type, angle = 0)` | Draw the specified geared stepper with optional shaft angle. |
|
||||||
| `geared_stepper_screw_positions(type)` | Place children at the screw positions |
|
| `geared_stepper_screw_positions(type)` | Place children at the screw positions |
|
||||||
|
|
||||||

|

|
||||||
@@ -1703,6 +1709,8 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
|||||||
| `insert_ring2_d(type)` | Diameter of the middle ring |
|
| `insert_ring2_d(type)` | Diameter of the middle ring |
|
||||||
| `insert_ring3_d(type)` | Diameter of the bottom ring |
|
| `insert_ring3_d(type)` | Diameter of the bottom ring |
|
||||||
| `insert_screw_diameter(type)` | Screw size |
|
| `insert_screw_diameter(type)` | Screw size |
|
||||||
|
| `threaded_insert_chamfer(type)` | Size of the chamfer for threaded inserts |
|
||||||
|
| `threaded_insert_pitch(type)` | Pitch of the outer thread for threaded inserts |
|
||||||
|
|
||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -1718,6 +1726,7 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
|||||||
| `insert_boss(type, z, wall = 2 * extrusion_width)` | Make a boss to take an insert |
|
| `insert_boss(type, z, wall = 2 * extrusion_width)` | Make a boss to take an insert |
|
||||||
| `insert_hole(type, counterbore = 0, horizontal = false)` | Make a hole to take an insert, `counterbore` is the extra length for the screw |
|
| `insert_hole(type, counterbore = 0, horizontal = false)` | Make a hole to take an insert, `counterbore` is the extra length for the screw |
|
||||||
| `insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, flying = true)` | Make a flying insert lug, see [ssr_shroud](#Ssr_shroud) |
|
| `insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, flying = true)` | Make a flying insert lug, see [ssr_shroud](#Ssr_shroud) |
|
||||||
|
| `threaded_insert(type)` | Draw specified threaded insert, for use in wood |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -1732,6 +1741,14 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
|||||||
| 1 | `insert(CNCKM4)` | Heatfit insert M4 x 4mm |
|
| 1 | `insert(CNCKM4)` | Heatfit insert M4 x 4mm |
|
||||||
| 1 | `insert(F1BM4)` | Heatfit insert M4 x 8.2mm |
|
| 1 | `insert(F1BM4)` | Heatfit insert M4 x 8.2mm |
|
||||||
| 2 | `insert(CNCKM5)` | Heatfit insert M5 x 5.8mm |
|
| 2 | `insert(CNCKM5)` | Heatfit insert M5 x 5.8mm |
|
||||||
|
| 1 | `threaded_insert(M10x25)` | Threaded insert M10 x 25mm |
|
||||||
|
| 1 | `threaded_insert(M12x30)` | Threaded insert M12 x 30mm |
|
||||||
|
| 1 | `threaded_insert(M16x30)` | Threaded insert M16 x 30mm |
|
||||||
|
| 1 | `threaded_insert(M3x8)` | Threaded insert M3 x 8mm |
|
||||||
|
| 1 | `threaded_insert(M4x10)` | Threaded insert M4 x 10mm |
|
||||||
|
| 1 | `threaded_insert(M5x12)` | Threaded insert M5 x 12mm |
|
||||||
|
| 1 | `threaded_insert(M6x15)` | Threaded insert M6 x 15mm |
|
||||||
|
| 1 | `threaded_insert(M8x18)` | Threaded insert M8 x 18mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -2651,6 +2668,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 1 | `potentiometer(BTT_encoder)` | BTT_encoder |
|
| 1 | `potentiometer(BTT_encoder)` | BTT_encoder |
|
||||||
| 1 | `box_header(2p54header, 4, 2)` | Box header 4 x 2 |
|
| 1 | `box_header(2p54header, 4, 2)` | Box header 4 x 2 |
|
||||||
| 1 | `box_header(2p54header, 4, 2, right_angle = true)` | Box header 4 x 2 right angle |
|
| 1 | `box_header(2p54header, 4, 2, right_angle = true)` | Box header 4 x 2 right angle |
|
||||||
|
| 1 | `rd_disc(6p4mm_disc, "100n")` | Ceramic capacitor, 6p4mm_disc 100n |
|
||||||
| 1 | `rd_xtal(ACT1100, "40MHz")` | Crystal ACT1100 40MHz |
|
| 1 | `rd_xtal(ACT1100, "40MHz")` | Crystal ACT1100 40MHz |
|
||||||
| 1 | `rd_xtal(ACT1700, "80MHz")` | Crystal ACT1700 80MHz |
|
| 1 | `rd_xtal(ACT1700, "80MHz")` | Crystal ACT1700 80MHz |
|
||||||
| 1 | `rd_xtal(C_002RX, "60KHz")` | Crystal C_002RX 60KHz |
|
| 1 | `rd_xtal(C_002RX, "60KHz")` | Crystal C_002RX 60KHz |
|
||||||
@@ -2658,14 +2676,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 | `rd_xtal(HC49_4H, "10MHz")` | Crystal HC49_4H 10MHz |
|
||||||
| 1 | `d_plug(DCONN9, pcb = true)` | D-type 9 way PCB mount plug |
|
| 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 | `dil_socket(12, 15.24)` | DIL socket 24 x 0.6" |
|
||||||
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
|
| 1 | `smd_diode(DO214AC, "SS34")` | DO214AC package SS34 |
|
||||||
| 2 | `ax_diode(DO_41, "1N4007")` | Diode 1N4007 |
|
| 2 | `ax_diode(DO_41, "1N4007")` | Diode 1N4007 |
|
||||||
| 2 | `ax_diode(DO_35, "1N4148")` | Diode 1N4148 |
|
| 2 | `ax_diode(DO_35, "1N4148")` | Diode 1N4148 |
|
||||||
|
| 1 | `rd_electrolytic(ECAP8x12, "220uF35V")` | Electolytic capacitor ECAP8x12 220uF35V |
|
||||||
| 1 | `hdmi(hdmi_full)` | HDMI socket |
|
| 1 | `hdmi(hdmi_full)` | HDMI socket |
|
||||||
| 1 | `pdip(24, 27C32, w = 15.24)` | IC 27C32 PDIP24 |
|
| 1 | `pdip(24, 27C32, w = 15.24)` | IC 27C32 PDIP24 |
|
||||||
| 1 | `pdip(8, NE555)` | IC NE555 PDIP8 |
|
| 1 | `pdip(8, NE555)` | IC NE555 PDIP8 |
|
||||||
| 1 | `idc_transition(2p54header, 5)` | IDC transition header 5 x 2 |
|
| 1 | `idc_transition(2p54header, 5)` | IDC transition header 5 x 2 |
|
||||||
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
|
| 1 | `smd_inductor(IND2525 ,"4R7")` | IND2525 package 4R7 |
|
||||||
| 1 | `jst_xh_header(jst_ph_header, 2)` | JST PH connector 2 way |
|
| 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_xh_header, 2)` | JST XH connector 2 way |
|
||||||
| 1 | `jst_xh_header(jst_zh_header, 2)` | JST ZH connector 2 way |
|
| 1 | `jst_xh_header(jst_zh_header, 2)` | JST ZH connector 2 way |
|
||||||
@@ -2686,40 +2705,42 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 1 | `pin_socket(2p54header, 6, 1)` | Pin socket 6 x 1 |
|
| 1 | `pin_socket(2p54header, 6, 1)` | Pin socket 6 x 1 |
|
||||||
| 2 | `pin_socket(2p54header, 8, 1)` | Pin socket 8 x 1 |
|
| 2 | `pin_socket(2p54header, 8, 1)` | Pin socket 8 x 1 |
|
||||||
| 1 | `rd_transistor(TO92, "78L05")` | Regulator TO92 78L05 |
|
| 1 | `rd_transistor(TO92, "78L05")` | Regulator TO92 78L05 |
|
||||||
|
| 1 | `rd_module(HF33F, "012-HSL-3F")` | Relay HF33F / 012-HSL-3F |
|
||||||
| 1 | `ax_res(res1_2, 10, tol = 10)` | Resistor 10 Ohms 10% 0.5W |
|
| 1 | `ax_res(res1_2, 10, tol = 10)` | Resistor 10 Ohms 10% 0.5W |
|
||||||
| 1 | `ax_res(res1_4, 100, tol = 2)` | Resistor 100 Ohms 2% 0.25W |
|
| 1 | `ax_res(res1_4, 100, tol = 2)` | Resistor 100 Ohms 2% 0.25W |
|
||||||
| 1 | `ax_res(res1_8, 1000)` | Resistor 1000 Ohms 5% 0.125W |
|
| 1 | `ax_res(res1_8, 1000)` | Resistor 1000 Ohms 5% 0.125W |
|
||||||
| 1 | `ax_res(res1_4, 10000)` | Resistor 10000 Ohms 5% 0.25W |
|
| 1 | `ax_res(res1_4, 10000)` | Resistor 10000 Ohms 5% 0.25W |
|
||||||
| 1 | `ax_res(res1_2, 100000)` | Resistor 100000 Ohms 5% 0.5W |
|
| 1 | `ax_res(res1_2, 100000)` | Resistor 100000 Ohms 5% 0.5W |
|
||||||
| 1 | `ax_res(res1_8, 1e+6, tol = 1)` | Resistor 1e+6 Ohms 1% 0.125W |
|
| 1 | `ax_res(res1_8, 1e+6, tol = 1)` | Resistor 1e+6 Ohms 1% 0.125W |
|
||||||
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
|
| 1 | `smd_led(LED0603, "orange")` | SMD LED 0603 orange |
|
||||||
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
|
| 1 | `smd_led(LED0805, "red")` | SMD LED 0805 red |
|
||||||
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
|
| 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_A, value = "105e")` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||||
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 10V |
|
| 1 | `smd_tant(TANT_B, value = "106A")` | SMD Tantalum capacitor package B ,10uF, 10V |
|
||||||
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 16V |
|
| 1 | `smd_tant(TANT_C, value = "107C")` | SMD Tantalum capacitor package C ,100uF, 16V |
|
||||||
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 10nF |
|
| 1 | `smd_capacitor(CAP0402, value = "10nF")` | SMD capacitor 0402 10nF |
|
||||||
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 10nF |
|
| 1 | `smd_capacitor(CAP0502, value = "10nF")` | SMD capacitor 0502 10nF |
|
||||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 10nF |
|
| 1 | `smd_capacitor(CAP0603, value = "10nF")` | SMD capacitor 0603 10nF |
|
||||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 100nF |
|
| 1 | `smd_capacitor(CAP0805, value = "100nF")` | SMD capacitor 0805 100nF |
|
||||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 1uF |
|
| 1 | `smd_capacitor(CAP1206, value = "1uF")` | SMD capacitor 1206 1uF |
|
||||||
| 1 | `smd_qfp(QFP50P1200X1200X160_64N)` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
|
| 1 | `smd_qfp(QFP50P1200X1200X160_64N, "ATSAM4S4BA")` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
|
||||||
| 1 | `smd_resistor(L2012C, 1u)` | SMD choke 0805 1u |
|
| 1 | `smd_resistor(L2012C, 1u)` | SMD choke 0805 1u |
|
||||||
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
|
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
|
||||||
|
| 1 | `smd_250V_fuse(OMT250, "2A 250V")` | SMD fuse: OMT250 2A 250V |
|
||||||
| 1 | `smd_resistor(RES0402, 1)` | SMD resistor 0402 1 0.0625W |
|
| 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(RES0502, 10)` | SMD resistor 0502 10 0.05W |
|
||||||
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
|
| 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(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
|
||||||
| 1 | `smd_resistor(RES1206, 1M)` | SMD resistor 1206 1M 0.25W |
|
| 1 | `smd_resistor(RES1206, 1M)` | SMD resistor 1206 1M 0.25W |
|
||||||
| 1 | `smd_soic(SOIC14)` | SOIC14 package 74HC00 |
|
| 1 | `smd_soic(SOIC14, "74HC00")` | SOIC14 package 74HC00 |
|
||||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package ICL323 |
|
| 1 | `smd_soic(SOIC16, "ICL323")` | SOIC16 package ICL323 |
|
||||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package PIC18F88 |
|
| 1 | `smd_soic(SOIC18, "PIC18F88")` | SOIC18 package PIC18F88 |
|
||||||
| 1 | `smd_soic(SOIC8)` | SOIC8 package M34063 |
|
| 1 | `smd_soic(SOIC8, "M34063")` | SOIC8 package M34063 |
|
||||||
| 1 | `smd_sot(SOT223)` | SOT223 package LM117 |
|
| 1 | `smd_sot(SOT223, "LM117")` | SOT223 package LM117 |
|
||||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
| 1 | `smd_sot(SOT23, "2N7000")` | SOT23 package 2N7000 |
|
||||||
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
|
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
|
||||||
| 1 | `square_button(button_6mm)` | Square button 6mm |
|
| 1 | `square_button(button_6mm)` | Square button 6mm |
|
||||||
| 1 | `smd_pot(TC33X1)` | TC33X1 package 10K |
|
| 1 | `smd_pot(TC33X1, "10K")` | TC33X1 package 10K |
|
||||||
| 1 | `pcb(TMC2130)` | TMC2130 |
|
| 1 | `pcb(TMC2130)` | TMC2130 |
|
||||||
| 1 | `green_terminal(gt_5p08, 2)` | Terminal block 2 way 0.2" |
|
| 1 | `green_terminal(gt_5p08, 2)` | Terminal block 2 way 0.2" |
|
||||||
| 2 | `green_terminal(gt_6p35, 2)` | Terminal block 2 way 0.25" |
|
| 2 | `green_terminal(gt_6p35, 2)` | Terminal block 2 way 0.25" |
|
||||||
@@ -2732,11 +2753,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 1 | `terminal_35(4)` | Terminal block 4 way 3.5mm |
|
| 1 | `terminal_35(4)` | Terminal block 4 way 3.5mm |
|
||||||
| 1 | `pcb(test_pcb)` | Test PCB |
|
| 1 | `pcb(test_pcb)` | Test PCB |
|
||||||
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
|
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
|
||||||
|
| 1 | `rd_disc(ERZV07D471, "471")` | Varistor, ERZV07D471 471 |
|
||||||
| 2 | `vero_pin()` | Vero board pin |
|
| 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, 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)` | 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, 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 |
|
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
|
||||||
|
| 1 | `rd_boxc(BOXC18x5x11, "X2 rated film capacitor", "0.1uF 250V" )` | X2 rated film capacitor 0.1uF 250V |
|
||||||
|
| 1 | `rd_boxc(BOXC18x10x16, "X2 rated film capacitor", "0.47uF 250V" )` | X2 rated film capacitor 0.47uF 250V |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -2867,6 +2891,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 1 | `pcb(Melzi)` | Melzi electronics - not shown |
|
| 1 | `pcb(Melzi)` | Melzi electronics - not shown |
|
||||||
| 6 | | Micro SD card |
|
| 6 | | Micro SD card |
|
||||||
| 1 | | Micro SD card - not shown |
|
| 1 | | Micro SD card - not shown |
|
||||||
|
| 1 | `pcb(RCWL-0516)` | Microwave Radar Sensor |
|
||||||
| 1 | `molex_254(2)` | Molex KK header 2 way - not shown |
|
| 1 | `molex_254(2)` | Molex KK header 2 way - not shown |
|
||||||
| 1 | `molex_254(3)` | Molex KK header 3 way - not shown |
|
| 1 | `molex_254(3)` | Molex KK header 3 way - not shown |
|
||||||
| 20 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
|
| 20 | `nut(M2_nut, nyloc = true)` | Nut M2 x 1.6mm nyloc |
|
||||||
@@ -2894,8 +2919,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 8 | `screw(M2_cap_screw, 20)` | Screw M2 cap x 20mm |
|
| 8 | `screw(M2_cap_screw, 20)` | Screw M2 cap x 20mm |
|
||||||
| 4 | `screw(M2_cap_screw, 25)` | Screw M2 cap x 25mm |
|
| 4 | `screw(M2_cap_screw, 25)` | Screw M2 cap x 25mm |
|
||||||
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
||||||
| 4 | `screw(M2p5_cap_screw, 25)` | Screw M2.5 cap x 25mm |
|
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
||||||
| 4 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
|
||||||
| 12 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
|
| 12 | `screw(M2p5_cap_screw, 35)` | Screw M2.5 cap x 35mm |
|
||||||
| 4 | `screw(M2p5_dome_screw, 25)` | Screw M2.5 dome x 25mm |
|
| 4 | `screw(M2p5_dome_screw, 25)` | Screw M2.5 dome x 25mm |
|
||||||
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
|
| 4 | `screw(M2p5_pan_screw, 20)` | Screw M2.5 pan x 20mm |
|
||||||
@@ -2903,8 +2927,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 19 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
| 19 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||||
| 13 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
| 13 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
||||||
| 4 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
|
| 4 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
|
||||||
| 8 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
| 11 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
||||||
| 3 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
|
||||||
| 4 | `screw(M4_cap_screw, 20)` | Screw M4 cap x 20mm |
|
| 4 | `screw(M4_cap_screw, 20)` | Screw M4 cap x 20mm |
|
||||||
| 4 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
|
| 4 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm |
|
||||||
| 1 | `pcb(XIAO)` | Seeeduino XIAO |
|
| 1 | `pcb(XIAO)` | Seeeduino XIAO |
|
||||||
@@ -2924,24 +2947,24 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 4 | pcb_spacer20100.stl |
|
| 4 | pcb_spacer20100.stl |
|
||||||
| 4 | pcb_spacer20140.stl |
|
| 4 | pcb_spacer20150.stl |
|
||||||
| 4 | pcb_spacer2070.stl |
|
| 4 | pcb_spacer2070.stl |
|
||||||
| 4 | pcb_spacer2080.stl |
|
| 4 | pcb_spacer2080.stl |
|
||||||
| 4 | pcb_spacer2090.stl |
|
| 4 | pcb_spacer2090.stl |
|
||||||
| 2 | pcb_spacer25100.stl |
|
| 2 | pcb_spacer25110.stl |
|
||||||
| 4 | pcb_spacer25130.stl |
|
| 4 | pcb_spacer25140.stl |
|
||||||
| 4 | pcb_spacer25160.stl |
|
|
||||||
| 4 | pcb_spacer25170.stl |
|
| 4 | pcb_spacer25170.stl |
|
||||||
| 4 | pcb_spacer25180_2.stl |
|
| 4 | pcb_spacer25180.stl |
|
||||||
| 4 | pcb_spacer25190_2.stl |
|
| 4 | pcb_spacer25190_2.stl |
|
||||||
| 4 | pcb_spacer25230.stl |
|
| 4 | pcb_spacer25200_2.stl |
|
||||||
| 4 | pcb_spacer25240.stl |
|
| 4 | pcb_spacer25240.stl |
|
||||||
| 4 | pcb_spacer25250.stl |
|
| 4 | pcb_spacer25250.stl |
|
||||||
|
| 4 | pcb_spacer25260.stl |
|
||||||
| 4 | pcb_spacer2580.stl |
|
| 4 | pcb_spacer2580.stl |
|
||||||
| 4 | pcb_spacer30120.stl |
|
| 4 | pcb_spacer30130.stl |
|
||||||
| 4 | pcb_spacer30200.stl |
|
|
||||||
| 4 | pcb_spacer30210.stl |
|
| 4 | pcb_spacer30210.stl |
|
||||||
| 3 | pcb_spacer30220.stl |
|
| 4 | pcb_spacer30220.stl |
|
||||||
|
| 3 | pcb_spacer30230.stl |
|
||||||
| 10 | pcb_spacer3050.stl |
|
| 10 | pcb_spacer3050.stl |
|
||||||
| 9 | pcb_spacer3060.stl |
|
| 9 | pcb_spacer3060.stl |
|
||||||
| 9 | pcb_spacer3070.stl |
|
| 9 | pcb_spacer3070.stl |
|
||||||
@@ -3383,6 +3406,11 @@ Radial components for PCBs.
|
|||||||
### Properties
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `rd_boxc_colours(type)` | Case colour and resin fill colour |
|
||||||
|
| `rd_boxc_leads(type)` | Lead pitch, diameter and length |
|
||||||
|
| `rd_boxc_size(type)` | Overall size and corner radius |
|
||||||
|
| `rd_boxc_skirt(type)` | Skirt slot, thickness, height |
|
||||||
|
| `rd_boxc_z(type)` | Height of inner base above PCB. |
|
||||||
| `rd_disc_colours(type)` | Colours of body and text |
|
| `rd_disc_colours(type)` | Colours of body and text |
|
||||||
| `rd_disc_kind(type)` | Capacitor, etc |
|
| `rd_disc_kind(type)` | Capacitor, etc |
|
||||||
| `rd_disc_lead_d(type)` | Lead diameter and sleeve diameter |
|
| `rd_disc_lead_d(type)` | Lead diameter and sleeve diameter |
|
||||||
@@ -3412,6 +3440,7 @@ Radial components for PCBs.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `rd_box_cap(type, kind, value)` | Draw radial boxed film capacitor |
|
||||||
| `rd_disc(type, value, pitch = undef, z = 0, tail = 3)` | Draw a radial disc component |
|
| `rd_disc(type, value, pitch = undef, z = 0, tail = 3)` | Draw a radial disc component |
|
||||||
| `rd_electrolytic(type, value, pitch = undef, z = 0, tail = 3)` | Draw a radial electrolytic capcacitor |
|
| `rd_electrolytic(type, value, pitch = undef, z = 0, tail = 3)` | Draw a radial electrolytic capcacitor |
|
||||||
| `rd_module(type, value)` | Draw a PCB mounted potted module, e.g. PSU or relay |
|
| `rd_module(type, value)` | Draw a PCB mounted potted module, e.g. PSU or relay |
|
||||||
@@ -3437,6 +3466,8 @@ Radial components for PCBs.
|
|||||||
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
|
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
|
||||||
| 1 | `rd_transistor(TO92, "BC337")` | Transistor TO92 BC337 |
|
| 1 | `rd_transistor(TO92, "BC337")` | Transistor TO92 BC337 |
|
||||||
| 1 | `rd_disc(ERZV07D471, "470V")` | Varistor, ERZV07D471 470V |
|
| 1 | `rd_disc(ERZV07D471, "470V")` | Varistor, ERZV07D471 470V |
|
||||||
|
| 1 | `rd_boxc(BOXC18x5x11, "X2 rated film capacitor", "0.1uF 250V" )` | X2 rated film capacitor 0.1uF 250V |
|
||||||
|
| 1 | `rd_boxc(BOXC18x10x16, "X2 rated film capacitor", "0.47uF 250V" )` | X2 rated film capacitor 0.47uF 250V |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -4022,6 +4053,7 @@ When woven sheets (e.g. carbon fibre) are rendered it is necessary to specify th
|
|||||||
| 1 | `sheet(Spring08, 30, 30, 2)` | Bi-metal saw blade 30mm x 30mm x 0.8mm |
|
| 1 | `sheet(Spring08, 30, 30, 2)` | Bi-metal saw blade 30mm x 30mm x 0.8mm |
|
||||||
| 1 | `sheet(Cardboard, 30, 30, 2)` | Corrugated cardboard 30mm x 30mm x 5mm |
|
| 1 | `sheet(Cardboard, 30, 30, 2)` | Corrugated cardboard 30mm x 30mm x 5mm |
|
||||||
| 1 | `sheet(Foam20, 30, 30, 2)` | Foam sponge 30mm x 30mm x 20mm |
|
| 1 | `sheet(Foam20, 30, 30, 2)` | Foam sponge 30mm x 30mm x 20mm |
|
||||||
|
| 1 | `sheet(Sellotape, 30, 30, 2)` | Sellotape tape 30mm x 30mm x 0.05mm |
|
||||||
| 1 | `sheet(DiBond, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 3mm |
|
| 1 | `sheet(DiBond, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 3mm |
|
||||||
| 1 | `sheet(DiBond6, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 6mm |
|
| 1 | `sheet(DiBond6, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 6mm |
|
||||||
| 1 | `sheet(MDF10, 30, 30, 2)` | Sheet MDF 30mm x 30mm x 10mm |
|
| 1 | `sheet(MDF10, 30, 30, 2)` | Sheet MDF 30mm x 30mm x 10mm |
|
||||||
@@ -4130,6 +4162,10 @@ E.g. 475A is 4.7uF 10V on the parts list.
|
|||||||
### Properties
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `smd_250V_fuse_base(type)` | Base length |
|
||||||
|
| `smd_250V_fuse_size(type)` | Bounding box of the body |
|
||||||
|
| `smd_250V_fuse_step(type)` | End cutout length, width and height |
|
||||||
|
| `smd_250V_fuse_z(type)` | Height of body above the PCB surface |
|
||||||
| `smd_cap_end_cap(type)` | End cap width |
|
| `smd_cap_end_cap(type)` | End cap width |
|
||||||
| `smd_cap_size(type)` | Body length, width |
|
| `smd_cap_size(type)` | Body length, width |
|
||||||
| `smd_coax_base_r(type)` | Corner radius of the base |
|
| `smd_coax_base_r(type)` | Corner radius of the base |
|
||||||
@@ -4194,6 +4230,7 @@ E.g. 475A is 4.7uF 10V on the parts list.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `smd_250V_fuse(type, value)` | Draw an SMD mains fuse |
|
||||||
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
|
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
|
||||||
| `smd_coax(type)` | Draw an SMD coaxial connector |
|
| `smd_coax(type)` | Draw an SMD coaxial connector |
|
||||||
| `smd_diode(type, value)` | Draw an SMD diode |
|
| `smd_diode(type, value)` | Draw an SMD diode |
|
||||||
@@ -4211,37 +4248,39 @@ E.g. 475A is 4.7uF 10V on the parts list.
|
|||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
|
| 1 | `smd_inductor(CDRH104 ,"10R")` | CDRH104 package 10R |
|
||||||
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
|
| 1 | `smd_diode(DO214AC, "SS34")` | DO214AC package SS34 |
|
||||||
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
|
| 1 | `smd_inductor(IND2525 ,"4R7")` | IND2525 package 4R7 |
|
||||||
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
|
| 1 | `smd_led(LED0603, "green")` | SMD LED 0603 green |
|
||||||
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
|
| 1 | `smd_led(LED0805, "blue")` | SMD LED 0805 blue |
|
||||||
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
| 1 | `smd_led(LED1206, "red")` | SMD LED 1306 red |
|
||||||
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 6.3V |
|
| 1 | `smd_tant(TANT_A, value = "105e")` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||||
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 10V |
|
| 1 | `smd_tant(TANT_B, value = "106J")` | SMD Tantalum capacitor package B ,10uF, 6.3V |
|
||||||
|
| 1 | `smd_tant(TANT_C, value = "107A")` | SMD Tantalum capacitor package C ,100uF, 10V |
|
||||||
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 |
|
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 |
|
||||||
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 |
|
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 |
|
||||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||||
| 1 | `smd_capacitor(CAP1210)` | SMD capacitor 1210 |
|
| 1 | `smd_capacitor(CAP1210)` | SMD capacitor 1210 |
|
||||||
| 1 | `smd_qfp(QFP50P1200X1200X160_64N)` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
|
| 1 | `smd_qfp(QFP50P1200X1200X160_64N, "ATSAM4S4BA")` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
|
||||||
| 1 | `smd_resistor(L2012C, 10u)` | SMD choke 0805 10u |
|
| 1 | `smd_resistor(L2012C, 10u)` | SMD choke 0805 10u |
|
||||||
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
|
| 1 | `smd_coax(U_FL_R_SMT_1)` | SMD coax connector type: U_FL_R_SMT_1 |
|
||||||
|
| 1 | `smd_250V_fuse(OMT250, "2A 250V")` | SMD fuse: OMT250 2A 250V |
|
||||||
| 1 | `smd_resistor(RES0402, 1R0)` | SMD resistor 0402 1R0 0.0625W |
|
| 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(RES0502, 10)` | SMD resistor 0502 10 0.05W |
|
||||||
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
|
| 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(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
|
||||||
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
||||||
| 1 | `smd_soic(SOIC14)` | SOIC14 package SOIC14 |
|
| 1 | `smd_soic(SOIC14, "SOIC14")` | SOIC14 package SOIC14 |
|
||||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package SOIC16 |
|
| 1 | `smd_soic(SOIC16, "SOIC16")` | SOIC16 package SOIC16 |
|
||||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package SOIC18 |
|
| 1 | `smd_soic(SOIC18, "SOIC18")` | SOIC18 package SOIC18 |
|
||||||
| 1 | `smd_soic(SOIC8)` | SOIC8 package SOIC8 |
|
| 1 | `smd_soic(SOIC8, "SOIC8")` | SOIC8 package SOIC8 |
|
||||||
| 1 | `smd_sot(SOT223)` | SOT223 package FZT851 |
|
| 1 | `smd_sot(SOT223, "FZT851")` | SOT223 package FZT851 |
|
||||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
| 1 | `smd_sot(SOT23, "2N7000")` | SOT23 package 2N7000 |
|
||||||
| 1 | `smd_soic(SOT23_6)` | SOT23_6 package SOT23_6 |
|
| 1 | `smd_soic(SOT23_6, "SOT23_6")` | SOT23_6 package SOT23_6 |
|
||||||
| 1 | `smd_pot(TC33X1)` | TC33X1 package 10K |
|
| 1 | `smd_pot(TC33X1, "10K")` | TC33X1 package 10K |
|
||||||
| 1 | `smd_soic(TSOT23_8)` | TSOT23_8 package TSOT23_8 |
|
| 1 | `smd_soic(TSOT23_8, "TSOT23_8")` | TSOT23_8 package TSOT23_8 |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -4673,12 +4712,86 @@ Iron core transformers. The grey shaded area is the keep out region where the te
|
|||||||
| 1 | `transformer(SMALLTX)` | Transformer Small mains |
|
| 1 | `transformer(SMALLTX)` | Transformer Small mains |
|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="ttracks"></a>
|
||||||
|
## Ttracks
|
||||||
|
T-Tracks used in woodworking jigs
|
||||||
|
|
||||||
|
[vitamins/ttracks.scad](vitamins/ttracks.scad) Object definitions.
|
||||||
|
|
||||||
|
[vitamins/ttrack.scad](vitamins/ttrack.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/ttracks.scad](tests/ttracks.scad) Code for this example.
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `t_insert_description(type)` | Description of this t-track insert |
|
||||||
|
| `t_insert_height(type)` | Height of t-track insert |
|
||||||
|
| `t_insert_thread(type)` | M thread for this the screw hole in this insert |
|
||||||
|
| `t_insert_top_thickness(type)` | Top thickness for t-track insert |
|
||||||
|
| `t_insert_top_width(type)` | Top Width of t-track insert |
|
||||||
|
| `t_insert_width(type)` | Width of t-track insert |
|
||||||
|
| `tbolt_description(type)` | Description of this t-track bolt |
|
||||||
|
| `tbolt_head_length(type)` | Head length for t-track bolt |
|
||||||
|
| `tbolt_head_thickness(type)` | Head thickness for t-track bolt |
|
||||||
|
| `tbolt_head_width(type)` | Head width for t-track bolt |
|
||||||
|
| `tbolt_thread(type)` | M thread for this bolt |
|
||||||
|
| `ttrack_fixture(type)` | Fixture, such as T-bolt or Miter insert used with this track |
|
||||||
|
| `ttrack_height(type)` | Height of track section |
|
||||||
|
| `ttrack_opening(type)` | Width of the opening |
|
||||||
|
| `ttrack_screw(type)` | Screw used to fasten track |
|
||||||
|
| `ttrack_screw_pitch(type)` | Distance between screws |
|
||||||
|
| `ttrack_slot_height(type)` | Height of the slot |
|
||||||
|
| `ttrack_slot_width(type)` | Width of the slot |
|
||||||
|
| `ttrack_top_thickness(type)` | Thickness of the top layer |
|
||||||
|
| `ttrack_width(type)` | Width of track section |
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `ttrack_holes(type, length)` | Number of holes in a rail given its `length` |
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
| Module | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `ttrack(type, length, colour = "LightSlateGray")` | Draw the specified rail |
|
||||||
|
| `ttrack_hole_positions(type, length)` | Position children over screw holes |
|
||||||
|
| `ttrack_place_bolt(type, pos, bolt = undef)` | Place a T-Bolt relative to the centre of the track |
|
||||||
|
| `ttrack_place_insert(type, pos, insert = undef)` | Place a T-Insert relative to the centre of the track |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Vitamins
|
||||||
|
| Qty | Module call | BOM entry |
|
||||||
|
| ---:|:--- |:---|
|
||||||
|
| 3 | `screw(M3_cs_cap_screw, 15)` | Screw M3 cs cap x 15mm |
|
||||||
|
| 3 | `screw(M4_cs_cap_screw, 15)` | Screw M4 cs cap x 15mm |
|
||||||
|
| 2 | `screw(M6_hex_screw, 15)` | Screw M6 hex x 15mm |
|
||||||
|
| 1 | `ttrack(ttrack_mitre_30mm, 120)` | T-Track ttrack_mitre_30mm x 120mm |
|
||||||
|
| 1 | `ttrack(ttrack_mitre_30mm, 200)` | T-Track ttrack_mitre_30mm x 200mm |
|
||||||
|
| 1 | `ttrack(ttrack_mitre_36mm, 120)` | T-Track ttrack_mitre_36mm x 120mm |
|
||||||
|
| 1 | `ttrack(ttrack_universal_19mm, 120)` | T-Track ttrack_universal_19mm x 120mm |
|
||||||
|
| 1 | `ttrack(ttrack_universal_19mm, 200)` | T-Track ttrack_universal_19mm x 200mm |
|
||||||
|
| 1 | `ttrack(ttrack_universal_19mm_A, 120, colour="red")` | T-Track ttrack_universal_19mm_A x 120mm |
|
||||||
|
| 1 | `ttrack(ttrack_universal_19mm_B, 120, colour="blue")` | T-Track ttrack_universal_19mm_B x 120mm |
|
||||||
|
| 1 | `T-Track Bolt M6` | M6 x 30mm |
|
||||||
|
| 1 | `T-Track Bolt M6 with small head` | M6 x 30mm |
|
||||||
|
| 3 | `T-Track Bolt M8` | M8 x 30mm |
|
||||||
|
| 1 | `ttrack_insert(TTrack_insert_Miter30_M6, 30, 1)` | T-Track insert, Miter track 30mm, M6 thread, M30mm, with 1 M6 |
|
||||||
|
| 1 | `ttrack_insert(TTrack_insert_Miter30_M6, 30, 1, colour="red")` | T-Track insert, Miter track 30mm, M6 thread, M30mm, with 1 M6 |
|
||||||
|
| 1 | `ttrack_insert(TTrack_insert_Miter30_M6, 60, 2, colour="red")` | T-Track insert, Miter track 30mm, M6 thread, M60mm, with 2 M6 |
|
||||||
|
| 1 | `ttrack_insert(TTrack_insert_Miter30_M8, 30, 1, colour="red")` | T-Track insert, Miter track 30mm, M8 thread, M30mm, with 1 M8 |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="tubings"></a>
|
<a name="tubings"></a>
|
||||||
## Tubings
|
## Tubings
|
||||||
Tubing and sleeving. The internal diameter can be forced to stretch it over something.
|
Tubing and sleeving. The internal diameter can be forced to stretch it over something. A path can be specified, otherwise it is just straight with the specified length.
|
||||||
|
|
||||||
[vitamins/tubings.scad](vitamins/tubings.scad) Object definitions.
|
[vitamins/tubings.scad](vitamins/tubings.scad) Object definitions.
|
||||||
|
|
||||||
@@ -4703,7 +4816,7 @@ Tubing and sleeving. The internal diameter can be forced to stretch it over some
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `tubing(type, length = 15, forced_id = 0, center = true)` | Draw specified tubing with optional forced internal diameter |
|
| `tubing(type, length = 15, forced_id = 0, center = true, path = [])` | Draw specified tubing with optional forced internal diameter and optional path. |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -4968,6 +5081,7 @@ Utilities for adding wires to the BOM and optionally drawing them and cable bund
|
|||||||
| `cable_bundle_positions(cable)` | Positions of wires in a bundle to go through a cable strip |
|
| `cable_bundle_positions(cable)` | Positions of wires in a bundle to go through a cable strip |
|
||||||
| `cable_height(cable)` | Height in flat clip |
|
| `cable_height(cable)` | Height in flat clip |
|
||||||
| `cable_is_ribbon(cable)` | Is a ribbon cable? |
|
| `cable_is_ribbon(cable)` | Is a ribbon cable? |
|
||||||
|
| `cable_merge(cable1, cable2)` | Combine the wires of two cables |
|
||||||
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
||||||
| `cable_tlen(cable)` | Twisted cable twist length |
|
| `cable_tlen(cable)` | Twisted cable twist length |
|
||||||
| `cable_twisted_radius(cable)` | Approximate radius of a cable when twisted |
|
| `cable_twisted_radius(cable)` | Approximate radius of a cable when twisted |
|
||||||
@@ -5113,7 +5227,7 @@ The top bezel can have an optional child, which is subtracted to allow modificat
|
|||||||
| `box_right(type)` | Default right side, can be overridden to customise |
|
| `box_right(type)` | Default right side, can be overridden to customise |
|
||||||
| `box_right_blank(type, sheet = false)` | Generates a 2D template for the right sheet, `sheet` can be set to override the type |
|
| `box_right_blank(type, sheet = false)` | Generates a 2D template for the right sheet, `sheet` can be set to override the type |
|
||||||
| `box_shelf_blank(type, sheet = false, wall = undef)` | Generates a 2D template for a shelf sheet |
|
| `box_shelf_blank(type, sheet = false, wall = undef)` | Generates a 2D template for a shelf sheet |
|
||||||
| `box_shelf_bracket(type, screw_positions, wall = undef)` | Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts |
|
| `box_shelf_bracket(type, screw_positions, wall = undef)` | Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts, third child is 3D additions. |
|
||||||
| `box_shelf_bracket_section(type, rows, cols, x, y)` | Generates sections of the shelf bracket to allow it to be bigger than the printer |
|
| `box_shelf_bracket_section(type, rows, cols, x, y)` | Generates sections of the shelf bracket to allow it to be bigger than the printer |
|
||||||
| `box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = undef, top_screws = true)` | Place children at the shelf screw positions |
|
| `box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = undef, top_screws = true)` | Place children at the shelf screw positions |
|
||||||
| `box_top(type)` | Default top, can be overridden to customise |
|
| `box_top(type)` | Default top, can be overridden to customise |
|
||||||
@@ -5271,7 +5385,7 @@ fixing_blocks along the sides.
|
|||||||
---
|
---
|
||||||
<a name="cable_clip"></a>
|
<a name="cable_clip"></a>
|
||||||
## Cable_clip
|
## Cable_clip
|
||||||
Cable clips to order. Can be for one or two cables of different sizes.
|
Cable clips to order. Can be for one or two cables of different sizes. Can use an insert and a screw from below or a screw and nut, nyloc or plain, either way up.
|
||||||
|
|
||||||
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
|
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
|
||||||
|
|
||||||
@@ -5280,35 +5394,41 @@ Cable clips to order. Can be for one or two cables of different sizes.
|
|||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `cable_clip_extent(screw, cable)` | How far it extends from the screw. |
|
| `cable_clip_extent(screw, cable, insert = false, nut = false)` | How far it extends from the screw. |
|
||||||
| `cable_clip_height(cable)` | Height given the `cable`. |
|
| `cable_clip_height(cable, screw = false, insert = false, nut = false)` | Height given the `cable`. |
|
||||||
| `cable_clip_offset(screw, cable)` | The offset of the cable from the screw |
|
| `cable_clip_insert(screw, insert = true)` | Insert type for clip, given screw. |
|
||||||
| `cable_clip_width(screw)` | Width given the `screw`. |
|
| `cable_clip_offset(screw, cable, insert = false, nut = false)` | The offset of the cable from the screw. |
|
||||||
|
| `cable_clip_width(screw, insert = false, nut = false)` | Width given the `screw` and possibly insert or nut. |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `cable_clip(screw, cable1, cable2 = 0)` | Create the STL for a single cable or two cable clip |
|
| `cable_clip(screw, cable1, cable2 = 0, insert = false, nut = false)` | Create the STL for a single cable or two cable clip |
|
||||||
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0)` | Cable clip with the fasteners |
|
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false, nut = false, nyloc = true)` | Cable clip with the fasteners |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
|
| 2 | `insert(CNCKM3)` | Heatfit insert M3 x 3mm |
|
||||||
| 5 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
| 5 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||||
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
| 3 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||||
|
| 1 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||||
| 3 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
| 3 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
|
||||||
| 10 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
| 11 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||||
|
| 2 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||||
|
|
||||||
### Printed
|
### Printed
|
||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 1 | cable_clip_30_10_13.stl |
|
| 1 | cable_clip_30I_10_13.stl |
|
||||||
|
| 1 | cable_clip_30I_5_14_6_14.stl |
|
||||||
|
| 1 | cable_clip_30N_7_14_8_14.stl |
|
||||||
| 1 | cable_clip_30_1_14_2_14.stl |
|
| 1 | cable_clip_30_1_14_2_14.stl |
|
||||||
| 1 | cable_clip_30_1_60.stl |
|
| 1 | cable_clip_30_1_60.stl |
|
||||||
| 1 | cable_clip_30_3_14_4_14.stl |
|
| 1 | cable_clip_30_3_14_4_14.stl |
|
||||||
| 1 | cable_clip_30_5_14_6_14.stl |
|
| 1 | cable_clip_30_9_14.stl |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -5388,7 +5508,8 @@ Housings for PCB cameras.
|
|||||||
| 1 | `camera(rpi_camera_v1)` | Raspberry Pi camera V1 |
|
| 1 | `camera(rpi_camera_v1)` | Raspberry Pi camera V1 |
|
||||||
| 1 | `camera(rpi_camera_v2)` | Raspberry Pi camera V2 |
|
| 1 | `camera(rpi_camera_v2)` | Raspberry Pi camera V2 |
|
||||||
| 1 | `camera(rpi_camera)` | Raspberry Pi focusable camera |
|
| 1 | `camera(rpi_camera)` | Raspberry Pi focusable camera |
|
||||||
| 7 | `screw(M2_cap_screw, 10)` | Screw M2 cap x 10mm |
|
| 3 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
|
||||||
|
| 4 | `screw(M2_cap_screw, 10)` | Screw M2 cap x 10mm |
|
||||||
| 4 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
| 4 | `screw(M3_cap_screw, 16)` | Screw M3 cap x 16mm |
|
||||||
| 4 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
| 4 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||||
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
| 2 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
|
||||||
@@ -7319,6 +7440,32 @@ A sector of a circle between two angles.
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="splines"></a>
|
||||||
|
## Splines
|
||||||
|
Cubic splines that interpolate between a list of 2D points passing through all of them.
|
||||||
|
Translated from the Python version at <https://community.alteryx.com/t5/Engine-Works/Creating-a-Cubic-Spline-in-Python-and-Alteryx/ba-p/581173>.
|
||||||
|
Note the x values of the points must be strictly increasing.
|
||||||
|
|
||||||
|
Catmull-Rom splines are well behaved but the ends points are control points and the curve only goes from the second point to the penultimate point.
|
||||||
|
Coded from <https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline#Code_example_in_Python>.
|
||||||
|
No restrictions on points and they can be 3D.
|
||||||
|
|
||||||
|
[utils/splines.scad](utils/splines.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/splines.scad](tests/splines.scad) Code for this example.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `catmull_rom_spline(points, n, alpha = 0.5)` | Interpolate n new points between the specified points with a Catmull-Rom spline, alpha = 0.5 for centripetal, 0 for uniform and 1 for chordal. |
|
||||||
|
| `cubic_spline(points, N = 100)` | Interpolate the list of points given to produce N points on a cubic spline that passes through points given. |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -7351,6 +7498,7 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
|||||||
| `cap(facets, segment = 0, end)` | Create the mesh for an end cap |
|
| `cap(facets, segment = 0, end)` | Create the mesh for an end cap |
|
||||||
| `circle_points(r = 1, z = 0, dir = -1)` | Generate the points of a circle, setting z makes a single turn spiral |
|
| `circle_points(r = 1, z = 0, dir = -1)` | Generate the points of a circle, setting z makes a single turn spiral |
|
||||||
| `helical_twist_per_segment(r, pitch, sides)` | Calculate the twist around Z that rotate_from_to() introduces |
|
| `helical_twist_per_segment(r, pitch, sides)` | Calculate the twist around Z that rotate_from_to() introduces |
|
||||||
|
| `offset_paths(path, offsets, twists = 0)` | Create new paths offset from the original, optionally spiralling around it |
|
||||||
| `rectangle_points(w, h)` | Generate the points of a rectangle |
|
| `rectangle_points(w, h)` | Generate the points of a rectangle |
|
||||||
| `rounded_path(path)` | Convert a rounded_path, consisting of a start coordinate, vertex / radius pairs and then an end coordinate, to a path of points for sweep. |
|
| `rounded_path(path)` | Convert a rounded_path, consisting of a start coordinate, vertex / radius pairs and then an end coordinate, to a path of points for sweep. |
|
||||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||||
@@ -7362,7 +7510,7 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `show_path(path)` | Show a path using a chain of hulls for debugging, duplicate points are highlighted. |
|
| `show_path(path, r = 0.1)` | Show a path using a chain of hulls for debugging, duplicate points are highlighted. |
|
||||||
| `sweep(path, profile, loop = false, twist = 0, convexity = 1)` | Draw a polyhedron that is the swept volume |
|
| `sweep(path, profile, loop = false, twist = 0, convexity = 1)` | Draw a polyhedron that is the swept volume |
|
||||||
|
|
||||||

|

|
||||||
|
@@ -169,6 +169,9 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
# Print commits excluding merges
|
# Print commits excluding merges
|
||||||
|
|
||||||
if not c.comment.startswith('Merge branch') and not c.comment.startswith('Merge pull') and not re.match(r'U.?.ated ch.*log.*', c.comment):
|
if not c.comment.startswith('Merge branch') \
|
||||||
|
and not c.comment.startswith('Merge pull') \
|
||||||
|
and not re.match(r'U.?.ated ch.*log.*', c.comment) \
|
||||||
|
and not re.match(r'Changelog updated.*', c.comment):
|
||||||
print('* %s [`%s`](%s "show commit") %s %s\n' % (c.date, c.hash[:7], url + '/commit/' + c.hash, initials(c.author), fixup_comment(c.comment, url)), file = file)
|
print('* %s [`%s`](%s "show commit") %s %s\n' % (c.date, c.hash[:7], url + '/commit/' + c.hash, initials(c.author), fixup_comment(c.comment, url)), file = file)
|
||||||
do_cmd(('codespell -w -L od ' + filename).split())
|
do_cmd(('codespell -w -L od ' + filename).split())
|
||||||
|
@@ -63,5 +63,5 @@ def source_dirs(bom_dir):
|
|||||||
else:
|
else:
|
||||||
if dir.endswith('/printed'):
|
if dir.endswith('/printed'):
|
||||||
lib_dirs.add(dir)
|
lib_dirs.add(dir)
|
||||||
dirs.remove(source_dir)
|
dirs.discard(source_dir)
|
||||||
return [source_dir] + sorted(dirs) + sorted(lib_dirs)
|
return [source_dir] + sorted(dirs) + sorted(lib_dirs)
|
||||||
|
@@ -61,7 +61,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
|||||||
// components
|
// components
|
||||||
[
|
[
|
||||||
[ 20, -5, 180, "trimpot10"],
|
[ 20, -5, 180, "trimpot10"],
|
||||||
[ 20, -15, 90, "trimpot10", true],
|
[ 20, -18, 90, "trimpot10", true],
|
||||||
[ 19, 2, 90, "smd_led", LED1206, "blue"],
|
[ 19, 2, 90, "smd_led", LED1206, "blue"],
|
||||||
[ 16, 2, 90, "smd_led", LED0805, "red"],
|
[ 16, 2, 90, "smd_led", LED0805, "red"],
|
||||||
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
||||||
@@ -82,6 +82,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
|||||||
[ 32, 3, -90, "smd_diode",DO214AC, "SS34"],
|
[ 32, 3, -90, "smd_diode",DO214AC, "SS34"],
|
||||||
[ 26, 2, -90, "smd_pot", TC33X1, "10K"],
|
[ 26, 2, -90, "smd_pot", TC33X1, "10K"],
|
||||||
[ 26, 6, -90, "smd_coax",U_FL_R_SMT_1],
|
[ 26, 6, -90, "smd_coax",U_FL_R_SMT_1],
|
||||||
|
[ 8, 23, 0, "smd_250V_fuse", OMT250, "2A 250V"],
|
||||||
|
|
||||||
[ 26, 10, -90, "smd_sot", SOT23, "2N7000"],
|
[ 26, 10, -90, "smd_sot", SOT23, "2N7000"],
|
||||||
[ 28, 16, -90, "smd_sot", SOT223, "LM117"],
|
[ 28, 16, -90, "smd_sot", SOT223, "LM117"],
|
||||||
@@ -116,8 +117,8 @@ test_pcb = ["test_pcb", "Test PCB",
|
|||||||
[ 5, 220, 180, "hdmi"],
|
[ 5, 220, 180, "hdmi"],
|
||||||
[ 3, 235, 180, "mini_hdmi"],
|
[ 3, 235, 180, "mini_hdmi"],
|
||||||
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
||||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
[ 25, 205, 0, "buzzer", 4.5, 8.5],
|
||||||
[ 25, 218, 0, "buzzer"],
|
[ 25, 220, 0, "buzzer"],
|
||||||
|
|
||||||
[ 45, 1, 0, "link", inch(0.4), 0.75, undef, undef, [1.5, "red"]], // Sleeved link
|
[ 45, 1, 0, "link", inch(0.4), 0.75, undef, undef, [1.5, "red"]], // Sleeved link
|
||||||
[ 45, 3, 0, "link", inch(0.4)], // Flat link
|
[ 45, 3, 0, "link", inch(0.4)], // Flat link
|
||||||
@@ -130,6 +131,10 @@ test_pcb = ["test_pcb", "Test PCB",
|
|||||||
[ 35, 17, 0, "vero_pin", true],
|
[ 35, 17, 0, "vero_pin", true],
|
||||||
[ 35, 8, 180, "rd_transistor", TO92, "78L05", undef, undef, "Regulator"],
|
[ 35, 8, 180, "rd_transistor", TO92, "78L05", undef, undef, "Regulator"],
|
||||||
[ 35, 13, 180, "rd_transistor", E_LINE, "ZTX853"],
|
[ 35, 13, 180, "rd_transistor", E_LINE, "ZTX853"],
|
||||||
|
[ 25, 190, 0, "rd_electrolytic", ECAP8x11, "220uF35V"],
|
||||||
|
[ 25, 180, 90, "rd_disc", ERZV07D471, "471"],
|
||||||
|
[ 25, 170, 90, "rd_disc", 6p4mm_disc, "100n"],
|
||||||
|
[ 90, 135, -90, "rd_module", HF33F, "012-HSL-3F"],
|
||||||
[ 35, 3, 0, "link", 0, 5], // Vertical wire
|
[ 35, 3, 0, "link", 0, 5], // Vertical wire
|
||||||
|
|
||||||
[ 60, 3, 0, "link", inch(0.2), inch(0.4)], // Raised link
|
[ 60, 3, 0, "link", inch(0.2), inch(0.4)], // Raised link
|
||||||
@@ -147,6 +152,9 @@ test_pcb = ["test_pcb", "Test PCB",
|
|||||||
[ 30, 130,-90, "rd_xtal", ACT1100, "40MHz", 0.5 ],
|
[ 30, 130,-90, "rd_xtal", ACT1100, "40MHz", 0.5 ],
|
||||||
[ 30, 150,-90, "rd_xtal", ACT1700, "80MHz", 0.5 ],
|
[ 30, 150,-90, "rd_xtal", ACT1700, "80MHz", 0.5 ],
|
||||||
|
|
||||||
|
[ 93, 230,-90, "rd_box_cap", BOXC18x10x16, "X2 rated film capacitor", "0.47uF 250V" ],
|
||||||
|
[ 93, 210,-90, "rd_box_cap", BOXC18x5x11, "X2 rated film capacitor", "0.1uF 250V" ],
|
||||||
|
|
||||||
[ 77, 15, -90, "flex"],
|
[ 77, 15, -90, "flex"],
|
||||||
[ 95, 15, -90, "flat_flex"],
|
[ 95, 15, -90, "flat_flex"],
|
||||||
[ 87, 15, -90, "flat_flex", true],
|
[ 87, 15, -90, "flat_flex", true],
|
||||||
@@ -179,7 +187,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
|||||||
[ 55, 170, 0, "button_4p5mm"],
|
[ 55, 170, 0, "button_4p5mm"],
|
||||||
[ 50, 185, 0, "microswitch", small_microswitch],
|
[ 50, 185, 0, "microswitch", small_microswitch],
|
||||||
[ 52, 200, 0, "pcb", 11, TMC2130 ],
|
[ 52, 200, 0, "pcb", 11, TMC2130 ],
|
||||||
[ 80, 210, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
[ 76, 210, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||||
[ 80, 180, 0, "pdip", 8, "NE555" ],
|
[ 80, 180, 0, "pdip", 8, "NE555" ],
|
||||||
[ 71, 180, 0, "smd_inductor", IND2525, "4R7"],
|
[ 71, 180, 0, "smd_inductor", IND2525, "4R7"],
|
||||||
|
|
||||||
|
@@ -64,10 +64,15 @@ module smds() {
|
|||||||
let(s = smd_soics[$i])
|
let(s = smd_soics[$i])
|
||||||
smd_soic(s, s[0]);
|
smd_soic(s, s[0]);
|
||||||
|
|
||||||
translate([0, 39])
|
translate([0, 36.5])
|
||||||
|
layout([for(i = smd_250V_fuses) smd_250V_fuse_size(i).x], 1)
|
||||||
|
let(i = smd_250V_fuses[$i])
|
||||||
|
smd_250V_fuse(i, "2A 250V");
|
||||||
|
|
||||||
|
translate([0, 45])
|
||||||
layout([for(i = smd_inductors) smd_inductor_leads(i).x], 1)
|
layout([for(i = smd_inductors) smd_inductor_leads(i).x], 1)
|
||||||
let(i = smd_inductors[$i])
|
let(i = smd_inductors[$i])
|
||||||
smd_inductor(i, "4R7");
|
smd_inductor(i, ["4R7", "10R"][$i % 2]);
|
||||||
|
|
||||||
translate([20, 6])
|
translate([20, 6])
|
||||||
layout([for(q = smd_qfps) smd_qfp_body_size(q).x], 3)
|
layout([for(q = smd_qfps) smd_qfp_body_size(q).x], 3)
|
||||||
|
@@ -20,40 +20,47 @@
|
|||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../printed/cable_clip.scad>
|
use <../printed/cable_clip.scad>
|
||||||
use <../vitamins/wire.scad>
|
use <../vitamins/wire.scad>
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
|
screw = M3_dome_screw;
|
||||||
sheet_thickness = 3;
|
sheet_thickness = 3;
|
||||||
|
|
||||||
cables = [
|
cables = [
|
||||||
for(i = [1 : 6]) [i, 1.4], [1, 6], 0, [10, inch(0.05), true], 0
|
[10, inch(0.05), true], 0, for(i = [1 : 9]) [i, 1.4], 0, [1, 6], 0,
|
||||||
];
|
];
|
||||||
|
|
||||||
screw = M3_dome_screw;
|
clips = [for(i = [0 : ceil(len(cables) / 2) - 1]) let(c1= cables[2 * i], c2 = cables[2 * i + 1]) [c1, c2]];
|
||||||
|
|
||||||
|
function use_insert(i) = in([0, 3], i);
|
||||||
|
function use_nut(i) = in([4], i);
|
||||||
|
|
||||||
|
clip_lengths = [for(i = [0 : len(clips) - 1])
|
||||||
|
let(c = clips[i], c1 = c.x, c2 = c.y, ins = use_insert(i), nut = use_nut(i))
|
||||||
|
cable_clip_extent(screw, c1, insert = ins, nut = nut) + (c2 ? cable_clip_extent(screw, c2, insert = ins, nut = nut) : cable_clip_width(screw, insert = ins, nut = nut) / 2)];
|
||||||
|
|
||||||
module cable_clips() {
|
module cable_clips() {
|
||||||
for(i = [0 : ceil(len(cables) / 2) - 1])
|
layout(clip_lengths, 3, true) let(cable1 = clips[$i].x, cable2 = clips[$i].y) {
|
||||||
translate([i * 25, 0]) {
|
insert = use_insert($i);
|
||||||
cable1 = cables[2 * i];
|
nut = use_nut($i);
|
||||||
cable2 = cables[2 * i + 1];
|
translate([cable_clip_extent(screw, cable1, insert = insert, nut = nut) - clip_lengths[$i] / 2, 0]) {
|
||||||
|
|
||||||
if($preview) {
|
if($preview) {
|
||||||
cable_clip_assembly(screw, sheet_thickness, cable1, cable2);
|
cable_clip_assembly(screw, sheet_thickness, cable1, cable2, insert = insert, nut = nut, flip = $i == 1);
|
||||||
|
|
||||||
for(j = [0 : 1])
|
for(j = [0 : 1])
|
||||||
let(cable = cables[2 * i + j])
|
let(cable = clips[$i][j])
|
||||||
if(cable)
|
if(cable)
|
||||||
let(positions = cable_bundle_positions(cable))
|
let(positions = cable_bundle_positions(cable))
|
||||||
for(i = [0 : len(positions) - 1])
|
for(i = [0 : len(positions) - 1])
|
||||||
let(p = positions[i])
|
let(p = positions[i])
|
||||||
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable), 0, p.y])
|
translate([p.x + [-1, 1][j] * cable_clip_offset(screw, cable, insert = insert, nut = nut), 0, p.y])
|
||||||
rotate([90, 0, 0])
|
rotate([90, 0, 0])
|
||||||
color([grey(20), "blue", "red", "orange", "yellow", "green", "brown", "purple", "grey", "white"][i])
|
color([grey(20), "blue", "red", "orange", "yellow", "green", "brown", "purple", "grey", "white"][i])
|
||||||
cylinder(d = cable_wire_size(cable), h = 30, center = true);
|
cylinder(d = cable_wire_size(cable), h = 30, center = true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cable_clip(screw, cable1, cable2);
|
cable_clip(screw, cable1, cable2, insert = insert);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cable_clips();
|
cable_clips();
|
||||||
|
@@ -22,7 +22,6 @@ use <../utils/layout.scad>
|
|||||||
include <../vitamins/inserts.scad>
|
include <../vitamins/inserts.scad>
|
||||||
|
|
||||||
module inserts() {
|
module inserts() {
|
||||||
|
|
||||||
for(i = [0: len(inserts) -1])
|
for(i = [0: len(inserts) -1])
|
||||||
translate([10 * i, 5])
|
translate([10 * i, 5])
|
||||||
insert(inserts[i]);
|
insert(inserts[i]);
|
||||||
@@ -32,7 +31,6 @@ module inserts() {
|
|||||||
insert(short_inserts[i]);
|
insert(short_inserts[i]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
stl_colour(pp1_colour)
|
stl_colour(pp1_colour)
|
||||||
translate([len(inserts) * 10, 0]) {
|
translate([len(inserts) * 10, 0]) {
|
||||||
insert_lug(inserts[0], 2, 1);
|
insert_lug(inserts[0], 2, 1);
|
||||||
@@ -42,6 +40,17 @@ module inserts() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module threaded_inserts()
|
||||||
|
for(i = [0: len(threaded_inserts) -1]) {
|
||||||
|
d = insert_hole_radius(threaded_inserts[i]);
|
||||||
|
translate([(10 + d) * i, 0])
|
||||||
|
threaded_insert(threaded_inserts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
let($show_threads = true)
|
let($show_threads = true) {
|
||||||
inserts();
|
inserts();
|
||||||
|
|
||||||
|
translate([0, 20])
|
||||||
|
threaded_inserts();
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 151 KiB |
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 204 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 189 KiB |
BIN
tests/png/splines.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
tests/png/ttracks.png
Normal file
After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 222 KiB |
@@ -28,10 +28,14 @@ module radials() {
|
|||||||
pcb_grid(pcb, 10, 12)
|
pcb_grid(pcb, 10, 12)
|
||||||
rd_module(rd_modules[2], "12V 900ma");
|
rd_module(rd_modules[2], "12V 900ma");
|
||||||
|
|
||||||
for(i = [0: len(rd_electrolytics) - 1])
|
for(i = [0 : len(rd_electrolytics) - 1])
|
||||||
pcb_grid(pcb, i * 3, 2)
|
pcb_grid(pcb, i * 3, 2)
|
||||||
rotate(-90)
|
rotate(-90)
|
||||||
rd_electrolytic(rd_electrolytics[i], "220uF35V", z = 3, pitch = inch(0.2));
|
rd_electrolytic(rd_electrolytics[i], "220uF35V", z = 3, pitch = inch(0.2));
|
||||||
|
|
||||||
|
for(i = [0 : len(rd_box_caps) - 1])
|
||||||
|
pcb_grid(pcb, 20, i * 4)
|
||||||
|
rd_box_cap(rd_box_caps[i], "X2 rated film capacitor", ["0.1uF 250V", "0.47uF 250V"][i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$solder = pcb_solder(pcb);
|
$solder = pcb_solder(pcb);
|
||||||
|
38
tests/splines.scad
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2024
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
|
use <../utils/splines.scad>
|
||||||
|
use <../utils/sweep.scad>
|
||||||
|
|
||||||
|
points = [[0, 1.5], [2, 2], [3, 1], [4, -2], [5, 1], [6, 2], [7, 3]];
|
||||||
|
|
||||||
|
module splines() {
|
||||||
|
cm_spline = catmull_rom_spline(points, 100 / len(points), 0.5);
|
||||||
|
color("green") show_path(cm_spline, 0.01);
|
||||||
|
|
||||||
|
cu_spline = cubic_spline(points, 100);
|
||||||
|
color("blue") show_path(cu_spline, 0.01);
|
||||||
|
|
||||||
|
for(p = points)
|
||||||
|
translate(p) color("red")
|
||||||
|
cylinder($fn = 64, r = 0.03, h = 0.02, center = true);
|
||||||
|
}
|
||||||
|
|
||||||
|
rotate([70, 0, 315]) splines();
|
73
tests/ttracks.scad
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2024
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
include <../utils/core/core.scad>
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
use <../utils/maths.scad>
|
||||||
|
|
||||||
|
include <../vitamins/ttracks.scad>
|
||||||
|
|
||||||
|
module ttracks() {
|
||||||
|
colours = [ "LightSlateGray", "red", "blue", "LightSlateGray", "LightSlateGray" ];
|
||||||
|
gap = 8;
|
||||||
|
widths = [for(t = ttracks) ttrack_width(t)];
|
||||||
|
translate([0, 60])
|
||||||
|
layout(widths, gap) {
|
||||||
|
ttrack(ttracks[$i], 120, colours[$i]);
|
||||||
|
|
||||||
|
if($i < len(ttrack_bolts))
|
||||||
|
translate([0, -80])
|
||||||
|
ttrack_bolt(ttrack_bolts[$i], 30);
|
||||||
|
|
||||||
|
let(i = $i - len(ttrack_bolts))
|
||||||
|
if(i >= 0 && i < len(ttrack_inserts))
|
||||||
|
translate([0, -85])
|
||||||
|
rotate(90)
|
||||||
|
ttrack_insert(ttrack_inserts[i], 30, colour=colours[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
x = sumv(widths) + len(ttracks) * gap + ttrack_width(ttrack_universal_19mm) / 2;
|
||||||
|
translate([x, 20]) {
|
||||||
|
ttrack_assembly(ttrack_universal_19mm, 200);
|
||||||
|
ttrack_place_bolt(ttrack_universal_19mm, 50)
|
||||||
|
ttrack_bolt(ttrack_fixture(ttrack_universal_19mm), 30);
|
||||||
|
|
||||||
|
ttrack_place_bolt(ttrack_universal_19mm, -60)
|
||||||
|
ttrack_bolt(ttrack_fixture(ttrack_universal_19mm), 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
x2 = x + ttrack_width(ttrack_universal_19mm) / 2 + gap + ttrack_width(ttrack_mitre_30mm) / 2;
|
||||||
|
translate([x2, 20]) {
|
||||||
|
ttrack_assembly(ttrack_mitre_30mm, 200);
|
||||||
|
|
||||||
|
ttrack_place_insert(ttrack_mitre_30mm, 50)
|
||||||
|
ttrack_insert(ttrack_fixture(ttrack_mitre_30mm), 30, 1, "red");
|
||||||
|
|
||||||
|
ttrack_place_insert(ttrack_mitre_30mm, -60) {
|
||||||
|
ttrack_insert(ttrack_fixture(ttrack_mitre_30mm), 60, 2, "red");
|
||||||
|
ttrack_insert_hole_positions(ttrack_fixture(ttrack_mitre_30mm), 60, 2)
|
||||||
|
translate_z(8)
|
||||||
|
screw(M6_hex_screw, 15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if($preview)
|
||||||
|
let($show_threads = true)
|
||||||
|
ttracks();
|
@@ -17,7 +17,7 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
wire_r = 5; // [1 : 20]
|
wire_r = 5; // [1 : 20]
|
||||||
t = 0; // [0 : 3]
|
t = -1; // [-1 : 3]
|
||||||
|
|
||||||
include <../utils/core/core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
@@ -26,9 +26,9 @@ include <../vitamins/zipties.scad>
|
|||||||
|
|
||||||
module zipties()
|
module zipties()
|
||||||
layout([for(z = zipties) 9], 2 * wire_r) {
|
layout([for(z = zipties) 9], 2 * wire_r) {
|
||||||
ziptie(zipties[$i], wire_r, t);
|
ziptie(zipties[$i], wire_r, max(t, 0));
|
||||||
|
|
||||||
if(t)
|
if(t >= 0)
|
||||||
color(grey(20))
|
color(grey(20))
|
||||||
cylinder(r = wire_r, h = 10, center = true);
|
cylinder(r = wire_r, h = 10, center = true);
|
||||||
|
|
||||||
|
101
utils/splines.scad
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2024
|
||||||
|
// 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
//! Cubic splines that interpolate between a list of 2D points passing through all of them.
|
||||||
|
//! Translated from the Python version at <https://community.alteryx.com/t5/Engine-Works/Creating-a-Cubic-Spline-in-Python-and-Alteryx/ba-p/581173>.
|
||||||
|
//! Note the x values of the points must be strictly increasing.
|
||||||
|
//!
|
||||||
|
//! Catmull-Rom splines are well behaved but the ends points are control points and the curve only goes from the second point to the penultimate point.
|
||||||
|
//! Coded from <https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline#Code_example_in_Python>.
|
||||||
|
//! No restrictions on points and they can be 3D.
|
||||||
|
//
|
||||||
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
|
use <maths.scad>
|
||||||
|
use <sweep.scad>
|
||||||
|
|
||||||
|
function cubic_spline(points, N = 100) = let( //! Interpolate the list of points given to produce N points on a cubic spline that passes through points given.
|
||||||
|
N = N - 1,
|
||||||
|
n = len(points),
|
||||||
|
ass1 = assert(n >= 3, "must be at least 3 points")0,
|
||||||
|
|
||||||
|
dx = [for(i = [0 : n - 2]) points[i + 1].x - points[i].x], // x deltas
|
||||||
|
ass2 = assert(min(dx) > 0, "X must strictly increase")0,
|
||||||
|
|
||||||
|
//
|
||||||
|
// A and C are diagonals above and below the main diagonal B, which is all 2's
|
||||||
|
//
|
||||||
|
A = [for(i = [0 : n - 3]) dx[i] / (dx[i] + dx[i + 1]), 0],
|
||||||
|
C = [0, for(i = [0 : n - 3]) dx[i + 1] / (dx[i] + dx[i + 1]), 0],
|
||||||
|
//
|
||||||
|
// D are the target values on the right hand side of the equation
|
||||||
|
//
|
||||||
|
D = [0, for(i = [1 : n - 2]) 6 * ((points[i + 1].y - points[i].y) / dx[i] - (points[i].y - points[i - 1].y) / dx[i - 1]) / (dx[i] + dx[i - 1]), 0],
|
||||||
|
//
|
||||||
|
// Solve the tridiagonal equation using the Thomas algorithm
|
||||||
|
//
|
||||||
|
c = [for(i = 1, c = 0; i < n; c = C[i] / (2 - c * A[i - 1]), i = i + 1) c, 0],
|
||||||
|
d = [for(i = 1, d = 0; i < n; d = (D[i] - d * A[i - 1]) / (2 - c[i - 1] * A[i - 1]), i = i + 1) d, 0],
|
||||||
|
M = [for(i = n - 2, x = 0; i >= 0; x = d[i] - c[i] * x, i = i - 1) x, 0],
|
||||||
|
//
|
||||||
|
// Calculate the coefficients of each cubic curve
|
||||||
|
//
|
||||||
|
coefficients = [for(i = [0 : n - 2], dx2 = sqr(dx[i]), j = n - 1 - i)
|
||||||
|
[(M[j - 1] - M[j]) * dx2 / 6,
|
||||||
|
M[j] * dx2 / 2,
|
||||||
|
points[i + 1].y - points[i].y - (M[j - 1] + 2 * M[j]) * dx2 / 6,
|
||||||
|
points[i].y]
|
||||||
|
],
|
||||||
|
//
|
||||||
|
// Use the coefficients to interpolate between the points
|
||||||
|
//
|
||||||
|
x0 = points[0].x,
|
||||||
|
x1 = points[n - 1].x,
|
||||||
|
spline = [for(i = 0, j = 0, z = 0, x = x0; i <= N + 1;
|
||||||
|
x = x0 + (x1 - x0) * i / N,
|
||||||
|
j = i < N - 1 && x > points[j + 1].x ? j + 1 : j,
|
||||||
|
z = (x - points[j].x) / dx[j],
|
||||||
|
i = i + 1,
|
||||||
|
C = coefficients[j]
|
||||||
|
) if(i) [x, (((C[0] * z) + C[1]) * z + C[2]) * z + C[3]]
|
||||||
|
]
|
||||||
|
) spline;
|
||||||
|
|
||||||
|
function tj(ti, pi, pj, alpha = 0.5) = ti + pow(norm(pi - pj), alpha);
|
||||||
|
|
||||||
|
function catmull_rom_segment(P0, P1, P2, P3, n, alpha = 0.5, last = false) = let(
|
||||||
|
t0 = 0,
|
||||||
|
t1 = tj(t0, P0, P1, alpha),
|
||||||
|
t2 = tj(t1, P1, P2, alpha),
|
||||||
|
t3 = tj(t2, P2, P3, alpha),
|
||||||
|
end = last ? n : n - 1,
|
||||||
|
points = [for(i = [0 : end], t = t1 + (t2 - t1) * i / n) let(
|
||||||
|
A1 = (t1 - t) / (t1 - t0) * P0 + (t - t0) / (t1 - t0) * P1,
|
||||||
|
A2 = (t2 - t) / (t2 - t1) * P1 + (t - t1) / (t2 - t1) * P2,
|
||||||
|
A3 = (t3 - t) / (t3 - t2) * P2 + (t - t2) / (t3 - t2) * P3,
|
||||||
|
B1 = (t2 - t) / (t2 - t0) * A1 + (t - t0) / (t2 - t0) * A2,
|
||||||
|
B2 = (t3 - t) / (t3 - t1) * A2 + (t - t1) / (t3 - t1) * A3
|
||||||
|
) (t2 - t) / (t2 - t1) * B1 + (t - t1) / (t2 - t1) * B2]
|
||||||
|
) points;
|
||||||
|
|
||||||
|
|
||||||
|
function catmull_rom_spline(points, n, alpha = 0.5) = let( //! Interpolate n new points between the specified points with a Catmull-Rom spline, alpha = 0.5 for centripetal, 0 for uniform and 1 for chordal.
|
||||||
|
segs = len(points) - 3
|
||||||
|
) [for(i = [0 : segs - 1]) each catmull_rom_segment(points[i], points[i + 1], points[i + 2], points[i + 3], n, alpha, last = i == segs - 1)];
|
@@ -111,7 +111,7 @@ function helical_twist_per_segment(r, pitch, sides) = //! Calculate the twist ar
|
|||||||
//
|
//
|
||||||
// Generate all the transforms for the profile of the swept volume.
|
// Generate all the transforms for the profile of the swept volume.
|
||||||
//
|
//
|
||||||
function sweep_transforms(path, loop = false, twist = 0) =
|
function sweep_transforms(path, loop = false, twist = 0, initial_rotation = undef) =
|
||||||
let(len = len(path),
|
let(len = len(path),
|
||||||
last = len - 1,
|
last = len - 1,
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ function sweep_transforms(path, loop = false, twist = 0) =
|
|||||||
lengths = [for(i = 0, t = 0; i < len; t = t + norm(path[min(i + 1, last)] - path[i]), i = i + 1) t],
|
lengths = [for(i = 0, t = 0; i < len; t = t + norm(path[min(i + 1, last)] - path[i]), i = i + 1) t],
|
||||||
length = lengths[last],
|
length = lengths[last],
|
||||||
|
|
||||||
rotations = [for(i = 0, rot = fs_frame(tangents);
|
rotations = [for(i = 0, rot = is_undef(initial_rotation) ? fs_frame(tangents) : rot3_z(initial_rotation);
|
||||||
i < len;
|
i < len;
|
||||||
i = i + 1,
|
i = i + 1,
|
||||||
rot = i < len ? rotate_from_to(tangents[i - 1], tangents[i]) * rot : undef) rot],
|
rot = i < len ? rotate_from_to(tangents[i - 1], tangents[i]) * rot : undef) rot],
|
||||||
@@ -169,7 +169,7 @@ function sweep(path, profile, loop = false, twist = 0) = //! Generate the point
|
|||||||
points = skin_points(profile, path, loop, twist),
|
points = skin_points(profile, path, loop, twist),
|
||||||
skin_faces = skin_faces(points, npoints, facets, loop),
|
skin_faces = skin_faces(points, npoints, facets, loop),
|
||||||
faces = loop ? skin_faces : concat([cap(facets)], skin_faces, [cap(facets, npoints - 1)])
|
faces = loop ? skin_faces : concat([cap(facets)], skin_faces, [cap(facets, npoints - 1)])
|
||||||
) [points, faces];
|
) [points, faces];
|
||||||
|
|
||||||
module sweep(path, profile, loop = false, twist = 0, convexity = 1) { //! Draw a polyhedron that is the swept volume
|
module sweep(path, profile, loop = false, twist = 0, convexity = 1) { //! Draw a polyhedron that is the swept volume
|
||||||
mesh = sweep(path, profile, loop, twist);
|
mesh = sweep(path, profile, loop, twist);
|
||||||
@@ -229,16 +229,20 @@ function rounded_path(path) = //! Convert a rounded_path, consisting of a start
|
|||||||
|
|
||||||
function segmented_path(path, min_segment) = [ //! Add points to a path to enforce a minimum segment length
|
function segmented_path(path, min_segment) = [ //! Add points to a path to enforce a minimum segment length
|
||||||
for(i = [0 : len(path) - 2])
|
for(i = [0 : len(path) - 2])
|
||||||
let(delta =
|
let(delta =
|
||||||
assert(path[i] != path[i + 1], str("Coincident points at path[", i, "] = ", path[i]))
|
assert(path[i] != path[i + 1], str("Coincident points at path[", i, "] = ", path[i]))
|
||||||
path[i+1] - path[i],
|
path[i+1] - path[i],
|
||||||
segs = ceil(norm(delta) / min_segment)
|
segs = ceil(norm(delta) / min_segment)
|
||||||
)
|
)
|
||||||
for(j = [0 : segs - 1])
|
for(j = [0 : segs - 1])
|
||||||
path[i] + delta * j / segs, // Linear interpolation
|
path[i] + delta * j / segs, // Linear interpolation
|
||||||
path[len(path) - 1]
|
path[len(path) - 1]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function offset_paths(path, offsets, twists = 0) = let( //! Create new paths offset from the original, optionally spiralling around it
|
||||||
|
transforms = sweep_transforms(path, twist = 360 * twists, initial_rotation = 0)
|
||||||
|
) [for(o = offsets) let(initial = [o.x, o.y, o.z, 1]) [for(t = transforms) initial * t]];
|
||||||
|
|
||||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which spiral around the given path. Use for making twisted cables
|
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which spiral around the given path. Use for making twisted cables
|
||||||
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
||||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
|
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
|
||||||
@@ -246,16 +250,16 @@ function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new p
|
|||||||
|
|
||||||
function rounded_path_vertices(path) = [path[0], for(i = [1 : 2 : len(path) - 1]) path[i]]; //! Show the unrounded version of a rounded_path for debug
|
function rounded_path_vertices(path) = [path[0], for(i = [1 : 2 : len(path) - 1]) path[i]]; //! Show the unrounded version of a rounded_path for debug
|
||||||
|
|
||||||
module show_path(path) //! Show a path using a chain of hulls for debugging, duplicate points are highlighted.
|
module show_path(path, r = 0.1) //! Show a path using a chain of hulls for debugging, duplicate points are highlighted.
|
||||||
for(i = [0 : len(path) - 2]) {
|
for(i = [0 : len(path) - 2]) {
|
||||||
hull($fn = 16) {
|
hull($fn = 16) {
|
||||||
translate(path[i])
|
translate(path[i])
|
||||||
sphere(0.1);
|
sphere(r);
|
||||||
|
|
||||||
translate(path[i + 1])
|
translate(path[i + 1])
|
||||||
sphere(0.1);
|
sphere(r);
|
||||||
}
|
}
|
||||||
if(path[i] == path[i + 1])
|
if(path[i] == path[i + 1])
|
||||||
translate(path[i])
|
translate(path[i])
|
||||||
color("red") sphere(1);
|
color("red") sphere($fn = 16, r * 4);
|
||||||
}
|
}
|
||||||
|
@@ -47,7 +47,7 @@ thread_colour_factor = 0.8; // 60 degree threads appear too bright due to the an
|
|||||||
|
|
||||||
function thread_profile(h, crest, angle, overlap = 0.1) = //! Create thread profile path
|
function thread_profile(h, crest, angle, overlap = 0.1) = //! Create thread profile path
|
||||||
let(base = crest + 2 * (h + overlap) * tan(angle / 2))
|
let(base = crest + 2 * (h + overlap) * tan(angle / 2))
|
||||||
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], [crest / 2, h, 0], [base / 2, -overlap, 0]];
|
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], if(crest) [crest / 2, h, 0], [base / 2, -overlap, 0]];
|
||||||
|
|
||||||
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or female thread, ends can be tapered, chamfered or square
|
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or female thread, ends can be tapered, chamfered or square
|
||||||
assert(is_undef(colour) || is_list(colour), "Thread colour must be in [r, g, b] form");
|
assert(is_undef(colour) || is_list(colour), "Thread colour must be in [r, g, b] form");
|
||||||
|
@@ -30,6 +30,9 @@ function camera_connector_pos(type) = type[5]; //! The flex connector block for
|
|||||||
function camera_connector_size(type)= type[6]; //! The flex connector block for the camera itself's size
|
function camera_connector_size(type)= type[6]; //! The flex connector block for the camera itself's size
|
||||||
function camera_fov(type) = type[7]; //! The field of view of the camera lens
|
function camera_fov(type) = type[7]; //! The field of view of the camera lens
|
||||||
|
|
||||||
|
function camera_lens_height(type) = //! The height of the lens stack
|
||||||
|
let(lenses = camera_lens(type), lens = lenses[len(lenses) - 1][0]) lens.y + lens.z;
|
||||||
|
|
||||||
module camera_lens(type, offset = 0, show_lens = true) //! Draw the lens stack, with optional offset for making a clearance hole
|
module camera_lens(type, offset = 0, show_lens = true) //! Draw the lens stack, with optional offset for making a clearance hole
|
||||||
color(grey(20))
|
color(grey(20))
|
||||||
translate(camera_lens_offset(type))
|
translate(camera_lens_offset(type))
|
||||||
|
@@ -67,7 +67,8 @@ rpi_camera = ["rpi_camera", "Raspberry Pi focusable camera", rpi_camera_pcb, [0,
|
|||||||
[[0, 0, 12], 6],
|
[[0, 0, 12], 6],
|
||||||
[[0, 11, 4.3], 14 / 2, [8/2, 11/2, 1]],
|
[[0, 11, 4.3], 14 / 2, [8/2, 11/2, 1]],
|
||||||
],
|
],
|
||||||
[0, 18 - 1.5 - 2.5], [8, 5, 1.6]
|
[0, 18 - 1.5 - 2.5], [8, 5, 1.6],
|
||||||
|
[54, 41] // FOV
|
||||||
];
|
];
|
||||||
|
|
||||||
esp32_cam_x = 1; // Seems to vary as mine is offset but pictures on the web show it more centered.
|
esp32_cam_x = 1; // Seems to vary as mine is offset but pictures on the web show it more centered.
|
||||||
@@ -96,7 +97,7 @@ ESP32_module = ["", "", 18, 26, 0.8, 0, 0.7, [1.1, 1.1, 0, gold], grey(18), f
|
|||||||
ESP32_CAM_pcb = ["", "", 27, 40, 1.7, 2.5, 0, 0, grey(15), false, [],
|
ESP32_CAM_pcb = ["", "", 27, 40, 1.7, 2.5, 0, 0, grey(15), false, [],
|
||||||
[
|
[
|
||||||
[27 / 2, 26 / 2, 0, "-pcb", 0, ESP32_module],
|
[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],
|
for(side = [-1, 1]) [side * inch(0.45) + 27 / 2, -(4.2 + inch(.35)), 0, "-2p54joiner", 1, 8],
|
||||||
[ 27 / 2, -8, 90, "uSD", [14.85, 14.65, 1.8]],
|
[ 27 / 2, -8, 90, "uSD", [14.85, 14.65, 1.8]],
|
||||||
[ 27 / 2 + 1, 15, 0, "flat_flex", false],
|
[ 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", 3, 3, 0.8, grey(90)],
|
||||||
@@ -151,7 +152,7 @@ ESP32_CAM = ["ESP32_CAM", "ESP32-CAM Camera module", ESP32_CAM_pcb, [esp32_cam_x
|
|||||||
[[0, 0, 6.3], 3.5, [1, 1, 0.5]],
|
[[0, 0, 6.3], 3.5, [1, 1, 0.5]],
|
||||||
],
|
],
|
||||||
[1, -4], [15, 2.2, 1],
|
[1, -4], [15, 2.2, 1],
|
||||||
[54, 41] // FOV
|
[41, 54] // FOV
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
@@ -80,6 +80,13 @@ module d_plug_D(length, width, rad) { //! D plug D shape
|
|||||||
circle(rad);
|
circle(rad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module d_hole(type, h = 0, center = true, clearance = 0.2) { //! Make a hole to clear the back of d-connector
|
||||||
|
dwall = 0.5 + clearance;
|
||||||
|
|
||||||
|
extrude_if(h, center)
|
||||||
|
d_plug_D(d_lengths(type)[0] + 2 * dwall, d_widths(type)[0] + 2 * dwall, 2.5 + dwall);
|
||||||
|
}
|
||||||
|
|
||||||
module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specified D plug, which can be IDC, PCB or plain solder bucket
|
module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specified D plug, which can be IDC, PCB or plain solder bucket
|
||||||
hole_r = 3.05 / 2;
|
hole_r = 3.05 / 2;
|
||||||
dwall = 0.5;
|
dwall = 0.5;
|
||||||
@@ -106,7 +113,7 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
|
|||||||
// Shell
|
// Shell
|
||||||
//
|
//
|
||||||
color(d_plug_shell_colour) {
|
color(d_plug_shell_colour) {
|
||||||
linear_extrude( d_flange_thickness(type))
|
linear_extrude(d_flange_thickness(type))
|
||||||
difference() {
|
difference() {
|
||||||
rounded_square([flange_length, flange_width], 2);
|
rounded_square([flange_length, flange_width], 2);
|
||||||
|
|
||||||
|
@@ -52,7 +52,7 @@ module geared_stepper_screw_positions(type) //! Place children at the screw posi
|
|||||||
motor_colour = "#9BA2AC";
|
motor_colour = "#9BA2AC";
|
||||||
gearbox_colour = "#FFF7EE";
|
gearbox_colour = "#FFF7EE";
|
||||||
|
|
||||||
module geared_stepper(type) { //! Draw the specified geared stepper
|
module geared_stepper(type, angle = 0) { //! Draw the specified geared stepper with optional shaft angle.
|
||||||
vitamin(str("geared_stepper(", type[0], "): Geared stepper - ", type[1]));
|
vitamin(str("geared_stepper(", type[0], "): Geared stepper - ", type[1]));
|
||||||
|
|
||||||
radius = gs_diameter(type) / 2;
|
radius = gs_diameter(type) / 2;
|
||||||
@@ -125,19 +125,20 @@ module geared_stepper(type) { //! Draw the specified geared stepper
|
|||||||
f = gs_shaft_flat(type);
|
f = gs_shaft_flat(type);
|
||||||
two_flats = f < 0;
|
two_flats = f < 0;
|
||||||
vflip()
|
vflip()
|
||||||
color(two_flats ? brass : gearbox_colour) {
|
rotate(angle)
|
||||||
d = gs_shaft_d(type);
|
color(two_flats ? brass : gearbox_colour) {
|
||||||
h = gs_shaft_length(type);
|
d = gs_shaft_d(type);
|
||||||
linear_extrude(h)
|
h = gs_shaft_length(type);
|
||||||
intersection() {
|
linear_extrude(h)
|
||||||
circle(d = d);
|
intersection() {
|
||||||
|
circle(d = d);
|
||||||
|
|
||||||
translate([0, two_flats ? 0 : (f - d) / 2])
|
translate([0, two_flats ? 0 : (f - d) / 2])
|
||||||
square([d + 1, abs(f)], center = true);
|
square([d + 1, abs(f)], center = true);
|
||||||
}
|
}
|
||||||
|
|
||||||
cylinder(d = d, h = h - gs_flat_length(type));
|
cylinder(d = d, h = h - gs_flat_length(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wire block
|
// Wire block
|
||||||
color(bulge_z ? "white" : "skyblue") {
|
color(bulge_z ? "white" : "skyblue") {
|
||||||
|
@@ -32,6 +32,9 @@ function insert_barrel_d(type) = type[5]; //! Diameter of the main bar
|
|||||||
function insert_ring1_h(type) = type[6]; //! Height of the top and middle rings
|
function insert_ring1_h(type) = type[6]; //! Height of the top and middle rings
|
||||||
function insert_ring2_d(type) = type[7]; //! Diameter of the middle ring
|
function insert_ring2_d(type) = type[7]; //! Diameter of the middle ring
|
||||||
function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring
|
function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring
|
||||||
|
function threaded_insert_pitch(type) = type[9]; //! Pitch of the outer thread for threaded inserts
|
||||||
|
function threaded_insert_chamfer(type) = type[10]; //! Size of the chamfer for threaded inserts
|
||||||
|
|
||||||
|
|
||||||
function insert_hole_length(type) = round_to_layer(insert_length(type)); //! Length of the insert rounded to layer height
|
function insert_hole_length(type) = round_to_layer(insert_length(type)); //! Length of the insert rounded to layer height
|
||||||
|
|
||||||
@@ -46,6 +49,14 @@ function insert_nose_length(type, d) = let( //! The length before the second rin
|
|||||||
|
|
||||||
module insert(type) { //! Draw specified insert
|
module insert(type) { //! Draw specified insert
|
||||||
length = insert_length(type);
|
length = insert_length(type);
|
||||||
|
|
||||||
|
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type), " x ", length, "mm"));
|
||||||
|
|
||||||
|
base_insert(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
module base_insert(type) {
|
||||||
|
length = insert_length(type);
|
||||||
ring1_h = insert_ring1_h(type);
|
ring1_h = insert_ring1_h(type);
|
||||||
|
|
||||||
chamfer1 = (insert_ring2_d(type) - insert_barrel_d(type)) / 2;
|
chamfer1 = (insert_ring2_d(type) - insert_barrel_d(type)) / 2;
|
||||||
@@ -53,7 +64,6 @@ module insert(type) { //! Draw specified insert
|
|||||||
ring2_h = ring1_h + chamfer1;
|
ring2_h = ring1_h + chamfer1;
|
||||||
gap = (length - ring1_h - ring2_h - chamfer2) / 3;
|
gap = (length - ring1_h - ring2_h - chamfer2) / 3;
|
||||||
|
|
||||||
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type), " x ", length, "mm"));
|
|
||||||
$fn = 64;
|
$fn = 64;
|
||||||
thread_d = insert_screw_diameter(type);
|
thread_d = insert_screw_diameter(type);
|
||||||
explode(20, offset = [0, 0, -length]) translate_z(eps) vflip() {
|
explode(20, offset = [0, 0, -length]) translate_z(eps) vflip() {
|
||||||
@@ -186,3 +196,50 @@ module insert_lug(insert, wall, counter_bore = 0, extension = 0, corner_r = 0, f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module threaded_insert(type) { //! Draw specified threaded insert, for use in wood
|
||||||
|
d2 = insert_outer_d(type);
|
||||||
|
d3 = insert_barrel_d(type);
|
||||||
|
pitch = threaded_insert_pitch(type);
|
||||||
|
|
||||||
|
profile = thread_profile((d2 - d3) /2 , 0, 60);
|
||||||
|
socket = insert_screw_diameter(type) / cos(30) / 2;
|
||||||
|
length = insert_length(type);
|
||||||
|
|
||||||
|
r=insert_barrel_d(type) / 2;
|
||||||
|
z=threaded_insert_chamfer(type);
|
||||||
|
|
||||||
|
thread_l = insert_length(type) - z; // - insert_ring1_h(type);
|
||||||
|
|
||||||
|
vitamin(str("threaded_insert(", type[0], "): Threaded insert M", insert_screw_diameter(type), " x ", length, "mm"));
|
||||||
|
union() {
|
||||||
|
color(silver)
|
||||||
|
render() difference() {
|
||||||
|
base_insert(type);
|
||||||
|
translate_z(-socket/2 + 0.01)
|
||||||
|
cylinder(r=socket, $fn = 6, h=socket/2);
|
||||||
|
|
||||||
|
// chamfer the end
|
||||||
|
rotate_extrude(convexity = 3)
|
||||||
|
polygon([
|
||||||
|
[r - z, -length],
|
||||||
|
[r + 0.1, - length],
|
||||||
|
[r + 0.1, - length + z + 0.1]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate_z(-thread_l/2)
|
||||||
|
thread(insert_barrel_d(type),
|
||||||
|
pitch,
|
||||||
|
thread_l,
|
||||||
|
profile,
|
||||||
|
center = true,
|
||||||
|
top = 1,
|
||||||
|
bot = -1,
|
||||||
|
starts = 1,
|
||||||
|
solid = false,
|
||||||
|
female = false,
|
||||||
|
colour = silver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -39,8 +39,23 @@ CNCKM3 = [ "CNCKM3", 3.0, 4.6, 4.0, 3, 3.65, 0.7, 4.4, 3.9 ];
|
|||||||
CNCKM4 = [ "CNCKM4", 4.0, 6.3, 5.6, 4, 5.15, 1.0, 6.0, 5.55];
|
CNCKM4 = [ "CNCKM4", 4.0, 6.3, 5.6, 4, 5.15, 1.0, 6.0, 5.55];
|
||||||
CNCKM5 = [ "CNCKM5", 5.8, 7.1, 6.4, 5, 6.0, 1.6, 6.8, 6.33];
|
CNCKM5 = [ "CNCKM5", 5.8, 7.1, 6.4, 5, 6.0, 1.6, 6.8, 6.33];
|
||||||
|
|
||||||
|
// Measurements according to DIN 7965
|
||||||
|
//
|
||||||
|
// If you want to add an additional length, it should be sufficient copy one with the same
|
||||||
|
// M size and change the name (2x) and the first number column (l), all others are dependent
|
||||||
|
// on the M size.
|
||||||
|
// l, d2, d5, d, d3, h, d3, d3, P1 (h), z
|
||||||
|
M3x8 = [ "M3x8", 8, 6, 5, 3, 4.5, 0.5, 4.5, 4.5, 2, 0.6];
|
||||||
|
M4x10 = [ "M4x10", 10, 8, 6.5, 4, 5.5, 0.5, 5.5, 5.5, 2.5, 0.6];
|
||||||
|
M5x12 = [ "M5x12", 12, 10, 8.5, 5, 7.5, 0.5, 7.5, 7.5, 3.5, 0.8];
|
||||||
|
M6x15 = [ "M6x15", 15, 12, 10.5, 6, 9.5, 0.5, 9.5, 9.5, 4, 1];
|
||||||
|
M8x18 = [ "M8x18", 18, 16, 14.5, 8, 12.5, 0.5, 12.5, 12.5, 5, 1];
|
||||||
|
M10x25 = [ "M10x25", 25, 18.5, 17, 10, 15, 0.5, 15, 15, 5, 1.6];
|
||||||
|
M12x30 = [ "M12x30", 30, 22, 20, 12, 18, 0.5, 18, 18, 5, 1.6];
|
||||||
|
M16x30 = [ "M16x30", 30, 25, 22.5, 16, 20.5, 0.5, 20.5, 20.5, 5, 1.6];
|
||||||
|
|
||||||
inserts = [ F1BM2, F1BM2p5, F1BM3, F1BM4, CNCKM5 ];
|
inserts = [ F1BM2, F1BM2p5, F1BM3, F1BM4, CNCKM5 ];
|
||||||
short_inserts = [ F1BM2, CNCKM2p5, CNCKM3, CNCKM4, CNCKM5 ];
|
short_inserts = [ F1BM2, CNCKM2p5, CNCKM3, CNCKM4, CNCKM5 ];
|
||||||
|
threaded_inserts = [ M3x8, M4x10, M5x12, M6x15, M8x18, M10x25, M12x30, M16x30 ];
|
||||||
|
|
||||||
use <insert.scad>
|
use <insert.scad>
|
||||||
|
@@ -20,7 +20,7 @@ include <washers.scad>
|
|||||||
//
|
//
|
||||||
// Nuts
|
// Nuts
|
||||||
//
|
//
|
||||||
M2_nut_trap_depth = 2.5;
|
M2_nut_trap_depth = 1.75;
|
||||||
M2p5_nut_trap_depth = 2.5;
|
M2p5_nut_trap_depth = 2.5;
|
||||||
M3_nut_trap_depth = 3;
|
M3_nut_trap_depth = 3;
|
||||||
M4_nut_trap_depth = 4;
|
M4_nut_trap_depth = 4;
|
||||||
|
@@ -1169,6 +1169,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
|||||||
if(show(comp, "rd_module")) rd_module(type = comp[4], value = comp[5]);
|
if(show(comp, "rd_module")) rd_module(type = comp[4], value = comp[5]);
|
||||||
if(show(comp, "rd_transistor")) rd_transistor(type = comp[4], value = comp[5], lead_positions = param(6, undef), z = param(7, 5), kind = param(8,"Transistor"));
|
if(show(comp, "rd_transistor")) rd_transistor(type = comp[4], value = comp[5], lead_positions = param(6, undef), z = param(7, 5), kind = param(8,"Transistor"));
|
||||||
// type, value, lead positions, z, kind
|
// type, value, lead positions, z, kind
|
||||||
|
if(show(comp, "rd_box_cap")) rd_box_cap(type = comp[4], kind = comp[5], value = comp[6]);
|
||||||
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, "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, "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, "molex_hdr")) molex_254(comp[4], param(5, 0), param(6, undef));
|
||||||
@@ -1177,6 +1178,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
|||||||
if(show(comp, "jst_zh")) jst_xh_header(jst_zh_header, comp[4], param(5, false), param(6, false), param(7, undef));
|
if(show(comp, "jst_zh")) jst_xh_header(jst_zh_header, comp[4], param(5, false), param(6, false), param(7, undef));
|
||||||
if(show(comp, "potentiometer")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
|
if(show(comp, "potentiometer")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
|
||||||
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
|
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
|
||||||
|
if(show(comp, "smd_250V_fuse")) smd_250V_fuse(comp[4], comp[5]);
|
||||||
if(show(comp, "smd_res")) smd_resistor(comp[4], comp[5]);
|
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_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_tant")) smd_tant(comp[4], param(5, undef));
|
||||||
|
@@ -730,7 +730,6 @@ Keyes5p1 = ["Keyes5p1", "Keyes5.1 Arduino Uno expansion board", 68.58, 53.34, 1.
|
|||||||
M2p5_pan_screw
|
M2p5_pan_screw
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
ExtruderPCB = ["ExtruderPCB", "Extruder connection PCB",
|
ExtruderPCB = ["ExtruderPCB", "Extruder connection PCB",
|
||||||
33.02, 24.13, 1.6, 0, 0, 0, "green", true, [],
|
33.02, 24.13, 1.6, 0, 0, 0, "green", true, [],
|
||||||
[[3 * 1.27, 24.13 / 2, 90, "D_plug", DCONN15],
|
[[3 * 1.27, 24.13 / 2, 90, "D_plug", DCONN15],
|
||||||
@@ -761,9 +760,15 @@ ZC_A0591 = ["ZC_A0591", "ZC-A0591 ULN2003 driver PCB", 35, 32, 1.6, 0, 2.5, 0, "
|
|||||||
], [], [], [], M2p5_pan_screw];
|
], [], [], [], M2p5_pan_screw];
|
||||||
|
|
||||||
|
|
||||||
MT3608 = ["MT3608", "MT3608 boost converter module", 37, 17, 1.2, 2, 1.5, [5, 3], "#2140BE", false, [[3.0725, 5.095], [3.0725, -5.095], [-3.0725, 5.095], [-3.0725, -5.095]],
|
MT3608 = ["MT3608", "MT3608 boost converter module", 37, 17, 1.2, 2, 1.5, [5, 3], "#2140BE", false,
|
||||||
[ [-12.05 , -6.8, 180, "trimpot10"]
|
[[3.0725, 5.095], [3.0725, -5.095], [-3.0725, 5.095], [-3.0725, -5.095]],
|
||||||
]];
|
[[-12.05 , -6.8, 180, "trimpot10"],
|
||||||
|
[-24.05 , 13.8, 90, "smd_soic", SOT23_6, "B628"],
|
||||||
|
[-12.3, -14.4, 0, "smd_diode",DO214AC, "SS34"],
|
||||||
|
[-28.5, 13.2, 90,"smd_cap", CAP1206, 0.5],
|
||||||
|
[-20, 13.2, 90,"smd_cap", CAP1206, 0.5],
|
||||||
|
[-24.05 , -11.8, 180, "smd_inductor", CDRH104, "220"]]
|
||||||
|
];
|
||||||
|
|
||||||
HW803_1WAY_RELAY = [
|
HW803_1WAY_RELAY = [
|
||||||
"HW803_1WAY_RELAY", "HW-803 5V 1 way relay module",
|
"HW803_1WAY_RELAY", "HW-803 5V 1 way relay module",
|
||||||
@@ -1197,6 +1202,27 @@ ESP_12F = pcb("ESP_12F", "ESP-12F ESP8266 WiFi module", [24, 16, 0.8],
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
RCWL0516 = pcb(
|
||||||
|
"RCWL-0516", "Microwave Radar Sensor",
|
||||||
|
size = [36, 17.3, 1.2],
|
||||||
|
colour = "#17682d",
|
||||||
|
hole_d = 1.7,
|
||||||
|
holes = [
|
||||||
|
[ inch(0.05), inch(0.05) ],
|
||||||
|
[ -inch(0.05), inch(0.05) ],
|
||||||
|
[ -inch(0.05), -inch(0.05) ],
|
||||||
|
[ inch(0.05), -inch(0.05) ],
|
||||||
|
[ -inch(0.65), -inch(0.05) ],
|
||||||
|
[ -inch(0.65), inch(0.05) ],
|
||||||
|
],
|
||||||
|
grid = [inch(0.05), inch(0.13), 1, 5, silver, inch(0.1), inch(0.1)],
|
||||||
|
components = [
|
||||||
|
[inch(0.18), inch(0.13), 90,"smd_cap", CAP1206, 0.5],
|
||||||
|
[inch(0.18), inch(0.32), 90,"smd_cap", CAP1206, 0.5],
|
||||||
|
[inch(0.18), inch(0.54), 90,"smd_cap", CAP1206, 0.5],
|
||||||
|
[inch(0.45), inch(0.34), 0,"smd_soic", SOIC16, "RCWL9196"],
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
tiny_buck = pcb("tiny_buck", "Ultra Small 3A buck regulator", [20, 11, 1.6],
|
tiny_buck = pcb("tiny_buck", "Ultra Small 3A buck regulator", [20, 11, 1.6],
|
||||||
hole_d = 1.2,
|
hole_d = 1.2,
|
||||||
@@ -1222,7 +1248,7 @@ tiny_pcbs = [ESP_201, ESP_01M, XIAO, ESP_12F, MP1584EN, ESP_01,tiny_buck, LIPO_f
|
|||||||
|
|
||||||
big_pcbs = [BTT_RELAY_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
|
big_pcbs = [BTT_RELAY_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_E3_TURBO, BTT_SKR_V1_4_TURBO, DuetE, Duex5];
|
||||||
|
|
||||||
pcbs = [KY_040, TP4056, L9110S, ZC_A0591, MT3608, RAMPSEndstop, ArduinoNano, HW803_1WAY_RELAY, Feather405, RPI_Pico, ESP32_DOIT_V1, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, OPZ2, PanelDue_v3, RPI3A, RPI3, RPI4];
|
pcbs = [KY_040, TP4056, L9110S, ZC_A0591, RCWL0516, MT3608,RAMPSEndstop, ArduinoNano, HW803_1WAY_RELAY, Feather405, RPI_Pico, ESP32_DOIT_V1, RPI0, EnviroPlus, ArduinoUno3, ArduinoLeonardo, WD2002SJ, OPZ2, PanelDue_v3, RPI3A, RPI3, RPI4];
|
||||||
|
|
||||||
pcbs_not_shown = [Melzi, Duex2, PSU12V1A, Keyes5p1, PI_IO, ExtruderPCB];
|
pcbs_not_shown = [Melzi, Duex2, PSU12V1A, Keyes5p1, PI_IO, ExtruderPCB];
|
||||||
|
|
||||||
|
@@ -158,6 +158,7 @@ module rd_module(type, value) { //! Draw a PCB mounted potted module, e.g. PSU o
|
|||||||
r = rd_module_radius(type);
|
r = rd_module_radius(type);
|
||||||
size = rd_module_size(type);
|
size = rd_module_size(type);
|
||||||
pin = rd_module_pin_size(type);
|
pin = rd_module_pin_size(type);
|
||||||
|
|
||||||
color(rd_module_colour(type))
|
color(rd_module_colour(type))
|
||||||
rounded_top_rectangle(size, r, r);
|
rounded_top_rectangle(size, r, r);
|
||||||
|
|
||||||
@@ -393,3 +394,60 @@ module rd_electrolytic(type, value, pitch = undef, z = 0, tail = 3) { //! Draw a
|
|||||||
cylinder(r = jacket_ir, h = eps);
|
cylinder(r = jacket_ir, h = eps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function rd_boxc_size(type) = type[1]; //! Overall size and corner radius
|
||||||
|
function rd_boxc_z(type) = type[2]; //! Height of inner base above PCB.
|
||||||
|
function rd_boxc_skirt(type) = type[3]; //! Skirt slot, thickness, height
|
||||||
|
function rd_boxc_leads(type) = type[4]; //! Lead pitch, diameter and length
|
||||||
|
function rd_boxc_colours(type) = type[5]; //! Case colour and resin fill colour
|
||||||
|
|
||||||
|
module rd_box_cap(type, kind, value) { //! Draw radial boxed film capacitor
|
||||||
|
vitamin(str("rd_boxc(", type[0], ", \"", kind, "\", \"", value, "\" ): ", kind, " ", value));
|
||||||
|
|
||||||
|
size = rd_boxc_size(type);
|
||||||
|
r = size[3];
|
||||||
|
skirt = rd_boxc_skirt(type);
|
||||||
|
inset = skirt.y * 2;
|
||||||
|
leads = rd_boxc_leads(type);
|
||||||
|
c = rd_boxc_colours(type);
|
||||||
|
z = rd_boxc_z(type);
|
||||||
|
$fn = fn;
|
||||||
|
|
||||||
|
color(c[0]) {
|
||||||
|
translate_z(z)
|
||||||
|
rounded_top_rectangle([size.x, size.y, size.z - z], r, r);
|
||||||
|
|
||||||
|
for(i = [0, 1])
|
||||||
|
translate_z(i * skirt.z)
|
||||||
|
linear_extrude(z)
|
||||||
|
difference() {
|
||||||
|
rounded_square([size.x, size.y], r);
|
||||||
|
|
||||||
|
square([size.x - inset, size.y - inset], center = true);
|
||||||
|
|
||||||
|
if(!i)
|
||||||
|
square([skirt.x, size.y], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
color(c[1])
|
||||||
|
translate_z(z)
|
||||||
|
cube([size.x - inset, size.y - inset, 2 * eps], center = true);
|
||||||
|
|
||||||
|
color(silver)
|
||||||
|
for(end = [-1, 1])
|
||||||
|
translate([end * leads.x / 2, 0]) {
|
||||||
|
translate_z(- leads.z)
|
||||||
|
cylinder(d = leads.y, h = leads.z + z);
|
||||||
|
|
||||||
|
solder(leads.y / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
color("black")
|
||||||
|
translate([0, -size.y / 2])
|
||||||
|
rotate([90, 0, 0])
|
||||||
|
linear_extrude(eps)
|
||||||
|
translate([-size.x * 0.45, size.z * 0.75])
|
||||||
|
resize([size.x * 0.9, size.z / 6])
|
||||||
|
text(value, halign = "left", valign = "top");
|
||||||
|
}
|
||||||
|
@@ -54,4 +54,10 @@ ECAP8x11 = ["ECAP8x12", [8.2, 7.5, 12.5], 0.5, [2.4, 2.5], 0.5, inch(0.1), [grey
|
|||||||
|
|
||||||
rd_electrolytics = [ECAP8x11];
|
rd_electrolytics = [ECAP8x11];
|
||||||
|
|
||||||
|
// Boxed plastic film capacitors
|
||||||
|
BOXC18x5x11 = ["BOXC18x5x11", [18, 5, 11, 0.25], 1.2, [8, 0.6, 0.4], [15, 0.6, 4.4], [grey(40), "LightYellow"]];
|
||||||
|
BOXC18x10x16 = ["BOXC18x10x16", [18, 10, 16, 0.25], 1.7, [12, 0.8, 0.4], [15, 0.8, 4.4], [grey(40), "LightYellow"]];
|
||||||
|
|
||||||
|
rd_box_caps = [BOXC18x5x11, BOXC18x10x16];
|
||||||
|
|
||||||
use <radial.scad>
|
use <radial.scad>
|
||||||
|
@@ -35,8 +35,8 @@ neon_spades = [[spade4p8, 7.3, 0, -7, 0],
|
|||||||
//
|
//
|
||||||
// w h t
|
// w h t
|
||||||
//
|
//
|
||||||
small_rocker = ["small_rocker", "Rocker Switch PRASA1-16F-BB0BW", 13, 19.8, 15, 21, 2, 12.8, 18.5, 11.8, 2.5, -1, 3.8, small_spades];
|
small_rocker = ["small_rocker", "Rocker Switch PRASA1-16F-BB0BW", 13, 19.25, 15, 21, 2, 12.8, 18.5, 11.8, 2.5, -1, 3.8, small_spades];
|
||||||
neon_indicator = ["neon_indicator", "Neon Indicator H8630FBNAL", 13, 19.8, 15, 21, 2, 12.8, 18.5, 12.5, 2.5, 0, 0.3, neon_spades];
|
neon_indicator = ["neon_indicator", "Neon Indicator H8630FBNAL", 13, 19.25, 15, 21, 2, 12.8, 18.5, 12.5, 2.5, 0, 0.3, neon_spades];
|
||||||
|
|
||||||
rockers = [small_rocker, neon_indicator];
|
rockers = [small_rocker, neon_indicator];
|
||||||
|
|
||||||
|
@@ -44,6 +44,7 @@ DiBond = [ "DiBond", "Sheet DiBond", 3, [0.2, 0.2, 0.2, 1 ],
|
|||||||
DiBond6 = [ "DiBond6", "Sheet DiBond", 6, [0.2, 0.2, 0.2, 1 ], false];
|
DiBond6 = [ "DiBond6", "Sheet DiBond", 6, [0.2, 0.2, 0.2, 1 ], false];
|
||||||
Cardboard = [ "Cardboard", "Corrugated cardboard", 5, [0.8, 0.6, 0.3, 1 ], false];
|
Cardboard = [ "Cardboard", "Corrugated cardboard", 5, [0.8, 0.6, 0.3, 1 ], false];
|
||||||
FoilTape = [ "FoilTape", "Aluminium foil tape", 0.05,[0.9, 0.9, 0.9, 1 ], false];
|
FoilTape = [ "FoilTape", "Aluminium foil tape", 0.05,[0.9, 0.9, 0.9, 1 ], false];
|
||||||
|
Sellotape = [ "Sellotape", "Sellotape tape", 0.05,[1, 1, 0.9, 0.5 ], false];
|
||||||
Foam20 = [ "Foam20", "Foam sponge", 20,[0.3, 0.3, 0.3, 1 ], true];
|
Foam20 = [ "Foam20", "Foam sponge", 20,[0.3, 0.3, 0.3, 1 ], true];
|
||||||
AL1_6 = [ "AL1_6", "Aluminium tooling plate", 1.6, [0.5, 0.5, 0.5, 0.5], false];
|
AL1_6 = [ "AL1_6", "Aluminium tooling plate", 1.6, [0.5, 0.5, 0.5, 0.5], false];
|
||||||
AL2 = [ "AL2", "Aluminium tooling plate", 2, [0.9, 0.9, 0.9, 1 ], false];
|
AL2 = [ "AL2", "Aluminium tooling plate", 2, [0.9, 0.9, 0.9, 1 ], false];
|
||||||
@@ -59,6 +60,6 @@ CF3 = [ "CF3", "Sheet carbon fiber", 3, grey(35),
|
|||||||
|
|
||||||
|
|
||||||
sheets = [CF1, CF2, CF3, MDF3, MDF6, MDF10, MDF12, MDF19, MDF22, PMMA1p25, PMMA2, PMMA3, PMMA6, PMMA8, PMMA10,
|
sheets = [CF1, CF2, CF3, MDF3, MDF6, MDF10, MDF12, MDF19, MDF22, PMMA1p25, PMMA2, PMMA3, PMMA6, PMMA8, PMMA10,
|
||||||
glass2, DiBond, DiBond6, Cardboard, FoilTape, AL1_6, AL2, AL3, AL6, AL8, Steel06, Spring08, Silicone3, Foam20];
|
glass2, DiBond, DiBond6, Cardboard, FoilTape, Sellotape, AL1_6, AL2, AL3, AL6, AL8, Steel06, Spring08, Silicone3, Foam20];
|
||||||
|
|
||||||
use <sheet.scad>
|
use <sheet.scad>
|
||||||
|
@@ -55,7 +55,7 @@ function smd_size(size) = //! Convert size to 1/100" notation
|
|||||||
|
|
||||||
module smd_led(type, colour, cutout) { //! Draw an SMD LED with specified `colour`
|
module smd_led(type, colour, cutout) { //! Draw an SMD LED with specified `colour`
|
||||||
size = smd_led_size(type);
|
size = smd_led_size(type);
|
||||||
vitamin(str("smd_led(", type[0], ", ", colour, "): SMD LED ", smd_size(size), " ", colour));
|
vitamin(str("smd_led(", type[0], ", \"", colour, "\"): SMD LED ", smd_size(size), " ", colour));
|
||||||
|
|
||||||
lens = smd_led_lens(type);
|
lens = smd_led_lens(type);
|
||||||
r = size.y * 0.32;
|
r = size.y * 0.32;
|
||||||
@@ -137,7 +137,7 @@ function smd_cap_end_cap(type) = type[2]; //! End cap width
|
|||||||
|
|
||||||
module smd_capacitor(type, height, value = undef) { //! Draw an SMD capacitor with specified height
|
module smd_capacitor(type, height, value = undef) { //! Draw an SMD capacitor with specified height
|
||||||
size = smd_cap_size(type);
|
size = smd_cap_size(type);
|
||||||
vitamin(str("smd_capacitor(", type[0], "): SMD capacitor ", smd_size(size), !is_undef(value) ? str(" ", value) : ""));
|
vitamin(str("smd_capacitor(", type[0], arg(value, undef, "value"), "): SMD capacitor ", smd_size(size), !is_undef(value) ? str(" ", value) : ""));
|
||||||
|
|
||||||
cap = smd_cap_end_cap(type);
|
cap = smd_cap_end_cap(type);
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ function smd_sot_lead_size(type) = type[6]; //! Lead width, foot depth, lead
|
|||||||
function smd_sot_tab_width(type) = type[7]; //! The wide lead at the top
|
function smd_sot_tab_width(type) = type[7]; //! The wide lead at the top
|
||||||
|
|
||||||
module smd_sot(type, value) { //! Draw an SMD transistor
|
module smd_sot(type, value) { //! Draw an SMD transistor
|
||||||
vitamin(str("smd_sot(", type[0], "): ", type[0], " package ", value));
|
vitamin(str("smd_sot(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
|
||||||
|
|
||||||
size = smd_sot_size(type);
|
size = smd_sot_size(type);
|
||||||
z0 = smd_sot_z(type);
|
z0 = smd_sot_z(type);
|
||||||
@@ -197,7 +197,6 @@ module smd_sot(type, value) { //! Draw an SMD transistor
|
|||||||
linear_extrude(eps)
|
linear_extrude(eps)
|
||||||
resize([size.x - 4 * (z2 - z1) * tan(slant), size.y / 2])
|
resize([size.x - 4 * (z2 - z1) * tan(slant), size.y / 2])
|
||||||
text(value, halign = "center", valign = "center");
|
text(value, halign = "center", valign = "center");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function smd_soic_size(type) = type[1]; //! Body length, width and height
|
function smd_soic_size(type) = type[1]; //! Body length, width and height
|
||||||
@@ -208,7 +207,7 @@ function smd_soic_lead_span(type) = type[5]; //! Total span of leads
|
|||||||
function smd_soic_lead_size(type) = type[6]; //! Lead width, foot depth, lead thickness
|
function smd_soic_lead_size(type) = type[6]; //! Lead width, foot depth, lead thickness
|
||||||
|
|
||||||
module smd_soic(type, value) { //! Draw an SMD SOIC
|
module smd_soic(type, value) { //! Draw an SMD SOIC
|
||||||
vitamin(str("smd_soic(", type[0], "): ", type[0], " package ", value));
|
vitamin(str("smd_soic(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
|
||||||
|
|
||||||
size = smd_soic_size(type);
|
size = smd_soic_size(type);
|
||||||
z0 = smd_soic_z(type);
|
z0 = smd_soic_z(type);
|
||||||
@@ -261,7 +260,7 @@ function smd_diode_leads(type) = type[4]; //! Lead extent in x, width, thicknes
|
|||||||
function smd_diode_colour(type) = type[5]; //! Body colour
|
function smd_diode_colour(type) = type[5]; //! Body colour
|
||||||
|
|
||||||
module smd_diode(type, value) { //! Draw an SMD diode
|
module smd_diode(type, value) { //! Draw an SMD diode
|
||||||
vitamin(str("smd_diode(", type[0], "): ", type[0], " package ", value));
|
vitamin(str("smd_diode(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
|
||||||
|
|
||||||
slant = 5; //! 5 degree body draft angle
|
slant = 5; //! 5 degree body draft angle
|
||||||
size = smd_diode_size(type);
|
size = smd_diode_size(type);
|
||||||
@@ -326,7 +325,7 @@ module smd_tant(type, value) { //! Draw an SMD tantalum capacitor
|
|||||||
volts = is_undef(value) ? "" : let(c = value[3])
|
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))
|
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");
|
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));
|
vitamin(str("smd_tant(", type[0], arg(value, undef, "value"), "): SMD Tantalum capacitor package ", type[0][len(type[0]) -1], uF, volts));
|
||||||
|
|
||||||
size = smd_tant_size(type);
|
size = smd_tant_size(type);
|
||||||
slant = 5; //! 5 degree body draft angle
|
slant = 5; //! 5 degree body draft angle
|
||||||
@@ -388,7 +387,7 @@ function smd_inductor_leads(type) = type[4]; //! Lead extent in x, width, thick
|
|||||||
function smd_inductor_colour(type) = type[5]; //! Body colour
|
function smd_inductor_colour(type) = type[5]; //! Body colour
|
||||||
|
|
||||||
module smd_inductor(type, value) { //! Draw an SMD inductor
|
module smd_inductor(type, value) { //! Draw an SMD inductor
|
||||||
vitamin(str("smd_inductor(", type[0], "): ", type[0], " package ", value));
|
vitamin(str("smd_inductor(", type[0], " ,\"", value, "\"): ", type[0], " package ", value));
|
||||||
|
|
||||||
size = smd_inductor_size(type);
|
size = smd_inductor_size(type);
|
||||||
z0 = smd_inductor_z(type);
|
z0 = smd_inductor_z(type);
|
||||||
@@ -437,7 +436,7 @@ function smd_pot_cross(type) = type[4]; //! Cross head slot for screwdriver
|
|||||||
function smd_pot_flat(type) = type[5]; //! Flat at the back of the wiper
|
function smd_pot_flat(type) = type[5]; //! Flat at the back of the wiper
|
||||||
|
|
||||||
module smd_pot(type, value) { //! Draw an SMD pot
|
module smd_pot(type, value) { //! Draw an SMD pot
|
||||||
vitamin(str("smd_pot(", type[0], "): ", type[0], " package ", value));
|
vitamin(str("smd_pot(", type[0], ", \"", value, "\"): ", type[0], " package ", value));
|
||||||
|
|
||||||
size = smd_pot_size(type);
|
size = smd_pot_size(type);
|
||||||
contacts = smd_pot_contacts(type);
|
contacts = smd_pot_contacts(type);
|
||||||
@@ -601,7 +600,7 @@ function smd_qfp_pin_size(type) = type[5]; //! Pins dimensions
|
|||||||
function smd_qfp_gullwing(type) = type[6]; //! Gullwing S, L, R1, R2
|
function smd_qfp_gullwing(type) = type[6]; //! Gullwing S, L, R1, R2
|
||||||
|
|
||||||
module smd_qfp(type, value) { //! Draw and SMD QFP package
|
module smd_qfp(type, value) { //! Draw and SMD QFP package
|
||||||
vitamin(str("smd_qfp(", type[0], "): SMD chip: ", value, ", package : ", type[0]));
|
vitamin(str("smd_qfp(", type[0], ", \"", value, "\"): SMD chip: ", value, ", package : ", type[0]));
|
||||||
|
|
||||||
size = smd_qfp_body_size(type);
|
size = smd_qfp_body_size(type);
|
||||||
offset = size.z / 2 * tan(smd_qfp_slant(type));
|
offset = size.z / 2 * tan(smd_qfp_slant(type));
|
||||||
@@ -652,3 +651,66 @@ module smd_qfp(type, value) { //! Draw and SMD QFP package
|
|||||||
circle(r = pin.y, $fn = fn);
|
circle(r = pin.y, $fn = fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function smd_250V_fuse_size(type) = type[1]; //! Bounding box of the body
|
||||||
|
function smd_250V_fuse_z(type) = type[2]; //! Height of body above the PCB surface
|
||||||
|
function smd_250V_fuse_step(type) = type[3]; //! End cutout length, width and height
|
||||||
|
function smd_250V_fuse_base(type) = type[4]; //! Base length
|
||||||
|
|
||||||
|
module gcube(s) translate_z(s.z / 2) cube(s, center = true);
|
||||||
|
|
||||||
|
module smd_250V_fuse(type, value) { //! Draw an SMD mains fuse
|
||||||
|
size = smd_250V_fuse_size(type);
|
||||||
|
step = smd_250V_fuse_step(type);
|
||||||
|
base = smd_250V_fuse_base(type);
|
||||||
|
z = smd_250V_fuse_z(type);
|
||||||
|
|
||||||
|
vitamin(str("smd_250V_fuse(", type[0], ", \"", value, "\"): SMD fuse: ", type[0], " ", value));
|
||||||
|
|
||||||
|
color("LightYellow")
|
||||||
|
translate_z(z) {
|
||||||
|
gcube(base);
|
||||||
|
|
||||||
|
translate_z(base.z)
|
||||||
|
gcube([size.x - step.x * 2, size.y, size.z - base.z]);
|
||||||
|
|
||||||
|
for(end = [-1, 1], side = [-1,1]) {
|
||||||
|
translate([end * (size.x / 2 - step.x / 2), side * (size.y / 2 - step.y / 2)])
|
||||||
|
gcube(step);
|
||||||
|
|
||||||
|
translate([end * (size.x / 2 - step.x / 2 - eps), 0])
|
||||||
|
gcube([step.x, size.y, base.z]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
color(silver) {
|
||||||
|
contact_h = step.z - 0.2;
|
||||||
|
fuse_d = size.y - 2 * step.y;
|
||||||
|
|
||||||
|
for(end = [-1, 1])
|
||||||
|
translate([end * (size.x / 2 - step.x), 0, contact_h / 2])
|
||||||
|
rotate([90, 0, 0])
|
||||||
|
linear_extrude(size.y - 2 * step.y, center = true)
|
||||||
|
difference() {
|
||||||
|
rounded_square([step.x * 2, contact_h], 0.2, $fn = fn);
|
||||||
|
|
||||||
|
translate([-step.x * end, 0])
|
||||||
|
square([step.x * 2, contact_h], center = true);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate_z(step.z - fuse_d / 2)
|
||||||
|
rotate([0, 90, 0])
|
||||||
|
linear_extrude(size.x - (2 * step.x - eps), center = true)
|
||||||
|
scale([1, size.y / fuse_d - eps])
|
||||||
|
rotate(90)
|
||||||
|
semi_circle(fuse_d / 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
color("black")
|
||||||
|
translate_z(z + size.z)
|
||||||
|
linear_extrude(eps)
|
||||||
|
resize([(size.x - 2 * step.x) * 0.9, size.y / 2])
|
||||||
|
text(value, halign = "center", valign = "center");
|
||||||
|
}
|
||||||
|
@@ -70,8 +70,9 @@ TANT_C = ["TANT_C", [5.8, 3.2, 2.6], 0.1, 1.3, [6.0, 2.2, 0.08, 2.9], ["#E9D769
|
|||||||
smd_tants = [TANT_A, TANT_B, TANT_C];
|
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)];
|
IND2525 = ["IND2525", [6.75, 6.75, 2], 0.1, 1.75, [7.24, 3.2, 0.15, 4.4], grey(50)];
|
||||||
|
CDRH104 = ["CDRH104", [10.3, 10.3, 4.0], 0.1, 3.85, [10.5, 3.2, 0.15, 4.4], grey(50)];
|
||||||
|
|
||||||
smd_inductors = [IND2525];
|
smd_inductors = [IND2525, CDRH104];
|
||||||
|
|
||||||
TC33X1 = ["TC33X1", [3.0, 3.8, 0.5], [0.95, 0.9, 0.88, 1.5, 0.2, 0.75],[3.0, 0.1, 0.2, 1.2, 1.7, 1.2, 1, 0.5], [2.1, 0.5], 1.5];
|
TC33X1 = ["TC33X1", [3.0, 3.8, 0.5], [0.95, 0.9, 0.88, 1.5, 0.2, 0.75],[3.0, 0.1, 0.2, 1.2, 1.7, 1.2, 1, 0.5], [2.1, 0.5], 1.5];
|
||||||
|
|
||||||
@@ -86,4 +87,8 @@ QFP50P1200X1200X160_64N = ["QFP50P1200X1200X160_64N", [10, 10, 1.6], 12, 64, 0.5
|
|||||||
|
|
||||||
smd_qfps = [ QFP50P1200X1200X160_64N ];
|
smd_qfps = [ QFP50P1200X1200X160_64N ];
|
||||||
|
|
||||||
|
OMT250 = ["OMT250", [11, 4.6, 3.3], 0.15, [1.9,0.5, 2.7], [5.5, 4.6, 0.5]];
|
||||||
|
|
||||||
|
smd_250V_fuses = [OMT250];
|
||||||
|
|
||||||
use <smd.scad>
|
use <smd.scad>
|
||||||
|
209
vitamins/ttrack.scad
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2024
|
||||||
|
// 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/>.
|
||||||
|
|
||||||
|
//
|
||||||
|
//! T-Tracks used in woodworking jigs
|
||||||
|
//
|
||||||
|
include <../utils/core/core.scad>
|
||||||
|
use <../utils/thread.scad>
|
||||||
|
|
||||||
|
use <screw.scad>
|
||||||
|
|
||||||
|
function ttrack_width(type) = type[1]; //! Width of track section
|
||||||
|
function ttrack_height(type) = type[2]; //! Height of track section
|
||||||
|
function ttrack_opening(type) = type[3]; //! Width of the opening
|
||||||
|
function ttrack_slot_width(type) = type[4]; //! Width of the slot
|
||||||
|
function ttrack_slot_height(type) = type[5]; //! Height of the slot
|
||||||
|
function ttrack_top_thickness(type) = type[6]; //! Thickness of the top layer
|
||||||
|
function ttrack_screw_pitch(type) = type[7]; //! Distance between screws
|
||||||
|
function ttrack_screw(type) = type[8]; //! Screw used to fasten track
|
||||||
|
function ttrack_fixture(type) = type[9]; //! Fixture, such as T-bolt or Miter insert used with this track
|
||||||
|
|
||||||
|
function tbolt_description(type) = type[1]; //! Description of this t-track bolt
|
||||||
|
function tbolt_head_length(type) = type[2]; //! Head length for t-track bolt
|
||||||
|
function tbolt_head_width(type) = type[3]; //! Head width for t-track bolt
|
||||||
|
function tbolt_head_thickness(type) = type[4]; //! Head thickness for t-track bolt
|
||||||
|
function tbolt_thread(type) = type[5]; //! M thread for this bolt
|
||||||
|
|
||||||
|
function t_insert_description(type) = type[1]; //! Description of this t-track insert
|
||||||
|
function t_insert_top_width(type) = type[2]; //! Top Width of t-track insert
|
||||||
|
function t_insert_width(type) = type[3]; //! Width of t-track insert
|
||||||
|
function t_insert_height(type) = type[4]; //! Height of t-track insert
|
||||||
|
function t_insert_top_thickness(type) = type[5]; //! Top thickness for t-track insert
|
||||||
|
function t_insert_thread(type) = type[6]; //! M thread for this the screw hole in this insert
|
||||||
|
|
||||||
|
function ttrack_holes(type, length) = //! Number of holes in a rail given its `length`
|
||||||
|
floor((length - 2 * ttrack_screw_end(type)) / ttrack_screw_pitch(type)) + 1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module ttrack(type, length, colour = "LightSlateGray") { //! Draw the specified rail
|
||||||
|
W = ttrack_width(type);
|
||||||
|
H = ttrack_height(type);
|
||||||
|
SW = ttrack_slot_width(type);
|
||||||
|
SH = ttrack_slot_height(type);
|
||||||
|
T = ttrack_top_thickness(type);
|
||||||
|
O = ttrack_opening(type);
|
||||||
|
screw=ttrack_screw(type);
|
||||||
|
|
||||||
|
vit_colour = (colour == "LightSlateGray" ? "" : str(", colour=\"", colour, "\""));
|
||||||
|
|
||||||
|
vitamin(str("ttrack(", type[0], ", ", length, vit_colour, "): T-Track ", type[0], " x ", length, "mm"));
|
||||||
|
|
||||||
|
color(colour) {
|
||||||
|
difference() {
|
||||||
|
rotate([90,0,0])
|
||||||
|
linear_extrude(length, center=true, convexity = 3)
|
||||||
|
polygon([
|
||||||
|
[ -O/2, 0 ], // left side of the opening
|
||||||
|
[ -W/2, 0 ], // left top
|
||||||
|
[ -W/2, -H ], // left bottom
|
||||||
|
[ W/2, -H ], // right bottom
|
||||||
|
[ W/2, 0 ], // right top
|
||||||
|
[ O/2, 0 ], // right side of the opening
|
||||||
|
[ O/2, -T ], // right bottom side of the opening
|
||||||
|
[ SW/2, -T ], // right top of the slot
|
||||||
|
[ SW/2, -T - SH ], // right bottom of the slot
|
||||||
|
[ -SW/2,-T - SH ], // left bottom of the slot
|
||||||
|
[ -SW/2, -T ], // left top of the slot
|
||||||
|
[ -O/2, -T ] // left bottom side of the opening
|
||||||
|
]);
|
||||||
|
ttrack_hole_positions(type, length) {
|
||||||
|
B = H - (SH + T);
|
||||||
|
screw_countersink(screw, true);
|
||||||
|
translate_z(-B/2)
|
||||||
|
cylinder(r=screw_clearance_radius(screw), h=(H-(SH+T) + 0.2), center=true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module ttrack_assembly(type, length, colour = "LightSlateGray") {
|
||||||
|
ttrack(type, length, colour);
|
||||||
|
ttrack_hole_positions(type, length)
|
||||||
|
explode(20)
|
||||||
|
screw(ttrack_screw(type), 15);
|
||||||
|
}
|
||||||
|
module ttrack_hole_positions(type, length) { //! Position children over screw holes
|
||||||
|
P = ttrack_screw_pitch(type);
|
||||||
|
H = ttrack_height(type);
|
||||||
|
B = H - (ttrack_slot_height(type) + ttrack_top_thickness(type));
|
||||||
|
|
||||||
|
count = floor(length / P);
|
||||||
|
first = (length - count * P)/2;
|
||||||
|
|
||||||
|
c = first < P/3 ? count - 1 : count; // we don't want screws right on the edge
|
||||||
|
N = (length - c * P)/2;
|
||||||
|
|
||||||
|
for (y = [N:P:length-N])
|
||||||
|
translate([0,length/2 - y, -H + B])
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
|
||||||
|
module ttrack_place_bolt(type, pos, bolt = undef) { //! Place a T-Bolt relative to the centre of the track
|
||||||
|
bolt = is_undef(bolt) ? ttrack_fixture(type) : bolt;
|
||||||
|
|
||||||
|
T = tbolt_head_thickness(bolt);
|
||||||
|
translate([0,pos,-(ttrack_top_thickness(type)/2) - T])
|
||||||
|
rotate([0,0,90])
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
|
||||||
|
module ttrack_place_insert(type, pos, insert = undef) { //! Place a T-Insert relative to the centre of the track
|
||||||
|
insert = is_undef(insert) ? ttrack_fixture(type) : insert;
|
||||||
|
TT = t_insert_top_thickness(insert);
|
||||||
|
T = ttrack_top_thickness(type);
|
||||||
|
translate([0,pos,-T+TT])
|
||||||
|
rotate([0,0,90])
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
|
||||||
|
module ttrack_bolt(type, length) {
|
||||||
|
L = tbolt_head_length(type);
|
||||||
|
W = tbolt_head_width(type);
|
||||||
|
T = tbolt_head_thickness(type);
|
||||||
|
distance = L - W;
|
||||||
|
|
||||||
|
D = tbolt_thread(type);
|
||||||
|
pitch = metric_coarse_pitch(D);
|
||||||
|
|
||||||
|
vitamin(str(tbolt_description(type), ":", "M", D, " x ", length, "mm"));
|
||||||
|
|
||||||
|
color(silver) {
|
||||||
|
hull()
|
||||||
|
for (x = [-1, 1])
|
||||||
|
translate([x * distance/2, 0, 0])
|
||||||
|
cylinder(d=W, h=T, center=true);
|
||||||
|
|
||||||
|
translate_z((length/2))
|
||||||
|
male_metric_thread(D, pitch, length - T, center = true, top = -1, bot = 0, solid = true, colour = undef);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module ttrack_insert(type, length, num_holes = 1, colour="LightSlateGray") {
|
||||||
|
TW = t_insert_top_width(type);
|
||||||
|
W = t_insert_width(type);
|
||||||
|
H = t_insert_height(type);
|
||||||
|
T = t_insert_top_thickness(type);
|
||||||
|
//distance = L - W;
|
||||||
|
|
||||||
|
D = t_insert_thread(type);
|
||||||
|
pitch = metric_coarse_pitch(D);
|
||||||
|
|
||||||
|
vit_colour = (colour == "LightSlateGray" ? "" : str(", colour=\"", colour, "\""));
|
||||||
|
vitamin(str("ttrack_insert(", type[0], ", ", length, ", ", num_holes, vit_colour, "):", t_insert_description(type), ", M", length, "mm, with ", num_holes, " M", D));
|
||||||
|
|
||||||
|
color(colour) {
|
||||||
|
union() {
|
||||||
|
difference() {
|
||||||
|
rotate([90,0,90]) {
|
||||||
|
linear_extrude(length, center=true, convexity=2)
|
||||||
|
polygon([
|
||||||
|
[ -TW/2, 0 ], // left top
|
||||||
|
[ -TW/2, -T ], // left centre, bottom of top
|
||||||
|
[ -W/2, -T ], // left centre
|
||||||
|
[ -W/2, -H ], // left bottom
|
||||||
|
[ W/2, -H ], // right bottom
|
||||||
|
[ W/2, -T ], // right centre
|
||||||
|
[ TW/2, -T ], // right centre, bottom of top
|
||||||
|
[ TW/2, 0 ] // right top
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
ttrack_insert_hole_positions(type, length, num_holes)
|
||||||
|
translate_z(-H/2)
|
||||||
|
cylinder(h=H+1, d=t_insert_thread(type), center=true);
|
||||||
|
}
|
||||||
|
ttrack_insert_hole_positions(type, length, num_holes)
|
||||||
|
translate_z(-H/2)
|
||||||
|
female_metric_thread(D, pitch, H, center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module ttrack_insert_hole_positions(type, length, num_holes) {
|
||||||
|
P = length / (num_holes + 1);
|
||||||
|
for (x = [P:P:length-P])
|
||||||
|
translate([length/2 - x,0,0])
|
||||||
|
children();
|
||||||
|
}
|
52
vitamins/ttracks.scad
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2024
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
include <../core.scad>
|
||||||
|
|
||||||
|
use <screw.scad>
|
||||||
|
|
||||||
|
// Bolts HL, HW, HT, Thread M
|
||||||
|
ttrack_bolt_M6 = [ "ttrack_bolt_M6", "T-Track Bolt M6", 18, 12, 2.5, 6 ];
|
||||||
|
ttrack_bolt_M6_small = [ "ttrack_bolt_M6_small", "T-Track Bolt M6 with small head", 18, 11, 2.5, 6 ];
|
||||||
|
ttrack_bolt_M8 = [ "ttrack_bolt_M8", "T-Track Bolt M8", 22.5, 12.6, 3, 8 ];
|
||||||
|
|
||||||
|
// Inserts
|
||||||
|
// TW, W, H, SH, Thread M
|
||||||
|
ttrack_insert_mitre_30_M6 = [ "TTrack_insert_Miter30_M6", "T-Track insert, Miter track 30mm, M6 thread", 19, 23, 7.8, 4.8, 6 ];
|
||||||
|
ttrack_insert_mitre_30_M8 = [ "TTrack_insert_Miter30_M8", "T-Track insert, Miter track 30mm, M8 thread", 19, 23, 7.8, 4.8, 8 ];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tracks
|
||||||
|
// Width, Depth, Opening, Slot width, slot height, Top thickness, Screw pitch
|
||||||
|
// W D O SW SH TT Sp
|
||||||
|
ttrack_universal_19mm = [ "ttrack_universal_19mm", 19, 9.5, 9.5, 14.2, 3.3, 2.4, 75, M3_cs_cap_screw, ttrack_bolt_M8 ];
|
||||||
|
ttrack_universal_19mm_A = [ "ttrack_universal_19mm_A", 18.7, 12.5, 8.3, 12, 7.3, 3.5, 75, M3_cs_cap_screw, ttrack_bolt_M6 ];
|
||||||
|
ttrack_universal_19mm_B = [ "ttrack_universal_19mm_B", 19, 9.5, 6.6, 11.3, 4, 2.5, 75, M3_cs_cap_screw, ttrack_bolt_M6_small ];
|
||||||
|
|
||||||
|
ttrack_mitre_30mm = [ "ttrack_mitre_30mm", 30, 12.8, 19.3, 23.6, 3.1, 5.4, 75, M4_cs_cap_screw, ttrack_insert_mitre_30_M6 ];
|
||||||
|
ttrack_mitre_36mm = [ "ttrack_mitre_36mm", 36, 13.5, 19, 23.5, 3.6, 3.6, 75, M4_cs_cap_screw ];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ttracks = [ ttrack_universal_19mm, ttrack_universal_19mm_A, ttrack_universal_19mm_B, ttrack_mitre_30mm, ttrack_mitre_36mm];
|
||||||
|
ttrack_bolts = [ ttrack_bolt_M6, ttrack_bolt_M6_small, ttrack_bolt_M8 ];
|
||||||
|
ttrack_inserts = [ ttrack_insert_mitre_30_M6, ttrack_insert_mitre_30_M8 ];
|
||||||
|
|
||||||
|
|
||||||
|
use <ttrack.scad>
|
@@ -18,10 +18,11 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
//! Tubing and sleeving. The internal diameter can be forced to stretch it over something.
|
//! Tubing and sleeving. The internal diameter can be forced to stretch it over something. A path can be specified, otherwise it is just straight with the specified length.
|
||||||
//
|
//
|
||||||
include <../utils/core/core.scad>
|
include <../utils/core/core.scad>
|
||||||
include <../utils/tube.scad>
|
include <../utils/tube.scad>
|
||||||
|
include <../utils/sweep.scad>
|
||||||
|
|
||||||
function tubing_material(type) = type[1]; //! Material description
|
function tubing_material(type) = type[1]; //! Material description
|
||||||
function tubing_od(type) = type[2]; //! Outside diameter
|
function tubing_od(type) = type[2]; //! Outside diameter
|
||||||
@@ -31,11 +32,12 @@ function tubing_colour(type) = type[4]; //! Colour
|
|||||||
function tubing_or(type) = tubing_od(type) / 2; //! Outside radius
|
function tubing_or(type) = tubing_od(type) / 2; //! Outside radius
|
||||||
function tubing_ir(type) = tubing_id(type) / 2; //! Inside radius
|
function tubing_ir(type) = tubing_id(type) / 2; //! Inside radius
|
||||||
|
|
||||||
module tubing(type, length = 15, forced_id = 0, center = true) { //! Draw specified tubing with optional forced internal diameter
|
module tubing(type, length = 15, forced_id = 0, center = true, path = []) { //! Draw specified tubing with optional forced internal diameter and optional path.
|
||||||
original_od = tubing_od(type);
|
original_od = tubing_od(type);
|
||||||
original_id = tubing_id(type);
|
original_id = tubing_id(type);
|
||||||
id = forced_id ? forced_id : original_id;
|
id = forced_id ? forced_id : original_id;
|
||||||
od = original_od + id - original_id;
|
od = original_od + id - original_id;
|
||||||
|
length = path ? round(path_length(path)) : length;
|
||||||
if(tubing_material(type) == "Heatshrink sleeving")
|
if(tubing_material(type) == "Heatshrink sleeving")
|
||||||
vitamin(str("tubing(", type[0], arg(length, 15), "): ", tubing_material(type), " ID ", original_id, "mm x ",length, "mm"));
|
vitamin(str("tubing(", type[0], arg(length, 15), "): ", tubing_material(type), " ID ", original_id, "mm x ",length, "mm"));
|
||||||
else
|
else
|
||||||
@@ -45,9 +47,19 @@ module tubing(type, length = 15, forced_id = 0, center = true) { //! Draw specif
|
|||||||
woven_tube(od / 2, id /2, center = center, length, colour = tubing_colour(type));
|
woven_tube(od / 2, id /2, center = center, length, colour = tubing_colour(type));
|
||||||
else
|
else
|
||||||
color(tubing_colour(type))
|
color(tubing_colour(type))
|
||||||
linear_extrude(length, center = center, convexity = 4)
|
if(path)
|
||||||
difference() {
|
render_if(manifold)
|
||||||
circle(d = od);
|
difference() {
|
||||||
circle(d = id);
|
sweep(path, circle_points(od / 2));
|
||||||
}
|
start = path[0] - eps * unit(path[1] - path[0]);
|
||||||
|
n = len(path) - 1;
|
||||||
|
end = path[n] + eps * unit(path[n] - path[n - 1]);
|
||||||
|
sweep(concat([start], path, [end]), circle_points(id / 2));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
linear_extrude(length, center = center, convexity = 4)
|
||||||
|
difference() {
|
||||||
|
circle(d = od);
|
||||||
|
circle(d = id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
//! If a washer is given a child, usually a screw or a nut, then it is placed on its top surface.
|
//! If a washer is given a child, usually a screw or a nut, then it is placed on its top surface.
|
||||||
//
|
//
|
||||||
include <../utils/core/core.scad>
|
include <../utils/core/core.scad>
|
||||||
include <../utils/sweep.scad>
|
use <../utils/sweep.scad>
|
||||||
|
|
||||||
soft_washer_colour = grey(20);
|
soft_washer_colour = grey(20);
|
||||||
hard_washer_colour = grey(85);
|
hard_washer_colour = grey(85);
|
||||||
|
@@ -44,23 +44,62 @@ function cable_is_ribbon(cable) = len(cable) > 2 && cable[2]; //! Is a ribbon ca
|
|||||||
function cable_wire_colours(cable) = assert(len(cable[3]) >= cable_wires(cable)) cable[3]; //! Individual wire colours
|
function cable_wire_colours(cable) = assert(len(cable[3]) >= cable_wires(cable)) cable[3]; //! Individual wire colours
|
||||||
function cable_tlen(cable) = cable[4]; //! Twisted cable twist length
|
function cable_tlen(cable) = cable[4]; //! Twisted cable twist length
|
||||||
function cable(wires, size, colours, ribbon = false, tlen = 25) = [wires, size, ribbon, colours, tlen]; //! Cable constructor
|
function cable(wires, size, colours, ribbon = false, tlen = 25) = [wires, size, ribbon, colours, tlen]; //! Cable constructor
|
||||||
|
function cable_merge(cable1, cable2) = //! Combine the wires of two cables
|
||||||
|
assert(cable_wire_size(cable1) == cable_wire_size(cable2))
|
||||||
|
assert(cable_is_ribbon(cable1) == cable_is_ribbon(cable2))
|
||||||
|
cable(cable_wires(cable1) + cable_wires(cable2),
|
||||||
|
cable_wire_size(cable1),
|
||||||
|
concat(cable_wire_colours(cable1), cable_wire_colours(cable1)),
|
||||||
|
cable_is_ribbon(cable1));
|
||||||
|
|
||||||
// numbers from http://mathworld.wolfram.com/CirclePacking.html
|
// numbers from https://en.wikipedia.org/wiki/Circle_packing_in_a_circle
|
||||||
function cable_radius(cable) = [0, 1, 2, 2.15, 2.41, 2.7, 3, 3, 3.3][cable_wires(cable)] * cable_wire_size(cable) / 2; //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
|
function cable_radius(cable) = [ //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
|
||||||
|
0, 1, 2,
|
||||||
|
2.154, // 3
|
||||||
|
2.414, // 4
|
||||||
|
2.701, // 5
|
||||||
|
3, // 6
|
||||||
|
3, // 7
|
||||||
|
3.304, // 8
|
||||||
|
3.613, // 9
|
||||||
|
3.813, // 10
|
||||||
|
3.923, // 11
|
||||||
|
4.029, // 12
|
||||||
|
4.236, // 13
|
||||||
|
4.328, // 14
|
||||||
|
4.521, // 15
|
||||||
|
4.615, // 16
|
||||||
|
4.792, // 17
|
||||||
|
4.863, // 18
|
||||||
|
4.863, // 19
|
||||||
|
5.122, // 20
|
||||||
|
][cable_wires(cable)] * cable_wire_size(cable) / 2;
|
||||||
|
|
||||||
function wire_hole_radius(cable) = ceil(4 * cable_radius(cable) + 1) / 4; //! Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size
|
function wire_hole_radius(cable) = ceil(4 * cable_radius(cable) + 1) / 4; //! Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size
|
||||||
|
|
||||||
function cable_bundle(cable) = //! Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip
|
function cable_bundle(cable) = //! Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip
|
||||||
(cable_is_ribbon(cable) ? [cable_wires(cable), 1] :
|
(cable_is_ribbon(cable) ? [cable_wires(cable), 1] :
|
||||||
[[0,0], [1,1], [2,1], [2, 1 + sin(60)], [2,2], [3, 1 + sin(60)], [3,2]][cable_wires(cable)]) * cable_wire_size(cable);
|
[[0, 0], // 0
|
||||||
|
[1, 1], // 1
|
||||||
|
[2, 1], // 2
|
||||||
|
[2, 1 + sin(60)], // 3
|
||||||
|
[2, 2], // 4
|
||||||
|
[3, 1 + sin(60)], // 5
|
||||||
|
[3, 2], // 6
|
||||||
|
[4, 1 + sin(60)], // 7
|
||||||
|
[3, 2 + sin(60)], // 8
|
||||||
|
[3, 3]
|
||||||
|
][cable_wires(cable)]) * cable_wire_size(cable);
|
||||||
|
|
||||||
function cable_bundle_positions(cable) = let( //! Positions of wires in a bundle to go through a cable strip
|
function cable_bundle_positions(cable) = let( //! Positions of wires in a bundle to go through a cable strip
|
||||||
wires = cable_wires(cable),
|
wires = cable_wires(cable),
|
||||||
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : ceil(wires / 2),
|
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : wires <= 7 ? ceil(wires / 2) : min(wires, 3),
|
||||||
top = wires - bottom
|
middle = min(wires - bottom, 3),
|
||||||
|
top = wires - bottom - middle
|
||||||
)
|
)
|
||||||
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
|
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
|
||||||
for(i = [top - 1 : -1 : 0]) [i - (top - 1) / 2, top == bottom ? 1.5 : 0.5 + sin(60)]
|
for(i = [middle - 1 : -1 : 0]) [i - (middle - 1) / 2, middle == bottom ? 1.5 : 0.5 + sin(60)],
|
||||||
|
for(i = [0 : 1 : top - 1]) [i - [0.5, 0.5, 1][top - 1], top == middle ? 2.5 : 1.5 + sin(60)]
|
||||||
] * cable_wire_size(cable);
|
] * cable_wire_size(cable);
|
||||||
|
|
||||||
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip
|
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip
|
||||||
|