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

Compare commits

...

20 Commits

Author SHA1 Message Date
Chris Palmer
db2a9a8a24 Ziptie test can now show wires with t = 0. 2024-03-14 20:56:20 +00:00
Chris Palmer
6ced9c871c Fixed FOV for ESP32 camera being rotated.
Shortened the ESP32 camera header pins.
2024-03-14 20:51:05 +00:00
Chris Palmer
d6b00fbf57 Removed unused test code. 2024-03-14 20:48:05 +00:00
Chris Palmer
2c996bb7a1 Fixed random error caused by not running bom first. 2024-03-14 20:47:11 +00:00
Chris Palmer
dbd3004021 Updated changelog. 2024-02-19 19:07:26 +00:00
Chris Palmer
fb656c8fad Merge branch 'jeroenrnl-t-tracks' 2024-02-19 19:03:47 +00:00
Chris Palmer
fdb92ec263 Improved layout to fit into front page view. 2024-02-19 19:03:20 +00:00
Chris Palmer
cff4c71909 Merge branch 't-tracks' of https://github.com/jeroenrnl/NopSCADlib into jeroenrnl-t-tracks 2024-02-19 16:28:24 +00:00
Chris Palmer
db917ef2bc Updated changelog. 2024-02-19 16:15:34 +00:00
Chris Palmer
a2d98f9d3a Merge branch 'jeroenrnl-threaded_inserts' 2024-02-19 16:13:26 +00:00
Chris Palmer
30c67e742b Updated the front page image. 2024-02-19 16:10:19 +00:00
Chris Palmer
2506e5aa31 Merge branch 'threaded_inserts' of https://github.com/jeroenrnl/NopSCADlib into jeroenrnl-threaded_inserts 2024-02-19 15:00:48 +00:00
Chris Palmer
1f313aa4ac Updated changelog. 2024-02-19 00:06:35 +00:00
Chris Palmer
63a4271c4c Updated libtest image. 2024-02-18 23:56:47 +00:00
Chris Palmer
0edf3a2f75 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().
2024-02-18 23:51:30 +00:00
Jeroen Roos
f6404b939f Added T-Tracks and accessories 2024-02-18 22:10:01 +01:00
Jeroen Roos
efb1153e22 Add threaded inserts 2024-02-15 22:01:36 +01:00
Chris Palmer
a3b27a736e Changelog updated. 2024-02-10 12:22:37 +00:00
Chris Palmer
8540e04a10 Metal hex pillars now chamfered. 2024-02-10 12:21:17 +00:00
Chris Palmer
4c6a2b177f Updated changelog. 2024-02-10 01:13:56 +00:00
31 changed files with 764 additions and 147 deletions

View File

@@ -3,6 +3,35 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [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.
* 2024-02-10 [`38196e9`](https://github.com/nophead/NopSCADlib/commit/38196e9f78f07d0f9a4eca0355cc6e99f29332fb "show commit") [C.P.](# "Chris Palmer") Mods to allow the manifold experimental option to be used.
* 2024-02-05 [`9666c01`](https://github.com/nophead/NopSCADlib/commit/9666c018a0a99be8d24a2454a4c1448b09f83af0 "show commit") [C.P.](# "Chris Palmer") Made sheet overridable in `box_base_blank()`.
### [v21.12.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.12.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.11.0...v21.12.0 "diff with v21.11.0")
* 2024-02-05 [`38988ba`](https://github.com/nophead/NopSCADlib/commit/38988bacfa41dea19408b19cf06f134e51338ab0 "show commit") [C.P.](# "Chris Palmer") Updated images.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 KiB

After

Width:  |  Height:  |  Size: 1000 KiB

View File

@@ -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;

View File

@@ -18,100 +18,129 @@
//
//
//! 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 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) = //! Width given the `screw` and possibly insert.
let(insert = cable_clip_insert(screw, insert))
insert ? 2 * (insert_hole_radius(insert) + wall) :
max(wall + 2 * screw_clearance_radius(screw) + wall, washer_diameter(screw_washer(screw)));
function cable_clip_height(cable, screw = false, insert = false) = //! Height given the `cable`.
let(insert = cable_clip_insert(screw, insert))
max(cable_height(cable) + wall, insert ? insert_hole_length(insert) + 1 : 0);
function cable_clip_extent(screw, cable, insert = false) = cable_clip_width(screw, insert) / 2 + cable_width(cable) + wall; //! How far it extends from the screw.
function cable_clip_offset(screw, cable, insert = false) = cable_clip_width(screw, insert) / 2 + cable_width(cable) / 2; //! The offset of the cable from the screw.
module single_cable_clip(screw, cable, h = 0, insert = false) {
insert = cable_clip_insert(screw, insert);
height = cable_clip_width(screw, insert);
depth = h ? h : cable_clip_height(cable, screw, insert);
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() {
linear_extrude(height)
difference() {
hull() {
rounded_square([width, 1], r, center = false);
translate([width - 1, 0])
rounded_square([1, depth], r, center = false);
translate([rad, depth - rad])
circle(r = rad);
}
translate([wall + cable_width(cable) / 2, 0]) {
translate([-hole_x, 0])
difference() {
linear_extrude(height)
difference() {
hull() {
for(p = cable_bundle_positions(cable))
translate(p)
circle(d = cable_wire_size(cable));
rounded_square([width, 1], r, center = false);
square([w, eps], center = true);
translate([width - 1, 0])
rounded_square([1, depth], r, center = false);
translate([rad, depth - rad])
circle(r = rad);
}
translate([wall + cable_width(cable) / 2, 0]) {
hull() {
for(p = cable_bundle_positions(cable))
translate(p)
circle(d = cable_wire_size(cable));
square([w, eps], center = true);
}
for(side = [-1, 1])
translate([side * w / 2, 0])
hflip(side < 0)
fillet(r = r, h = 0);
}
for(side = [-1, 1])
translate([side * w / 2, 0])
hflip(side < 0)
fillet(r = r, h = 0);
}
}
translate([hole_x, depth / 2, height / 2])
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
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) {
h = max(cable_clip_height(cable1, screw, insert), cable_clip_height(cable2, screw, insert));
union() {
single_cable_clip(screw, cable1, h);
single_cable_clip(screw, cable1, h, insert);
mirror([1,0,0]) single_cable_clip(screw, cable2, h);
mirror([1,0,0]) single_cable_clip(screw, cable2, h, insert);
}
}
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) { //! Create the STL for a single cable or two cable clip
function clip_str(screw) = str("cable_clip_", screw_radius(screw) * 20, insert ? "I" : "");
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);
double_cable_clip(screw, cable1, cable2, insert);
}
else {
stl(str(clip_str(screw), cable_str(cable1)));
single_cable_clip(screw, cable1);
single_cable_clip(screw, cable1, h = 0, insert = insert);
}
}
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) { //! Cable clip with the fasteners
flip = flip || insert; // Screw must be below if using an insert
insert = cable_clip_insert(screw, insert);
height = max(cable_clip_height(cable1, screw, insert), cable2 ? cable_clip_height(cable2, screw, insert) : 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) / 2])
rotate([90, 0, 0])
cable_clip(screw, cable1, cable2, insert);
nut = screw_nut(screw);
screw_len = screw_length(screw, height + thickness, 2, nyloc = !insert, insert = insert);
translate_z(height)
screw_and_washer(screw, screw_length(screw, height + thickness, 2, nyloc = true));
if(flip)
if(insert)
insert(insert);
else
nut_and_washer(nut, true);
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);
else
nut_and_washer(nut, true);
}

View File

@@ -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);

131
readme.md
View File

@@ -43,13 +43,13 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
<tr><td> <a href = "#extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#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 = "#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></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>
---
@@ -1703,6 +1703,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 +1720,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 |
![inserts](tests/png/inserts.png)
@@ -1732,6 +1735,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>
@@ -3010,6 +3021,7 @@ Threaded pillars. Each end can be male or female.
| Function | Description |
|:--- |:--- |
| `pillar_bot_thread(type)` | Bottom thread length, + for male, - for female |
| `pillar_chamfered(type)` | True if pillar is chamfered |
| `pillar_height(type)` | Body height |
| `pillar_i_colour(type)` | Colour of the inner part |
| `pillar_id(type)` | Inner diameter of metal part |
@@ -4672,6 +4684,80 @@ 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 |
![ttracks](tests/png/ttracks.png)
### 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>
---
@@ -4967,6 +5053,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 |
@@ -5270,7 +5357,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 either way up.
[printed/cable_clip.scad](printed/cable_clip.scad) Implementation.
@@ -5279,35 +5366,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)` | How far it extends from the screw. |
| `cable_clip_height(cable, screw = false, insert = false)` | Height given the `cable`. |
| `cable_clip_insert(screw, insert = true)` | Insert type for clip, given screw. |
| `cable_clip_offset(screw, cable, insert = false)` | The offset of the cable from the screw. |
| `cable_clip_width(screw, insert = false)` | Width given the `screw` and possibly insert. |
### 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)` | Create the STL for a single cable or two cable clip |
| `cable_clip_assembly(screw, thickness, cable1, cable2 = 0, flip = false, insert = false)` | Cable clip with the fasteners |
![cable_clip](tests/png/cable_clip.png)
### 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, 16)` | Screw M3 dome x 16mm |
| 10 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 2 | `screw(M3_dome_screw, 10)` | Screw M3 dome x 10mm |
| 1 | `screw(M3_dome_screw, 12)` | Screw M3 dome x 12mm |
| 4 | `screw(M3_dome_screw, 16)` | Screw M3 dome x 16mm |
| 12 | `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_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_7_14_8_14.stl |
| 1 | cable_clip_30_9_14.stl |
<a href="#top">Top</a>

View File

@@ -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())

View File

@@ -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)

View File

@@ -50,4 +50,5 @@ module pcbs() {
pcb(p);
}
if($preview)
pcbs();
let($show_threads = false)
pcbs();

View File

@@ -25,20 +25,20 @@ use <../vitamins/wire.scad>
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;
module cable_clips() {
for(i = [0 : ceil(len(cables) / 2) - 1])
translate([i * 25, 0]) {
cable1 = cables[2 * i];
cable2 = cables[2 * i + 1];
for(i = [0 : ceil(len(cables) / 2) - 1]) {
cable1 = cables[2 * i];
cable2 = cables[2 * i + 1];
translate([i * 21 + (!cable2 ? cable_clip_offset(screw, cable1) / 2 : 0), 0]) {
insert = in([0, 3], i);
if($preview) {
cable_clip_assembly(screw, sheet_thickness, cable1, cable2);
cable_clip_assembly(screw, sheet_thickness, cable1, cable2, insert = insert, flip = i == 1);
for(j = [0 : 1])
let(cable = cables[2 * i + j])
@@ -46,14 +46,15 @@ module cable_clips() {
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), 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);
}
}
}
cable_clips();

View File

@@ -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();
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 107 KiB

BIN
tests/png/ttracks.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

73
tests/ttracks.scad Normal file
View 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();

View File

@@ -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);

View File

@@ -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
];

View File

@@ -23,6 +23,7 @@
include <../utils/core/core.scad>
use <../utils/thread.scad>
use <../utils/pcb_utils.scad>
use <nut.scad>
d_pillar_colour = grey(90);
d_plug_shell_colour = grey(80);
@@ -62,17 +63,13 @@ module d_pillar() { //! Draw a pillar for a D-connector
color(d_pillar_colour)
cylinder(d = screw, h = screw_length + 1);
color(d_pillar_colour) {
linear_extrude(height)
difference() {
circle(r = rad, $fn = 6);
circle(d = screw);
}
}
if(show_threads)
female_metric_thread(screw, pitch, height, false, colour = d_pillar_colour);
draw_nut(rad * 2, screw, height, pitch, d_pillar_colour, show_threads);
color(d_pillar_colour)
cylinder(d = screw + eps, h = 1);
}
module d_plug_D(length, width, rad) { //! D plug D shape
d = width / 2 - rad;
offset = d * sin(10);

View File

@@ -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,54 @@ 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)
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);
}
}

View File

@@ -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>

View File

@@ -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],
@@ -1197,7 +1196,6 @@ ESP_12F = pcb("ESP_12F", "ESP-12F ESP8266 WiFi module", [24, 16, 0.8],
]
);
tiny_buck = pcb("tiny_buck", "Ultra Small 3A buck regulator", [20, 11, 1.6],
hole_d = 1.2,
land_d = [2, 2],

View File

@@ -22,6 +22,7 @@
//
include <../utils/core/core.scad>
use <../utils/thread.scad>
use <nut.scad>
function pillar_name(type) = type[1]; //! Name of part
function pillar_thread(type) = type[2]; //! Thread diameter
@@ -34,6 +35,7 @@ function pillar_o_colour(type) = type[8]; //! Colour of the outer part
function pillar_i_colour(type) = type[9]; //! Colour of the inner part
function pillar_top_thread(type) = type[10]; //! Top thread length, + for male, - for female
function pillar_bot_thread(type) = type[11]; //! Bottom thread length, + for male, - for female
function pillar_chamfered(type) = type[12]; //! True if pillar is chamfered
module pillar(type) { //! Draw specified pillar
function sex(thread) = thread > 0 ? "M" : "F";
@@ -67,12 +69,15 @@ module pillar(type) { //! Draw specified pillar
color(thread_colour)
cylinder(h = top_thread_l, d = thread_d);
color(pillar_i_colour(type)) {
linear_extrude(height)
difference() {
circle(d = pillar_id(type), $fn = fn(pillar_ifn(type)));
circle(d = thread_d);
}
color(thread_colour) {
if(pillar_chamfered(type))
draw_nut(pillar_id(type), thread_d, height, 0, thread_colour, false);
else
linear_extrude(height)
difference() {
circle(d = pillar_id(type), $fn = fn(pillar_ifn(type)));
circle(d = thread_d);
}
top = height + min(top_thread_l, 0);
bot = -min(bot_thread_l, 0);
@@ -85,10 +90,10 @@ module pillar(type) { //! Draw specified pillar
if(top_thread_l < 0)
translate_z(height)
vflip()
female_metric_thread(thread_d, pitch, -top_thread_l, false, colour = thread_colour);
female_metric_thread(thread_d, pitch, -top_thread_l, bot = 1, false, colour = thread_colour);
if(bot_thread_l < 0)
female_metric_thread(thread_d, pitch, -bot_thread_l, false, colour = thread_colour);
female_metric_thread(thread_d, pitch, -bot_thread_l, false, bot = 1, colour = thread_colour);
}
if(pillar_od(type) > pillar_id(type))

View File

@@ -20,23 +20,23 @@
//
// Nylon pillars
//
// n t h o i o i o i b t
// a h e d d f f
// m r i n n c c t t
// e e g o o h h
// a h l l r r
// d t o o e e
// u u a a
// d r r d d
//
M2x16_brass_pillar = ["M2x16_brass_pillar", "nurled", 2, 16, 3.17, 3.17, 0, 0, brass, brass, 3,-3];
M3x6_hex_pillar = ["M3x6_hex_pillar", "hex", 3, 6, 5/cos(30), 5/cos(30), 6, 6, brass, brass, -5, 6];
M3x13_hex_pillar = ["M3x13_hex_pillar", "hex", 3, 13, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -6, 6];
M3x20_hex_pillar = ["M3x20_hex_pillar", "hex", 3, 20, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -8, 8];
M3x20_nylon_pillar = ["M3x20_nylon_pillar", "nylon", 3, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6];
M4x17_nylon_pillar = ["M4x17_nylon_pillar", "nylon", 4, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6];
M3x20_nylon_hex_pillar = ["M3x20_nylon_hex_pillar", "hex nylon", 3, 20, 8/cos(30), 8/cos(30), 6, 6, grey(20), grey(20), -6, 6];
M3x10_nylon_hex_pillar = ["M3x10_nylon_hex_pillar", "hex nylon", 3, 10,5.5/cos(30),5.5/cos(30),6, 6, grey(20), grey(20), -6, 6];
// n t h o i o i o i b t c
// a h e d d f f h
// m r i n n c c t t a
// e e g o o h h m
// a h l l r r f
// d t o o e e e
// u u a a r
// d r r d d e
// d
M2x16_brass_pillar = ["M2x16_brass_pillar", "nurled", 2, 16, 3.17, 3.17, 0, 0, brass, brass, 3,-3, false];
M3x6_hex_pillar = ["M3x6_hex_pillar", "hex", 3, 6, 5/cos(30), 5/cos(30), 6, 6, brass, brass, -5, 6, true];
M3x13_hex_pillar = ["M3x13_hex_pillar", "hex", 3, 13, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -6, 6, true];
M3x20_hex_pillar = ["M3x20_hex_pillar", "hex", 3, 20, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -8, 8, true];
M3x20_nylon_pillar = ["M3x20_nylon_pillar", "nylon", 3, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6, false];
M4x17_nylon_pillar = ["M4x17_nylon_pillar", "nylon", 4, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6, false];
M3x20_nylon_hex_pillar = ["M3x20_nylon_hex_pillar", "hex nylon", 3, 20, 8/cos(30), 8/cos(30), 6, 6, grey(20), grey(20), -6, 6, false];
M3x10_nylon_hex_pillar = ["M3x10_nylon_hex_pillar", "hex nylon", 3, 10,5.5/cos(30),5.5/cos(30),6, 6, grey(20), grey(20), -6, 6, false];
pillars = [M2x16_brass_pillar, M3x6_hex_pillar, M3x13_hex_pillar, M3x20_hex_pillar, M3x20_nylon_pillar, M4x17_nylon_pillar, M3x10_nylon_hex_pillar, M3x20_nylon_hex_pillar];

209
vitamins/ttrack.scad Normal file
View 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
View 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>

View File

@@ -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 = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
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