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.
|
||||
|
||||
|
||||
#### [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")
|
||||
* 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.
|
||||
|
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
|
||||
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/rounded_polygon.scad>
|
||||
use <utils/rounded_triangle.scad>
|
||||
use <utils/splines.scad>
|
||||
use <utils/layout.scad>
|
||||
use <utils/round.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/toggles.scad>
|
||||
use <tests/transformers.scad>
|
||||
use <tests/ttracks.scad>
|
||||
use <tests/tubings.scad>
|
||||
use <tests/veroboard.scad>
|
||||
use <tests/washers.scad>
|
||||
@@ -220,15 +221,12 @@ translate([950, box_y])
|
||||
box_test();
|
||||
|
||||
|
||||
translate([950, 1525])
|
||||
rotate(-90)
|
||||
bbox_test();
|
||||
|
||||
inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
washers_y = nuts_y + 140;
|
||||
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;
|
||||
o_rings_y = springs_y;
|
||||
sealing_strip_y = springs_y + 20;
|
||||
@@ -246,6 +244,10 @@ fans_y = displays_y + 110;
|
||||
transformers_y = fans_y + 120;
|
||||
psus_y = transformers_y + 190;
|
||||
|
||||
ttracks_y = pcbs_y + 150;
|
||||
translate([840, ttracks_y])
|
||||
ttracks();
|
||||
|
||||
translate([x0 + 35, inserts_y])
|
||||
inserts();
|
||||
|
||||
@@ -258,6 +260,9 @@ translate([x0, nuts_y])
|
||||
translate([x0, washers_y])
|
||||
washers();
|
||||
|
||||
translate([x0, threaded_inserts_y])
|
||||
threaded_inserts();
|
||||
|
||||
translate([x0, screws_y])
|
||||
screws();
|
||||
|
||||
@@ -467,6 +472,9 @@ translate([370, transformers_y])
|
||||
translate([x4, transformers_y])
|
||||
no_explode() socket_boxes();
|
||||
|
||||
translate([950, transformers_y + 110])
|
||||
rotate(-90)
|
||||
bbox_test();
|
||||
|
||||
belts_y = 0;
|
||||
rails_y = belts_y + 200;
|
||||
|
@@ -494,6 +494,7 @@ module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = un
|
||||
for(p = screw_positions)
|
||||
multmatrix(p)
|
||||
translate_z(thickness)
|
||||
let($horizontal = true)
|
||||
children();
|
||||
|
||||
r = box_boss_r(type);
|
||||
@@ -503,10 +504,11 @@ module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = un
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
translate([x * (box_width(type) / 2 - inset), y * (box_depth(type) / 2 - inset)])
|
||||
rotate(45 * x * (2 + y))
|
||||
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;
|
||||
insert = box_shelf_insert(type);
|
||||
lip = 2 * insert_boss_radius(insert, w);
|
||||
@@ -561,9 +563,13 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
|
||||
children(0);
|
||||
}
|
||||
|
||||
hflip()
|
||||
hflip() {
|
||||
box_shelf_screw_positions(type, screw_positions, 0, w)
|
||||
boss();
|
||||
|
||||
if($children > 2)
|
||||
children(2);
|
||||
}
|
||||
}
|
||||
if($children > 1)
|
||||
hflip()
|
||||
@@ -571,7 +577,7 @@ module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a
|
||||
|
||||
hflip()
|
||||
box_shelf_screw_positions(type, screw_positions, 0, w)
|
||||
insert_hole(insert, counterbore = 1, horizontal = true);
|
||||
insert_hole(insert, counterbore = 1, horizontal = $horizontal);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -18,29 +18,43 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! 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>
|
||||
use <../vitamins/wire.scad>
|
||||
use <../utils/fillet.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
||||
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_height(cable) = cable_height(cable) + wall; //! Height given the `cable`.
|
||||
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
|
||||
function cable_clip_insert(screw, insert = true) = //! Insert type for clip, given screw.
|
||||
is_list(insert) ? insert : insert ? screw_insert(screw, true) : false;
|
||||
|
||||
module single_cable_clip(screw, cable, h = 0) {
|
||||
screw_dia = 2 * screw_clearance_radius(screw);
|
||||
height = cable_clip_width(screw);
|
||||
depth = h ? h : cable_height(cable) + wall;
|
||||
function cable_clip_width(screw, insert = false, nut = false) = //! Width given the `screw` and possibly insert or nut.
|
||||
let(insert = cable_clip_insert(screw, insert))
|
||||
insert ? 2 * (insert_hole_radius(insert) + 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);
|
||||
width = wall + w + wall + screw_dia + wall;
|
||||
hole_x = wall + w + wall + screw_dia / 2;
|
||||
width = wall + w + height;
|
||||
hole_x = wall + w + height / 2;
|
||||
rad = min(wall + cable_wire_size(cable) / 2, depth / 2);
|
||||
r = extrusion_width - eps;
|
||||
translate([-hole_x, 0]) difference() {
|
||||
the_nut = screw_nut(screw);
|
||||
translate([-hole_x, 0])
|
||||
difference() {
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
hull() {
|
||||
@@ -68,50 +82,73 @@ module single_cable_clip(screw, cable, h = 0) {
|
||||
}
|
||||
}
|
||||
|
||||
translate([hole_x, depth / 2, height / 2])
|
||||
rotate([90,0,0])
|
||||
teardrop_plus(h = depth + 1, r = screw_dia / 2, center = true);
|
||||
translate([hole_x, depth, height / 2])
|
||||
rotate([90, 0, 0])
|
||||
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) {
|
||||
h = max(cable_clip_height(cable1), cable_clip_height(cable2));
|
||||
module double_cable_clip(screw, cable1, cable2, insert = false, nut = false) {
|
||||
h = max(cable_clip_height(cable1, screw, insert, nut), cable_clip_height(cable2, screw, insert, nut));
|
||||
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
|
||||
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20);
|
||||
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, insert ? "I" : nut ? "N" : "");
|
||||
function cable_str(cable) = str("_", cable_wires(cable), "_", round(cable_wire_size(cable) * 10));
|
||||
|
||||
if(cable2) {
|
||||
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)));
|
||||
|
||||
double_cable_clip(screw, cable1, cable2);
|
||||
}
|
||||
else {
|
||||
stl(str(clip_str(screw), cable_str(cable1)));
|
||||
|
||||
single_cable_clip(screw, cable1);
|
||||
}
|
||||
assert(!(insert && nut), "insert and nut mutually exclusive");
|
||||
if(cable2)
|
||||
stl(str(clip_str(screw), cable_str(cable1), cable_str(cable2)))
|
||||
double_cable_clip(screw, cable1, cable2, insert, nut);
|
||||
else
|
||||
stl(str(clip_str(screw), cable_str(cable1)))
|
||||
single_cable_clip(screw, cable1, h = 0, insert = insert, nut = nut);
|
||||
}
|
||||
|
||||
|
||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0) { //! Cable clip with the fasteners
|
||||
height = max(cable_clip_height(cable1), cable2 ? cable_clip_height(cable2) : 0);
|
||||
module cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false, nut = false, nyloc = true) { //! Cable clip with the fasteners
|
||||
flip = flip || insert || nut; // Screw must be below if using an insert or nut
|
||||
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()
|
||||
translate([0, cable_clip_width(screw) / 2]) rotate([90, 0, 0])
|
||||
cable_clip(screw, cable1, cable2);
|
||||
translate([0, cable_clip_width(screw, insert, nut) / 2])
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#hygrometer">Hygrometer</a> </td><td></td><td></td><td></td><td></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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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> <a href = "#zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
@@ -779,6 +779,11 @@ PCB cameras.
|
||||
| `camera_lens_offset(type)` | Offset of the lens center from the PCB centre |
|
||||
| `camera_pcb(type)` | The PCB part of the camera |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `camera_lens_height(type)` | The height of the lens stack |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
@@ -982,6 +987,7 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `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_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 |
|
||||
@@ -1453,7 +1459,7 @@ Geared tin can steppers
|
||||
### Modules
|
||||
| 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 |
|
||||
|
||||

|
||||
@@ -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_ring3_d(type)` | Diameter of the bottom ring |
|
||||
| `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
|
||||
| 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_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) |
|
||||
| `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(F1BM4)` | Heatfit insert M4 x 8.2mm |
|
||||
| 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>
|
||||
@@ -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 | `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 | `rd_disc(6p4mm_disc, "100n")` | Ceramic capacitor, 6p4mm_disc 100n |
|
||||
| 1 | `rd_xtal(ACT1100, "40MHz")` | Crystal ACT1100 40MHz |
|
||||
| 1 | `rd_xtal(ACT1700, "80MHz")` | Crystal ACT1700 80MHz |
|
||||
| 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 | `d_plug(DCONN9, pcb = true)` | D-type 9 way PCB mount plug |
|
||||
| 1 | `dil_socket(12, 15.24)` | DIL socket 24 x 0.6" |
|
||||
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
|
||||
| 1 | `smd_diode(DO214AC, "SS34")` | DO214AC package SS34 |
|
||||
| 2 | `ax_diode(DO_41, "1N4007")` | Diode 1N4007 |
|
||||
| 2 | `ax_diode(DO_35, "1N4148")` | Diode 1N4148 |
|
||||
| 1 | `rd_electrolytic(ECAP8x12, "220uF35V")` | Electolytic capacitor ECAP8x12 220uF35V |
|
||||
| 1 | `hdmi(hdmi_full)` | HDMI socket |
|
||||
| 1 | `pdip(24, 27C32, w = 15.24)` | IC 27C32 PDIP24 |
|
||||
| 1 | `pdip(8, NE555)` | IC NE555 PDIP8 |
|
||||
| 1 | `idc_transition(2p54header, 5)` | IDC transition header 5 x 2 |
|
||||
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
|
||||
| 1 | `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_xh_header, 2)` | JST XH 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 |
|
||||
| 2 | `pin_socket(2p54header, 8, 1)` | Pin socket 8 x 1 |
|
||||
| 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_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_4, 10000)` | Resistor 10000 Ohms 5% 0.25W |
|
||||
| 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 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
|
||||
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
|
||||
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
|
||||
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 10V |
|
||||
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 16V |
|
||||
| 1 | `smd_capacitor(CAP0402)` | SMD capacitor 0402 10nF |
|
||||
| 1 | `smd_capacitor(CAP0502)` | SMD capacitor 0502 10nF |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 10nF |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 100nF |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 1uF |
|
||||
| 1 | `smd_qfp(QFP50P1200X1200X160_64N)` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
|
||||
| 1 | `smd_led(LED0603, "orange")` | SMD LED 0603 orange |
|
||||
| 1 | `smd_led(LED0805, "red")` | SMD LED 0805 red |
|
||||
| 1 | `smd_led(LED1206, "blue")` | SMD LED 1306 blue |
|
||||
| 1 | `smd_tant(TANT_A, value = "105e")` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||
| 1 | `smd_tant(TANT_B, value = "106A")` | SMD Tantalum capacitor package B ,10uF, 10V |
|
||||
| 1 | `smd_tant(TANT_C, value = "107C")` | SMD Tantalum capacitor package C ,100uF, 16V |
|
||||
| 1 | `smd_capacitor(CAP0402, value = "10nF")` | SMD capacitor 0402 10nF |
|
||||
| 1 | `smd_capacitor(CAP0502, value = "10nF")` | SMD capacitor 0502 10nF |
|
||||
| 1 | `smd_capacitor(CAP0603, value = "10nF")` | SMD capacitor 0603 10nF |
|
||||
| 1 | `smd_capacitor(CAP0805, value = "100nF")` | SMD capacitor 0805 100nF |
|
||||
| 1 | `smd_capacitor(CAP1206, value = "1uF")` | SMD capacitor 1206 1uF |
|
||||
| 1 | `smd_qfp(QFP50P1200X1200X160_64N, "ATSAM4S4BA")` | SMD chip: ATSAM4S4BA, package : QFP50P1200X1200X160_64N |
|
||||
| 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_250V_fuse(OMT250, "2A 250V")` | SMD fuse: OMT250 2A 250V |
|
||||
| 1 | `smd_resistor(RES0402, 1)` | SMD resistor 0402 1 0.0625W |
|
||||
| 1 | `smd_resistor(RES0502, 10)` | SMD resistor 0502 10 0.05W |
|
||||
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 1M)` | SMD resistor 1206 1M 0.25W |
|
||||
| 1 | `smd_soic(SOIC14)` | SOIC14 package 74HC00 |
|
||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package ICL323 |
|
||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package PIC18F88 |
|
||||
| 1 | `smd_soic(SOIC8)` | SOIC8 package M34063 |
|
||||
| 1 | `smd_sot(SOT223)` | SOT223 package LM117 |
|
||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
||||
| 1 | `smd_soic(SOIC14, "74HC00")` | SOIC14 package 74HC00 |
|
||||
| 1 | `smd_soic(SOIC16, "ICL323")` | SOIC16 package ICL323 |
|
||||
| 1 | `smd_soic(SOIC18, "PIC18F88")` | SOIC18 package PIC18F88 |
|
||||
| 1 | `smd_soic(SOIC8, "M34063")` | SOIC8 package M34063 |
|
||||
| 1 | `smd_sot(SOT223, "LM117")` | SOT223 package LM117 |
|
||||
| 1 | `smd_sot(SOT23, "2N7000")` | SOT23 package 2N7000 |
|
||||
| 1 | `square_button(button_4p5mm)` | Square button 4.5mm |
|
||||
| 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 | `green_terminal(gt_5p08, 2)` | Terminal block 2 way 0.2" |
|
||||
| 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 | `pcb(test_pcb)` | Test PCB |
|
||||
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
|
||||
| 1 | `rd_disc(ERZV07D471, "471")` | Varistor, ERZV07D471 471 |
|
||||
| 2 | `vero_pin()` | Vero board pin |
|
||||
| 1 | `wire_link(0.8, 5.08, h = 10.16)` | Wire link 0.8mm x 0.2" |
|
||||
| 1 | `wire_link(0.8, 10.16)` | Wire link 0.8mm x 0.4" |
|
||||
| 1 | `wire_link(0.8, 10.16, h = 0.75, sleeve = [1.5, "red"])` | Wire link 0.8mm x 0.4" with red sleeving |
|
||||
| 1 | `wire_link(0.8, 0, h = 5)` | Wire link 0.8mm x 8mm |
|
||||
| 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>
|
||||
@@ -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 |
|
||||
| 6 | | Micro SD card |
|
||||
| 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(3)` | Molex KK header 3 way - not shown |
|
||||
| 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 |
|
||||
| 4 | `screw(M2_cap_screw, 25)` | Screw M2 cap x 25mm |
|
||||
| 2 | `screw(M2p5_cap_screw, 20)` | Screw M2.5 cap x 20mm |
|
||||
| 4 | `screw(M2p5_cap_screw, 25)` | Screw M2.5 cap x 25mm |
|
||||
| 4 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
||||
| 8 | `screw(M2p5_cap_screw, 30)` | Screw M2.5 cap x 30mm |
|
||||
| 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_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 |
|
||||
| 13 | `screw(M3_cap_screw, 20)` | Screw M3 cap x 20mm |
|
||||
| 4 | `screw(M3_cap_screw, 25)` | Screw M3 cap x 25mm |
|
||||
| 8 | `screw(M3_cap_screw, 30)` | Screw M3 cap x 30mm |
|
||||
| 3 | `screw(M3_cap_screw, 35)` | Screw M3 cap x 35mm |
|
||||
| 11 | `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, 25)` | Screw M4 cap x 25mm |
|
||||
| 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 |
|
||||
| ---:|:--- |
|
||||
| 4 | pcb_spacer20100.stl |
|
||||
| 4 | pcb_spacer20140.stl |
|
||||
| 4 | pcb_spacer20150.stl |
|
||||
| 4 | pcb_spacer2070.stl |
|
||||
| 4 | pcb_spacer2080.stl |
|
||||
| 4 | pcb_spacer2090.stl |
|
||||
| 2 | pcb_spacer25100.stl |
|
||||
| 4 | pcb_spacer25130.stl |
|
||||
| 4 | pcb_spacer25160.stl |
|
||||
| 2 | pcb_spacer25110.stl |
|
||||
| 4 | pcb_spacer25140.stl |
|
||||
| 4 | pcb_spacer25170.stl |
|
||||
| 4 | pcb_spacer25180_2.stl |
|
||||
| 4 | pcb_spacer25180.stl |
|
||||
| 4 | pcb_spacer25190_2.stl |
|
||||
| 4 | pcb_spacer25230.stl |
|
||||
| 4 | pcb_spacer25200_2.stl |
|
||||
| 4 | pcb_spacer25240.stl |
|
||||
| 4 | pcb_spacer25250.stl |
|
||||
| 4 | pcb_spacer25260.stl |
|
||||
| 4 | pcb_spacer2580.stl |
|
||||
| 4 | pcb_spacer30120.stl |
|
||||
| 4 | pcb_spacer30200.stl |
|
||||
| 4 | pcb_spacer30130.stl |
|
||||
| 4 | pcb_spacer30210.stl |
|
||||
| 3 | pcb_spacer30220.stl |
|
||||
| 4 | pcb_spacer30220.stl |
|
||||
| 3 | pcb_spacer30230.stl |
|
||||
| 10 | pcb_spacer3050.stl |
|
||||
| 9 | pcb_spacer3060.stl |
|
||||
| 9 | pcb_spacer3070.stl |
|
||||
@@ -3383,6 +3406,11 @@ Radial components for PCBs.
|
||||
### Properties
|
||||
| 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_kind(type)` | Capacitor, etc |
|
||||
| `rd_disc_lead_d(type)` | Lead diameter and sleeve diameter |
|
||||
@@ -3412,6 +3440,7 @@ Radial components for PCBs.
|
||||
### Modules
|
||||
| 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_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 |
|
||||
@@ -3437,6 +3466,8 @@ Radial components for PCBs.
|
||||
| 1 | `rd_transistor(E_LINE, "ZTX853")` | Transistor E_LINE ZTX853 |
|
||||
| 1 | `rd_transistor(TO92, "BC337")` | Transistor TO92 BC337 |
|
||||
| 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>
|
||||
@@ -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(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(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(DiBond6, 30, 30, 2)` | Sheet DiBond 30mm x 30mm x 6mm |
|
||||
| 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
|
||||
| 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_size(type)` | Body length, width |
|
||||
| `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
|
||||
| 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_coax(type)` | Draw an SMD coaxial connector |
|
||||
| `smd_diode(type, value)` | Draw an SMD diode |
|
||||
@@ -4211,37 +4248,39 @@ E.g. 475A is 4.7uF 10V on the parts list.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `smd_diode(DO214AC)` | DO214AC package SS34 |
|
||||
| 1 | `smd_inductor(IND2525)` | IND2525 package 4R7 |
|
||||
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
|
||||
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
|
||||
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
|
||||
| 1 | `smd_tant(TANT_A)` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||
| 1 | `smd_tant(TANT_B)` | SMD Tantalum capacitor package B ,10uF, 6.3V |
|
||||
| 1 | `smd_tant(TANT_C)` | SMD Tantalum capacitor package C ,100uF, 10V |
|
||||
| 1 | `smd_inductor(CDRH104 ,"10R")` | CDRH104 package 10R |
|
||||
| 1 | `smd_diode(DO214AC, "SS34")` | DO214AC package SS34 |
|
||||
| 1 | `smd_inductor(IND2525 ,"4R7")` | IND2525 package 4R7 |
|
||||
| 1 | `smd_led(LED0603, "green")` | SMD LED 0603 green |
|
||||
| 1 | `smd_led(LED0805, "blue")` | SMD LED 0805 blue |
|
||||
| 1 | `smd_led(LED1206, "red")` | SMD LED 1306 red |
|
||||
| 1 | `smd_tant(TANT_A, value = "105e")` | SMD Tantalum capacitor package A ,1uF, 2.5V |
|
||||
| 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(CAP0502)` | SMD capacitor 0502 |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_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_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(RES0502, 10)` | SMD resistor 0502 10 0.05W |
|
||||
| 1 | `smd_resistor(RES0603, 100)` | SMD resistor 0603 100 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
||||
| 1 | `smd_soic(SOIC14)` | SOIC14 package SOIC14 |
|
||||
| 1 | `smd_soic(SOIC16)` | SOIC16 package SOIC16 |
|
||||
| 1 | `smd_soic(SOIC18)` | SOIC18 package SOIC18 |
|
||||
| 1 | `smd_soic(SOIC8)` | SOIC8 package SOIC8 |
|
||||
| 1 | `smd_sot(SOT223)` | SOT223 package FZT851 |
|
||||
| 1 | `smd_sot(SOT23)` | SOT23 package 2N7000 |
|
||||
| 1 | `smd_soic(SOT23_6)` | SOT23_6 package SOT23_6 |
|
||||
| 1 | `smd_pot(TC33X1)` | TC33X1 package 10K |
|
||||
| 1 | `smd_soic(TSOT23_8)` | TSOT23_8 package TSOT23_8 |
|
||||
| 1 | `smd_soic(SOIC14, "SOIC14")` | SOIC14 package SOIC14 |
|
||||
| 1 | `smd_soic(SOIC16, "SOIC16")` | SOIC16 package SOIC16 |
|
||||
| 1 | `smd_soic(SOIC18, "SOIC18")` | SOIC18 package SOIC18 |
|
||||
| 1 | `smd_soic(SOIC8, "SOIC8")` | SOIC8 package SOIC8 |
|
||||
| 1 | `smd_sot(SOT223, "FZT851")` | SOT223 package FZT851 |
|
||||
| 1 | `smd_sot(SOT23, "2N7000")` | SOT23 package 2N7000 |
|
||||
| 1 | `smd_soic(SOT23_6, "SOT23_6")` | SOT23_6 package SOT23_6 |
|
||||
| 1 | `smd_pot(TC33X1, "10K")` | TC33X1 package 10K |
|
||||
| 1 | `smd_soic(TSOT23_8, "TSOT23_8")` | TSOT23_8 package TSOT23_8 |
|
||||
|
||||
|
||||
<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 |
|
||||
|
||||
|
||||
<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 name="tubings"></a>
|
||||
## 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.
|
||||
|
||||
@@ -4703,7 +4816,7 @@ Tubing and sleeving. The internal diameter can be forced to stretch it over some
|
||||
### Modules
|
||||
| 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_height(cable)` | Height in flat clip |
|
||||
| `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_tlen(cable)` | Twisted cable twist length |
|
||||
| `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_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_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_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 |
|
||||
@@ -5271,7 +5385,7 @@ fixing_blocks along the sides.
|
||||
---
|
||||
<a name="cable_clip"></a>
|
||||
## 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.
|
||||
|
||||
@@ -5280,35 +5394,41 @@ Cable clips to order. Can be for one or two cables of different sizes.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip_extent(screw, cable)` | How far it extends from the screw. |
|
||||
| `cable_clip_height(cable)` | Height given the `cable`. |
|
||||
| `cable_clip_offset(screw, cable)` | The offset of the cable from the screw |
|
||||
| `cable_clip_width(screw)` | Width given the `screw`. |
|
||||
| `cable_clip_extent(screw, cable, insert = false, nut = false)` | How far it extends from the screw. |
|
||||
| `cable_clip_height(cable, screw = false, insert = false, nut = false)` | Height given the `cable`. |
|
||||
| `cable_clip_insert(screw, insert = true)` | Insert type for clip, given 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
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `cable_clip(screw, cable1, cable2 = 0)` | 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(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, flip = false, insert = false, nut = false, nyloc = true)` | Cable clip with the fasteners |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| 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 |
|
||||
| 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 |
|
||||
| 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
|
||||
| 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_60.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>
|
||||
@@ -5388,7 +5508,8 @@ Housings for PCB cameras.
|
||||
| 1 | `camera(rpi_camera_v1)` | Raspberry Pi camera V1 |
|
||||
| 1 | `camera(rpi_camera_v2)` | Raspberry Pi camera V2 |
|
||||
| 1 | `camera(rpi_camera)` | Raspberry Pi focusable camera |
|
||||
| 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_dome_screw, 10)` | Screw M3 dome x 10mm |
|
||||
| 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>
|
||||
|
||||
---
|
||||
@@ -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 |
|
||||
| `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 |
|
||||
| `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 |
|
||||
| `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 |
|
||||
@@ -7362,7 +7510,7 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
||||
### Modules
|
||||
| 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 |
|
||||
|
||||

|
||||
|
@@ -169,6 +169,9 @@ if __name__ == '__main__':
|
||||
|
||||
# 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)
|
||||
do_cmd(('codespell -w -L od ' + filename).split())
|
||||
|
@@ -63,5 +63,5 @@ def source_dirs(bom_dir):
|
||||
else:
|
||||
if dir.endswith('/printed'):
|
||||
lib_dirs.add(dir)
|
||||
dirs.remove(source_dir)
|
||||
dirs.discard(source_dir)
|
||||
return [source_dir] + sorted(dirs) + sorted(lib_dirs)
|
||||
|
@@ -61,7 +61,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
// components
|
||||
[
|
||||
[ 20, -5, 180, "trimpot10"],
|
||||
[ 20, -15, 90, "trimpot10", true],
|
||||
[ 20, -18, 90, "trimpot10", true],
|
||||
[ 19, 2, 90, "smd_led", LED1206, "blue"],
|
||||
[ 16, 2, 90, "smd_led", LED0805, "red"],
|
||||
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
||||
@@ -82,6 +82,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 32, 3, -90, "smd_diode",DO214AC, "SS34"],
|
||||
[ 26, 2, -90, "smd_pot", TC33X1, "10K"],
|
||||
[ 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"],
|
||||
[ 28, 16, -90, "smd_sot", SOT223, "LM117"],
|
||||
@@ -116,8 +117,8 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 5, 220, 180, "hdmi"],
|
||||
[ 3, 235, 180, "mini_hdmi"],
|
||||
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 218, 0, "buzzer"],
|
||||
[ 25, 205, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 220, 0, "buzzer"],
|
||||
|
||||
[ 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
|
||||
@@ -130,6 +131,10 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 35, 17, 0, "vero_pin", true],
|
||||
[ 35, 8, 180, "rd_transistor", TO92, "78L05", undef, undef, "Regulator"],
|
||||
[ 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
|
||||
|
||||
[ 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, 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"],
|
||||
[ 95, 15, -90, "flat_flex"],
|
||||
[ 87, 15, -90, "flat_flex", true],
|
||||
@@ -179,7 +187,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 55, 170, 0, "button_4p5mm"],
|
||||
[ 50, 185, 0, "microswitch", small_microswitch],
|
||||
[ 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" ],
|
||||
[ 71, 180, 0, "smd_inductor", IND2525, "4R7"],
|
||||
|
||||
|
@@ -64,10 +64,15 @@ module smds() {
|
||||
let(s = smd_soics[$i])
|
||||
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)
|
||||
let(i = smd_inductors[$i])
|
||||
smd_inductor(i, "4R7");
|
||||
smd_inductor(i, ["4R7", "10R"][$i % 2]);
|
||||
|
||||
translate([20, 6])
|
||||
layout([for(q = smd_qfps) smd_qfp_body_size(q).x], 3)
|
||||
|
@@ -20,39 +20,46 @@
|
||||
include <../core.scad>
|
||||
use <../printed/cable_clip.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
|
||||
screw = M3_dome_screw;
|
||||
sheet_thickness = 3;
|
||||
|
||||
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() {
|
||||
for(i = [0 : ceil(len(cables) / 2) - 1])
|
||||
translate([i * 25, 0]) {
|
||||
cable1 = cables[2 * i];
|
||||
cable2 = cables[2 * i + 1];
|
||||
|
||||
layout(clip_lengths, 3, true) let(cable1 = clips[$i].x, cable2 = clips[$i].y) {
|
||||
insert = use_insert($i);
|
||||
nut = use_nut($i);
|
||||
translate([cable_clip_extent(screw, cable1, insert = insert, nut = nut) - clip_lengths[$i] / 2, 0]) {
|
||||
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])
|
||||
let(cable = cables[2 * i + j])
|
||||
let(cable = clips[$i][j])
|
||||
if(cable)
|
||||
let(positions = cable_bundle_positions(cable))
|
||||
for(i = [0 : len(positions) - 1])
|
||||
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])
|
||||
color([grey(20), "blue", "red", "orange", "yellow", "green", "brown", "purple", "grey", "white"][i])
|
||||
cylinder(d = cable_wire_size(cable), h = 30, center = true);
|
||||
}
|
||||
else
|
||||
cable_clip(screw, cable1, cable2);
|
||||
cable_clip(screw, cable1, cable2, insert = insert);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -22,7 +22,6 @@ use <../utils/layout.scad>
|
||||
include <../vitamins/inserts.scad>
|
||||
|
||||
module inserts() {
|
||||
|
||||
for(i = [0: len(inserts) -1])
|
||||
translate([10 * i, 5])
|
||||
insert(inserts[i]);
|
||||
@@ -32,7 +31,6 @@ module inserts() {
|
||||
insert(short_inserts[i]);
|
||||
|
||||
|
||||
|
||||
stl_colour(pp1_colour)
|
||||
translate([len(inserts) * 10, 0]) {
|
||||
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)
|
||||
let($show_threads = true)
|
||||
let($show_threads = true) {
|
||||
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)
|
||||
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)
|
||||
rotate(-90)
|
||||
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);
|
||||
|
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/>.
|
||||
//
|
||||
wire_r = 5; // [1 : 20]
|
||||
t = 0; // [0 : 3]
|
||||
t = -1; // [-1 : 3]
|
||||
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/layout.scad>
|
||||
@@ -26,9 +26,9 @@ include <../vitamins/zipties.scad>
|
||||
|
||||
module zipties()
|
||||
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))
|
||||
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.
|
||||
//
|
||||
function sweep_transforms(path, loop = false, twist = 0) =
|
||||
function sweep_transforms(path, loop = false, twist = 0, initial_rotation = undef) =
|
||||
let(len = len(path),
|
||||
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],
|
||||
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 = i + 1,
|
||||
rot = i < len ? rotate_from_to(tangents[i - 1], tangents[i]) * rot : undef) rot],
|
||||
@@ -239,6 +239,10 @@ function segmented_path(path, min_segment) = [ //! Add points to a path to enfo
|
||||
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
|
||||
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
||||
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
|
||||
|
||||
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]) {
|
||||
hull($fn = 16) {
|
||||
translate(path[i])
|
||||
sphere(0.1);
|
||||
sphere(r);
|
||||
|
||||
translate(path[i + 1])
|
||||
sphere(0.1);
|
||||
sphere(r);
|
||||
}
|
||||
if(path[i] == path[i + 1])
|
||||
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
|
||||
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
|
||||
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_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
|
||||
color(grey(20))
|
||||
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, 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.
|
||||
@@ -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, [],
|
||||
[
|
||||
[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 + 1, 15, 0, "flat_flex", false],
|
||||
[ 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]],
|
||||
],
|
||||
[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);
|
||||
}
|
||||
|
||||
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
|
||||
hole_r = 3.05 / 2;
|
||||
dwall = 0.5;
|
||||
@@ -106,7 +113,7 @@ module d_plug(type, socket = false, pcb = false, idc = false) { //! Draw specifi
|
||||
// Shell
|
||||
//
|
||||
color(d_plug_shell_colour) {
|
||||
linear_extrude( d_flange_thickness(type))
|
||||
linear_extrude(d_flange_thickness(type))
|
||||
difference() {
|
||||
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";
|
||||
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]));
|
||||
|
||||
radius = gs_diameter(type) / 2;
|
||||
@@ -125,6 +125,7 @@ module geared_stepper(type) { //! Draw the specified geared stepper
|
||||
f = gs_shaft_flat(type);
|
||||
two_flats = f < 0;
|
||||
vflip()
|
||||
rotate(angle)
|
||||
color(two_flats ? brass : gearbox_colour) {
|
||||
d = gs_shaft_d(type);
|
||||
h = gs_shaft_length(type);
|
||||
|
@@ -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_ring2_d(type) = type[7]; //! Diameter of the middle 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
|
||||
|
||||
@@ -46,6 +49,14 @@ function insert_nose_length(type, d) = let( //! The length before the second rin
|
||||
|
||||
module insert(type) { //! Draw specified insert
|
||||
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);
|
||||
|
||||
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;
|
||||
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;
|
||||
thread_d = insert_screw_diameter(type);
|
||||
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];
|
||||
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 ];
|
||||
short_inserts = [ F1BM2, CNCKM2p5, CNCKM3, CNCKM4, CNCKM5 ];
|
||||
threaded_inserts = [ M3x8, M4x10, M5x12, M6x15, M8x18, M10x25, M12x30, M16x30 ];
|
||||
|
||||
use <insert.scad>
|
||||
|
@@ -20,7 +20,7 @@ include <washers.scad>
|
||||
//
|
||||
// Nuts
|
||||
//
|
||||
M2_nut_trap_depth = 2.5;
|
||||
M2_nut_trap_depth = 1.75;
|
||||
M2p5_nut_trap_depth = 2.5;
|
||||
M3_nut_trap_depth = 3;
|
||||
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_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
|
||||
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, "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));
|
||||
@@ -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, "potentiometer")) let(pot = param(4, BTT_encoder)) translate_z(pot_size(pot).z) vflip() potentiometer(pot, shaft_length = param(5, undef));
|
||||
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
|
||||
if(show(comp, "smd_250V_fuse")) smd_250V_fuse(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_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
|
||||
];
|
||||
|
||||
|
||||
ExtruderPCB = ["ExtruderPCB", "Extruder connection PCB",
|
||||
33.02, 24.13, 1.6, 0, 0, 0, "green", true, [],
|
||||
[[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];
|
||||
|
||||
|
||||
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]],
|
||||
[ [-12.05 , -6.8, 180, "trimpot10"]
|
||||
]];
|
||||
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]],
|
||||
[[-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", "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],
|
||||
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];
|
||||
|
||||
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];
|
||||
|
||||
|
@@ -158,6 +158,7 @@ module rd_module(type, value) { //! Draw a PCB mounted potted module, e.g. PSU o
|
||||
r = rd_module_radius(type);
|
||||
size = rd_module_size(type);
|
||||
pin = rd_module_pin_size(type);
|
||||
|
||||
color(rd_module_colour(type))
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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];
|
||||
|
||||
// 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>
|
||||
|
@@ -35,8 +35,8 @@ neon_spades = [[spade4p8, 7.3, 0, -7, 0],
|
||||
//
|
||||
// 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];
|
||||
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];
|
||||
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.25, 15, 21, 2, 12.8, 18.5, 12.5, 2.5, 0, 0.3, neon_spades];
|
||||
|
||||
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];
|
||||
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];
|
||||
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];
|
||||
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];
|
||||
@@ -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,
|
||||
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>
|
||||
|
@@ -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`
|
||||
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);
|
||||
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
|
||||
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);
|
||||
|
||||
@@ -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
|
||||
|
||||
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);
|
||||
z0 = smd_sot_z(type);
|
||||
@@ -197,7 +197,6 @@ module smd_sot(type, value) { //! Draw an SMD transistor
|
||||
linear_extrude(eps)
|
||||
resize([size.x - 4 * (z2 - z1) * tan(slant), size.y / 2])
|
||||
text(value, halign = "center", valign = "center");
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
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);
|
||||
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
|
||||
|
||||
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
|
||||
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])
|
||||
assert(in(codes, c), str("expected the 4th character of value to be a voltage code: ", codes, ", got ", c))
|
||||
str(", ", voltages[search(c, codes)[0]], "V");
|
||||
vitamin(str("smd_tant(", type[0], "): SMD Tantalum capacitor package ", type[0][len(type[0]) -1], uF, volts));
|
||||
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);
|
||||
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
|
||||
|
||||
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);
|
||||
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
|
||||
|
||||
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);
|
||||
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
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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];
|
||||
|
||||
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];
|
||||
|
||||
@@ -86,4 +87,8 @@ QFP50P1200X1200X160_64N = ["QFP50P1200X1200X160_64N", [10, 10, 1.6], 12, 64, 0.5
|
||||
|
||||
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>
|
||||
|
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/tube.scad>
|
||||
include <../utils/sweep.scad>
|
||||
|
||||
function tubing_material(type) = type[1]; //! Material description
|
||||
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_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_id = tubing_id(type);
|
||||
id = forced_id ? forced_id : original_id;
|
||||
od = original_od + id - original_id;
|
||||
length = path ? round(path_length(path)) : length;
|
||||
if(tubing_material(type) == "Heatshrink sleeving")
|
||||
vitamin(str("tubing(", type[0], arg(length, 15), "): ", tubing_material(type), " ID ", original_id, "mm x ",length, "mm"));
|
||||
else
|
||||
@@ -45,6 +47,16 @@ 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));
|
||||
else
|
||||
color(tubing_colour(type))
|
||||
if(path)
|
||||
render_if(manifold)
|
||||
difference() {
|
||||
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);
|
||||
|
@@ -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.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../utils/sweep.scad>
|
||||
use <../utils/sweep.scad>
|
||||
|
||||
soft_washer_colour = grey(20);
|
||||
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_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_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
|
||||
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>.
|
||||
// numbers from https://en.wikipedia.org/wiki/Circle_packing_in_a_circle
|
||||
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 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] :
|
||||
[[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
|
||||
wires = cable_wires(cable),
|
||||
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : ceil(wires / 2),
|
||||
top = wires - bottom
|
||||
bottom = cable_is_ribbon(cable) ? wires : wires < 3 ? wires : wires <= 7 ? ceil(wires / 2) : min(wires, 3),
|
||||
middle = min(wires - bottom, 3),
|
||||
top = wires - bottom - middle
|
||||
)
|
||||
[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);
|
||||
|
||||
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip
|
||||
|