cyclone-pcb-factory/Hardware/yOPERO/libs/MCAD/nuts_and_bolts.scad

182 lines
2.4 KiB
OpenSCAD

// License: GPL 2.0
//testNutsAndBolts();
module testNutsAndBolts()
{
$fn = 360;
translate([0,15])nutHole(3, proj=2);
boltHole(3, length= 30, proj=2);
}
MM = "mm";
INCH = "inch"; //Not yet supported
//Based on: http://www.roymech.co.uk/Useful_Tables/Screws/Hex_Screws.htm
METRIC_NUT_AC_WIDTHS =
[
-1, //0 index is not used but reduces computation
-1,
-1,
6.40,//m3
8.10,//m4
9.20,//m5
11.50,//m6
-1,
15.00,//m8
-1,
19.60,//m10
-1,
22.10,//m12
-1,
-1,
-1,
27.70,//m16
-1,
-1,
-1,
34.60,//m20
-1,
-1,
-1,
41.60,//m24
-1,
-1,
-1,
-1,
-1,
53.1,//m30
-1,
-1,
-1,
-1,
-1,
63.5//m36
];
METRIC_NUT_THICKNESS =
[
-1, //0 index is not used but reduces computation
-1,
-1,
2.40,//m3
3.20,//m4
4.00,//m5
5.00,//m6
-1,
6.50,//m8
-1,
8.00,//m10
-1,
10.00,//m12
-1,
-1,
-1,
13.00,//m16
-1,
-1,
-1,
16.00//m20
-1,
-1,
-1,
19.00,//m24
-1,
-1,
-1,
-1,
-1,
24.00,//m30
-1,
-1,
-1,
-1,
-1,
29.00//m36
];
COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS =
[//based on max values
-1, //0 index is not used but reduces computation
-1,
-1,
2.98,//m3
3.978,//m4
4.976,//m5
5.974,//m6
-1,
7.972,//m8
-1,
9.968,//m10
-1,
11.966,//m12
-1,
-1,
-1,
15.962,//m16
-1,
-1,
-1,
19.958,//m20
-1,
-1,
-1,
23.952,//m24
-1,
-1,
-1,
-1,
-1,
29.947,//m30
-1,
-1,
-1,
-1,
-1,
35.940//m36
];
module nutHole(size, units=MM, tolerance = +0.0001, proj = -1)
{
//takes a metric screw/nut size and looksup nut dimensions
radius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance;
height = METRIC_NUT_THICKNESS[size]+tolerance;
if (proj == -1)
{
cylinder(r= radius, h=height, $fn = 6, center=[0,0]);
}
if (proj == 1)
{
circle(r= radius, $fn = 6);
}
if (proj == 2)
{
translate([-radius/2, 0])
square([radius*2, height]);
}
}
module boltHole(size, units=MM, length, tolerance = +0.0001, proj = -1)
{
radius = COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS[size]/2+tolerance;
//TODO: proper screw cap values
capHeight = METRIC_NUT_THICKNESS[size]+tolerance; //METRIC_BOLT_CAP_HEIGHTS[size]+tolerance;
capRadius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance; //METRIC_BOLT_CAP_RADIUS[size]+tolerance;
if (proj == -1)
{
translate([0, 0, -capHeight])
cylinder(r= capRadius, h=capHeight);
cylinder(r = radius, h = length);
}
if (proj == 1)
{
circle(r = radius);
}
if (proj == 2)
{
translate([-capRadius/2, -capHeight])
square([capRadius*2, capHeight]);
square([radius*2, length]);
}
}
boltHole(3);