1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 20:32:35 +02:00

Compare commits

...

34 Commits

Author SHA1 Message Date
Chris Palmer
545329b875 Bug fix hygrometer_hole() when h > 0. 2021-01-08 21:24:06 +00:00
Chris Palmer
16c1eeef27 Documented circle_tangent() and simplified it. 2021-01-06 10:54:21 +00:00
Chris Palmer
800bb89921 Added microswitch_size(). 2021-01-06 09:36:13 +00:00
Chris Palmer
41a0723362 Can now control the number of index_screws in rail_screws() 2021-01-04 15:26:29 +00:00
Chris Palmer
6b8ea9685e Fixed rail_hole_positions() bug. 2021-01-04 14:46:54 +00:00
Chris Palmer
0cf8cb7d28 Added missing vitamin() call in magnet.scad. 2021-01-04 01:04:04 +00:00
Chris Palmer
7c439a687f Fixed openscad.py on Linux. 2021-01-03 09:51:20 +00:00
Chris Palmer
4a95ce528e Merge branch 'martinbudden-pancake_stepper' 2021-01-02 11:02:27 +00:00
Chris Palmer
138f45730b Updated images and readme. 2021-01-02 11:02:06 +00:00
Chris Palmer
8d1ff3584c Merge branch 'pancake_stepper' of https://github.com/martinbudden/NopSCADlib into martinbudden-pancake_stepper 2021-01-02 10:38:27 +00:00
Chris Palmer
26b2b63b6e Merge branch 'martinbudden-rocker' 2021-01-02 10:13:23 +00:00
Chris Palmer
611772d960 Updated readme for rocker. 2021-01-02 10:12:54 +00:00
Chris Palmer
b6e648b485 Merge branch 'rocker' of https://github.com/martinbudden/NopSCADlib into martinbudden-rocker 2021-01-02 10:10:03 +00:00
Chris Palmer
e224ee0ad2 Removed z fight in printed box test. 2021-01-02 10:04:24 +00:00
Chris Palmer
10c3df466b screw_polysink can now have h = 0 to get just the cone. 2021-01-02 10:04:03 +00:00
Martin Budden
3e4eedc25f Added JST connector to NEMA17P in tests. 2020-12-31 12:30:06 +00:00
Chris Palmer
029265e1b9 Add rr_green to global_defs. 2020-12-31 12:27:46 +00:00
Martin Budden
7449857ab7 Added NEMA17P pancake stepper motor. 2020-12-31 12:20:11 +00:00
Martin Budden
49f6da767a Added size and slot convenience functions. Added non-rounded hole. 2020-12-31 11:59:41 +00:00
Chris Palmer
171dff723f Updated gallery pictures 2020-12-30 19:05:14 +00:00
Chris Palmer
85a7494813 Updated gallery images 2020-12-30 09:49:17 +00:00
Chris Palmer
46937e403e Better use of Python regex facilities. 2020-12-30 09:48:46 +00:00
Chris Palmer
8f2532d61b Merge branch 'martinbudden-gt2x16_pulley' 2020-12-29 22:29:57 +00:00
Chris Palmer
84fa528ff7 Updated images and readme for new pulley. 2020-12-29 22:29:11 +00:00
Chris Palmer
807850aac5 Merge branch 'gt2x16_pulley' of https://github.com/martinbudden/NopSCADlib into martinbudden-gt2x16_pulley 2020-12-29 21:45:47 +00:00
Chris Palmer
4ea0883965 Blurb divider now three or more asterisks. 2020-12-29 21:42:05 +00:00
Martin Budden
103ad1827e Added GT2x16_pulley. 2020-12-29 17:25:18 +00:00
Chris Palmer
816adb07e7 Typo. 2020-12-29 12:22:45 +00:00
Chris Palmer
06e1c1a3da Documented project description blurb and openscad.py. 2020-12-29 12:20:32 +00:00
Chris Palmer
46ff632bbb Better screw test layout. 2020-12-29 11:30:14 +00:00
Chris Palmer
fc47b1d9db Merge branch 'martinbudden-m5_cs_cap' 2020-12-28 21:25:11 +00:00
Chris Palmer
de6589a2ef Updated images and readme for M5_cs_cap_screw. 2020-12-28 21:24:04 +00:00
Chris Palmer
c2b3eb6580 Merge branch 'm5_cs_cap' of https://github.com/martinbudden/NopSCADlib into martinbudden-m5_cs_cap 2020-12-28 20:56:50 +00:00
Martin Budden
f6f4fcc7e8 Added M5_cs_cap screw 2020-12-28 20:24:46 +00:00
39 changed files with 108 additions and 71 deletions

View File

@@ -119,6 +119,16 @@ A more optimised approach for large projects is to include [NopSCADlib/core.scad
That only has the a small set of utilities and the global settings in [global_defs.scad](../global_defs.scad) plus screws, nuts and washers that are required by a lot of other vitamins.
Any other vitamins used need to be included explicitly. One can copy the includes or use a line from [NopSCADlib/lib.scad](../lib.scad).
### Project Description
A description of the project can be placed in comments in Markdown format before the first include file.
By default this is followed by a picture of the main assembly unless the description contains any pictures.
The description can be divided into two or three sections using //! ***, which is a Markdown horizontal rule in a comment.
If there is a second section it is placed after the table of contents and a third section will be placed after the parts list.
If an actual horizontal rule is desired the alternative Markdown markup //! --- can be used.
### Parametric parts.
Modules that generate parts and assemblies need to take no parameters so that they can be called from the framework to make the STL files and assembly views, etc.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 202 KiB

View File

@@ -43,11 +43,11 @@ Bench power supply built around an ATX PSU.
* The green LED shows the power good signal.
* Dummy loads keep the outputs in range.
![](Lab_ATX_PSU.png)
<a name="TOP"></a>
## Laser Load
15kV dummy load for testing CO2 laser PSUs
@@ -77,11 +77,11 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
## Mains Box
Mains isolated and variable supply with metering.
![](Mains_Box.png)
<a name="TOP"></a>
## SunBot
A solar tracker to keep a solar panel pointing at the sun.
@@ -95,13 +95,15 @@ WiFi enabled remote control turntable for photography
![](Turntable.png)
Was actually made from DiBond but shown made with carbon fibre here.
<a name="TOP"></a>
## Variac
Motorised variac with WiFi control, see [hydraraptor.blogspot.com/2018/04/esp8266-spi-spy](https://hydraraptor.blogspot.com/2018/04/esp8266-spi-spy.html)
![](Variac.png)

View File

@@ -26,7 +26,7 @@
// Setting $bom after including lib overrides bom in the libs but not in the local file.
// Setting $_bom in the local file overrides it in the local file but not in the libs.
//
//function is_undef(x) = x == undef;
rr_green = [0, 146/255, 0]; // RepRap logo colour
$_bom = is_undef($bom) ? 0 : $bom; // 0 no bom, 1 assemblies and stls, 2 vitamins as well
$exploded = is_undef($explode) ? 0 : $explode; // 1 for exploded view
@@ -34,7 +34,7 @@ layer_height = is_undef($layer_height) ? 0.25 : $layer_height; // lay
extrusion_width = is_undef($extrusion_width) ? 0.5 : $extrusion_width; // filament width when printing
nozzle = is_undef($nozzle) ? 0.45 : $nozzle; // 3D printer nozzle
cnc_bit_r = is_undef($cnc_bit_r) ? 1.2 : $cnc_bit_r; // minimum tool radius when milling 2D objects
pp1_colour = is_undef($pp1_colour) ? [0, 146/255, 0] : $pp1_colour; // printed part colour 1, RepRap logo colour
pp1_colour = is_undef($pp1_colour) ? rr_green : $pp1_colour; // printed part colour 1, RepRap logo colour
pp2_colour = is_undef($pp2_colour) ? "Crimson" : $pp2_colour; // printed part colour 2
pp3_colour = is_undef($pp3_colour) ? "SteelBlue" : $pp3_colour; // printed part colour 3
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 859 KiB

After

Width:  |  Height:  |  Size: 862 KiB

View File

@@ -351,7 +351,7 @@ modules_y = iecs_y + 60;
ssrs_y = modules_y + 80;
blowers_y = ssrs_y + 60;
batteries_y = blowers_y + 100;
steppers_y = batteries_y + 70;
steppers_y = batteries_y + 55;
panel_meters_y = steppers_y + 70;
extrusions_y = panel_meters_y + 80;

View File

@@ -1687,6 +1687,13 @@ Cylindrical and ring magnets.
![magnets](tests/png/magnets.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `magnet(MAG484)` | Magnet 6.35mm diameter, 6.35mm high, 3.175mm bore |
| 1 | `magnet(MAG8x4x4p2)` | Magnet 8mm diameter, 4mm high, 4.2mm bore |
| 1 | `magnet(MAG5x8)` | Magnet 8mm diameter, 5mm high |
<a href="#top">Top</a>
@@ -1771,6 +1778,7 @@ Used for limit switches.
|:--- |:--- |
| `microswitch_lower_extent(type)` | How far legs extend downwards |
| `microswitch_right_extent(type)` | How far legs extend right |
| `microswitch_size(type)` | Body size |
### Modules
| Module | Description |
@@ -2603,6 +2611,7 @@ Timing belt pulleys, both toothed and plain with internal bearings for idlers.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | `pulley(GT2x16_pulley)` | Pulley GT2 16 teeth |
| 1 | `pulley(GT2x16_toothed_idler)` | Pulley GT2 idler 16 teeth |
| 1 | `pulley(GT2x20_toothed_idler)` | Pulley GT2 idler 20 teeth |
| 1 | `pulley(GT2x20_plain_idler)` | Pulley GT2 idler smooth 12mm |
@@ -2614,6 +2623,7 @@ Timing belt pulleys, both toothed and plain with internal bearings for idlers.
| 1 | `pulley(T2p5x16_pulley)` | Pulley T2.5 16 teeth |
| 1 | `pulley(T5x10_pulley)` | Pulley T5 10 teeth |
| 1 | `screw(M3_grub_screw, 3)` | Screw M3 grub x 3mm |
| 2 | `screw(M3_grub_screw, 4.5)` | Screw M3 grub x 4.5mm |
| 2 | `screw(M3_grub_screw, 4)` | Screw M3 grub x 4mm |
| 4 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
| 1 | `screw(M4_grub_screw, 6)` | Screw M4 grub x 6mm |
@@ -2671,7 +2681,7 @@ Linear rails with carriages.
| `rail(type, length)` | Draw the specified rail |
| `rail_assembly(type, length, pos, carriage_end_colour = grey(20)` | Rail and carriage assembly |
| `rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)` | Position children over screw holes |
| `rail_screws(type, length, thickness, screws = 100)` | Place screws in the rail |
| `rail_screws(type, length, thickness, screws = 100, index_screws = undef)` | Place screws in the rail |
![rails](tests/png/rails.png)
@@ -2783,11 +2793,17 @@ Rocker switch. Also used for neon indicator in the same form factor.
| `rocker_spades(type)` | Spade types and positions |
| `rocker_width(type)` | Body width |
### Functions
| Function | Description |
|:--- |:--- |
| `rocker_size(type)` | Width, height, and depth in a vector |
| `rocker_slot(type)` | Rocker slot in a vector |
### Modules
| Module | Description |
|:--- |:--- |
| `rocker(type, colour)` | Draw the specified rocker switch |
| `rocker_hole(type, h = 0)` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
| `rocker_hole(type, h = 0, rounded = true)` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
![rockers](tests/png/rockers.png)
@@ -2919,6 +2935,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
| 1 | `screw(M4_hex_screw, 30)` | Screw M4 hex x 30mm |
| 1 | `screw(M4_pan_screw, 30)` | Screw M4 pan x 30mm |
| 1 | `screw(M5_cap_screw, 30)` | Screw M5 cap x 30mm |
| 1 | `screw(M5_cs_cap_screw, 30)` | Screw M5 cs cap x 30mm |
| 1 | `screw(M5_hex_screw, 30)` | Screw M5 hex x 30mm |
| 1 | `screw(M5_pan_screw, 30)` | Screw M5 pan x 30mm |
| 1 | `screw(M6_cap_screw, 30)` | Screw M6 cap x 30mm |
@@ -3452,15 +3469,16 @@ NEMA stepper motor model.
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
| 15 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
| 20 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
| 1 | `NEMA(NEMA14)` | Stepper motor NEMA14 x 36mm |
| 1 | `NEMA(NEMA16)` | Stepper motor NEMA16 x 19.2mm |
| 1 | `NEMA(NEMA17P)` | Stepper motor NEMA17 x 26.5mm |
| 1 | `NEMA(NEMA17S)` | Stepper motor NEMA17 x 34mm |
| 1 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
| 1 | `NEMA(NEMA17)` | Stepper motor NEMA17 x 47mm |
| 1 | `NEMA(NEMA23)` | Stepper motor NEMA22 x 51.2mm |
| 11 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 15 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
| 16 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
| 20 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
<a href="#top">Top</a>
@@ -5718,7 +5736,8 @@ Cylinder with a rounded end.
---
<a name="Rounded_polygon"></a>
## Rounded_polygon
Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius. Radius can be negative for a concave corner.
Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius in clockwise order.
Radius can be negative for a concave corner.
Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
@@ -5729,6 +5748,7 @@ Because the tangents need to be calculated to find the length these can be calcu
### Functions
| Function | Description |
|:--- |:--- |
| `circle_tangent(p1, p2)` | Compute the clockwise tangent between two circles represented as [x,y,r] |
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by ` rounded_polygon_tangents` |
| `rounded_polygon_tangents(points)` | Compute the straight sections needed to draw and to compute the lengths |

View File

@@ -51,7 +51,7 @@ def split_blurb(lines):
""" Split blurb on horizontal rules."""
blurbs = [""]
for line in lines.split('\n')[:-1]:
if line == "***":
if re.match(r'\*{3,}',line):
blurbs.append("")
else:
blurbs[-1] += line + '\n'

View File

@@ -60,7 +60,8 @@ They should work with both Python 2 and Python 3.
break
if not blurb:
print("Missing description for", file)
print("| `%s` | %s |" % (file, blurb), file = doc_file)
else:
print("| `%s` | %s |" % (file, blurb), file = doc_file)
with open(dir + "/readme.html", "wt") as html_file:
do_cmd(("python -m markdown -x tables " + doc_name).split(), html_file)

View File

@@ -52,7 +52,7 @@ def gallery(force):
if os.path.isfile(document):
with open(document, 'rt') as readme:
for line in readme.readlines():
match = re.match(r"^.*!(\[.*\]\(.*\)).*$", line)
match = re.search(r"!(\[.*\]\(.*\))", line)
if match:
image = match.group(0)
if image.startswith('![Main Assembly](assemblies/'):

View File

@@ -18,14 +18,14 @@
#
#
# Run openscad
#! Run `openscad.exe` and capture `stdout` and `stderr` in `openscad.log` as well as printing to the console.
#
from __future__ import print_function
import subprocess, sys
def run_list(args, silent = False, verbose = False):
cmd = ["openscad.exe"] + args
cmd = ["openscad"] + args
if not silent:
for arg in cmd:
print(arg, end=" ")

View File

@@ -9,11 +9,10 @@ They should work with both Python 2 and Python 3.
| `bom.py` | Generates BOM files for the project. |
| `c14n_stl.py` | OpenSCAD produces randomly ordered STL files. This script re-orders them consistently so that GIT can tell if they have changed or not. |
| `doc_scripts.py` | Makes this document and doc/usage.md. |
| `dxf.py` | |
| `dxf2pdf.py` | |
| `dxfs.py` | Generates DXF files for all the routed parts listed on the BOM or a specified list. |
| `gallery.py` | Finds projects and adds them to the gallery. |
| `make_all.py` | Generates all the files for a project by running `bom.py`, `stls.py`, `dxfs.py`, `render.py` and `views.py`. |
| `openscad.py` | Run `openscad.exe` and capture `stdout` and `stderr` in `openscad.log` as well as printing to the console. |
| `panels.py` | Panelises DXF files so they can be routed together by running scad files found in the `panels` directory. |
| `platters.py` | Generates build plates of STL files for efficient printing by running scad files found in the `platters` directory. |
| `render.py` | Renders STL and DXF files to PNG for inclusion in the build instructions. |

View File

@@ -227,11 +227,7 @@ def views(target, do_assemblies = None):
#
# Only add the image if the first blurb section doesn't contain one.
#
got_image = False
for line in blurbs[0].split('\n'):
if re.match(r'.*\!\[.*\]\(.*\).*', line):
got_image = True
if not got_image:
if not re.search(r'\!\[.*\]\(.*\)', blurbs[0], re.MULTILINE):
print('![Main Assembly](assemblies/%s.png)\n' % flat_bom[-1]["name"].replace('_assembly', '_assembled'), file = doc_file)
eop(print_mode, doc_file, first = True)
#

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 107 KiB

View File

@@ -107,7 +107,7 @@ assembly("box1") {
screw_and_washer(foot_screw(foot), 6);
}
translate_z(height + top_thickness + base_thickness + eps) vflip()
translate_z(height + top_thickness + base_thickness + 2 * eps) vflip()
%render() box1_base_stl();
}

View File

@@ -52,7 +52,7 @@ module screws() {
screw(screw, length);
}
}
translate([80, 20])
translate([20, 40, -15])
polysink_stl();
}

View File

@@ -22,9 +22,9 @@ include <../vitamins/stepper_motors.scad>
use <../utils/layout.scad>
module stepper_motors()
layout([for(s = stepper_motors) NEMA_width(s)], 5) let(m = stepper_motors[$i]) {
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = true) let(m = stepper_motors[$i]) {
rotate(180)
NEMA(m, 0, m == NEMA17M || m == NEMA17M8);
NEMA(m, 0, m == NEMA17P || m == NEMA17M || m == NEMA17M8);
translate_z(4)
NEMA_screws(m, M3_pan_screw, n = $i, earth = $i > 4 ? undef : $i - 1);

View File

@@ -18,13 +18,14 @@
//
//
//! Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius. Radius can be negative for a concave corner.
//! Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius in clockwise order.
//! Radius can be negative for a concave corner.
//!
//! Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
//
include <../utils/core/core.scad>
function circle_tangent(p1, p2) =
function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two circles represented as [x,y,r]
let(
r1 = p1[2],
r2 = p2[2],
@@ -32,11 +33,8 @@ function circle_tangent(p1, p2) =
dy = p2.y - p1.y,
d = sqrt(dx * dx + dy * dy),
theta = atan2(dy, dx) + acos((r1 - r2) / d),
xa = p1.x +(cos(theta) * r1),
ya = p1.y +(sin(theta) * r1),
xb = p2.x +(cos(theta) * r2),
yb = p2.y +(sin(theta) * r2)
)[ [xa, ya], [xb, yb] ];
v = [cos(theta), sin(theta)]
)[ p1 + r1 * v, p2 + r2 * v ];
function rounded_polygon_tangents(points) = //! Compute the straight sections needed to draw and to compute the lengths
let(len = len(points))

View File

@@ -34,15 +34,16 @@ hygrometer_hole_r = 21.3;
slot_w = 5.5;
module hygrometer_hole(h = 0) { //! Drill the hole for a hygrometer
round(cnc_bit_r) {
intersection() {
drill(hygrometer_hole_r, h);
extrude_if(h)
round(cnc_bit_r) {
intersection() {
drill(hygrometer_hole_r, 0);
rotate(30)
square([slot_w + 2 * cnc_bit_r, 100], center = true);
rotate(30)
square([slot_w + 2 * cnc_bit_r, 100], center = true);
}
drill((od + 0.2) / 2, 0);
}
drill((od + 0.2) / 2, h);
}
}
function hygrometer_or() = flange_d / 2; //! The outside radius of a hygrometer
@@ -54,13 +55,13 @@ module hygrometer() { //! Draw a hygrometer
color(grey(30))
rotate_extrude()
polygon([
[0, 0],
[aperture_d / 2, 0],
[aperture_d / 2, flange_t],
[flange_d2 / 2, flange_t2],
[flange_d / 2, flange_t],
[flange_d / 2, 0],
[od / 2, 0],
[0, 0],
[aperture_d / 2, 0],
[aperture_d / 2, flange_t],
[flange_d2 / 2, flange_t2],
[flange_d / 2, flange_t],
[flange_d / 2, 0],
[od / 2, 0],
[od / 2, -h],
[0, -h]
]);

View File

@@ -33,7 +33,7 @@ module magnet(type) { //! Draw specified magnet
h = magnet_h(type);
r = magnet_r(type);
//vitamin(str("magnet(", type[0], "): Magnet ", od, "mm diameter, ", h, "mm high", id ? str(", ", id, "mm bore") : "" ));
vitamin(str("magnet(", type[0], "): Magnet ", od, "mm diameter, ", h, "mm high", id ? str(", ", id, "mm bore") : "" ));
or = od / 2;
ir = id / 2;

View File

@@ -23,7 +23,7 @@
// od, id, h, r
MAG8x4x4p2 = ["MAG8x4x4p2", 8, 4.2, 4, 0.5];
MAG484 = ["MAG484", inch(1/4), inch(1/8), inch(1/4), 0.5];
MAG5x8 = ["MAG484", 8, 0, 5, 0.5];
MAG5x8 = ["MAG5x8", 8, 0, 5, 0.5];
magnets = [MAG8x4x4p2, MAG484, MAG5x8];

View File

@@ -41,6 +41,8 @@ function microswitch_button_clr(type)= type[14]; //! Button colour
function microswitch_lower_extent(type) = let(leg = microswitch_leg(type)) min([for(pos = microswitch_legs(type)) pos.y - leg.y / 2]); //! How far legs extend downwards
function microswitch_right_extent(type) = let(leg = microswitch_leg(type)) max([microswitch_length(type) / 2, for(pos = microswitch_legs(type)) pos.x + leg.x / 2]); //! How far legs extend right
function microswitch_size(type) = [microswitch_length(type), microswitch_width(type), microswitch_thickness(type)]; //! Body size
module microswitch_hole_positions(type) //! Place children at the hole positions
{
for(hole = microswitch_holes(type))

View File

@@ -29,9 +29,10 @@ include <belts.scad>
//
T5x10_pulley = ["T5x10_pulley", "T5", 10, 15, T5x6, 11.6, 7.9, 7, 5, 19.3, 1.7, 3, 10.7, M3_grub_screw, 1];
T2p5x16_pulley = ["T2p5x16_pulley", "T2.5", 16, 12.16, T2p5x6, 8, 16, 5.7, 5, 16.0, 1.0, 6, 3.75, M4_grub_screw, 1];
GT2x20um_pulley = ["GT2x20um_pulley", "GT2UM", 20, 12.22, GT2x6, 7.5, 18, 6.5, 5, 18.0, 1.0, 6, 3.75, M3_grub_screw, 2];
GT2x20ob_pulley = ["GT2x20ob_pulley", "GT2OB", 20, 12.22, GT2x6, 7.5, 16, 5.5, 5, 16.0, 1.0, 6, 3.25, M3_grub_screw, 2];
GT2x12_pulley = ["GT2x12_pulley", "GT2RD", 12, 7.15, GT2x6, 6.5, 12, 5.5, 4, 12.0, 1.0, 4, 3.0, M3_grub_screw, 2];
GT2x20um_pulley = ["GT2x20um_pulley", "GT2UM", 20, 12.22, GT2x6, 7.5, 18, 6.5, 5, 18.0, 1.0, 6, 3.75, M3_grub_screw, 2]; //Ultimaker
GT2x20ob_pulley = ["GT2x20ob_pulley", "GT2OB", 20, 12.22, GT2x6, 7.5, 16, 5.5, 5, 16.0, 1.0, 6, 3.25, M3_grub_screw, 2]; //Openbuilds
GT2x16_pulley = ["GT2x16_pulley", "GT2", 16, 9.75, GT2x6, 7.0, 13, 5, 5, 13.0, 1.0,4.5,3.0, M3_grub_screw, 2];
GT2x12_pulley = ["GT2x12_pulley", "GT2RD", 12, 7.15, GT2x6, 6.5, 12, 5.5, 4, 12.0, 1.0, 4, 3.0, M3_grub_screw, 2]; //Robotdigg
GT2x20_toothed_idler = ["GT2x20_toothed_idler", "GT2", 20, 12.22, GT2x6, 6.5, 18, 0, 4, 18.0, 1.0, 0, 0, false, 0];
GT2x20_plain_idler = ["GT2x20_plain_idler", "GT2", 0, 12.0, GT2x6, 6.5, 18, 0, 4, 18.0, 1.0, 0, 0, false, 0];
GT2x16_toothed_idler = ["GT2x16_toothed_idler", "GT2", 16, 9.75, GT2x6, 6.5, 14, 0, 3, 14.0, 1.0, 0, 0, false, 0];
@@ -42,6 +43,7 @@ pulleys = [T5x10_pulley,
T2p5x16_pulley,
GT2x20um_pulley,
GT2x20ob_pulley,
GT2x16_pulley,
GT2x12_pulley,
GT2x20_toothed_idler,
GT2x20_plain_idler,

View File

@@ -53,7 +53,7 @@ function rail_holes(type, length) = //! Number of holes in a rail given its `len
module rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true) { //! Position children over screw holes
pitch = rail_pitch(type);
holes = rail_holes(type, length);
last = first + screws;
last = first + min(screws, both_ends ? ceil(holes / 2) : holes);
for(i = [first : holes - 1], j = holes - 1 - i)
if(i < last || both_ends && (j >= first && j < last))
translate([i * pitch - length / 2 + (length - (holes - 1) * pitch) / 2, 0])
@@ -181,19 +181,19 @@ module rail_assembly(type, length, pos, carriage_end_colour = grey(20), carriage
carriage(rail_carriage(type), type, carriage_end_colour, carriage_wiper_colour);
}
module rail_screws(type, length, thickness, screws = 100) { //! Place screws in the rail
module rail_screws(type, length, thickness, screws = 100, index_screws = undef) { //! Place screws in the rail
screw = rail_screw(type);
end_screw = rail_end_screw(type);
screw_len = screw_longer_than(rail_screw_height(type, screw) + thickness);
end_screw_len = screw_longer_than(rail_screw_height(type, end_screw) + thickness);
index_screws = screws > 2 ? 1 : 2;
index_screws = is_undef(index_screws) ? screws > 2 ? 1 : 2 : index_screws;
translate_z(rail_screw_height(type, end_screw))
rail_hole_positions(type, length, 0, index_screws)
screw(end_screw, end_screw_len);
translate_z(rail_screw_height(type, screw))
rail_hole_positions(type, length, index_screws, min(screws, rail_holes(type, length)) - 2 * index_screws)
rail_hole_positions(type, length, index_screws, screws - index_screws)
screw(screw, screw_len);
}

View File

@@ -36,6 +36,8 @@ function rocker_bezel(type) = type[10]; //! Bezel width
function rocker_pivot(type) = type[11]; //! Pivot distance from the back of the flange
function rocker_button(type) = type[12]; //! How far the button extends from the bezel
function rocker_spades(type) = type[13]; //! Spade types and positions
function rocker_size(type) = [rocker_width(type), rocker_height(type), rocker_depth(type)]; //! Width, height, and depth in a vector
function rocker_slot(type) = [rocker_slot_w(type), rocker_slot_h(type)]; //! Rocker slot in a vector
module rocker(type, colour) { //! Draw the specified rocker switch
vitamin(str("rocker(", type[0], "): ", rocker_part(type)));
@@ -87,6 +89,6 @@ module rocker(type, colour) { //! Draw the specified rocker switch
}
}
module rocker_hole(type, h = 0) //! Make a hole to accept a rocker switch, by default 2D, set h for 3D
module rocker_hole(type, h = 0, rounded = true) //! Make a hole to accept a rocker switch, by default 2D, set h for 3D
extrude_if(h)
rounded_square([rocker_slot_w(type), rocker_slot_h(type)], 1, center = true);
rounded_square([rocker_slot_w(type), rocker_slot_h(type)], rounded ? 1 : 0, center = true);

View File

@@ -295,8 +295,10 @@ module screw_polysink(type, h = 100, alt = false) { //! A countersink hole made
poly_cylinder(r = r, h = lh, center = false);
}
translate_z(layers * layer_height)
poly_cylinder(r = rmin, h = h / 2 - layers * layer_height, center = false);
remainder = h / 2 - layers * layer_height;
if(remainder > 0)
translate_z(layers * layer_height)
poly_cylinder(r = rmin, h = remainder, center = false);
}
}

View File

@@ -78,6 +78,7 @@ M8_cap_screw = ["M8_cap", "M8 cap", hs_cap, 8, 13, 8, 4.3, 6.0
M2_cs_cap_screw = ["M2_cs_cap","M2 cs cap", hs_cs_cap,2, 3.8, 0, 0.65,1.3, 16, M2_washer, M2_nut, M2_tap_radius, M2_clearance_radius];
M3_cs_cap_screw = ["M3_cs_cap","M3 cs cap", hs_cs_cap,3, 6.0, 0, 1.05,2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
M4_cs_cap_screw = ["M4_cs_cap","M4 cs cap", hs_cs_cap,4, 8.0, 0, 1.49,2.5, 20, M4_washer, M4_nut, M4_tap_radius, M4_clearance_radius];
M5_cs_cap_screw = ["M5_cs_cap","M5 cs cap", hs_cs_cap,5,10.0, 0, 3.00,3.0, 22, M5_washer, M5_nut, M5_tap_radius, M5_clearance_radius];
M2_dome_screw = ["M2_dome", "M2 dome", hs_dome, 2, 3.5, 1.3, 0.6, 1.3, 16, M2_washer, M2_nut, M2_tap_radius, M2_clearance_radius];
M3_dome_screw = ["M3_dome", "M3 dome", hs_dome, 3, 5.7, 1.65, 1.04,2.0, 18, M3_washer, M3_nut, M3_tap_radius, M3_clearance_radius];
@@ -107,13 +108,13 @@ No6_screw = ["No6", "No6 pan wood", hs_pan, 3.5, 6.7, 2.2, 0, 0
No6_cs_screw = ["No6_cs", "No6 cs wood", hs_cs, 3.5, 7.0, 0, 0, 0, 0, M4_washer, false, No6_pilot_radius, No6_clearance_radius];
screw_lists = [
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
[ 0, 0, M3_low_cap_screw],
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw],
[ M2_cs_cap_screw, 0, M3_cs_cap_screw, M4_cs_cap_screw, M5_cs_cap_screw],
[ M2_dome_screw, 0, M3_dome_screw, M4_dome_screw],
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
[ No2_screw, 0, No4_screw, No6_screw, No6_cs_screw],
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
[ No2_screw, 0, No4_screw, No6_screw, No6_cs_screw],
[ 0, 0, M3_grub_screw, M4_grub_screw]
];

View File

@@ -27,10 +27,11 @@ NEMA17 = ["NEMA17", 42.3, 47, 53.6/2, 25, 11, 2, 5, 24,
NEMA17M = ["NEMA17M", 42.3, 40, 53.6/2, 25, 11, 2, 5, 20, 31, [12.5, 11]];
NEMA17M8= ["NEMA17M8", 42.3, 40, 53.6/2, 25, 11, 2, 8, [280, 8, 4], 31, [12.5, 11]];
NEMA17S = ["NEMA17S", 42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31, [8, 8]];
NEMA17P = ["NEMA17P", 42.3, 26.5, 53.6/2, 25, 11, 2, 5, 26.5, 31, [10, 8]];
NEMA16 = ["NEMA16", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5, 12, 31, [8, 8]];
NEMA14 = ["NEMA14", 35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26, [8, 8]];
NEMA23 = ["NEMA23", 56.4, 51.2, 75.7/2, 35, 38.1/2, 1.6, 6.35, 24, 47.1, [8, 8]];
stepper_motors = [NEMA14, NEMA16, NEMA17S, NEMA17M, NEMA17, NEMA23];
stepper_motors = [NEMA14, NEMA16, NEMA17P, NEMA17S, NEMA17M, NEMA17, NEMA23];
use <stepper_motor.scad>