Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b4cc6f6c37 | ||
|
6238f82bf0 | ||
|
fbc688c81f | ||
|
7b2b239a8b | ||
|
de8eb594a7 | ||
|
f061b0a2f8 | ||
|
43b17c6f0b | ||
|
886319a6e4 | ||
|
723be7ac64 | ||
|
3a5e027bbb | ||
|
d068b972ff |
@@ -86,9 +86,9 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|--:|:----------|
|
||||
|8| Washer M3 x 7mm x 0.5mm|
|
||||
|4| Screw M3 dome x 10mm|
|
||||
|4| Nut M3 x 2.4mm nyloc|
|
||||
|4| Screw M3 dome x 10mm|
|
||||
|8| Washer M3 x 7mm x 0.5mm|
|
||||
|
||||
|
||||
### 3D Printed parts
|
||||
@@ -122,14 +122,14 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|--:|:----------|
|
||||
|1| Wire green & yellow 30/0.25mm strands, length 150mm - not shown|
|
||||
|1| Wire blue 30/0.25mm strands, length 150mm - not shown|
|
||||
|2| Wire brown 30/0.25mm strands, length 150mm - not shown|
|
||||
|3| Heatshrink sleeving ID 3.2mm x 15mm - not shown|
|
||||
|1| IEC inlet for ATX|
|
||||
|2| Nut M3 x 2.4mm nyloc|
|
||||
|2| Screw M3 cs cap x 12mm|
|
||||
|2| Washer M3 x 7mm x 0.5mm|
|
||||
|2| Nut M3 x 2.4mm nyloc|
|
||||
|1| Wire blue 30/0.25mm strands, length 150mm - not shown|
|
||||
|2| Wire brown 30/0.25mm strands, length 150mm - not shown|
|
||||
|1| Wire green & yellow 30/0.25mm strands, length 150mm - not shown|
|
||||
|
||||
|
||||
### Sub-assemblies
|
||||
@@ -161,15 +161,15 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
|
||||
### Vitamins
|
||||
|Qty|Description|
|
||||
|--:|:----------|
|
||||
|1| Wire green & yellow 30/0.25mm strands, length 150mm - not shown|
|
||||
|1| Wire blue 30/0.25mm strands, length 150mm - not shown|
|
||||
|5| Heatshrink sleeving ID 3.2mm x 15mm - not shown|
|
||||
|3| Ferrule for 1.5mm^2 wire - not shown|
|
||||
|1| Mains socket 13A|
|
||||
|2| Screw M3 cs cap x 20mm|
|
||||
|2| 4mm shielded jack socket blue|
|
||||
|1| 4mm shielded jack socket brown|
|
||||
|2| 4mm shielded jack socket green|
|
||||
|3| Ferrule for 1.5mm^2 wire - not shown|
|
||||
|5| Heatshrink sleeving ID 3.2mm x 15mm - not shown|
|
||||
|1| Mains socket 13A|
|
||||
|2| Screw M3 cs cap x 20mm|
|
||||
|1| Wire blue 30/0.25mm strands, length 150mm - not shown|
|
||||
|1| Wire green & yellow 30/0.25mm strands, length 150mm - not shown|
|
||||
|
||||
|
||||
### Sub-assemblies
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 696 KiB After Width: | Height: | Size: 703 KiB |
@@ -88,6 +88,7 @@ use <tests/socket_box.scad>
|
||||
use <tests/strap_handle.scad>
|
||||
use <tests/ssr_shroud.scad>
|
||||
use <tests/psu_shroud.scad>
|
||||
use <tests/flat_hinge.scad>
|
||||
|
||||
x5 = 800;
|
||||
|
||||
@@ -114,6 +115,9 @@ translate([x5 + 70, cable_grommets_y + 150])
|
||||
translate([x5, cable_grommets_y + 470]) {
|
||||
door_hinges()
|
||||
door_latches();
|
||||
|
||||
translate([120, 0])
|
||||
flat_hinges();
|
||||
}
|
||||
|
||||
translate([x5, cable_grommets_y + 370])
|
||||
@@ -152,7 +156,7 @@ fans_y = displays_y + 100;
|
||||
transformers_y = fans_y + 120;
|
||||
psus_y = transformers_y + 190;
|
||||
|
||||
translate([x0 + 20, inserts_y])
|
||||
translate([x0 + 30, inserts_y])
|
||||
inserts();
|
||||
|
||||
translate([x0, inserts_y])
|
||||
|
@@ -97,7 +97,7 @@ function fixing_block_positions(type) = let(
|
||||
|
||||
for(i = [0 : 1 : hspans - 1], x = [-1, 1], y = [-1, 1])
|
||||
translate([x * width / 2, y * depth / 2, (i - (hspans - 1) / 2) * hspan]) *
|
||||
rotate([y > 0 ? 180 : 0, x * y * 90]),
|
||||
rotate([y > 0 ? 180 : 0, x * y * 90, 0]),
|
||||
|
||||
];
|
||||
|
||||
|
@@ -130,7 +130,7 @@ module round_grommet_bottom(diameter, od = undef) { //! Generate the STL for a r
|
||||
}
|
||||
|
||||
module round_grommet_hole(diameter, h = 100) //! Make a hole for a round grommet
|
||||
drill(diameter / 2 + wall + clearance, h);
|
||||
drill(echoit(corrected_radius(diameter / 2) + wall + clearance), h);
|
||||
|
||||
module round_grommet_assembly(diameter, thickness, od = undef) {
|
||||
color(pp1_colour)
|
||||
@@ -149,12 +149,17 @@ module mouse_grommet_hole(r, h = 50, z = undef, expand = wall + clearance) //! M
|
||||
hull(){
|
||||
R = r + expand;
|
||||
translate([0, z == undef ? R : z])
|
||||
semi_circle(R);
|
||||
if(expand)
|
||||
semi_circle(R);
|
||||
else
|
||||
semi_teardrop(r = R, h = 0);
|
||||
|
||||
translate([-R, 0])
|
||||
square([2 * R, eps]);
|
||||
}
|
||||
|
||||
function mouse_grommet_offset(r) = r + wall;
|
||||
|
||||
module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
||||
stl(str("mouse_grommet_", r * 10, "_", thickness));
|
||||
|
||||
@@ -167,7 +172,7 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
||||
translate_z(side * (width - wall) / 2)
|
||||
linear_extrude(height = wall, center = true)
|
||||
difference() {
|
||||
mouse_grommet_hole(r + wall + overlap, z = r + wall, h = 0, expand = 0);
|
||||
mouse_grommet_hole(r, z = r + wall, h = 0, expand = wall + overlap);
|
||||
|
||||
translate([0, wall])
|
||||
mouse_grommet_hole(r, h = 0, expand = 0);
|
||||
@@ -182,6 +187,20 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
||||
}
|
||||
}
|
||||
|
||||
module mouse_grommet_assembly(r, thickness)
|
||||
color(pp1_colour)
|
||||
rotate([-90, 0, 0])
|
||||
mouse_grommet(r, thickness);
|
||||
|
||||
module ribbon_grommet_20_3_stl() ribbon_grommet(20, 3);
|
||||
module mouse_grommet_20_3_stl() mouse_grommet(2,3);
|
||||
module mouse_grommet_30_3_stl() mouse_grommet(3,3);
|
||||
module mouse_grommet_15_3_stl() mouse_grommet(1.5, 3);
|
||||
module mouse_grommet_20_3_stl() mouse_grommet(2, 3);
|
||||
module mouse_grommet_30_3_stl() mouse_grommet(3, 3);
|
||||
|
||||
module round_grommet_bottom_30_stl() round_grommet_bottom(3);
|
||||
module round_grommet_bottom_40_stl() round_grommet_bottom(4);
|
||||
module round_grommet_bottom_60_stl() round_grommet_bottom(6);
|
||||
|
||||
module round_grommet_top_30_3_stl() round_grommet_top(3, 3);
|
||||
module round_grommet_top_40_3_stl() round_grommet_top(4, 3);
|
||||
module round_grommet_top_60_3_stl() round_grommet_top(6, 3);
|
||||
|
180
printed/flat_hinge.scad
Normal file
@@ -0,0 +1,180 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2018
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! A parametric flat hinge. A piece of filament can be used for the hinge pin.
|
||||
//!
|
||||
//! The width, depth, thickness, number and type of screws, number of knuckles, knuckle diameter, pin diameter and clearance can all be varied.
|
||||
//! A margin between the screws and the knuckle edge can be enforced to allow the hinge to bend all the way back to 270° from closed.
|
||||
//!
|
||||
//! Opening the test in OpenSCAD with its customiser enabled allows these parameters to be played with.
|
||||
//!
|
||||
//! Note setting ```thickness1``` or ```thickness2``` to zero in the ```hinge_fastened_assembly()``` removes the screws from one side or the other and
|
||||
//! setting ```show_hinge``` to false removes the hinge.
|
||||
//! This allows the hinges and one set of screws to belong to one assembly and the other set of screws to another assembly.
|
||||
//
|
||||
include <../core.scad>
|
||||
include <../vitamins/screws.scad>
|
||||
|
||||
function hinge_width(type) = type[1]; //! Width
|
||||
function hinge_depth(type) = type[2]; //! Depth of each leaf
|
||||
function hinge_thickness(type) = type[3]; //! Thickness of the leaves
|
||||
function hinge_pin_dia(type) = type[4]; //! The pin diameter
|
||||
function hinge_knuckle_dia(type) = type[5]; //! The knuckle diameter
|
||||
function hinge_knuckles(type) = type[6]; //! How many knuckles
|
||||
function hinge_screw(type) = type[7]; //! Screw type to mount it
|
||||
function hinge_screws(type) = type[8]; //! How many screws
|
||||
function hinge_clearance(type) = type[9]; //! Clearance between knuckles
|
||||
function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckes
|
||||
|
||||
function hinge_radius(type) = washer_radius(screw_washer(hinge_screw(type))) + 1;
|
||||
|
||||
module hinge_screw_positions(type) { //! Place children at the screw positions
|
||||
screws = hinge_screws(type);
|
||||
w = hinge_width(type);
|
||||
d = hinge_depth(type);
|
||||
r = hinge_radius(type);
|
||||
m = hinge_margin(type);
|
||||
assert(screws > 1, "must be at least two screws");
|
||||
w_pitch = (w - 2 * r) / (screws - 1);
|
||||
d_pitch = d - 2 * r - m;
|
||||
wr = washer_radius(screw_washer(hinge_screw(type)));
|
||||
assert(w_pitch >= wr && norm([w_pitch, d_pitch]) >= 2 * wr && d_pitch >= 0, "not enough room for screws");
|
||||
|
||||
for(i = [0 : screws - 1])
|
||||
translate([-w / 2 + r + i * w_pitch, r + m + (i % 2) * d_pitch])
|
||||
children();
|
||||
}
|
||||
|
||||
module hinge_male(type, female = false) { //! The half with the stationary pin
|
||||
stl(str("hinge_", female ? "fe": "", "male_", type[0]));
|
||||
|
||||
r = hinge_radius(type);
|
||||
w = hinge_width(type);
|
||||
t = hinge_thickness(type);
|
||||
kr = hinge_knuckle_dia(type) / 2;
|
||||
pr = hinge_pin_dia(type) / 2;
|
||||
assert(kr > pr, "knuckle diameter must be bigger than the pin diameter");
|
||||
|
||||
n = hinge_knuckles(type);
|
||||
assert(n >= 3, "must be at least three knuckes");
|
||||
mn = ceil(n / 2); // Male knuckles
|
||||
fn = floor(n / 2); // Female knuckles
|
||||
gap = hinge_clearance(type);
|
||||
mw = (w - (n - 1) * gap) / 2 / mn; // Male knuckle width
|
||||
fw = (w - (n - 1) * gap) / 2 / fn; // Female knuckle width
|
||||
|
||||
teardrop_r = kr / cos(22.5); // The corner on the teardrop
|
||||
inset = sqrt(sqr(teardrop_r + gap) - sqr(kr - t)) - kr;
|
||||
|
||||
linear_extrude(height =t)
|
||||
difference() {
|
||||
hull() {
|
||||
for(side = [-1, 1])
|
||||
translate([side * (w / 2 - r), hinge_depth(type) - r])
|
||||
circle4n(r);
|
||||
|
||||
translate([-w / 2, inset])
|
||||
square([w, eps]);
|
||||
}
|
||||
hinge_screw_positions(type)
|
||||
poly_circle(screw_clearance_radius(hinge_screw(type)));
|
||||
}
|
||||
|
||||
pitch = mw + gap + fw + gap;
|
||||
dir = female ? -1 : 1;
|
||||
translate([0, -kr, kr])
|
||||
rotate([90, 0, -90])
|
||||
for(z = [0 : (female ? fn : mn) - 1])
|
||||
translate_z(-dir * w / 2 + z * dir * pitch + (female ? -fw - mw - gap : 0))
|
||||
linear_extrude(height = female ? fw : mw)
|
||||
difference() {
|
||||
hull() {
|
||||
rotate(180)
|
||||
teardrop(r = kr, h = 0);
|
||||
|
||||
translate([-kr - 1, -kr])
|
||||
square(1);
|
||||
}
|
||||
teardrop_plus(r = pr + (female ? gap : 0), h = 0);
|
||||
}
|
||||
}
|
||||
|
||||
module hinge_female(type) hinge_male(type, true);
|
||||
|
||||
module hinge_both(type) { //! Both parts together for printing
|
||||
hinge_male(type);
|
||||
|
||||
translate([0, -hinge_knuckle_dia(type)])
|
||||
rotate(180)
|
||||
hinge_female(type);
|
||||
}
|
||||
|
||||
module hinge_assembly(type, angle = 0)
|
||||
assembly(str("hinge_", type[0])) { //! Assembled hinge
|
||||
kr = hinge_knuckle_dia(type) / 2;
|
||||
hr = hinge_pin_dia(type) / 2;
|
||||
w = hinge_width(type);
|
||||
|
||||
vitamin(str(": Hinge pin ", w, " x ", 2 * hr, "mm"));
|
||||
|
||||
color(pp1_colour) hinge_male(type);
|
||||
|
||||
translate([0, -kr, kr]) {
|
||||
rotate([0, 90, 0])
|
||||
explode(w + 10)
|
||||
color("silver") cylinder(r = hr , h = w, center = true);
|
||||
|
||||
rotate([-angle, 0, 0])
|
||||
translate([0, -kr, -kr])
|
||||
rotate(180)
|
||||
color(pp2_colour) hinge_female(type);
|
||||
}
|
||||
}
|
||||
|
||||
module hinge_fastened_assembly(type, thickness1, thickness2, angle, show_hinge = true) { //! Assembled hinge with its fasteners
|
||||
if(show_hinge)
|
||||
hinge_assembly(type, angle);
|
||||
|
||||
screw = hinge_screw(type);
|
||||
washer_t = 2 * washer_thickness(screw_washer(screw));
|
||||
nut = screw_nut(screw);
|
||||
nut_t = nut_thickness(nut, true);
|
||||
t = hinge_thickness(type);
|
||||
kr = hinge_knuckle_dia(type) / 2;
|
||||
|
||||
module fasteners(thickness)
|
||||
if(thickness)
|
||||
hinge_screw_positions(type) {
|
||||
translate_z(t)
|
||||
screw_and_washer(screw, screw_longer_than(t + thickness + washer_t + nut_t));
|
||||
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
nut_and_washer(nut, true);
|
||||
}
|
||||
|
||||
fasteners(thickness1);
|
||||
|
||||
translate([0, -kr, kr])
|
||||
rotate([-angle, 0, 0])
|
||||
translate([0, -kr, - kr])
|
||||
rotate(180)
|
||||
fasteners(thickness2);
|
||||
}
|
@@ -30,7 +30,7 @@ knob_stem_h = 6;
|
||||
knob_thickness = 4;
|
||||
knob_r = 8;
|
||||
knob_wave = 1;
|
||||
knob_waves = 9;
|
||||
knob_waves = 5;
|
||||
knob_height = knob_stem_h + knob_thickness;
|
||||
function knob_height() = knob_height;
|
||||
|
||||
@@ -73,5 +73,8 @@ assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length)) {
|
||||
module screw_knob_M30_stl() screw_knob(M3_hex_screw);
|
||||
module screw_knob_M40_stl() screw_knob(M4_hex_screw);
|
||||
|
||||
//! * Press the M3 x 16 hex screw into the knob
|
||||
module screw_knob_M30_16_assembly() screw_knob_assembly(M3_hex_screw, 16);
|
||||
|
||||
//! * Press the M4 x 16 hex screw into the knob
|
||||
module screw_knob_M40_16_assembly() screw_knob_assembly(M4_hex_screw, 16);
|
||||
|
102
readme.md
@@ -27,15 +27,15 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
|
||||
@@ -620,7 +620,7 @@ Can draw three styles: solid, open frame and open frame with screw bosses.
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```fan(type)``` | Draw specified fan, origin in the centre |
|
||||
| ```fan_assembly(type, thickness, include_fan = true)``` | Fan with its fasteners |
|
||||
| ```fan_assembly(type, thickness, include_fan = true, screw = false)``` | Fan with its fasteners |
|
||||
| ```fan_hole_positions(type, z = undef)``` | Position children at the screw hole positions |
|
||||
| ```fan_holes(type, poly = false, screws = true, h = 100)``` | Make all the holes for the fan, or just the aperture if ```screws``` is false. Set ```poly``` true for poly_holes. |
|
||||
|
||||
@@ -1994,10 +1994,12 @@ Ring terminals and earth assemblies for DiBond panels.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 2 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 1 | ```ring_terminal(M3_ringterm)``` | Ring terminal 3mm |
|
||||
| 1 | ```ring_terminal(M3_ringterm_cs)``` | Ring terminal 3mm |
|
||||
| 1 | ```screw(M3_cap_screw, 10)``` | Screw M3 cap x 10mm |
|
||||
| 1 | ```screw(M3_dome_screw, 10)``` | Screw M3 dome x 10mm |
|
||||
| 2 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
|
||||
| 4 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2303,6 +2305,7 @@ Filament spool models
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```spool_height(type)``` | Outside width |
|
||||
| ```spool_pitch(type)``` | Spacing of the rims |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -2316,6 +2319,7 @@ Filament spool models
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```spool(spool_200x55)``` | Filament spool 200 x 55 |
|
||||
| 1 | ```spool(spool_300x85)``` | Filament spool 300 x 85 |
|
||||
| 1 | ```spool(spool_300x88)``` | Filament spool 300 x 88 |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -3475,6 +3479,76 @@ Note that the block with its inserts is defined as a sub assembly, but its faste
|
||||
| 1 | fixing_block_M40_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Flat_hinge"></a>
|
||||
## Flat_hinge
|
||||
A parametric flat hinge. A piece of filament can be used for the hinge pin.
|
||||
|
||||
The width, depth, thickness, number and type of screws, number of knuckles, knuckle diameter, pin diameter and clearance can all be varied.
|
||||
A margin between the screws and the knuckle edge can be enforced to allow the hinge to bend all the way back to 270° from closed.
|
||||
|
||||
Opening the test in OpenSCAD with its customiser enabled allows these parameters to be played with.
|
||||
|
||||
Note setting ```thickness1``` or ```thickness2``` to zero in the ```hinge_fastened_assembly()``` removes the screws from one side or the other and
|
||||
setting ```show_hinge``` to false removes the hinge.
|
||||
This allows the hinges and one set of screws to belong to one assembly and the other set of screws to another assembly.
|
||||
|
||||
|
||||
[printed/flat_hinge.scad](printed/flat_hinge.scad) Implementation.
|
||||
|
||||
[tests/flat_hinge.scad](tests/flat_hinge.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```hinge_clearance(type)``` | Clearance between knuckles |
|
||||
| ```hinge_depth(type)``` | Depth of each leaf |
|
||||
| ```hinge_knuckle_dia(type)``` | The knuckle diameter |
|
||||
| ```hinge_knuckles(type)``` | How many knuckles |
|
||||
| ```hinge_margin(type)``` | How far to keep the screws from the knuckes |
|
||||
| ```hinge_pin_dia(type)``` | The pin diameter |
|
||||
| ```hinge_screw(type)``` | Screw type to mount it |
|
||||
| ```hinge_screws(type)``` | How many screws |
|
||||
| ```hinge_thickness(type)``` | Thickness of the leaves |
|
||||
| ```hinge_width(type)``` | Width |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```hinge_both(type)``` | Both parts together for printing |
|
||||
| ```hinge_fastened_assembly(type, thickness1, thickness2, angle, show_hinge = true)``` | Assembled hinge with its fasteners |
|
||||
| ```hinge_male(type, female = false)``` | The half with the stationary pin |
|
||||
| ```hinge_screw_positions(type)``` | Place children at the screw positions |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | | Hinge pin 20 x 2.85mm |
|
||||
| 1 | | Hinge pin 50 x 4mm |
|
||||
| 14 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 4 | ```screw(M3_dome_screw, 10)``` | Screw M3 dome x 10mm |
|
||||
| 10 | ```screw(M3_dome_screw, 12)``` | Screw M3 dome x 12mm |
|
||||
| 28 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | hinge_female_big.stl |
|
||||
| 1 | hinge_female_small.stl |
|
||||
| 1 | hinge_male_big.stl |
|
||||
| 1 | hinge_male_small.stl |
|
||||
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | hinge_big_assembly |
|
||||
| 1 | hinge_small_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -4296,6 +4370,8 @@ heirachical BOMs are also generated for real projects.
|
||||
| ```no_pose()``` | Force children not to be posed even if parent is |
|
||||
| ```not_on_bom(on = false)``` | Specify the following child parts are not on the BOM, for example when they are on a PCB that comes assembled |
|
||||
| ```pose(a = [55, 0, 25], t = [0, 0, 0], exploded = undef)``` | Pose an STL or assembly for rendering to png by specifying rotation ```a``` and translation ```t```, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
|
||||
| ```pose_hflip(exploded = undef)``` | Pose an STL or assembly for rendering to png by flipping around the Y axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
|
||||
| ```pose_vflip(exploded = undef)``` | Pose an STL or assembly for rendering to png by flipping around the X axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
|
||||
| ```stl(name)``` | Name an stl that will appear on the BOM, there needs to a module named ```<name>_stl``` to make it |
|
||||
| ```vitamin(description)``` | Describe a vitamin for the BOM entry and precede it with a module call that creates it, eg. "wigit(42): Type 42 widget" |
|
||||
|
||||
@@ -4423,6 +4499,7 @@ The module provides `poly_circle()`, `poly_cylinder()` and `poly_ring()` that is
|
||||
| ```poly_circle(r, sides = 0)``` | Make a circle adjusted to print the correct size |
|
||||
| ```poly_cylinder(r, h, center = false, sides = 0)``` | Make a cylinder adjusted to print the correct size |
|
||||
| ```poly_ring(or, ir)``` | Make a 2D ring adjusted to have the correct internal radius |
|
||||
| ```poly_tube(or, ir, h, center = false)``` | Make a tube adjusted to have the correct internal radius |
|
||||
| ```slot(r, l, h = 100)``` | Make a horizontal slot suitable for CNC routing, set h = 0 for 2D version |
|
||||
|
||||

|
||||
@@ -4512,6 +4589,7 @@ Small holes can get away without it, but they print better with truncated teardr
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```semi_teardrop(h, r, d = undef, center = true)``` | A semi teardrop in the positive Y domain |
|
||||
| ```teardrop(h, r, center = true, truncate = true)``` | For making horizontal holes that don't need support material, set ```truncate = false``` to make traditional RepRap teardrops that don't even need bridging |
|
||||
| ```teardrop_plus(h, r, center = true, truncate = true)``` | Slightly bigger teardrop to allow for the 3D printing staircase effect |
|
||||
| ```tearslot(h, r, w, center = true)``` | A horizontal slot that doesn't need support material |
|
||||
|
@@ -267,7 +267,7 @@ def views(target, do_assemblies = None):
|
||||
print("### Vitamins", file = doc_file)
|
||||
print("|Qty|Description|", file = doc_file)
|
||||
print("|--:|:----------|", file = doc_file)
|
||||
for v in vitamins:
|
||||
for v in sorted(vitamins, key = lambda s: s.split(":")[-1]):
|
||||
print("|%d|%s|" % (vitamins[v], v.split(":")[1]), file = doc_file)
|
||||
print("\n", file = doc_file)
|
||||
|
||||
|
48
tests/flat_hinge.scad
Normal file
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2018
|
||||
// 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>
|
||||
include <../vitamins/screws.scad>
|
||||
use <../utils/layout.scad>
|
||||
use <../printed/flat_hinge.scad>
|
||||
|
||||
width = 50; // [20 : 100]
|
||||
depth = 20; // [8 : 50]
|
||||
thickness = 4; //[1 : 10]
|
||||
screws = 5; // [1 : 20]
|
||||
knuckles = 5; // [3 : 10]
|
||||
pin_diameter = 4; // [1: 10]
|
||||
knuckle_diameter = 9; //[4 : 15]
|
||||
margin = 0; // [0 : 10]
|
||||
clearance = 0.2;
|
||||
|
||||
angle = 0; // [-90 : 180]
|
||||
|
||||
big_hinge = ["big", width, depth, thickness, pin_diameter, knuckle_diameter, knuckles, M3_dome_screw, screws, clearance, margin];
|
||||
small_hinge = ["small", 20, 16, 2, 2.85, 7, 3, M3_dome_screw, 2, 0.2, 0];
|
||||
|
||||
hinges = [small_hinge, big_hinge];
|
||||
|
||||
module flat_hinges()
|
||||
layout([for(h = hinges) hinge_width(h)], 10)
|
||||
if($preview)
|
||||
hinge_fastened_assembly(hinges[$i], 3, 3, angle);
|
||||
else
|
||||
hinge_male(hinges[$i]);
|
||||
|
||||
flat_hinges();
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
BIN
tests/png/flat_hinge.png
Normal file
After Width: | Height: | Size: 147 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
@@ -52,8 +52,8 @@ module polyholes() {
|
||||
sizes = [1.5, 2, 3, 4];
|
||||
for(i = [0 : len(sizes) - 1])
|
||||
translate([i * 10, -10]) {
|
||||
color(pp1_colour) linear_extrude(height = 1)
|
||||
poly_ring(ir = ir, or = cir + sizes[i] * extrusion_width);
|
||||
color(pp1_colour)
|
||||
poly_tube(ir = ir, or = cir + sizes[i] * extrusion_width, h = 1);
|
||||
|
||||
rod(2 * ir, 3);
|
||||
}
|
||||
|
@@ -36,7 +36,10 @@ module teardrops() {
|
||||
tearslot(h = 0, r = 3, w = 10);
|
||||
|
||||
translate([30, 15])
|
||||
vertical_tearslot(h = 0, r =3, l = 10);
|
||||
vertical_tearslot(h = 0, r =3, l = 10);
|
||||
|
||||
translate([20, 10])
|
||||
semi_teardrop(h = 0, r = 3);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -63,6 +63,22 @@ module pose(a = [55, 0, 25], t = [0, 0, 0], exploded = undef) //! Pose an
|
||||
translate(-t)
|
||||
children();
|
||||
|
||||
module pose_hflip(exploded = undef) //! Pose an STL or assembly for rendering to png by flipping around the Y axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only.
|
||||
if(is_undef($pose) || !is_undef($posed) || (!is_undef(exploded) && exploded != !!exploded()))
|
||||
children();
|
||||
else
|
||||
let($posed = true) // only pose the top level
|
||||
hflip()
|
||||
children();
|
||||
|
||||
module pose_vflip(exploded = undef) //! Pose an STL or assembly for rendering to png by flipping around the X axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only.
|
||||
if(is_undef($pose) || !is_undef($posed) || (!is_undef(exploded) && exploded != !!exploded()))
|
||||
children();
|
||||
else
|
||||
let($posed = true) // only pose the top level
|
||||
vflip()
|
||||
children();
|
||||
|
||||
|
||||
module assembly(name) { //! Name an assembly that will appear on the BOM, there needs to a module named ```<name>_assembly``` to make it
|
||||
if(bom_mode())
|
||||
|
@@ -62,6 +62,10 @@ module poly_ring(or, ir) { //! Make a 2D ring adjusted to have the correct inter
|
||||
}
|
||||
}
|
||||
|
||||
module poly_tube(or, ir, h, center = false) //! Make a tube adjusted to have the correct internal radius
|
||||
extrude_if(h, center)
|
||||
poly_ring(or, ir);
|
||||
|
||||
module drill(r, h = 100) //! Make a cylinder for drilling holes suitable for CNC routing, set h = 0 for circle
|
||||
extrude_if(h)
|
||||
circle(r = corrected_radius(r, r2sides(r)));
|
||||
|
@@ -34,6 +34,18 @@ module teardrop(h, r, center = true, truncate = true) //! For making horizontal
|
||||
polygon([[0, 0], [eps, 0], [0, r * sqrt(2)]]);
|
||||
}
|
||||
|
||||
module semi_teardrop(h, r, d = undef, center = true) //! A semi teardrop in the positive Y domain
|
||||
render(convexity = 5)
|
||||
extrude_if(h, center)
|
||||
intersection() {
|
||||
R = is_undef(d) ? r : d / 2;
|
||||
teardrop(r = R, h = 0);
|
||||
|
||||
sq = R + 1;
|
||||
translate([-sq, 0])
|
||||
square([2 * sq, sq]);
|
||||
}
|
||||
|
||||
module teardrop_plus(h, r, center = true, truncate = true) //! Slightly bigger teardrop to allow for the 3D printing staircase effect
|
||||
teardrop(h, r + layer_height / 4, center, truncate);
|
||||
|
||||
|
@@ -151,16 +151,16 @@ function nut_and_washer_thickness(screw, nyloc) = washer_thickness(screw_washer(
|
||||
function fan_screw_depth(type) = fan_boss_d(type) ? fan_depth(type) : fan_thickness(type);
|
||||
function fan_screw_length(type, thickness) = screw_longer_than(thickness + fan_screw_depth(type) + nut_and_washer_thickness(fan_screw(type), true)); //! Screw length required
|
||||
|
||||
module fan_assembly(type, thickness, include_fan = true) { //! Fan with its fasteners
|
||||
module fan_assembly(type, thickness, include_fan = true, screw = false) { //! Fan with its fasteners
|
||||
translate_z(-fan_depth(type) / 2) {
|
||||
if(include_fan)
|
||||
fan(type);
|
||||
|
||||
screw = fan_screw(type);
|
||||
nut = screw_nut(screw);
|
||||
Screw = screw ? screw : fan_screw(type);
|
||||
nut = screw_nut(Screw);
|
||||
fan_hole_positions(type) {
|
||||
translate_z(thickness)
|
||||
screw_and_washer(screw, fan_screw_length(type, thickness));
|
||||
screw_and_washer(Screw, fan_screw_length(type, thickness));
|
||||
|
||||
translate_z(include_fan ? -fan_screw_depth(type) : 0)
|
||||
vflip()
|
||||
|
@@ -20,15 +20,16 @@
|
||||
//
|
||||
// Ring terminals
|
||||
//
|
||||
// o i l w h t s
|
||||
// d d e i o h c
|
||||
// n d l i r
|
||||
// g t e c e
|
||||
// t h k w
|
||||
// h
|
||||
// o i l w h t s
|
||||
// d d e i o h c
|
||||
// n d l i r
|
||||
// g t e c e
|
||||
// t h k w
|
||||
// h
|
||||
//
|
||||
M3_ringterm = ["M3_ringterm", 6, 3, 12, 3, 1.5, 0.2, M3_dome_screw];
|
||||
M3_ringterm = ["M3_ringterm", 6, 3, 12, 3, 1.5, 0.2, M3_dome_screw];
|
||||
M3_ringterm_cs = ["M3_ringterm_cs", 6, 3, 12, 3, 1.5, 0.2, M3_cap_screw];
|
||||
|
||||
ring_terminals = [M3_ringterm];
|
||||
ring_terminals = [M3_ringterm, M3_ringterm_cs];
|
||||
|
||||
use <ring_terminal.scad>
|
||||
|
@@ -30,6 +30,7 @@ function spool_hub_bore(type) = type[6]; //! Bore through the hub
|
||||
function spool_hub_diameter(type) = type[7]; //! Diameter of the thicker hub
|
||||
function spool_hub_taper(type) = type[8]; //! Diameter at which it tapers down to rim thickness
|
||||
function spool_height(type) = spool_width(type) + 2 * spool_hub_thickness(type); //! Outside width
|
||||
function spool_pitch(type) = spool_width(type) + spool_rim_thickness(type); //! Spacing of the rims
|
||||
|
||||
module spool(type) { //! Draw specified spool
|
||||
vitamin(str("spool(", type[0], "): Filament spool ", spool_diameter(type), " x ", spool_width(type)));
|
||||
|
@@ -23,10 +23,11 @@
|
||||
// i i e i u o u u
|
||||
// a d p m b r b b
|
||||
// t t e
|
||||
// h h t t d t
|
||||
// h h t t d taper_d
|
||||
spool_300x88 = ["spool_300x88", 300, 88, 43, 6, 8, 52, 214, 300];
|
||||
spool_300x85 = ["spool_300x85", 300, 85, 60, 4, 8, 52, 250, 280];
|
||||
spool_200x55 = ["spool_200x55", 200, 55, 40, 5, 5, 52, 200, 200];
|
||||
|
||||
spools = [spool_200x55, spool_300x85];
|
||||
spools = [spool_200x55, spool_300x85, spool_300x88];
|
||||
|
||||
use <spool.scad>
|
||||
|