diff --git a/electronics/reflow-oven-parts/LICENSE b/electronics/reflow-oven-parts/LICENSE new file mode 100644 index 0000000..4cc9cb5 --- /dev/null +++ b/electronics/reflow-oven-parts/LICENSE @@ -0,0 +1 @@ +This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. diff --git a/electronics/reflow-oven-parts/README.md b/electronics/reflow-oven-parts/README.md new file mode 100644 index 0000000..eb84eef --- /dev/null +++ b/electronics/reflow-oven-parts/README.md @@ -0,0 +1,20 @@ +# Controleo3 reflow oven add-ons + +![This model is a work in progress][work-in-progress-badge] +[![CC-BY-SA-4.0 license][license-badge]][license] + +Misc add-ons for Controleo3 reflow oven: + +* Front panel wiring grommet +* Enclosure mounting spacer + +![Model render](images/readme/demo.png) + +## License + +This model is licensed under [Creative Commons (4.0 International License) Attribution-ShareAlike][license]. + + +[license]: http://creativecommons.org/licenses/by-sa/4.0/ +[license-badge]: /_static/license-badge-cc-by-sa-4.0.svg +[work-in-progress-badge]: /_static/work-in-progress-badge.svg diff --git a/electronics/reflow-oven-parts/SConscript b/electronics/reflow-oven-parts/SConscript new file mode 100644 index 0000000..757e72a --- /dev/null +++ b/electronics/reflow-oven-parts/SConscript @@ -0,0 +1,13 @@ +Import("env") +b = ModelBuilder(env) + +panel_model = "panel-grommet.scad" +enclosure_mount_model = "enclosure-mount.scad" + +b.STL("panel-grommet.stl", panel_model) +b.STL("enclosure-mount.stl", enclosure_mount_model) +b.Image("demo.png", panel_model) + +b.add_default_targets() + +# vim: ft=python diff --git a/electronics/reflow-oven-parts/enclosure-mount.scad b/electronics/reflow-oven-parts/enclosure-mount.scad new file mode 100644 index 0000000..72b2ae8 --- /dev/null +++ b/electronics/reflow-oven-parts/enclosure-mount.scad @@ -0,0 +1,138 @@ +/* + * Controleo3 reflow oven add-ons + * Enclosure mounting spacer + * By smkent (GitHub) / bulbasaur0 (Printables) + * + * Licensed under Creative Commons (4.0 International License) Attribution-ShareAlike + */ + +/* [Size] */ +// All units in millimeters + +Dimensions = [38, 15]; + +Thickness = 4; // [1.5:0.1:10] +Diameter = 35; +Hole_Diameter = 16; // [10:0.1:30] +Screw_Hole_Diameter = 3; // [2:0.1:5] +Screw_Hole_Offset = 14; +Screw_Separation = 19; +Grommet_Thickness = 3; // [0.8:0.1:5] +Grommet_Depth = 2; // [0.4:0.1:5] + +/* [Advanced Options] */ +Screw_Hole_Fit = 0.2; // [0:0.05:1] +Screw_Hole_Style = "inset"; // [flat: Flat, countersink: Countersink, inset: Inset] +Edge_Radius = 0.4; // [0:0.1:3] + +/* [Development Toggles] */ + +module __end_customizer_options__() { } + +// Constants // + +$fa = $preview ? $fa : 2; +$fs = $preview ? $fs / 2 : 0.4; + +slop = 0.001; + +// Modules // + +module _round_3d(radius = Edge_Radius) { + if (radius == 0) { + children(); + } else { + render() + minkowski() { + children(); + for (mz = [0, 1]) + mirror([0, 0, mz]) + cylinder(r1=radius, r2=0, h=radius); + } + } +} + +module _screw_hole(d, h, fit=0, style="flat", print_upside_down=false) { + inset_bare_min_h = 1.4; + inset_min_h = (style == "inset") ? max((h - d), inset_bare_min_h) - (h - d) : 0; + translate([0, 0, -slop]) + cylinder(d=(d + fit), h=h + slop * 2); + if (style == "countersink" || style == "inset") { + translate([0, 0, h + inset_min_h + slop * 2]) + mirror([0, 0, 1]) + cylinder(d1=d * 2, d2=d * (style == "inset" ? 2 : 1), h=d); + } + if (style == "inset" && print_upside_down) { + layer_height = 0.2; + translate([0, 0, (h + inset_min_h) - d - layer_height]) + linear_extrude(height=layer_height + slop * 2) + intersection() { + square([d * 2, d + fit], center=true); + circle(d=d*2); + } + } +} + +module at_enclosure_mount_screw_holes() { + for (mx = [0, 1]) + mirror([mx, 0]) + translate([Screw_Separation / 2, 0]) + children(); +} + +module enclosure_mount_body() { + difference() { + translate([0, 0, Edge_Radius]) + union() { + rr = 2; + _round_3d() + difference() { + linear_extrude(height=Thickness - Edge_Radius * 2) + offset(r=rr) + offset(r=-rr) + square(Dimensions, center=true); + translate([0, 0, Dimensions[1] + (Thickness - Edge_Radius * 2) / 2]) + rotate([0, 90, 0]) + cylinder(h=Dimensions[0], d=Dimensions[1] * 2, center=true); + } + } + if(0) + union() { + dd = Hole_Diameter - Grommet_Thickness * 2; + translate([0, 0, slop]) + linear_extrude(height=Thickness + Grommet_Depth + slop * 2) + circle(d=dd); + translate([0, 0, -slop]) + cylinder(d2=dd, d1=dd + Edge_Radius * 2, h=Edge_Radius); + translate([0, 0, Thickness + Grommet_Depth - Edge_Radius + slop]) + cylinder(d1=dd, d2=dd + Edge_Radius * 2, h=Edge_Radius); + } + } +} + +module enclosure_mount_screw_holes() { + translate([0, 0, Thickness]) + mirror([0, 0, 1]) + at_enclosure_mount_screw_holes() + hull() { + oy = (Dimensions[1] - Screw_Hole_Diameter) / 4; + for (my = [0, 1]) + mirror([0, my]) + translate([0, oy, 0]) + cylinder(d=Screw_Hole_Diameter + Screw_Hole_Fit, h=Thickness * 2); + } +} + +module panel_grommet() { + difference() { + enclosure_mount_body(); + enclosure_mount_screw_holes(); + } +} + +module main() { + color("yellowgreen", 0.8) + panel_grommet(); +} + +main(); diff --git a/electronics/reflow-oven-parts/images/publish/demo.png b/electronics/reflow-oven-parts/images/publish/demo.png new file mode 100644 index 0000000..8f13345 Binary files /dev/null and b/electronics/reflow-oven-parts/images/publish/demo.png differ diff --git a/electronics/reflow-oven-parts/images/readme/demo.png b/electronics/reflow-oven-parts/images/readme/demo.png new file mode 100644 index 0000000..69c9c85 Binary files /dev/null and b/electronics/reflow-oven-parts/images/readme/demo.png differ diff --git a/electronics/reflow-oven-parts/panel-grommet.scad b/electronics/reflow-oven-parts/panel-grommet.scad new file mode 100644 index 0000000..d3f71be --- /dev/null +++ b/electronics/reflow-oven-parts/panel-grommet.scad @@ -0,0 +1,129 @@ +/* + * Controleo3 reflow oven add-ons + * Front panel wiring grommet + * By smkent (GitHub) / bulbasaur0 (Printables) + * + * Licensed under Creative Commons (4.0 International License) Attribution-ShareAlike + */ + +/* [Size] */ +// All units in millimeters + +Thickness = 3; // [1.5:0.1:10] +Diameter = 35; +Hole_Diameter = 16; // [10:0.1:30] +Screw_Hole_Diameter = 3; // [2:0.1:5] +Screw_Hole_Offset = 14; +Grommet_Thickness = 3; // [0.8:0.1:5] +Grommet_Depth = 2; // [0.4:0.1:5] + +/* [Advanced Options] */ +Screw_Hole_Fit = 0.2; // [0:0.05:1] +Screw_Hole_Style = "inset"; // [flat: Flat, countersink: Countersink, inset: Inset] +Edge_Radius = 0.4; // [0:0.1:3] + +/* [Development Toggles] */ + +module __end_customizer_options__() { } + +// Constants // + +$fa = $preview ? $fa : 2; +$fs = $preview ? $fs / 2 : 0.4; + +slop = 0.001; + +// Modules // + +module _round_3d(radius = Edge_Radius) { + if (radius == 0) { + children(); + } else { + render() + minkowski() { + children(); + for (mz = [0, 1]) + mirror([0, 0, mz]) + cylinder(r1=radius, r2=0, h=radius); + } + } +} + +module _screw_hole(d, h, fit=0, style="flat", print_upside_down=false) { + inset_bare_min_h = 1.4; + inset_min_h = (style == "inset") ? max((h - d), inset_bare_min_h) - (h - d) : 0; + translate([0, 0, -slop]) + cylinder(d=(d + fit), h=h + slop * 2); + if (style == "countersink" || style == "inset") { + translate([0, 0, h + inset_min_h + slop * 2]) + mirror([0, 0, 1]) + cylinder(d1=d * 2, d2=d * (style == "inset" ? 2 : 1), h=d); + } + if (style == "inset" && print_upside_down) { + layer_height = 0.2; + translate([0, 0, (h + inset_min_h) - d - layer_height]) + linear_extrude(height=layer_height + slop * 2) + intersection() { + square([d * 2, d + fit], center=true); + circle(d=d*2); + } + } +} + +module at_panel_grommet_screw_holes() { + for (angle = [0:90:270]) + rotate(angle) + translate([Screw_Hole_Offset, 0]) + children(); +} + +module panel_grommet_body() { + difference() { + translate([0, 0, Edge_Radius]) + union() { + _round_3d() + linear_extrude(height=Thickness - Edge_Radius * 2) + circle(d=Diameter); + _round_3d() + linear_extrude(height=Thickness + Grommet_Depth - Edge_Radius * 2) + circle(d=Hole_Diameter - Edge_Radius * 2); + } + union() { + dd = Hole_Diameter - Grommet_Thickness * 2; + translate([0, 0, slop]) + linear_extrude(height=Thickness + Grommet_Depth + slop * 2) + circle(d=dd); + translate([0, 0, -slop]) + cylinder(d2=dd, d1=dd + Edge_Radius * 2, h=Edge_Radius); + translate([0, 0, Thickness + Grommet_Depth - Edge_Radius + slop]) + cylinder(d1=dd, d2=dd + Edge_Radius * 2, h=Edge_Radius); + } + } +} + +module panel_grommet_screw_holes() { + translate([0, 0, Thickness]) + mirror([0, 0, 1]) + at_panel_grommet_screw_holes() + _screw_hole( + d=Screw_Hole_Diameter, + h=Thickness, + fit=Screw_Hole_Fit, + style=Screw_Hole_Style, + print_upside_down=true + ); +} + +module panel_grommet() { + difference() { + panel_grommet_body(); + panel_grommet_screw_holes(); + } +} + +module main() { + color("lightsteelblue", 0.8) + panel_grommet(); +} + +main();