Compare commits
52 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
664d04ad93 | ||
|
78b8c2031e | ||
|
2001de2408 | ||
|
64fb562f58 | ||
|
bf163587fa | ||
|
1238dba90a | ||
|
f40a7d19a9 | ||
|
a054eb8216 | ||
|
05edd923b8 | ||
|
b58a59dab7 | ||
|
6b6ffb2b74 | ||
|
1e30ad24e8 | ||
|
dc715ff2b7 | ||
|
c57c202e31 | ||
|
26bfe96614 | ||
|
fa49ae09fa | ||
|
974457eabd | ||
|
2cc3c6ec7c | ||
|
633843d45e | ||
|
1a472c8ed5 | ||
|
f44d9ae424 | ||
|
4f0c443c8e | ||
|
ecd534b577 | ||
|
aec72118fa | ||
|
0d828f8f7f | ||
|
28c36a4e96 | ||
|
1ddfb35bda | ||
|
235caa4101 | ||
|
6a9af0af8a | ||
|
f066b1b8ae | ||
|
4be7b2f0ea | ||
|
3cc3c52b54 | ||
|
7f1634ef06 | ||
|
34c8c31cae | ||
|
a6a08088d9 | ||
|
06443a558b | ||
|
bcf9fb38df | ||
|
18f3d43780 | ||
|
eda88cc8d7 | ||
|
630268d71a | ||
|
66f793b00b | ||
|
cc5654d7d7 | ||
|
9989f13edf | ||
|
d46913ce4f | ||
|
b9f676a753 | ||
|
1a649060bd | ||
|
68fd04f6d5 | ||
|
ddc4150ed7 | ||
|
ed7e55808a | ||
|
3eff5fc2e0 | ||
|
50d62b4170 | ||
|
7e126c94ca |
1
.gitignore
vendored
@@ -11,3 +11,4 @@ options.json
|
||||
times.txt
|
||||
*_diff.png
|
||||
*.echo
|
||||
cmd_times.txt
|
||||
|
84
CHANGELOG.md
@@ -3,6 +3,88 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
#### [v20.10.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.10.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.10.0...v20.10.1 "diff with v20.10.0")
|
||||
* 2022-06-30 [`f44d9ae`](https://github.com/nophead/NopSCADlib/commit/f44d9ae424f407baa4f8b5187819b43b30800257 "show commit") [M.B.](# "Martin Budden") Made includes relative in `bldc_motors`.
|
||||
|
||||
* 2022-07-15 [`1238dba`](https://github.com/nophead/NopSCADlib/commit/1238dba90ac5c48ba01abb9e7926a064353489de "show commit") [C.](# "Chris") Updated readme.
|
||||
|
||||
* 2022-06-22 [`aec7211`](https://github.com/nophead/NopSCADlib/commit/aec72118fac218ca033264fa7b28db2bff7db10a "show commit") [M.B.](# "Martin Budden") Fixed typos.
|
||||
|
||||
### [v20.10.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.10.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.9.0...v20.10.0 "diff with v20.9.0")
|
||||
* 2022-07-04 [`b58a59d`](https://github.com/nophead/NopSCADlib/commit/b58a59dab70bb414dd90dc5a9055d6bf3b4f6144 "show commit") [C.](# "Chris") Updated images and readme.
|
||||
|
||||
* 2022-07-04 [`6b6ffb2`](https://github.com/nophead/NopSCADlib/commit/6b6ffb2b74cc89ffecbcad7c304c3c4f047a8805 "show commit") [C.](# "Chris") Added SOICs to tests.
|
||||
|
||||
* 2022-07-04 [`1e30ad2`](https://github.com/nophead/NopSCADlib/commit/1e30ad24e802dc6e075fd73185551202101d4793 "show commit") [C.](# "Chris") Added `smd_soic` to `pcb_component()`.
|
||||
|
||||
* 2022-07-04 [`dc715ff`](https://github.com/nophead/NopSCADlib/commit/dc715ff2b70ae98615ee43750f3bb7613b481f7b "show commit") [C.](# "Chris") Tweaked SOIC text size.
|
||||
|
||||
* 2022-07-04 [`c57c202`](https://github.com/nophead/NopSCADlib/commit/c57c202e31c70351f38ef6299c60b0deb54bd296 "show commit") [M.](# "MS3FGX") Adjust lead sizing
|
||||
|
||||
* 2022-07-02 [`26bfe96`](https://github.com/nophead/NopSCADlib/commit/26bfe96614741206c8da6d126edfa9eb5326cb8f "show commit") [M.](# "MS3FGX") Add SOIC SMD Package
|
||||
|
||||
### [v20.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.8.0...v20.9.0 "diff with v20.8.0")
|
||||
* 2022-07-02 [`2cc3c6e`](https://github.com/nophead/NopSCADlib/commit/2cc3c6ec7c9d8ee285d49111559d40fb2a3112e1 "show commit") [C.](# "Chris") Updated images and readme.
|
||||
|
||||
* 2022-07-02 [`633843d`](https://github.com/nophead/NopSCADlib/commit/633843d45eacd42619581a4619752700e1cd687b "show commit") [C.](# "Chris") Added LED1206 example to PCB test.
|
||||
|
||||
* 2022-07-02 [`1a472c8`](https://github.com/nophead/NopSCADlib/commit/1a472c8ed549e230f7df93989f3e1db729b4b281 "show commit") [M.](# "MS3FGX") Add 1206 SMD LED
|
||||
|
||||
### [v20.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.7.0...v20.8.0 "diff with v20.7.0")
|
||||
* 2022-06-23 [`ecd534b`](https://github.com/nophead/NopSCADlib/commit/ecd534b5773928b9987023bd4370f661cc750fbd "show commit") [C.P.](# "Chris Palmer") Added `NEMA_connection_pos()`.
|
||||
Changed motor wire colours and tweaked wire position and size,
|
||||
|
||||
### [v20.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.6.1...v20.7.0 "diff with v20.6.1")
|
||||
* 2022-06-21 [`28c36a4`](https://github.com/nophead/NopSCADlib/commit/28c36a4e966cceccbbdc330cf9a6fdeaa0283889 "show commit") [C.P.](# "Chris Palmer") `rounded_polygon()` now copes with the degenerate case when tangents intersect to form a sharp corner with no arc.
|
||||
Added an `offset()` function with some limitations.
|
||||
|
||||
#### [v20.6.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.6.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.6.0...v20.6.1 "diff with v20.6.0")
|
||||
* 2022-06-21 [`6a9af0a`](https://github.com/nophead/NopSCADlib/commit/6a9af0af8aef68978b8be248810d07c85150341b "show commit") [C.P.](# "Chris Palmer") Updates images
|
||||
|
||||
* 2022-06-21 [`a6a0808`](https://github.com/nophead/NopSCADlib/commit/a6a08088d986dbcbc4d01c06e0475176ec8bc76f "show commit") [M.B.](# "Martin Budden") Fixed dimensions of E1515 extrusion.
|
||||
|
||||
* 2022-06-21 [`bcf9fb3`](https://github.com/nophead/NopSCADlib/commit/bcf9fb38dfabaf93508a380b85b12e3b23f28cf8 "show commit") [M.B.](# "Martin Budden") Fixed typos.
|
||||
|
||||
* 2022-06-21 [`06443a5`](https://github.com/nophead/NopSCADlib/commit/06443a558b407292a1e73f60c24cc90ec618d511 "show commit") [M.B.](# "Martin Budden") Standardised setting of imgsize in scripts.
|
||||
|
||||
### [v20.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.5.1...v20.6.0 "diff with v20.5.1")
|
||||
* 2022-06-14 [`18f3d43`](https://github.com/nophead/NopSCADlib/commit/18f3d43780d7e083fc3b21290db2049fb4364a46 "show commit") [C.P.](# "Chris Palmer") Added convexity parameter to `clip()`.
|
||||
|
||||
#### [v20.5.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.5.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.5.0...v20.5.1 "diff with v20.5.0")
|
||||
* 2022-06-14 [`eda88cc`](https://github.com/nophead/NopSCADlib/commit/eda88cc8d75eb4c0cb59b368b4e2ad3db2115834 "show commit") [C.P.](# "Chris Palmer") Fixed `vero()` constructor documentation.
|
||||
Fixed missing space in veroboard vitamin description.
|
||||
|
||||
* 2022-06-14 [`630268d`](https://github.com/nophead/NopSCADlib/commit/630268d71a0b478c28b6bde2a7c3ff9074c7a8fb "show commit") [C.P.](# "Chris Palmer") Changed `screw_knob()` facets to be suitable for 3D printing.
|
||||
Fixed `knob_height()` so it can take a screw as a type.
|
||||
|
||||
### [v20.5.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.5.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.4.0...v20.5.0 "diff with v20.4.0")
|
||||
* 2022-05-31 [`cc5654d`](https://github.com/nophead/NopSCADlib/commit/cc5654d7d756287f5311e35104003f38a4a94475 "show commit") [C.](# "Chris") Added `usb_miniA()`.
|
||||
|
||||
### [v20.4.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.4.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.3.1...v20.4.0 "diff with v20.3.1")
|
||||
* 2022-04-01 [`d46913c`](https://github.com/nophead/NopSCADlib/commit/d46913ce4f64656889fd29dccc0709d84d4d9c49 "show commit") [C.P.](# "Chris Palmer") Printed `screw_knob()` is now fully customisable by passing a parameter
|
||||
list, constructed by `screw_knob(),` in place of the screw.
|
||||
|
||||
* Screws can still be passed for backwards compatibility.
|
||||
|
||||
#### [v20.3.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.3.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.3.0...v20.3.1 "diff with v20.3.0")
|
||||
* 2022-04-01 [`b9f676a`](https://github.com/nophead/NopSCADlib/commit/b9f676a75369d666540f79abe0392e209e20d0f0 "show commit") [C.P.](# "Chris Palmer") Documented `insert_hole_length()`.
|
||||
|
||||
### [v20.3.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.3.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.2.0...v20.3.0 "diff with v20.2.0")
|
||||
* 2022-03-17 [`ddc4150`](https://github.com/nophead/NopSCADlib/commit/ddc4150ed73c8300bc3ef4326a91cd4ec54ed9e3 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||
|
||||
* 2022-03-16 [`7e126c9`](https://github.com/nophead/NopSCADlib/commit/7e126c94cadd120d686eaad8459723e0c1dfc0b2 "show commit") [M.](# "Mozza") Add A23 cell
|
||||
|
||||
### [v20.2.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.2.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.1.2...v20.2.0 "diff with v20.1.2")
|
||||
* 2022-03-17 [`744ebc2`](https://github.com/nophead/NopSCADlib/commit/744ebc293594e2d049220bba7325f3a22f40a71a "show commit") [C.P.](# "Chris Palmer") Added functions for generating twisted cable paths and calculating its radius.
|
||||
Top row of cable bundles reversed to match a twisted cable.
|
||||
|
||||
#### [v20.1.2](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.1.1...v20.1.2 "diff with v20.1.1")
|
||||
* 2022-03-17 [`99a5570`](https://github.com/nophead/NopSCADlib/commit/99a5570e248be32747bead61e17feaa3bde13f9b "show commit") [C.P.](# "Chris Palmer") Fixed ziptie bug for small wires and corners made sharper.
|
||||
|
||||
* 2022-03-17 [`b70911d`](https://github.com/nophead/NopSCADlib/commit/b70911dc132727f24798e92be06a87ab37f2917e "show commit") [C.P.](# "Chris Palmer") Image odd pixel changes due to move to summer computer.
|
||||
|
||||
* 2022-03-01 [`2d20fb1`](https://github.com/nophead/NopSCADlib/commit/2d20fb130a260b1f7358ea9fbb9fca2b5a18a65b "show commit") [C.P.](# "Chris Palmer") Removed dead code in `spiral_paths()`.
|
||||
|
||||
#### [v20.1.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.1.0...v20.1.1 "diff with v20.1.0")
|
||||
* 2022-02-25 [`943deed`](https://github.com/nophead/NopSCADlib/commit/943deededfe2b258f23ca64001ae7c010ed626bc "show commit") [C.P.](# "Chris Palmer") Updated the readme.
|
||||
|
||||
@@ -392,8 +474,6 @@ Fixed `M6_cs_cap_screw` and `M4_grub_screw` socket sizes.
|
||||
#### [v15.21.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.21.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.21.0...v15.21.1 "diff with v15.21.0")
|
||||
* 2021-08-09 [`be53547`](https://github.com/nophead/NopSCADlib/commit/be53547728834d8e786ad4cb5637c768320a3105 "show commit") [M.B.](# "Martin Budden") Fixed display of BLDC prop shaft when thread length `=` 0.
|
||||
|
||||
* 2021-07-04 [`ba7d7d3`](https://github.com/nophead/NopSCADlib/commit/ba7d7d32adf554d163143c0ae1707565340bb35b "show commit") [C.P.](# "Chris Palmer") Updated chnagelog.
|
||||
|
||||
### [v15.21.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.21.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.20.0...v15.21.0 "diff with v15.20.0")
|
||||
* 2021-07-01 [`df35e14`](https://github.com/nophead/NopSCADlib/commit/df35e14fc71794c3826d6c99ce3cab93a4cfa5fe "show commit") [M.B.](# "Martin Budden") Improved handling of pcb plating colour.
|
||||
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 982 KiB After Width: | Height: | Size: 984 KiB |
12
libtest.scad
@@ -163,14 +163,11 @@ corner_blocks_y = fixing_blocks_y + 30;
|
||||
translate([x5, corner_blocks_y])
|
||||
corner_blocks();
|
||||
|
||||
feet_y = corner_blocks_y + 70;
|
||||
translate([x5, feet_y])
|
||||
feet();
|
||||
|
||||
translate([x5 + 70, feet_y])
|
||||
screw_knobs_y = corner_blocks_y + 70;
|
||||
translate([x5, screw_knobs_y])
|
||||
screw_knobs();
|
||||
|
||||
knobs_y = feet_y + 40;
|
||||
knobs_y = screw_knobs_y + 40;
|
||||
translate([640, knobs_y])
|
||||
printed_pulley_test();
|
||||
|
||||
@@ -185,6 +182,9 @@ strap_y = clips_y + 50;
|
||||
translate([x5 + 60, strap_y])
|
||||
strap_handles();
|
||||
|
||||
translate([x6, strap_y])
|
||||
feet();
|
||||
|
||||
handle_y = strap_y + 50;
|
||||
translate([x5, handle_y])
|
||||
handle();
|
||||
|
@@ -19,53 +19,102 @@
|
||||
|
||||
//
|
||||
//! Knob with embedded hex head screw.
|
||||
//!
|
||||
//! Most aspects can be customised, e.g. the flange thickness and radius. It can also be solid or just a wall and be wavey edged or fluted.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../utils/hanging_hole.scad>
|
||||
|
||||
knob_wall = 2;
|
||||
function screw_knob_screw(type) = type[0]; //! The hex screw
|
||||
function screw_knob_wall(type) = type[1]; //! Wall thickness
|
||||
function screw_knob_stem_h(type) = type[2]; //! The stem height below the flange
|
||||
function screw_knob_flange_t(type) = type[3]; //! The thickness of the flange
|
||||
function screw_knob_flange_r(type) = type[4]; //! The flange outside radius
|
||||
function screw_knob_solid(type) = type[5]; //! Is the flange solid or just a wall
|
||||
function screw_knob_waves(type) = type[6]; //! Number of waves around the flange edge
|
||||
function screw_knob_wave_amp(type) = type[7]; //! Wave amplitude
|
||||
function screw_knob_fluted(type) = type[8]; //! Fluted instead of sine wave
|
||||
|
||||
function screw_knob(screw, wall = 2, stem_h = 6, flange_t = 4, flange_r = 9, solid = true, waves = 5, wave_amp = 2, fluted = false) = //! Constructor
|
||||
[screw, wall, stem_h, flange_t, flange_r, solid, waves, wave_amp, fluted];
|
||||
|
||||
function knob_nut_trap_depth(screw) = round_to_layer(screw_head_height(screw));
|
||||
knob_stem_h = 6;
|
||||
knob_thickness = 4;
|
||||
knob_r = 8;
|
||||
knob_wave = 1;
|
||||
knob_waves = 5;
|
||||
knob_height = knob_stem_h + knob_thickness;
|
||||
function knob_height() = knob_height;
|
||||
function knob_height(type) = //! Total height of the knob
|
||||
let(type = !is_list(type[0]) ? screw_knob(type) : type)
|
||||
screw_knob_stem_h(type) + screw_knob_flange_t(type);
|
||||
|
||||
module screw_knob(screw) { //! Generate the STL for a knob to fit the specified hex screw
|
||||
knob_stem_r = nut_trap_radius(screw_nut(screw)) + knob_wall;
|
||||
module screw_knob(type) { //! Generate the STL for a knob to fit the specified hex screw
|
||||
type = !is_list(type[0]) ? screw_knob(type) : type; // Allow just the screw to be specified for backwards compatibility
|
||||
screw = screw_knob_screw(type);
|
||||
wall = screw_knob_wall(type);
|
||||
trap_r = nut_trap_radius(screw_nut(screw));
|
||||
stem_r = trap_r + wall;
|
||||
amp = screw_knob_wave_amp(type);
|
||||
flange_r = max(screw_knob_flange_r(type), stem_r + amp);
|
||||
flange_t = screw_knob_flange_t(type);
|
||||
knob_h = knob_height(type);
|
||||
waves = screw_knob_waves(type);
|
||||
|
||||
function wave(a) = knob_r + sin(a * knob_waves) * knob_wave;
|
||||
function wave(a) = flange_r - amp / 2 + sin(a * waves) * amp / 2;
|
||||
fn = r2sides(flange_r);
|
||||
points = [for(i = [0 : fn - 1], a = i * 360 / fn) wave(a) * [sin(a), cos(a)]];
|
||||
solid = screw_knob_solid(type);
|
||||
|
||||
module shape()
|
||||
if(screw_knob_fluted(type))
|
||||
difference() {
|
||||
circle4n(flange_r);
|
||||
|
||||
c = flange_r * sin(90 / waves); // Flute half chord
|
||||
d = flange_r - flange_r * cos(90 / waves); // Distance from chord to perimeter
|
||||
b = amp - d; // Distance from chord to flute bottom
|
||||
flute_r = (b^2 + c^2) / b / 2;
|
||||
for(i = [0 : waves - 1])
|
||||
rotate(360 * i / waves)
|
||||
translate([0, flange_r - amp + flute_r])
|
||||
circle4n(flute_r);
|
||||
}
|
||||
else
|
||||
polygon(points);
|
||||
|
||||
stl(str("screw_knob_M", screw_radius(screw) * 20))
|
||||
union() {
|
||||
render() difference() {
|
||||
cylinder(r = knob_stem_r, h = knob_thickness + knob_stem_h);
|
||||
cylinder(r = stem_r, h = knob_h);
|
||||
|
||||
hanging_hole(knob_nut_trap_depth(screw), screw_clearance_radius(screw))
|
||||
rotate(45)
|
||||
circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
|
||||
circle(r = trap_r, $fn = 6);
|
||||
}
|
||||
linear_extrude(knob_thickness, convexity = 3)
|
||||
difference() {
|
||||
polygon(points = [for(a = [0 : 359]) [wave(a) * sin(a), wave(a) * cos(a)]]);
|
||||
for(i = [0 : 1])
|
||||
linear_extrude(i ? flange_t : round_to_layer(wall), convexity = 3)
|
||||
difference() {
|
||||
shape();
|
||||
|
||||
circle(knob_stem_r - eps);
|
||||
}
|
||||
if(i && ! solid)
|
||||
offset(-wall)
|
||||
shape();
|
||||
|
||||
circle(stem_r - eps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! Place the screw through the printed part
|
||||
module screw_knob_assembly(screw, length) //! Assembly with the screw in place
|
||||
assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length), ngb = true) {
|
||||
translate_z(knob_height)
|
||||
vflip()
|
||||
stl_colour(pp1_colour) screw_knob(screw);
|
||||
module screw_knob_assembly(type, length) { //! Assembly with the screw in place
|
||||
type = !is_list(type[0]) ? screw_knob(type) : type;
|
||||
screw = screw_knob_screw(type);
|
||||
knob_h = knob_height(type);
|
||||
|
||||
translate_z(knob_height - knob_nut_trap_depth(screw))
|
||||
rotate(-45)
|
||||
screw(screw, length);
|
||||
assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length), ngb = true) {
|
||||
translate_z(knob_h)
|
||||
vflip()
|
||||
stl_colour(pp1_colour) screw_knob(type);
|
||||
|
||||
translate_z(knob_h - knob_nut_trap_depth(screw))
|
||||
rotate(-45)
|
||||
screw(screw, length);
|
||||
}
|
||||
}
|
||||
|
||||
module screw_knob_M30_stl() screw_knob(M3_hex_screw);
|
||||
|
65
readme.md
@@ -234,8 +234,9 @@ exposing enough information to make a battery box.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 6 | `battery_contact(bcontact, false)` | Battery negative contact |
|
||||
| 6 | `battery_contact(bcontact, true)` | Battery positive contact |
|
||||
| 7 | `battery_contact(bcontact, false)` | Battery negative contact |
|
||||
| 7 | `battery_contact(bcontact, true)` | Battery positive contact |
|
||||
| 1 | `battery(A23CELL)` | Cell A23 12v |
|
||||
| 1 | `battery(AACELL)` | Cell AA |
|
||||
| 1 | `battery(AAACELL)` | Cell AAA |
|
||||
| 1 | `battery(CCELL)` | Cell C |
|
||||
@@ -1511,6 +1512,7 @@ Heatfit threaded inserts. Can be pushed into thermoplastics using a soldering ir
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `insert_boss_radius(type, wall)` | Compute the outer radius of an insert boss |
|
||||
| `insert_hole_length(type)` | Length of the insert rounded to layer height |
|
||||
| `insert_nose_length(type, d)` | The length before the second ring. |
|
||||
|
||||
### Modules
|
||||
@@ -2401,6 +2403,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `usb_Ax2(cutout = false)` | Draw USB type A dual socket |
|
||||
| `usb_B(cutout = false)` | Draw USB B connector |
|
||||
| `usb_C(cutout = false)` | Draw USB C connector |
|
||||
| `usb_miniA(cutout = false)` | Draw USB mini A connector |
|
||||
| `usb_uA(cutout = false)` | Draw USB micro A connector |
|
||||
| `vero_pin(cropped = false)` | Draw a vero pin |
|
||||
|
||||
@@ -2437,12 +2440,16 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | `ax_res(res1_8, 1e+6, tol = 1)` | Resistor 1e+6 Ohms 1% 0.125W |
|
||||
| 1 | `smd_led(LED0603, orange)` | SMD LED 0603 orange |
|
||||
| 1 | `smd_led(LED0805, red)` | SMD LED 0805 red |
|
||||
| 1 | `smd_led(LED1206, blue)` | SMD LED 1306 blue |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1K)` | SMD resistor 0603 1K 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 1K)` | SMD resistor 0805 1K 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 1K)` | SMD resistor 1206 1K 0.25W |
|
||||
| 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 | `square_button(button_4p5mm)` | Square button 4.5mm |
|
||||
@@ -2551,6 +2558,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| `usb_Ax2(cutout = false)` | Draw USB type A dual socket |
|
||||
| `usb_B(cutout = false)` | Draw USB B connector |
|
||||
| `usb_C(cutout = false)` | Draw USB C connector |
|
||||
| `usb_miniA(cutout = false)` | Draw USB mini A connector |
|
||||
| `usb_uA(cutout = false)` | Draw USB micro A connector |
|
||||
| `vero_pin(cropped = false)` | Draw a vero pin |
|
||||
|
||||
@@ -3639,6 +3647,12 @@ Surface mount components for PCBs.
|
||||
| `smd_res_end_cap(type)` | End cap width |
|
||||
| `smd_res_power(type)` | Power rating in Watts |
|
||||
| `smd_res_size(type)` | Body length, width and height |
|
||||
| `smd_soic_lead_pitch(type)` | Lead pitch |
|
||||
| `smd_soic_lead_size(type)` | Lead width, foot depth, lead thickness |
|
||||
| `smd_soic_lead_span(type)` | Total span of leads |
|
||||
| `smd_soic_lead_z(type)` | Top of lead frame from top |
|
||||
| `smd_soic_size(type)` | Body length, width and height |
|
||||
| `smd_soic_z(type)` | Height above PCB surface |
|
||||
| `smd_sot_lead_pitch(type)` | Lead pitch |
|
||||
| `smd_sot_lead_size(type)` | Lead width, foot depth, lead thickness |
|
||||
| `smd_sot_lead_span(type)` | Total span of leads |
|
||||
@@ -3660,6 +3674,7 @@ Surface mount components for PCBs.
|
||||
| `smd_capacitor(type, height, value = undef)` | Draw an SMD capacitor with specified height |
|
||||
| `smd_led(type, colour, cutout)` | Draw an SMD LED with specified `colour` |
|
||||
| `smd_resistor(type, value)` | Draw an SMD resistor with specified value |
|
||||
| `smd_soic(type, value)` | Draw an SMD SOIC |
|
||||
| `smd_sot(type, value)` | Draw an SMD transistor |
|
||||
|
||||

|
||||
@@ -3669,12 +3684,16 @@ Surface mount components for PCBs.
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `smd_led(LED0603, green)` | SMD LED 0603 green |
|
||||
| 1 | `smd_led(LED0805, blue)` | SMD LED 0805 blue |
|
||||
| 1 | `smd_led(LED1206, red)` | SMD LED 1306 red |
|
||||
| 1 | `smd_capacitor(CAP0603)` | SMD capacitor 0603 |
|
||||
| 1 | `smd_capacitor(CAP0805)` | SMD capacitor 0805 |
|
||||
| 1 | `smd_capacitor(CAP1206)` | SMD capacitor 1206 |
|
||||
| 1 | `smd_resistor(RES0603, 1R0)` | SMD resistor 0603 1R0 0.1W |
|
||||
| 1 | `smd_resistor(RES0805, 10M)` | SMD resistor 0805 10M 0.125W |
|
||||
| 1 | `smd_resistor(RES1206, 100K)` | SMD resistor 1206 100K 0.25W |
|
||||
| 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 |
|
||||
|
||||
@@ -3883,6 +3902,7 @@ NEMA stepper motor model.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `NEMA_big_hole(type)` | Clearance hole for the big boss |
|
||||
| `NEMA_connection_pos(type, jst_connector = false)` | Position of the wires or the connector |
|
||||
| `NEMA_holes(type)` | Screw positions for for loop |
|
||||
|
||||
### Modules
|
||||
@@ -4242,7 +4262,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `vero(name, assembly, holes, strips, pitch = inch(0.1)` | Constructor |
|
||||
| `vero(name, assembly, holes, strips, pitch = 2.54, fr4 = false, screw = M3_cap_screw, mounting_holes = [], breaks = [], no_tracks = [], components = [], joints = [])` | Constructor |
|
||||
| `vero_length(type)` | Length of the board |
|
||||
| `vero_size(type)` | Board size |
|
||||
| `vero_thickness(type)` | Thickness of the substrate |
|
||||
@@ -4270,7 +4290,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
|
||||
| 4 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||
| 4 | `screw(M3_dome_screw, 25)` | Screw M3 dome x 25mm |
|
||||
| 2 | `green_terminal(gt_2p54, 10)` | Terminal block 10 way 0.1" |
|
||||
| 2 | `veroboard(z_vb)` | Veroboard 5 holes x 22strips |
|
||||
| 2 | `veroboard(z_vb)` | Veroboard 5 holes x 22 strips |
|
||||
| 8 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
|
||||
### Printed
|
||||
@@ -5912,15 +5932,36 @@ Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
## Screw_knob
|
||||
Knob with embedded hex head screw.
|
||||
|
||||
Most aspects can be customised, e.g. the flange thickness and radius. It can also be solid or just a wall and be wavey edged or fluted.
|
||||
|
||||
[printed/screw_knob.scad](printed/screw_knob.scad) Implementation.
|
||||
|
||||
[tests/screw_knob.scad](tests/screw_knob.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `screw_knob_flange_r(type)` | The flange outside radius |
|
||||
| `screw_knob_flange_t(type)` | The thickness of the flange |
|
||||
| `screw_knob_fluted(type)` | Fluted instead of sine wave |
|
||||
| `screw_knob_screw(type)` | The hex screw |
|
||||
| `screw_knob_solid(type)` | Is the flange solid or just a wall |
|
||||
| `screw_knob_stem_h(type)` | The stem height below the flange |
|
||||
| `screw_knob_wall(type)` | Wall thickness |
|
||||
| `screw_knob_wave_amp(type)` | Wave amplitude |
|
||||
| `screw_knob_waves(type)` | Number of waves around the flange edge |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `knob_height(type)` | Total height of the knob |
|
||||
| `screw_knob(screw, wall = 2, stem_h = 6, flange_t = 4, flange_r = 9, solid = true, waves = 5, wave_amp = 2, fluted = false)` | Constructor |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `screw_knob(screw)` | Generate the STL for a knob to fit the specified hex screw |
|
||||
| `screw_knob_assembly(screw, length)` | Assembly with the screw in place |
|
||||
| `screw_knob(type)` | Generate the STL for a knob to fit the specified hex screw |
|
||||
| `screw_knob_assembly(type, length)` | Assembly with the screw in place |
|
||||
|
||||

|
||||
|
||||
@@ -5929,18 +5970,24 @@ Knob with embedded hex head screw.
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `screw(M3_hex_screw, 16)` | Screw M3 hex x 16mm |
|
||||
| 1 | `screw(M4_hex_screw, 16)` | Screw M4 hex x 16mm |
|
||||
| 1 | `screw(M5_hex_screw, 16)` | Screw M5 hex x 16mm |
|
||||
| 1 | `screw(M6_hex_screw, 16)` | Screw M6 hex x 16mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | screw_knob_M30.stl |
|
||||
| 1 | screw_knob_M40.stl |
|
||||
| 1 | screw_knob_M50.stl |
|
||||
| 1 | screw_knob_M60.stl |
|
||||
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | screw_knob_M30_16_assembly |
|
||||
| 1 | screw_knob_M40_16_assembly |
|
||||
| 1 | screw_knob_M50_16_assembly |
|
||||
| 1 | screw_knob_M60_16_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -6577,6 +6624,8 @@ Because the tangents need to be calculated to find the length these can be calcu
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `circle_tangent(p1, p2)` | Compute the clockwise tangent between two circles represented as [x,y,r] |
|
||||
| `line_intersection(l0, l1)` | Return the point where two 2D lines intersect or undef if they don't. |
|
||||
| `offset(points, offset)` | Offset a 2D polygon, breaks for concave shapes and negative offsets if the offset is more than half the smallest feature size. |
|
||||
| `rounded_polygon(points, _tangents = undef)` | Return the rounded polygon from the point list, can pass the tangent list to save it being calculated |
|
||||
| `rounded_polygon_arcs(points, tangents)` | Compute the arcs at the points, for each point [angle, rotate_angle, length] |
|
||||
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by `rounded_polygon_tangents` |
|
||||
@@ -6665,7 +6714,7 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||
| `segmented_path(path, min_segment)` | Add points to a path to enforce a minimum segment length |
|
||||
| `skin_faces(points, npoints, facets, loop, offset = 0)` | Create the mesh for the swept volume without end caps |
|
||||
| `spiral_paths(path, n, r, twists, start_angle)` | Create a new paths which sprial around the given path. Use for making twisted cables |
|
||||
| `spiral_paths(path, n, r, twists, start_angle)` | Create a new paths which spiral around the given path. Use for making twisted cables |
|
||||
| `sweep(path, profile, loop = false, twist = 0)` | Generate the point list and face list of the swept volume |
|
||||
|
||||
### Modules
|
||||
@@ -6852,7 +6901,7 @@ Original version by Doug Moen on the OpenSCAD forum
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `box(xmin, ymin, zmin, xmax, ymax, zmax)` | Construct a box given its bounds |
|
||||
| `clip(xmin = -inf, ymin = -inf, zmin = -inf, xmax = inf, ymax = inf, zmax = inf)` | Clip child to specified boundaries |
|
||||
| `clip(xmin = -inf, ymin = -inf, zmin = -inf, xmax = inf, ymax = inf, zmax = inf, convexity = 1)` | Clip child to specified boundaries |
|
||||
|
||||

|
||||
|
||||
|
@@ -157,11 +157,11 @@ if __name__ == '__main__':
|
||||
break
|
||||
j += 1
|
||||
|
||||
# Print verson info
|
||||
# Print version info
|
||||
print('%s [%s](%s "show release") %s %s' % ('#' * (level + 1), ver, url + '/releases/tag/' + ver, type, diff), file = file)
|
||||
|
||||
# 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 chang.*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):
|
||||
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())
|
||||
|
@@ -26,7 +26,7 @@ from set_config import *
|
||||
from exports import bom_to_parts
|
||||
import os
|
||||
import openscad
|
||||
from tests import do_cmd, update_image, colour_scheme, background
|
||||
from tests import do_cmd, update_image, colour_scheme, background, image_size
|
||||
from deps import mtime
|
||||
from colorama import init
|
||||
import json
|
||||
@@ -95,7 +95,7 @@ def render(target, type):
|
||||
render = "--preview" if type == 'stl' or colour != pp1 else "--render"
|
||||
tmp_name = tmp_dir + '/' + part[:-4] + '.png'
|
||||
dummy_deps_name = tmp_dir + '/tmp.deps' # work around for OpenSCAD issue #3879
|
||||
openscad.run("-o", tmp_name, png_maker_name, colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-d", dummy_deps_name)
|
||||
openscad.run("-o", tmp_name, png_maker_name, colour_scheme, "--projection=p", image_size, cam, render, "--autocenter", "--viewall", "-d", dummy_deps_name)
|
||||
do_cmd(("magick "+ tmp_name + " -trim -resize 280x280 -background %s -gravity Center -extent 280x280 -bordercolor %s -border 10 %s"
|
||||
% (background, background, tmp_name)).split())
|
||||
update_image(tmp_name, png_name)
|
||||
|
@@ -57,13 +57,13 @@ def set_config(target, usage = None):
|
||||
sys.exit(1)
|
||||
|
||||
if not targets:
|
||||
print("Not a muli-configuration project (no config_<target>.scad files found)")
|
||||
print("Not a multi-configuration project (no config_<target>.scad files found)")
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if not target in targets:
|
||||
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
|
||||
print(target + " is not a configuration, available configurations are: " + valid_targets_string())
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
@@ -36,8 +36,7 @@ from blurb import *
|
||||
from colorama import Fore
|
||||
from tmpdir import *
|
||||
|
||||
w = 4096
|
||||
h = w
|
||||
image_size = "--imgsize=4096,4096"
|
||||
threshold = 20 # Image comparison allowed number of different pixels
|
||||
fuzz = 5 # Image comparison allowed percentage error in pixel value
|
||||
|
||||
@@ -48,7 +47,12 @@ def do_cmd(cmd, output = sys.stdout):
|
||||
for arg in cmd:
|
||||
print(arg, end = " ")
|
||||
print()
|
||||
return subprocess.call(cmd, stdout = output, stderr = output)
|
||||
t = time.time()
|
||||
rv = subprocess.call(cmd, stdout = output, stderr = output)
|
||||
elapsed = time.time() - t
|
||||
with open("cmd_times.txt", 'at') as f:
|
||||
print(cmd[0], cmd[-1], elapsed, file = f)
|
||||
return rv
|
||||
|
||||
def compare_images(a, b, c):
|
||||
if not os.path.isfile(b):
|
||||
@@ -119,7 +123,7 @@ def tests(tests):
|
||||
libtest = True
|
||||
lib_blurb = scrape_blurb(scad_name)
|
||||
if not os.path.isfile(png_name):
|
||||
openscad.run(scad_name, "-o", png_name, colour_scheme, "--projection=p", "--imgsize=%d,%d" % (w, h), "--camera=0,0,0,50,0,340,500", "--autocenter", "--viewall");
|
||||
openscad.run(scad_name, "-o", png_name, colour_scheme, "--projection=p", image_size, "--camera=0,0,0,50,0,340,500", "--autocenter", "--viewall");
|
||||
do_cmd(["magick", png_name, "-trim", "-resize", "1280", "-bordercolor", background, "-border", "10", png_name])
|
||||
else:
|
||||
#
|
||||
@@ -240,7 +244,7 @@ def tests(tests):
|
||||
print(changed)
|
||||
t = time.time()
|
||||
tmp_name = tmp_dir + '/tmp.png'
|
||||
openscad.run_list([scad_name, "-o", tmp_name] + options.list() + ["-D$bom=2", colour_scheme, "--projection=p", "--imgsize=%d,%d" % (w, h), "--camera=0,0,0,70,0,315,500", "--autocenter", "--viewall", "-d", dname]);
|
||||
openscad.run_list([scad_name, "-o", tmp_name] + options.list() + ["-D$bom=2", colour_scheme, "--projection=p", image_size, "--camera=0,0,0,70,0,315,500", "--autocenter", "--viewall", "-d", dname]);
|
||||
times.add_time(scad_name, t)
|
||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1000x600", "-bordercolor", background, "-border", "10", tmp_name])
|
||||
update_image(tmp_name, png_name)
|
||||
|
@@ -25,7 +25,7 @@
|
||||
from __future__ import print_function
|
||||
from set_config import *
|
||||
import openscad
|
||||
from tests import do_cmd, update_image, colour_scheme, background
|
||||
from tests import do_cmd, update_image, colour_scheme, background, image_size
|
||||
import time
|
||||
import times
|
||||
import options
|
||||
@@ -223,7 +223,7 @@ def views(target, do_assemblies = None):
|
||||
target_def = ['-D$target="%s"' % target] if target else []
|
||||
cwd_def = ['-D$cwd="%s"' % os.getcwd().replace('\\', '/')]
|
||||
view_def = ['--viewall', '--autocenter'] if not (zoomed & (1 << explode)) else ['--camera=0,0,0,55,0,25,140']
|
||||
openscad.run_list(["-o", tmp_name, png_maker_name] + options.list() + target_def + cwd_def + view_def + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", "--imgsize=4096,4096", "-d", dname]);
|
||||
openscad.run_list(["-o", tmp_name, png_maker_name] + options.list() + target_def + cwd_def + view_def + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", image_size, "-d", dname]);
|
||||
times.add_time(png_name, t)
|
||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
|
||||
update_image(tmp_name, png_name)
|
||||
|
@@ -61,6 +61,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[
|
||||
[ 20, -5, 180, "trimpot10"],
|
||||
[ 20, -15, 90, "trimpot10", true],
|
||||
[ 7, 2, 90, "smd_led", LED1206, "blue"],
|
||||
[ 10, 2, 90, "smd_led", LED0805, "red"],
|
||||
[ 13, 2, 90, "smd_led", LED0603, "orange"],
|
||||
[ 16, 2, 90, "smd_res", RES1206, "1K"],
|
||||
@@ -85,16 +86,18 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 8, 105, 180, "usb_Ax2"],
|
||||
[ 7, 85, 180, "molex_usb_Ax1"],
|
||||
[ 8.5,125, 180, "molex_usb_Ax2"],
|
||||
[ 3, 140, 180, "usb_uA"],
|
||||
[ 8, 155, 180, "usb_B"],
|
||||
[ 3, 138, 180, "usb_uA"],
|
||||
[ 4.6,148, 180, "usb_miniA"],
|
||||
[ 3.7,158, 180, "usb_C"],
|
||||
[ 8, 170, 180, "usb_B"],
|
||||
[ 6, 184, 180, "uSD", [12, 11.5, 1.4]],
|
||||
[ 8, 196, 180, "jack"],
|
||||
[ 6, 206, 180, "barrel_jack"],
|
||||
[ 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"],
|
||||
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
||||
[ 8, 190, 180, "jack"],
|
||||
[ 6, 200, 180, "barrel_jack"],
|
||||
[ 5, 218, 180, "hdmi"],
|
||||
[ 3, 235, 180, "mini_hdmi"],
|
||||
[ 6, 175, 180, "uSD", [12, 11.5, 1.4]],
|
||||
|
||||
[ 65, 9, 0, "link", inch(0.4)],
|
||||
[ 65, 12, 0, "ax_res", res1_8, 1000],
|
||||
@@ -112,7 +115,6 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 60, 3, 0, "flex"],
|
||||
[ 50, 15, -90, "flat_flex"],
|
||||
[ 40, 15, -90, "flat_flex", true],
|
||||
[ 60, 35, 0, "D_plug", DCONN9],
|
||||
|
||||
[ 50, 50, 0, "molex_hdr", 2],
|
||||
[ 50, 60, 0, "jst_xh", 2],
|
||||
@@ -137,8 +139,11 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 55, 170, 0, "button_4p5mm"],
|
||||
[ 50, 185, 0, "microswitch", small_microswitch],
|
||||
[ 52, 200, 0, "pcb", 11, TMC2130 ],
|
||||
[ 80, 200, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 170, 0, "pdip", 8, "NE555" ],
|
||||
[ 80, 210, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 180, 0, "pdip", 8, "NE555" ],
|
||||
[ 80, 166, -90, "smd_soic", SOIC18, "PIC18F88"],
|
||||
[ 71, 166, -90, "smd_soic", SOIC16, "ICL323"],
|
||||
[ 64, 166, -90, "smd_soic", SOIC8, "M34063"],
|
||||
[ 80, 150, 0, "chip", 10, 5, 1, grey(20)],
|
||||
|
||||
[ 52, 206, 0, "2p54socket", 8, 1 ],
|
||||
@@ -146,7 +151,8 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
|
||||
[ 50, 240, 0, "potentiometer"],
|
||||
[ 75, 240, 0, "potentiometer", KY_040_encoder, 8],
|
||||
[ 30, 85, -90, "7seg", WT5011BSR, 2],
|
||||
[ 30, 85, -90, "7seg", WT5011BSR, 2],
|
||||
[ 30, 55, -90, "D_plug", DCONN9],
|
||||
],
|
||||
// accessories
|
||||
[]
|
||||
|
@@ -38,6 +38,12 @@ module smds() {
|
||||
layout([for(s = smd_sots) smd_sot_size(s).x], 1)
|
||||
let(s = smd_sots[$i])
|
||||
smd_sot(s, ["2N7000", "FZT851"][$i]);
|
||||
|
||||
translate([0, 20])
|
||||
layout([for(s = smd_soics) smd_soic_size(s).x], 1)
|
||||
let(s = smd_soics[$i])
|
||||
smd_soic(s, s[0]);
|
||||
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
@@ -17,20 +17,26 @@
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
use <../printed/screw_knob.scad>
|
||||
|
||||
screws = [M3_hex_screw, M4_hex_screw];
|
||||
knobs = [
|
||||
M3_hex_screw,
|
||||
M4_hex_screw,
|
||||
screw_knob(M5_hex_screw, flange_r = 12, flange_t = 6, stem_h = 2, waves = 6),
|
||||
screw_knob(M6_hex_screw, flange_r = 15, flange_t = 6, solid = false, stem_h = 2, waves = 6, wall = 1.6, fluted = true),
|
||||
];
|
||||
|
||||
module do_screw_knob(screw)
|
||||
module do_screw_knob(knob) {
|
||||
if($preview)
|
||||
screw_knob_assembly(screw, 16);
|
||||
screw_knob_assembly(knob, 16);
|
||||
else
|
||||
screw_knob(screw);
|
||||
screw_knob(knob);
|
||||
}
|
||||
|
||||
module screw_knobs()
|
||||
for(i = [0 : len(screws) - 1])
|
||||
translate([i * 30, 0])
|
||||
do_screw_knob(screws[i]);
|
||||
layout([for(k = knobs) 2 * screw_knob_flange_r(k)], 10)
|
||||
do_screw_knob(knobs[$i]);
|
||||
|
||||
screw_knobs();
|
||||
|
@@ -16,18 +16,28 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
show_connection_pos = false;
|
||||
|
||||
/* [Hidden] */
|
||||
include <../core.scad>
|
||||
include <../vitamins/stepper_motors.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
has_connector = [NEMA17_27, NEMA17_40, NEMA17_40L280, NEMA8_30, NEMA8_30BH];
|
||||
|
||||
module stepper_motors()
|
||||
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = false) let(m = stepper_motors[$i]) {
|
||||
rotate(180)
|
||||
NEMA(m, 0, in([NEMA17_27, NEMA17_40, NEMA17_40L280, NEMA8_30, NEMA8_30BH], m));
|
||||
rotate(180) {
|
||||
NEMA(m, 0, in(has_connector, m) ? true : show_connection_pos ? undef : false);
|
||||
|
||||
translate_z(4)
|
||||
NEMA_screws(m, M3_pan_screw, n = $i - 2, earth = $i > 6 ? undef : $i - 3);
|
||||
if(show_connection_pos)
|
||||
translate(NEMA_connection_pos(m, in(has_connector, m)))
|
||||
sphere();
|
||||
|
||||
translate_z(4)
|
||||
NEMA_screws(m, M3_pan_screw, n = $i - 2, earth = $i > 6 ? undef : $i - 3);
|
||||
}
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -41,8 +41,8 @@ module box(xmin, ymin, zmin, xmax, ymax, zmax) //! Construct a box given its bou
|
||||
[0,2,3,1]] // left
|
||||
);
|
||||
|
||||
module clip(xmin = -inf, ymin = -inf, zmin = -inf, xmax = inf, ymax = inf, zmax = inf) //! Clip child to specified boundaries
|
||||
render() intersection() {
|
||||
module clip(xmin = -inf, ymin = -inf, zmin = -inf, xmax = inf, ymax = inf, zmax = inf, convexity = 1) //! Clip child to specified boundaries
|
||||
render(convexity = convexity) intersection() {
|
||||
children();
|
||||
|
||||
box(xmin, ymin, zmin, xmax, ymax, zmax);
|
||||
|
@@ -33,7 +33,7 @@ function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two
|
||||
dx = p2.x - p1.x,
|
||||
dy = p2.y - p1.y,
|
||||
d = sqrt(dx * dx + dy * dy),
|
||||
theta = atan2(dy, dx) + acos((r1 - r2) / d),
|
||||
theta = assert(d, str("points conicident ", p1)) atan2(dy, dx) + acos((r1 - r2) / d),
|
||||
v = [cos(theta), sin(theta)]
|
||||
)[ p1 + r1 * v, p2 + r2 * v ];
|
||||
|
||||
@@ -72,24 +72,52 @@ function rounded_polygon_length(points, tangents) = //! Calculate the length giv
|
||||
arcs = rounded_polygon_arcs(points, tangents)
|
||||
) sumv( map( concat(tangents, arcs), function(e) e[2] ) );
|
||||
|
||||
function line_intersection(l0, l1) = //! Return the point where two 2D lines intersect or undef if they don't.
|
||||
assert(Len(l0) == 2 && Len(l1) == 2, "Two 2D vectors expected")
|
||||
let(
|
||||
p0 = l0[0], p1 = l0[1], p2 = l1[0], p3 = l1[1],
|
||||
v1 = p1 - p0,
|
||||
v2 = p3 - p2,
|
||||
v3 = p0 - p2,
|
||||
det = v1.x * v2.y - v2.x * v1.y,
|
||||
s = det ? (-v1.y * v3.x + v1.x * v3.y) / det : inf,
|
||||
t = det ? ( v2.x * v3.y - v2.y * v3.x) / det : inf
|
||||
) s >= 0 && s <= 1 && t >= 0 && t <= 1 ? p0 + t * v1 : undef;
|
||||
|
||||
function rounded_polygon(points, _tangents = undef) = //! Return the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
||||
let(
|
||||
len = len(points),
|
||||
tangents = _tangents ? _tangents : rounded_polygon_tangents(points),
|
||||
arcs = rounded_polygon_arcs(points, tangents)
|
||||
) [for(i = [0 : len - 1], last = (i - 1 + len) % len, R = points[i][2]) each [
|
||||
vec2(tangents[last][1]), // End of last tangent
|
||||
if(R) // If rounded
|
||||
let(r = abs(R), // Get radius
|
||||
n = r2sides4n(r), // Decide number of vertices
|
||||
step = 360 / n, // Angular step
|
||||
arc = arcs[i], // Get corner arc details
|
||||
start = ceil(arc[1] / step + eps), // Starting index
|
||||
end = floor((arc[0] + arc[1]) / step - eps), // Ending index
|
||||
c = vec2(points[i]) // Centre of arc
|
||||
) for(j = R > 0 ? [end : -1 : start] : [start : 1 : end], a = j * step) c + r * [cos(a), sin(a)], // Points on the arc
|
||||
vec2(tangents[i][0])] // Start of next tangent
|
||||
) [for(i = [0 : len - 1], last = (i - 1 + len) % len)
|
||||
let(
|
||||
t0 = vec2(tangents[last]),
|
||||
t1 = vec2(tangents[i]),
|
||||
p = line_intersection(t0, t1), // Do the tangents cross?
|
||||
R = points[i][2]
|
||||
)
|
||||
if(!is_undef(p)) // Tangents intersect, so just add the intersection point
|
||||
p
|
||||
else
|
||||
each [ // Else link the two tangent ends with an arc
|
||||
t0[1], // End of last tangent
|
||||
if(R) // If rounded
|
||||
let(r = abs(R), // Get radius
|
||||
n = r2sides4n(r), // Decide number of vertices
|
||||
step = 360 / n, // Angular step
|
||||
arc = arcs[i], // Get corner arc details
|
||||
start = ceil(arc[1] / step + eps), // Starting index
|
||||
end = floor((arc[0] + arc[1]) / step - eps), // Ending index
|
||||
c = vec2(points[i]) // Centre of arc
|
||||
) for(j = R > 0 ? [end : -1 : start] : [start : 1 : end], a = j * step)
|
||||
c + r * [cos(a), sin(a)], // Points on the arc
|
||||
if(R)
|
||||
t1[0], // Start of next tangent
|
||||
]
|
||||
];
|
||||
|
||||
function offset(points, offset) = //! Offset a 2D polygon, breaks for concave shapes and negative offsets if the offset is more than half the smallest feature size.
|
||||
rounded_polygon([for(p = points) [p.x, p.y, offset]]);
|
||||
|
||||
module rounded_polygon(points, _tangents = undef) //! Draw the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
||||
polygon(rounded_polygon(points, _tangents), convexity = len(points));
|
||||
|
@@ -127,8 +127,8 @@ function sweep_transforms(path, loop = false, twist = 0) =
|
||||
i = i + 1,
|
||||
rot = i < len ? rotate_from_to(tangents[i - 1], tangents[i]) * rot : undef) rot],
|
||||
|
||||
missmatch = loop ? calculate_twist(rotations[0], rotations[last]) : 0,
|
||||
rotation = missmatch + twist
|
||||
mismatch = loop ? calculate_twist(rotations[0], rotations[last]) : 0,
|
||||
rotation = mismatch + twist
|
||||
)
|
||||
[for(i = [0 : last])
|
||||
let(za = rotation * lengths[i] / length)
|
||||
@@ -239,7 +239,7 @@ function segmented_path(path, min_segment) = [ //! Add points to a path to enfo
|
||||
path[len(path) - 1]
|
||||
];
|
||||
|
||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which sprial around the given path. Use for making twisted cables
|
||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which spiral around the given path. Use for making twisted cables
|
||||
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
|
||||
) [for(i = [0 : n - 1]) let(initial = [r, 0, 0, 1] * rotate(start_angle + i * 360 / n)) [for(t = transforms) initial * t]];
|
||||
|
@@ -44,7 +44,8 @@ AACELL = ["AACELL", "Cell AA", 50.5, 14.5
|
||||
AAACELL = ["AAACELL", "Cell AAA", 44.5, 10.5, 8, 3.8, 0.8, "grey", [], 0, bcontact];
|
||||
CCELL = ["CCELL", "Cell C", 50, 26.2, 20, 7.5, 1.5, "brown", [], 0, bcontact];
|
||||
DCELL = ["DCELL", "Cell D", 61.5, 34.2, 22, 8.2, 2.4, "brown", [], 0, bcontact];
|
||||
A23CELL = ["A23CELL", "Cell A23 12v", 28.5, 10.3, 5.2,5.2, 1.0, "silver", [], 0, bcontact];
|
||||
|
||||
batteries = [AAACELL, AACELL, CCELL, DCELL, LUMINTOP, S25R18650];
|
||||
batteries = [AAACELL, AACELL, CCELL, DCELL, LUMINTOP, S25R18650, A23CELL];
|
||||
|
||||
use <battery.scad>
|
||||
|
@@ -20,11 +20,11 @@
|
||||
//
|
||||
//! Brushless DC electric motor
|
||||
//
|
||||
include <NopSCADlib/core.scad>
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
use <NopSCADlib/vitamins/rod.scad>
|
||||
use <NopSCADlib/utils/thread.scad>
|
||||
use <NopSCADlib/utils/tube.scad>
|
||||
use <rod.scad>
|
||||
use <../utils/thread.scad>
|
||||
use <../utils/tube.scad>
|
||||
|
||||
|
||||
function BLDC_diameter(type) = type[1]; //! Diameter of motor
|
||||
|
@@ -20,7 +20,7 @@
|
||||
// Extrusion
|
||||
//
|
||||
// W H d1 d2 sq cw cwi t st f recess
|
||||
E1515 = [ "E1515", 15, 15, -2.5, 0, 5.7, 3.4, 5.7, 1.1, 1.1, 0.5, false ];
|
||||
E1515 = [ "E1515", 15, 15, -3.3, 0, 5.5, 6.2, 9.5, 1.0, 0.9, 0.5, false ];
|
||||
E2020 = [ "E2020", 20, 20, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
|
||||
E2020t = [ "E2020t",20, 20, -5.0, -3, 7.8, 6.2, 11.0, 1.8, 1.5, 1.5, [7.2, 0.5] ];
|
||||
E2040 = [ "E2040", 20, 40, -4.2, -3, 8, 6, 12.0, 2, 2, 1, false ];
|
||||
|
@@ -33,7 +33,7 @@ function insert_ring1_h(type) = type[6]; //! Height of the top and mi
|
||||
function insert_ring2_d(type) = type[7]; //! Diameter of the middle ring
|
||||
function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring
|
||||
|
||||
function insert_hole_length(type) = round_to_layer(insert_length(type));
|
||||
function insert_hole_length(type) = round_to_layer(insert_length(type)); //! Length of the insert rounded to layer height
|
||||
|
||||
function insert_nose_length(type, d) = let( //! The length before the second ring.
|
||||
length = insert_length(type),
|
||||
|
@@ -485,6 +485,50 @@ module usb_uA(cutout = false) { //! Draw USB micro A connector
|
||||
}
|
||||
}
|
||||
|
||||
module usb_miniA(cutout = false) { //! Draw USB mini A connector
|
||||
l = 9.2;
|
||||
iw1 = 7.0;
|
||||
iw2 = 6.0;
|
||||
ih1 = 1.05;
|
||||
ih2 = 1.0;
|
||||
h = 4.0;
|
||||
t = 0.4;
|
||||
|
||||
module D() {
|
||||
hull() {
|
||||
translate([-iw1 / 2, h - t - ih1])
|
||||
square([iw1, ih1]);
|
||||
|
||||
translate([-iw2 / 2, t + ih2])
|
||||
square([iw2, eps]);
|
||||
|
||||
}
|
||||
translate([-iw2 / 2, t])
|
||||
square([iw2, ih2]);
|
||||
}
|
||||
|
||||
if(cutout)
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(100)
|
||||
offset(2 * panel_clearance)
|
||||
D();
|
||||
else
|
||||
color("silver") rotate([90, 0, 90]) {
|
||||
linear_extrude(l, center = true)
|
||||
difference() {
|
||||
offset(t)
|
||||
D();
|
||||
|
||||
D();
|
||||
}
|
||||
|
||||
translate_z(-l / 2)
|
||||
linear_extrude(1)
|
||||
offset(t)
|
||||
D();
|
||||
}
|
||||
}
|
||||
|
||||
module usb_C(cutout = false) { //! Draw USB C connector
|
||||
l = 7.35;
|
||||
w = 8.94;
|
||||
@@ -1046,6 +1090,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "usb_A")) usb_Ax1(cutouts);
|
||||
if(show(comp, "usb_Ax2")) usb_Ax2(cutouts);
|
||||
if(show(comp, "usb_uA")) usb_uA(cutouts);
|
||||
if(show(comp, "usb_miniA")) usb_miniA(cutouts);
|
||||
if(show(comp, "usb_B")) usb_B(cutouts);
|
||||
if(show(comp, "usb_C")) usb_C(cutouts);
|
||||
if(show(comp, "jack")) jack(cutouts);
|
||||
@@ -1089,6 +1134,7 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
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_sot")) smd_sot(comp[4], comp[5]);
|
||||
if(show(comp, "smd_soic")) smd_soic(comp[4], comp[5]);
|
||||
if(show(comp, "vero_pin")) vero_pin(param(4, false));
|
||||
if(show(comp, "terminal")) terminal_block(comp[5], comp[4]);
|
||||
if(show(comp, "text")) color("white") linear_extrude(eps) resize([comp[4], comp[5]]) text(comp[6], font = param(7, "Liberation Mono"), valign = "center", halign = "center");
|
||||
|
@@ -885,7 +885,7 @@ ArduinoNano = let(l = 43.18, w = 17.78, pitch = inch(0.6), pins = 15, poffset =
|
||||
[l / 2 + poffset, w / 2 - pitch / 2, 0, "-2p54joiner", pins, 1],
|
||||
[l / 2 + poffset, w / 2 + pitch / 2, 0, "-2p54joiner", pins, 1],
|
||||
[l / 2 + poffset + inch(0.75), w / 2, 0, "2p54header", 2, 3, false, undef, false, false],
|
||||
[1.75, w / 2, 180, "usb_uA" ],
|
||||
[3.1, w / 2, 180, "usb_miniA" ],
|
||||
[l / 2 - inch(0.25), w / 2, 45, "chip", 7, 7, 1.3],
|
||||
[l / 2 + poffset + inch(0.15), w / 2, 0, "chip", 3.5, 6, 1.8, silver ], // mock button
|
||||
[l / 2 + poffset + inch(0.15), w / 2, 0, "chip", 1.3, 2.6, 2.6, grey(90) ], // mock button
|
||||
|
@@ -178,3 +178,53 @@ module smd_sot(type, value) { //! Draw an SMD transistor
|
||||
text(value, halign = "center", valign = "center");
|
||||
|
||||
}
|
||||
|
||||
function smd_soic_size(type) = type[1]; //! Body length, width and height
|
||||
function smd_soic_z(type) = type[2]; //! Height above PCB surface
|
||||
function smd_soic_lead_z(type) = type[3]; //! Top of lead frame from top
|
||||
function smd_soic_lead_pitch(type) = type[4]; //! Lead pitch
|
||||
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));
|
||||
|
||||
size = smd_soic_size(type);
|
||||
z0 = smd_soic_z(type);
|
||||
z2 = z0 + size.z;
|
||||
z1 = z2 - smd_soic_lead_z(type);
|
||||
slant = 5; //! 5 degree body draft angle
|
||||
pitch = smd_soic_lead_pitch(type);
|
||||
span = (smd_soic_lead_span(type) / 2);
|
||||
leads = floor(size.x / pitch) + 1;
|
||||
ls = smd_soic_lead_size(type);
|
||||
|
||||
r = ls.z;
|
||||
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]], $fn = 32);
|
||||
|
||||
color(grey(20))
|
||||
hull()
|
||||
for(z = [z0, z1, z2], inset = abs(z - z1) * tan(slant))
|
||||
translate_z(z)
|
||||
cube([size.x - 2 * inset, size.y - 2 * inset, eps], center = true);
|
||||
|
||||
color(silver) {
|
||||
for(i = [0 : leads - 1]) {
|
||||
translate([i * pitch - size.x / 2 + (size.x - (leads - 1) * pitch) / 2, -span])
|
||||
sweep(gullwing, rectangle_points(ls.x, ls.z));
|
||||
|
||||
rotate(180)
|
||||
translate([0, -span / 2])
|
||||
translate([i * pitch - size.x / 2 + (size.x - (leads - 1) * pitch) / 2, -span / 2])
|
||||
sweep(gullwing, rectangle_points(ls.x, ls.z));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
color("white")
|
||||
translate_z(z0 + size.z)
|
||||
linear_extrude(eps)
|
||||
resize([size.x * 0.9, size.y / 2])
|
||||
text(value, halign = "center", valign = "center");
|
||||
|
||||
}
|
||||
|
@@ -23,8 +23,9 @@
|
||||
|
||||
LED0603 = ["LED0603", [1.6, 0.8, 0.18], [1.0, 0.8, 0.42]];
|
||||
LED0805 = ["LED0805", [2.0, 1.25, 0.46], [1.4, 1.25, 0.54]];
|
||||
LED1206 = ["LED1206", [3.2, 1.6, 0.5], [2.0, 1.6, .6]];
|
||||
|
||||
smd_leds = [LED0603, LED0805];
|
||||
smd_leds = [LED0603, LED0805, LED1206];
|
||||
|
||||
RES0603 = ["RES0603", [1.6, 0.8, 0.45], 0.3, 1/10];
|
||||
RES0805 = ["RES0805", [2.0, 1.2, 0.45], 0.4, 1/8];
|
||||
@@ -43,4 +44,10 @@ SOT223 = ["SOT223", [6.5, 3.5, 1.6], 0.05, 0.89, 2.3, 7.0, [0.7, 0.95, 0.25], 3]
|
||||
|
||||
smd_sots = [SOT23, SOT223];
|
||||
|
||||
SOIC8 = ["SOIC8", [4.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC16 = ["SOIC16", [9.90, 3.90, 1.25], 0.10, 0.66, 1.27, 6.00, [0.31, .50, 0.20]];
|
||||
SOIC18 = ["SOIC18", [11.40, 7.50, 2.00], 0.10, 1.20, 1.27, 10.30, [0.31, .50, 0.20]];
|
||||
|
||||
smd_soics = [SOIC8, SOIC16, SOIC18];
|
||||
|
||||
use <smd.scad>
|
||||
|
@@ -51,6 +51,18 @@ stepper_body_colour = grey(20);
|
||||
stepper_cap_colour = grey(50);
|
||||
stepper_machined_colour = grey(90);
|
||||
|
||||
function NEMA_connection_pos(type, jst_connector = false) = let( //! Position of the wires or the connector
|
||||
side = NEMA_width(type),
|
||||
length = NEMA_length(type),
|
||||
cap = NEMA_cap_heights(type)[1],
|
||||
hdr = NEMA_end_connector(type) ? jst_zh_header : jst_ph_header,
|
||||
socket_size = hdr_box_size(hdr),
|
||||
end_conn_inset = socket_size.y - 2
|
||||
)
|
||||
jst_connector ? NEMA_end_connector(type) ? [0, side / 2 + hdr_y_offset(hdr) + socket_size.y / 2 - end_conn_inset, -length]
|
||||
: [0, side / 2 + socket_size.z, hdr_y_offset(hdr) - socket_size.y / 2 - length + cap]
|
||||
: [0, side / 2, -length + cap / 2];
|
||||
|
||||
module NEMA_outline(type) //! 2D outline
|
||||
intersection() {
|
||||
side = NEMA_width(type);
|
||||
@@ -185,14 +197,14 @@ module NEMA(type, shaft_angle = 0, jst_connector = false) { //! Draw specified N
|
||||
not_on_bom()
|
||||
leadscrew(shaft_rad * 2, shaft.x + length + shaft2, shaft.y, shaft.z, center = false);
|
||||
|
||||
if(!jst_connector)
|
||||
if(jst_connector == false)
|
||||
translate([0, side / 2, -length + cap / 2])
|
||||
rotate([90, 0, 0])
|
||||
for(i = [0 : 3])
|
||||
rotate(225 + i * 90)
|
||||
color(["red", "blue","green","black"][i])
|
||||
translate([1, 0, 0])
|
||||
cylinder(r = 1.5 / 2, h = 12, center = true);
|
||||
color(["red", "green", "black", "blue"][i])
|
||||
translate([1.48 / sqrt(2), 0, 0])
|
||||
cylinder(d = 1.48, h = 12, center = true);
|
||||
}
|
||||
|
||||
module NEMA_screw_positions(type, n = 4) { //! Positions children at the screw holes
|
||||
|
@@ -41,7 +41,7 @@ function vero_track_width(type) = vero_pitch(type) * 0.8; //! The width of th
|
||||
function vero_length(type) = vero_holes(type) * vero_pitch(type); //! Length of the board
|
||||
function vero_width(type) = vero_strips(type) * vero_pitch(type); //! Width of the board
|
||||
|
||||
function vero(name, assembly, holes, strips, pitch = inch(0.1), fr4 = false, screw = M3_cap_screw, mounting_holes = [], breaks = [], no_tracks = [], components = [], joints = []) = //! Constructor
|
||||
function vero(name, assembly, holes, strips, pitch = 2.54, fr4 = false, screw = M3_cap_screw, mounting_holes = [], breaks = [], no_tracks = [], components = [], joints = []) = //! Constructor
|
||||
[ name, assembly, holes, strips, pitch, fr4, screw, mounting_holes, breaks, no_tracks, components, joints ];
|
||||
|
||||
function vero_size(type) = [vero_length(type), vero_width(type), vero_thickness(type)]; //! Board size
|
||||
@@ -89,7 +89,7 @@ module veroboard(type) { //! Draw specified veroboard with missing tracks and tr
|
||||
tc = vero_fr4(type) ? "silver" : copper;
|
||||
no_track = vero_no_track(type);
|
||||
|
||||
vitamin(str("veroboard(", type[0], "): Veroboard ", holes, " holes x ", strips, "strips"));
|
||||
vitamin(str("veroboard(", type[0], "): Veroboard ", holes, " holes x ", strips, " strips"));
|
||||
|
||||
color(colour) linear_extrude(vero_thickness(type))
|
||||
difference() {
|
||||
|