1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-25 22:49:07 +02:00

Compare commits

..

5 Commits

Author SHA1 Message Date
Chris Palmer
547a418cea Hanging hole now works when the hole has only four sides. 2020-08-22 13:52:25 +01:00
Chris Palmer
b6d25048bc Fixed belt gap positioning and added ability to rotae it. 2020-08-22 11:16:56 +01:00
Chris Palmer
4cdab218d9 Fix belt positioning bug.
Belt gap position is now relative to the pitch line.
Added belt_pitch_to_back().
2020-08-22 09:45:13 +01:00
Chris Palmer
b6147e5684 Code formatting 2020-08-13 17:02:14 +01:00
Chris Palmer
966ba536ed Fixed J-Head nozzle offset.
Reduced J-Head inset.
Removed J-Head MK4.
2020-08-13 12:44:17 +01:00
10 changed files with 42 additions and 32 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 816 KiB

After

Width:  |  Height:  |  Size: 816 KiB

View File

@@ -209,6 +209,7 @@ Only models 2D paths, so not core XY!
To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius. To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius.
By default the path is a closed loop but a gap length and position can be specified to make open loops. By default the path is a closed loop but a gap length and position can be specified to make open loops.
To draw the gap its XY position is specified by ```gap_pos```. ```gap_pos.z``` can be used to specify a rotation if the gap is not at the bottom of the loop.
Individual teeth are not drawn, instead they are represented by a lighter colour. Individual teeth are not drawn, instead they are represented by a lighter colour.
@@ -223,6 +224,7 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
| Function | Description | | Function | Description |
|:--- |:--- | |:--- |:--- |
| ```belt_pitch(type)``` | Pitch in mm | | ```belt_pitch(type)``` | Pitch in mm |
| ```belt_pitch_height(type)``` | Offset of the pitch radius from the tips of the teeth |
| ```belt_thickness(type)``` | Total thickness including teeth | | ```belt_thickness(type)``` | Total thickness including teeth |
| ```belt_tooth_height(type)``` | Tooth height | | ```belt_tooth_height(type)``` | Tooth height |
| ```belt_width(type)``` | Width in mm | | ```belt_width(type)``` | Width in mm |
@@ -231,12 +233,12 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
| Function | Description | | Function | Description |
|:--- |:--- | |:--- |:--- |
| ```belt_length(points, gap = 0)``` | Compute belt length given path and optional gap | | ```belt_length(points, gap = 0)``` | Compute belt length given path and optional gap |
| ```belt_pitch_height(type)``` | Offset of the pitch radius from the tips of the teeth | | ```belt_pitch_to_back(type)``` | Offset of the back from the pitch radius |
### Modules ### Modules
| Module | Description | | Module | Description |
|:--- |:--- | |:--- |:--- |
| ```belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey(20)``` | Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified | | ```belt(type, points, gap = 0, gap_pos = undef, belt_colour = grey(20)``` | Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified |
![belts](tests/png/belts.png) ![belts](tests/png/belts.png)
@@ -244,7 +246,7 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
| Qty | Module call | BOM entry | | Qty | Module call | BOM entry |
| ---:|:--- |:---| | ---:|:--- |:---|
| 1 | ```belt(GT2x6, [ ... ])``` | Belt GT2 x 6mm x 128mm | | 1 | ```belt(GT2x6, [ ... ])``` | Belt GT2 x 6mm x 128mm |
| 1 | ```belt(GT2x6, [ ... ], 80, [0, 0.81])``` | Belt GT2 x 6mm x 694mm | | 1 | ```belt(GT2x6, [ ... ], 80, [0, 0])``` | Belt GT2 x 6mm x 696mm |
| 1 | ```belt(T2p5x6, [ ... ])``` | Belt T2.5 x 6mm x 130mm | | 1 | ```belt(T2p5x6, [ ... ])``` | Belt T2.5 x 6mm x 130mm |
| 1 | ```belt(T5x10, [ ... ])``` | Belt T5 x 10mm x 130mm | | 1 | ```belt(T5x10, [ ... ])``` | Belt T5 x 10mm x 130mm |
| 1 | ```belt(T5x6, [ ... ])``` | Belt T5 x 6mm x 130mm | | 1 | ```belt(T5x6, [ ... ])``` | Belt T5 x 6mm x 130mm |

View File

@@ -60,7 +60,7 @@ module belt_test() {
[p4.x, p4.y, pulley_pr(GT2x20ob_pulley)] [p4.x, p4.y, pulley_pr(GT2x20ob_pulley)]
]; ];
belt = GT2x6; belt = GT2x6;
belt(belt, path, 80, [0, belt_pitch_height(belt) - belt_thickness(belt) / 2]); belt(belt, path, 80, [0, 0]);
translate([-25, 0]) translate([-25, 0])
layout([for(b = belts) belt_width(b)], 10) layout([for(b = belts) belt_width(b)], 10)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -39,11 +39,13 @@ module hanging_hole(z, ir, h = 100, h2 = 100) { //! Hole radius ```ir``` hanging
infill_angle = z % (2 * layer_height) ? -45 : 45; infill_angle = z % (2 * layer_height) ? -45 : 45;
below = min(z + eps, h2); below = min(z + eps, h2);
big = 1000; big = 1000;
render(convexity = 3) translate_z(z) render(convexity = 3) translate_z(z)
union() { union() {
translate_z(2 * layer_height) translate_z(2 * layer_height)
polyhole(ir - eps, h - 2 * layer_height); if(sides(ir) > 4)
polyhole(ir - eps, h - 2 * layer_height);
else
poly_cylinder(ir, h - 2 * layer_height);
difference() { difference() {
translate_z(-below) translate_z(-below)

View File

@@ -24,29 +24,33 @@
//! To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius. //! To make the back of the belt run against a smooth pulley on the outside of the loop specify a negative pitch radius.
//! //!
//! By default the path is a closed loop but a gap length and position can be specified to make open loops. //! By default the path is a closed loop but a gap length and position can be specified to make open loops.
//! To draw the gap its XY position is specified by ```gap_pos```. ```gap_pos.z``` can be used to specify a rotation if the gap is not at the bottom of the loop.
//! //!
//! Individual teeth are not drawn, instead they are represented by a lighter colour. //! Individual teeth are not drawn, instead they are represented by a lighter colour.
// //
include <../utils/core/core.scad> include <../utils/core/core.scad>
use <../utils/rounded_polygon.scad> use <../utils/rounded_polygon.scad>
use <../utils/maths.scad>
function belt_pitch(type) = type[1]; //! Pitch in mm function belt_pitch(type) = type[1]; //! Pitch in mm
function belt_width(type) = type[2]; //! Width in mm function belt_width(type) = type[2]; //! Width in mm
function belt_thickness(type) = type[3]; //! Total thickness including teeth function belt_thickness(type) = type[3]; //! Total thickness including teeth
function belt_tooth_height(type) = type[4]; //! Tooth height function belt_tooth_height(type) = type[4]; //! Tooth height
function belt_pitch_height(type) = belt_tooth_height(type) + type[4]; //! Offset of the pitch radius from the tips of the teeth function belt_pitch_height(type) = type[5] + belt_tooth_height(type); //! Offset of the pitch radius from the tips of the teeth
function belt_pitch_to_back(type) = belt_thickness(type) - belt_pitch_height(type); //! Offset of the back from the pitch radius
function no_point(str) = chr([for(c = str) if(c == ".") ord("p") else ord(c)]); function no_point(str) = chr([for(c = str) if(c == ".") ord("p") else ord(c)]);
// //
// We model the belt path at the pitch radius of the pulleys and the pitch line of the belt to get an accurate length. // We model the belt path at the pitch radius of the pulleys and the pitch line of the belt to get an accurate length.
// The belt is then drawn by offseting each side from the pitch line. // The belt is then drawn by offseting each side from the pitch line.
// //
module belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey(20), tooth_colour = grey(50)) { //! Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified module belt(type, points, gap = 0, gap_pos = undef, belt_colour = grey(20), tooth_colour = grey(50)) { //! Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified
width = belt_width(type); width = belt_width(type);
pitch = belt_pitch(type); pitch = belt_pitch(type);
thickness = belt_thickness(type); thickness = belt_thickness(type);
part = str(type[0],pitch); part = str(type[0],pitch);
vitamin(str("belt(", no_point(part), "x", width, ", ", points, arg(gap, 0), arg(gap_pt, undef), "): Belt ", part," x ", width, "mm x ", length, "mm")); vitamin(str("belt(", no_point(part), "x", width, ", ", points, arg(gap, 0), arg(gap_pos, undef), "): Belt ", part," x ", width, "mm x ", length, "mm"));
len = len(points); len = len(points);
@@ -56,24 +60,28 @@ module belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey(20), tooth
module shape() rounded_polygon(points, tangents); module shape() rounded_polygon(points, tangents);
ph = belt_pitch_height(type);
th = belt_tooth_height(type);
module gap() module gap()
if(gap) if(gap)
translate(gap_pt) translate([gap_pos.x, gap_pos.y])
square([gap, thickness + eps], center = true); rotate(is_undef(gap_pos.z) ? 0 : gap_pos.z)
translate([0, ph - thickness / 2])
square([gap, thickness + eps], center = true);
color(belt_colour) color(belt_colour)
linear_extrude(width, center = true) linear_extrude(width, center = true)
difference() { difference() {
offset(thickness - belt_pitch_height(type)) shape(); offset(-ph + thickness ) shape();
offset(-belt_pitch_height(type) + belt_tooth_height(type)) shape(); offset(-ph + th) shape();
gap(); gap();
} }
color(tooth_colour) color(tooth_colour)
linear_extrude(width, center = true) linear_extrude(width, center = true)
difference() { difference() {
offset(-belt_pitch_height(type) + belt_tooth_height(type)) shape(); offset(-ph + th) shape();
offset(-belt_pitch_height(type)) shape(); offset(-ph) shape();
gap(); gap();
} }
} }

View File

@@ -33,8 +33,7 @@
// h t s t t t // h t s t t t
// h // h
// //
JHeadMk4 = ["JHeadMk4", jhead, "JHead MK4", 64, 5.1, 16, 50, grey(20), 12, 4.64, 14, [0, 2.94, -5], 20, 20]; JHeadMk5 = ["JHeadMk5", jhead, "JHead MK5", 51.2, 4.75,16, 40, grey(20), 12, 4.64, 13, [0, 2.38, -5], 20, 20];
JHeadMk5 = ["JHeadMk5", jhead, "JHead MK5", 51.2, 5.1, 16, 40, grey(20), 12, 4.64, 13, [0, 2.38, -5], 20, 20];
E3Dv5 = ["E3Dv5", e3d, "E3D V5 direct", 70, 3.7, 16, 50.1, "silver", 12, 6, 15, [1, 5, -4.5], 14.5, 28]; E3Dv5 = ["E3Dv5", e3d, "E3D V5 direct", 70, 3.7, 16, 50.1, "silver", 12, 6, 15, [1, 5, -4.5], 14.5, 28];
E3Dv6 = ["E3Dv6", e3d, "E3D V6 direct", 62, 3.7, 16, 42.7, "silver", 12, 6, 15, [1, 5, -4.5], 14, 21]; E3Dv6 = ["E3Dv6", e3d, "E3D V6 direct", 62, 3.7, 16, 42.7, "silver", 12, 6, 15, [1, 5, -4.5], 14, 21];
E3D_clone = ["E3D_clone", e3d, "E3D clone aliexpress",66, 6.8, 16, 46, "silver", 12, 5.6, 15, [1, 5, -4.5], 14.5, 21]; E3D_clone = ["E3D_clone", e3d, "E3D clone aliexpress",66, 6.8, 16, 46, "silver", 12, 5.6, 15, [1, 5, -4.5], 14.5, 21];

View File

@@ -24,14 +24,14 @@ include <../utils/core/core.scad>
use <../utils/quadrant.scad> use <../utils/quadrant.scad>
use <../utils/thread.scad> use <../utils/thread.scad>
function insert_length(type) = type[1]; //! Length function insert_length(type) = type[1]; //! Length
function insert_outer_d(type) = type[2]; //! Outer diameter at the top function insert_outer_d(type) = type[2]; //! Outer diameter at the top
function insert_hole_radius(type) = type[3] / 2; //! Radius of the required hole in the plastic function insert_hole_radius(type) = type[3] / 2; //! Radius of the required hole in the plastic
function insert_screw_diameter(type) = type[4]; //! Screw size function insert_screw_diameter(type) = type[4]; //! Screw size
function insert_barrel_d(type) = type[5]; //! Diameter of the main barrel function insert_barrel_d(type) = type[5]; //! Diameter of the main barrel
function insert_ring1_h(type) = type[6]; //! Height of the top and middle rings 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_ring2_d(type) = type[7]; //! Diameter of the middle ring
function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring function insert_ring3_d(type) = type[8]; //! Diameter of the bottom ring
function insert_hole_length(type) = round_to_layer(insert_length(type)); function insert_hole_length(type) = round_to_layer(insert_length(type));
@@ -42,12 +42,12 @@ module insert(type) { //! Draw specified insert
chamfer1 = (insert_ring2_d(type) - insert_barrel_d(type)) / 2; chamfer1 = (insert_ring2_d(type) - insert_barrel_d(type)) / 2;
chamfer2 = (insert_ring3_d(type) - insert_barrel_d(type)) / 2; chamfer2 = (insert_ring3_d(type) - insert_barrel_d(type)) / 2;
ring2_h = ring1_h + chamfer1; ring2_h = ring1_h + chamfer1;
gap = (length - ring1_h - ring2_h- chamfer2) / 3; gap = (length - ring1_h - ring2_h - chamfer2) / 3;
vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type))); vitamin(str("insert(", type[0], "): Heatfit insert M", insert_screw_diameter(type)));
$fn = 64; $fn = 64;
thread_d = insert_screw_diameter(type); thread_d = insert_screw_diameter(type);
explode(20, offset =[0, 0, -5]) translate_z(eps) vflip() { explode(20, offset = [0, 0, -5]) translate_z(eps) vflip() {
r1 = thread_d / 2; r1 = thread_d / 2;
r2 = insert_barrel_d(type) / 2; r2 = insert_barrel_d(type) / 2;
r3 = insert_ring3_d(type) / 2; r3 = insert_ring3_d(type) / 2;

View File

@@ -29,7 +29,6 @@ include <zipties.scad>
use <wire.scad> use <wire.scad>
use <../utils/tube.scad> use <../utils/tube.scad>
MK4_heater = [ 12.76, 15.88, 8.22, (15.88 / 2 - 4.5), (12.76 / 2 - 0.5 - 2.5 / 2), (-15.88 / 2 + 5), 9.5, 3];
MK5_heater = [ 12.76, 12.76, 8.22, (12.76 / 2 - 3.75), (12.76 / 2 - 0.5 - 2.5 / 2), (-12.76 / 2 + 4), 8, 2]; MK5_heater = [ 12.76, 12.76, 8.22, (12.76 / 2 - 3.75), (12.76 / 2 - 0.5 - 2.5 / 2), (-12.76 / 2 + 4), 8, 2];
function heater_width(type) = type[0]; function heater_width(type) = type[0];
@@ -71,7 +70,7 @@ module heater_block(type, resistor, thermistor) {
cone_start_r = nozzle_cone(type) / 2; cone_start_r = nozzle_cone(type) / 2;
straight = 1; straight = 1;
nozzle_r = 0.4 / 2; nozzle_r = 0.4 / 2;
translate_z(-h / 2) vflip() translate([nozzle_x(type), 0, -h / 2]) vflip()
rotate_extrude() rotate_extrude()
polygon([ polygon([
[nozzle_r, 0], [nozzle_r, 0],
@@ -86,7 +85,7 @@ module heater_block(type, resistor, thermistor) {
module jhead_hot_end(type, filament) { module jhead_hot_end(type, filament) {
resistor = RIE1212UB5C5R6; resistor = RIE1212UB5C5R6;
thermistor = Epcos; thermistor = Epcos;
heater = type == JHeadMk4 ? MK4_heater : MK5_heater; heater = MK5_heater;
insulator_length = hot_end_insulator_length(type); insulator_length = hot_end_insulator_length(type);
inset = hot_end_inset(type); inset = hot_end_inset(type);
@@ -106,7 +105,7 @@ module jhead_hot_end(type, filament) {
square([hot_end_insulator_diameter(type) / 2 - chamfer, insulator_length]); square([hot_end_insulator_diameter(type) / 2 - chamfer, insulator_length]);
} }
square([3.2 / 2, insulator_length]); square([(filament + 0.2) / 2, insulator_length]);
translate([hot_end_groove_dia(type) / 2, insulator_length - hot_end_inset(type) - hot_end_groove(type)]) translate([hot_end_groove_dia(type) / 2, insulator_length - hot_end_inset(type) - hot_end_groove(type)])
square([100, hot_end_groove(type)]); square([100, hot_end_groove(type)]);
@@ -122,7 +121,7 @@ module jhead_hot_end(type, filament) {
module jhead_hot_end_assembly(type, filament, naked = false) { //! Assembly with resistor, thermistor, tape, sleaving and ziptie module jhead_hot_end_assembly(type, filament, naked = false) { //! Assembly with resistor, thermistor, tape, sleaving and ziptie
resistor = RIE1212UB5C5R6; resistor = RIE1212UB5C5R6;
thermistor = Epcos; thermistor = Epcos;
heater = type == JHeadMk4 ? MK4_heater : MK5_heater; heater = MK5_heater;
insulator_length = hot_end_insulator_length(type); insulator_length = hot_end_insulator_length(type);
inset = hot_end_inset(type); inset = hot_end_inset(type);