diff --git a/readme.md b/readme.md index 3ba9b6f..0693bda 100644 --- a/readme.md +++ b/readme.md @@ -26,29 +26,29 @@ A list of changes classified as breaking, additions or fixes is maintained in [C BLDC_motors Jack Ring_terminals Cable_clip Catenary Global Ball_bearings LDRs Rockers Cable_grommets Core_xy Polyholes Batteries LED_meters Rod Camera_housing Dogbones Rounded_rectangle - Bearing_blocks LEDs SK_brackets Carriers Fillet Sphere - Belts Leadnuts SMDs Corner_block Gears Teardrops - Blowers Light_strips SSRs Door_hinge Hanging_hole - Box_sections Linear_bearings Screws Door_latch Horiholes - Bulldogs Magnets Sealing_strip Drag_chain Layout - Buttons Mains_sockets Servo_motors Fan_guard Maths - Cable_strips Microswitches Shaft_couplings Fixing_block Offset - Cameras Microview Sheets Flat_hinge Quadrant - Circlips Modules Spades Foot Round - Components Nuts Spools Handle Rounded_cylinder - DIP O_ring Springs Knob Rounded_polygon - D_connectors Opengrab Stepper_motors LED_bezel Rounded_triangle - Displays PCB Swiss_clips PCB_mount Sector - Extrusion_brackets PCBs Terminals PSU_shroud Sweep - Extrusions PSUs Toggles Pocket_handle Thread - Fans Panel_meters Transformers Press_fit Tube - Fastons Photo_interrupters Tubings Printed_box - Fuseholder Pillars Variacs Printed_pulleys - Geared_steppers Pillow_blocks Veroboard Ribbon_clamp - Green_terminals Pin_headers Washers SSR_shroud - Hot_ends Potentiometers Wire Screw_knob - Hygrometer Pulleys Zipties Socket_box - Strap_handle + Bearing_blocks LEDs SBR_rails Carriers Fillet Sphere + Belts Leadnuts SK_brackets Corner_block Gears Teardrops + Blowers Light_strips SMDs Door_hinge Hanging_hole + Box_sections Linear_bearings SSRs Door_latch Horiholes + Bulldogs Magnets Screws Drag_chain Layout + Buttons Mains_sockets Sealing_strip Fan_guard Maths + Cable_strips Microswitches Servo_motors Fixing_block Offset + Cameras Microview Shaft_couplings Flat_hinge Quadrant + Circlips Modules Sheets Foot Round + Components Nuts Spades Handle Rounded_cylinder + DIP O_ring Spools Knob Rounded_polygon + D_connectors Opengrab Springs LED_bezel Rounded_triangle + Displays PCB Stepper_motors PCB_mount Sector + Extrusion_brackets PCBs Swiss_clips PSU_shroud Sweep + Extrusions PSUs Terminals Pocket_handle Thread + Fans Panel_meters Toggles Press_fit Tube + Fastons Photo_interrupters Transformers Printed_box + Fuseholder Pillars Tubings Printed_pulleys + Geared_steppers Pillow_blocks Variacs Ribbon_clamp + Green_terminals Pin_headers Veroboard SSR_shroud + Hot_ends Potentiometers Washers Screw_knob + Hygrometer Pulleys Wire Socket_box + Zipties Strap_handle --- @@ -263,6 +263,14 @@ SCSnUU and SCSnLUU bearing blocks ### Properties | Function | Description | |:--- |:--- | +| `sbr_bearing(type)` | Linear bearing used | +| `sbr_circlip(type)` | Circlip used | +| `sbr_hole_offset(type)` | Offset of bearing hole from base of *rail* | +| `sbr_screw(type)` | Screw type | +| `sbr_screw_separation_x(type)` | Screw separation in X direction | +| `sbr_screw_separation_z(type)` | Screw separation in Z direction | +| `sbr_side_height(type)` | Height of side above *rail* | +| `sbr_spacer(type)` | Spacer used in long bearings | | `scs_bearing(type)` | Linear bearing used | | `scs_block_center_height(type)` | Height of the center of the block | | `scs_block_side_height(type)` | Height of the side of the block, this determines the minimum screw length | @@ -276,11 +284,16 @@ SCSnUU and SCSnLUU bearing blocks ### Functions | Function | Description | |:--- |:--- | +| `sbr_size(type)` | Size of SBR bracket bounding block | | `scs_size(type)` | Size of scs bracket bounding block | ### Modules | Module | Description | |:--- |:--- | +| `right_trapezoid(base, top, height, h = 0, center = true)` | A right angled trapezoid with the 90° corner at the origin. 3D when `h` is nonzero, otherwise 2D | +| `sbr_bearing_block(type)` | Draw the specified SBR bearing block | +| `sbr_bearing_block_assembly(type, part_thickness, screw_type)` | Assembly with screws in place | +| `sbr_bearing_block_hole_positions(type)` | Place children at hole positions | | `scs_bearing_block(type)` | Draw the specified SCS bearing block | | `scs_bearing_block_assembly(type, part_thickness, screw_type, nut_type)` | Assembly with screws and nuts in place | | `scs_bearing_block_hole_positions(type)` | Place children at hole positions | @@ -292,6 +305,7 @@ SCSnUU and SCSnLUU bearing blocks | ---:|:--- |:---| | 12 | `nut(M4_nut)` | Nut M4 x 3.2mm | | 24 | `nut(M5_nut)` | Nut M5 x 4mm | +| 1 | `sbr_bearing_block(SBR16UU)` | SBR16UU bearing block | | 1 | `scs_bearing_block(SCS10LUU)` | SCS10LUU bearing block | | 1 | `scs_bearing_block(SCS10UU)` | SCS10UU bearing block | | 1 | `scs_bearing_block(SCS12LUU)` | SCS12LUU bearing block | @@ -303,6 +317,7 @@ SCSnUU and SCSnLUU bearing blocks | 1 | `scs_bearing_block(SCS8UU)` | SCS8UU bearing block | | 4 | `screw(M4_cap_screw, 25)` | Screw M4 cap x 25mm | | 8 | `screw(M4_cap_screw, 30)` | Screw M4 cap x 30mm | +| 4 | `screw(M5_cap_screw, 16)` | Screw M5 cap x 16mm | | 16 | `screw(M5_cap_screw, 35)` | Screw M5 cap x 35mm | | 8 | `screw(M5_cap_screw, 45)` | Screw M5 cap x 45mm | | 12 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm | @@ -741,6 +756,11 @@ Circlips aka tapered retaining rings. | `circlip_d5(type)` | Plier hole diameter | | `circlip_thickness(type)` | Thickness | +### Functions +| Function | Description | +|:--- |:--- | +| `circlip_closed_angle(type)` | Closed angle | + ### Modules | Module | Description | |:--- |:--- | @@ -756,6 +776,7 @@ Circlips aka tapered retaining rings. | 3 | `circlip(circlip_19i)` | Circlip internal 19mm | | 3 | `circlip(circlip_21i)` | Circlip internal 21mm | | 3 | `circlip(circlip_28i)` | Circlip internal 28mm | +| 3 | `circlip(circlip_28iw)` | Circlip internal 28mm (wide opening) | Top @@ -1928,6 +1949,8 @@ LMnUU linear bearings. | `bearing_groove_spacing(type)` | Spacing between grooves, outer to outer, ie includes the grooves themselves | | `bearing_length(type)` | Total length | | `bearing_rod_dia(type)` | Internal diameter | +| `open_bearing_theta(type)` | For open bearings, the angle of the opening | +| `open_bearing_width(type)` | For open bearings, the width of the opening at the rod | ### Functions | Function | Description | @@ -1950,6 +1973,7 @@ LMnUU linear bearings. | 1 | `linear_bearing(LM12UU)` | Linear bearing LM12UU | | 1 | `linear_bearing(LM16LUU)` | Linear bearing LM16LUU | | 1 | `linear_bearing(LM16UU)` | Linear bearing LM16UU | +| 1 | `linear_bearing(LM16UUOP)` | Linear bearing LM16UUOP | | 1 | `linear_bearing(LM3LUU)` | Linear bearing LM3LUU | | 1 | `linear_bearing(LM3UU)` | Linear bearing LM3UU | | 1 | `linear_bearing(LM4LUU)` | Linear bearing LM4LUU | @@ -3484,6 +3508,49 @@ These items are symmetrical, so by default the origin is in the centre but it ca | 1 | `studding(8, 80)` | Threaded rod M8 x 80mm | +Top + +--- + +## SBR_rails +SBR rails + +The rails are drawn from the center of the rod. +`sbr_rail_center_height(type)` can be used to determine where the bottom of the rail is. + +[vitamins/sbr_rails.scad](vitamins/sbr_rails.scad) Object definitions. + +[vitamins/sbr_rail.scad](vitamins/sbr_rail.scad) Implementation. + +[tests/SBR_rails.scad](tests/SBR_rails.scad) Code for this example. + +### Properties +| Function | Description | +|:--- |:--- | +| `sbr_rail_base_width(type)` | Width of the rail base | +| `sbr_rail_carriage(type)` | Carriage to use with this rail | +| `sbr_rail_center_height(type)` | Height of the center above the bottom of the rail | +| `sbr_rail_diameter(type)` | Diameter of the rod | +| `sbr_rail_screw(type)` | Screw to fasten this rail | + +### Modules +| Module | Description | +|:--- |:--- | +| `sbr_rail(type , l)` | Draw an SBR rail | +| `sbr_screw_locations(type, l)` | Linear locations of screws | +| `sbr_screw_positions(type, l)` | Screw positions | + +![sbr_rails](tests/png/sbr_rails.png) + +### Vitamins +| Qty | Module call | BOM entry | +| ---:|:--- |:---| +| 1 | `sbr_rail(16, 200)` | SBR16 rail, length 200mm | +| 1 | `sbr_bearing_block(SBR16UU)` | SBR16UU bearing block | +| 4 | `screw(M5_cap_screw, 12)` | Screw M5 cap x 12mm | +| 4 | `screw(M5_cap_screw, 18)` | Screw M5 cap x 18mm | + + Top --- diff --git a/tests/SBR_rails.scad b/tests/SBR_rails.scad new file mode 100644 index 0000000..e25b331 --- /dev/null +++ b/tests/SBR_rails.scad @@ -0,0 +1,46 @@ +// +// 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 . +// +include <../core.scad> +include <../vitamins/sbr_rails.scad> + +use <../utils/layout.scad> +use <../vitamins/bearing_block.scad> + +length = 200; +sheet = 3; + +module sbr_rails() + layout([for(r = sbr_rails) sbr_rail_base_width(r)], 10) + rotate([90, 180,0]) { + rail = sbr_rails[$i]; + sbr_rail(rail, length); + carriage = sbr_rail_carriage(rail); + screw = sbr_rail_screw(rail); + + sbr_bearing_block_assembly(carriage, sheet); + + sbr_screw_positions(rail, length) + explode(20) + rotate([90,0,0]) + screw(sbr_rail_screw(rail), 18); + + } + +if($preview) + sbr_rails(); diff --git a/tests/bearing_blocks.scad b/tests/bearing_blocks.scad index 994e942..a85de88 100644 --- a/tests/bearing_blocks.scad +++ b/tests/bearing_blocks.scad @@ -31,5 +31,16 @@ module scs_bearing_blocks() scs_bearing_block_assembly(scs_bearing_blocks_long[$i - 1], part_thickness); } -if($preview) +module sbr_bearing_blocks() + layout([for(s = sbr_bearing_blocks) sbr_size(s).x], 10) { + part_thickness = 5; + sbr_bearing_block_assembly(sbr_bearing_blocks[$i], part_thickness); + } + +module bearing_blocks() scs_bearing_blocks(); + translate([190,120,0]) + sbr_bearing_blocks(); + +if($preview) + bearing_blocks(); diff --git a/tests/linear_bearings.scad b/tests/linear_bearings.scad index 0b20fa8..de4fb2e 100644 --- a/tests/linear_bearings.scad +++ b/tests/linear_bearings.scad @@ -28,6 +28,9 @@ module linear_bearings() translate([0, 30]) linear_bearing(long_linear_bearings[$i]); } + layout([for(b = open_linear_bearings) 2 * bearing_radius(b)]) + translate([105, 60]) + linear_bearing(open_linear_bearings[$i]); if($preview) linear_bearings(); diff --git a/tests/png/bearing_blocks.png b/tests/png/bearing_blocks.png index 5cf8921..e434466 100644 Binary files a/tests/png/bearing_blocks.png and b/tests/png/bearing_blocks.png differ diff --git a/tests/png/circlips.png b/tests/png/circlips.png index 9e49b62..ca59009 100644 Binary files a/tests/png/circlips.png and b/tests/png/circlips.png differ diff --git a/tests/png/linear_bearings.png b/tests/png/linear_bearings.png index f0952a7..675045a 100644 Binary files a/tests/png/linear_bearings.png and b/tests/png/linear_bearings.png differ diff --git a/tests/png/sbr_rails.png b/tests/png/sbr_rails.png new file mode 100644 index 0000000..2427c2e Binary files /dev/null and b/tests/png/sbr_rails.png differ diff --git a/vitamins/bearing_block.scad b/vitamins/bearing_block.scad index 8b1593c..a2d4122 100644 --- a/vitamins/bearing_block.scad +++ b/vitamins/bearing_block.scad @@ -41,6 +41,17 @@ function scs_circlip(type) = type[15]; //! Circlip used function scs_spacer(type) = type[16]; //! Spacer used in long bearings +function sbr_size(type) = [type[4],type[6],type[5]]; //! Size of SBR bracket bounding block +function sbr_hole_offset(type) = type[2]; //! Offset of bearing hole from base of *rail* +function sbr_side_height(type) = type[3]; //! Height of side above *rail* +function sbr_screw(type) = type[10]; //! Screw type +function sbr_screw_separation_x(type) = type[7]; //! Screw separation in X direction +function sbr_screw_separation_z(type) = type[8]; //! Screw separation in Z direction +function sbr_bearing(type) = type[12]; //! Linear bearing used +function sbr_circlip(type) = type[13]; //! Circlip used +function sbr_spacer(type) = type[14]; //! Spacer used in long bearings + + sks_bearing_block_colour = grey(90); module scs_bearing_block(type) { //! Draw the specified SCS bearing block @@ -63,11 +74,6 @@ module scs_bearing_block(type) { //! Draw the specified SCS bearing block bearing = scs_bearing(type); clip = scs_circlip(type); - module right_trapezoid(base, top, height, h = 0, center = true) {//! A right angled trapezoid with the 90° corner at the origin. 3D when `h` is nonzero, otherwise 2D - extrude_if(h, center = center) - polygon(points = [ [0,0], [base, 0], [top, height], [0, height] ]); - } - boltHoleRadius = screw_clearance_radius(S1); footHeight = min(0.75, (G - bearing_dia(bearing) - 1.5) / 2); // estimate, not specified on drawings @@ -169,3 +175,140 @@ module scs_bearing_block_assembly(type, part_thickness, screw_type, nut_type) { washer(washer_type); } } + +/* SBR bearing blocks */ + +module sbr_bearing_block(type) { //! Draw the specified SBR bearing block + vitamin(str("sbr_bearing_block(", type[0], "): ", type[0], " bearing block")); + + T = type[1]; + h = sbr_hole_offset(type); + H = sbr_side_height(type); + + W = sbr_size(type)[0]; + G = sbr_size(type)[1]; + M = sbr_size(type)[2]; + J = sbr_screw_separation_x(type); + K = sbr_screw_separation_z(type); + S1 = sbr_screw(type); + I = type[11]; // screw length + + S2 = type[15]; + S2L = type[16]; + + bearing = sbr_bearing(type); + clip = sbr_circlip(type); + chamfer = 1.5; + A = type[9]; // size of chamfered overhang - vertical + Ah = A + chamfer * 2; // size of chamfered overhand - horizontal - not given in drawings + + width = W - (2 * chamfer); + height = G - chamfer; + + boltHoleRadius = screw_radius(S1); + setScrewRadius = screw_radius(S2); + + color(sks_bearing_block_colour) { + difference() { + linear_extrude(M, center = true, convexity=2) { + cutoutheight = 15; // chosen to fit SBR16, may not work with others + bearingRadius = bearing_dia(bearing) / 2; + bearingTheta = open_bearing_theta(bearing); + bearingOpening = open_bearing_width(bearing); + bearingOpeningBig = bearingOpening + (tan(bearingTheta/2) * cutoutheight); + // center section with bearing hole + difference() { + translate([-width/2, -(H-h - chamfer)]) + square([width, height]); + circle(r = bearingRadius); + for(m = [0, 1]) + mirror([m, 0, 0]) + translate([0, h - (cutoutheight/2) - H + G + 0.1]) + right_trapezoid(bearingOpening/2, bearingOpeningBig/2, cutoutheight/2); + } + // add the sides + for(m = [0, 1]) + mirror([m, 0, 0]) { + translate([-(W/2) + chamfer, -((H-h))]) { + difference() { + union() { + right_trapezoid(Ah - chamfer,Ah,chamfer); + rotate([0,0,90]) + right_trapezoid(A + chamfer,A,chamfer); + } + translate([-(chamfer +0.1), -0.1,0]) + right_trapezoid(chamfer/2 + 0.2, 0, chamfer/2+ 0.2); + } + } + } + } + // bolt holes + for(x = [-J / 2, J / 2]) + translate([x, h - H + I/2 - 0.1, 0]) + rotate([90, 0, 0]) + for (y = [-K / 2, K / 2]) + translate([0, y]) + cylinder(r = boltHoleRadius, h=I + 0.1, center=true); + // set screw holes + translate([-width/2 + S2L/2 - 0.1,0,0]) + rotate([0,90,0]) + cylinder(r = setScrewRadius, h=S2L, center=true); + translate([0,-(H-h) + chamfer + S2L/2 -0.1,0]) + rotate([0,90,90]) + cylinder(r = setScrewRadius, h=S2L, center=true); + + } + } + not_on_bom() no_explode() { + spacer = sbr_spacer(type); + for(end = spacer ? [-1, 1] : 0) + translate_z(end * (bearing_length(bearing) + spacer) / 2) + rotate([0,0,-90]) + linear_bearing(bearing); + + for(end = [-1, 1]) + translate_z(end * ((spacer ? 2 * bearing_length(bearing) + spacer : bearing_length(bearing)) + circlip_thickness(clip)) / 2) + rotate(180) + internal_circlip(clip); + + translate([-width/2 - 0.1,0,0]) + rotate([0,90,180]) + screw(S2, S2L); + translate([0,-(H-h) + chamfer - 0.1,0]) + rotate([0,90,270]) + screw(S2, S2L); + } +} + +module sbr_bearing_block_hole_positions(type) { //! Place children at hole positions + y = sbr_hole_offset(type) - sbr_side_height(type); + screw_separation_x = sbr_screw_separation_x(type); + screw_separation_z = sbr_screw_separation_z(type); + + for(x = [-screw_separation_x, screw_separation_x], z = [-screw_separation_z, screw_separation_z]) + translate([x / 2, y, z / 2]) + rotate([-90, 0, 0]) + children(); +} + +module sbr_bearing_block_assembly(type, part_thickness, screw_type) { //! Assembly with screws in place + + I = type[11]; // screw length + sbr_bearing_block(type); + screw_type = is_undef(screw_type) ? sbr_screw(type) : screw_type; + G = sbr_size(type)[1]; + + screw_length = screw_shorter_than(I + part_thickness); + + translate([0,-part_thickness,0]) + sbr_bearing_block_hole_positions(type) + rotate([0,180,0]) + screw(screw_type, screw_length); +} + +/* Generic bearing block functions */ + +module right_trapezoid(base, top, height, h = 0, center = true) {//! A right angled trapezoid with the 90° corner at the origin. 3D when `h` is nonzero, otherwise 2D + extrude_if(h, center = center) + polygon(points = [ [0,0], [base, 0], [top, height], [0, height] ]); +} diff --git a/vitamins/bearing_blocks.scad b/vitamins/bearing_blocks.scad index 04fee50..201cbfe 100644 --- a/vitamins/bearing_blocks.scad +++ b/vitamins/bearing_blocks.scad @@ -36,8 +36,12 @@ SCS10LUU = ["SCS10LUU", 8, 13, 20, 40, 68, 26, 21, 28, 45, 6, M5_cap_sc SCS12LUU = ["SCS12LUU", 8, 15, 21, 42, 70, 28, 24, 30.5, 50, 5.75, M5_cap_screw, 4.3, 12, LM12UU, circlip_21i, 4]; SCS16LUU = ["SCS16LUU", 9, 19, 25, 50, 85, 38.5, 32.5, 36, 60, 7, M5_cap_screw, 4.3, 12, LM16UU, circlip_28i, 4]; +// T h H W M G J K A S1 I LB S2 S2L +SBR16UU = ["SBR16UU", 16, 25, 45, 45, 45, 33, 32, 30, 9, M5_cap_screw, 12, LM16UUOP, circlip_28iw, 0, M5_grub_screw, 5]; scs_bearing_blocks = [SCS6UU, SCS8UU, SCS10UU, SCS12UU, SCS16UU]; scs_bearing_blocks_long = [SCS8LUU, SCS10LUU, SCS12LUU, SCS16LUU]; +sbr_bearing_blocks = [SBR16UU]; + use diff --git a/vitamins/circlip.scad b/vitamins/circlip.scad index 6818aaa..0177d6c 100644 --- a/vitamins/circlip.scad +++ b/vitamins/circlip.scad @@ -32,14 +32,14 @@ function circlip_thickness(type) = type[4]; //! Thickness function circlip_a(type) = type[5]; //! Size of the lugs function circlip_b(type) = type[6]; //! Widest part of the taper function circlip_d5(type) = type[7]; //! Plier hole diameter +function circlip_closed_angle(type) = is_undef(type[8]) ? 25 : type[8]; //! Closed angle circlip_colour = grey(20); -closed_angle = 25; module internal_circlip(type, open = 0) { //! Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install d1 = circlip_d1(type); - - vitamin(str("circlip(", type[0], "): Circlip internal ", d1, "mm")); + wide = is_undef(type[8]) ? "" : " (wide opening)"; + vitamin(str("circlip(", type[0], "): Circlip internal ", d1, "mm",wide)); d3 = circlip_d3(type); d2 = circlip_d2(type); a = circlip_a(type); @@ -50,7 +50,7 @@ module internal_circlip(type, open = 0) { //! Draw specified internal circlip, o or = od / 2; c = (d3 - d1); - angle = (od - d1) / d1 * 360 + closed_angle; + angle = (od - d1) / d1 * 360 + circlip_closed_angle(type); tab_angle = 360 * a / PI / od; p = [0, -or + b / 2, 1] * rot3_z(angle / 2 + tab_angle); pitch = (or - a / 2); diff --git a/vitamins/circlips.scad b/vitamins/circlips.scad index 2e70902..d203e94 100644 --- a/vitamins/circlips.scad +++ b/vitamins/circlips.scad @@ -22,7 +22,8 @@ circlip_15i = ["circlip_15i", 15, 15.7, 16.2, 1.0, 3.7, 2.0, 1.7]; circlip_19i = ["circlip_19i", 19, 20.0, 20.5, 1.0, 4.1, 2.2, 2.0]; circlip_21i = ["circlip_21i", 21, 22.0, 22.5, 1.0, 4.2, 2.4, 2.0]; circlip_28i = ["circlip_28i", 28, 29.4, 30.1, 1.2, 4.8, 2.9, 2.0]; +circlip_28iw = ["circlip_28iw", 28, 29.4, 30.1, 1.2, 4.8, 2.9, 2.0, 100]; // with wide opening -circlips = [circlip_12i, circlip_15i, circlip_19i, circlip_21i, circlip_28i]; +circlips = [circlip_12i, circlip_15i, circlip_19i, circlip_21i, circlip_28i, circlip_28iw]; use diff --git a/vitamins/linear_bearing.scad b/vitamins/linear_bearing.scad index 73832df..ba427d2 100644 --- a/vitamins/linear_bearing.scad +++ b/vitamins/linear_bearing.scad @@ -36,6 +36,10 @@ function bearing_groove_length(type) = type[4]; //! Groove length function bearing_groove_dia(type) = type[5]; //! Groove diameter function bearing_groove_spacing(type) = type[6]; //! Spacing between grooves, outer to outer, ie includes the grooves themselves +function open_bearing_theta(type) = type[7]; //! For open bearings, the angle of the opening +function open_bearing_width(type) = type[8]; //! For open bearings, the width of the opening at the rod + + function bearing_radius(type) = bearing_dia(type) / 2; //! Outside radius module linear_bearing(type) { //! Draw specified linear bearing @@ -50,21 +54,43 @@ module linear_bearing(type) { //! Draw specified linear bearing gs = bearing_groove_spacing(type); offset = (length-gs)/2; - if(gs==0) { - color(bearing_colour) tube(or = or, ir = casing_ir, h = length); - } else { - translate_z(-length/2) { - color(bearing_colour) tube(or = or, ir = casing_ir, h = offset, center = false); - color(groove_colour) translate_z(offset) tube(or = gr, ir = casing_ir, h = gl,center = false); - color(bearing_colour) translate_z(offset+gl) tube(or = or, ir = casing_ir, h = gs-2*gl, center = false); - color(groove_colour) translate_z(offset+gs-gl) tube(or = gr, ir = casing_ir, h = gl, center = false); - color(bearing_colour) translate_z(offset+gs) tube(or = or, ir = casing_ir, h = offset, center = false); + difference() { + union() { + if(gs==0) { + color(bearing_colour) tube(or = or, ir = casing_ir, h = length); + } else { + translate_z(-length/2) { + color(bearing_colour) tube(or = or, ir = casing_ir, h = offset, center = false); + color(groove_colour) translate_z(offset) tube(or = gr, ir = casing_ir, h = gl,center = false); + color(bearing_colour) translate_z(offset+gl) tube(or = or, ir = casing_ir, h = gs-2*gl, center = false); + color(groove_colour) translate_z(offset+gs-gl) tube(or = gr, ir = casing_ir, h = gl, center = false); + color(bearing_colour) translate_z(offset+gs) tube(or = or, ir = casing_ir, h = offset, center = false); + } + } + rod_r = bearing_rod_dia(type) / 2; + color(seal_colour) + tube(or = casing_ir, ir = rod_r + eps, h = length - 0.5); + + color(seal_colour * 0.8) + tube(or = rod_r * 1.12, ir = rod_r, h = length); + + } + + // Open bearing + if (!is_undef(type[7])) { + rod_r = bearing_rod_dia(type) / 2; + theta = open_bearing_theta(type); + w = open_bearing_width(type) / 2; + h = (w / tan(theta/2)); + // calculate the midpoint of the width + mp = w / tan(asin(w / rod_r)); + + color(groove_colour) + translate([-(h*3) +(h-mp),0,0]) { + mirror([0,1,0]) + right_triangle(h*3, w*3, length + 5); + right_triangle(h*3, w*3, length + 5); + } } } - rod_r = bearing_rod_dia(type) / 2; - color(seal_colour) - tube(or = casing_ir, ir = rod_r + eps, h = length - 0.5); - - color(seal_colour * 0.8) - tube(or = rod_r * 1.12, ir = rod_r, h = length); } diff --git a/vitamins/linear_bearings.scad b/vitamins/linear_bearings.scad index e92ee3a..2791ecd 100644 --- a/vitamins/linear_bearings.scad +++ b/vitamins/linear_bearings.scad @@ -20,25 +20,27 @@ // // Linear bearings // -// L od id gl gd gs -LM16UU = ["LM16UU", 37, 28, 16, 1.6, 27.0, 26.5]; -LM16LUU = ["LM16LUU", 70, 28, 16, 1.6, 27.0, 53.0]; -LM12UU = ["LM12UU", 30, 21, 12, 1.3, 20.0, 23.0]; -LM12LUU = ["LM12LUU", 57, 21, 12, 1.3, 20.0, 46.0]; -LM10UU = ["LM10UU", 29, 19, 10, 1.3, 18.0, 22.0]; -LM10LUU = ["LM10LUU", 55, 19, 10, 1.3, 18.0, 44.0]; -LM8UU = ["LM8UU", 24, 15, 8, 1.1, 14.3, 17.5]; -LM8LUU = ["LM8LUU", 45, 15, 8, 1.1, 14.3, 35.0]; -LM6UU = ["LM6UU", 19, 12, 6, 1.1, 11.5, 13.5]; -LM6LUU = ["LM6LUU", 35, 12, 6, 1.1, 11.5, 27.0]; -LM5UU = ["LM5UU", 15, 10, 5, 1.1, 9.5, 10.2]; -LM5LUU = ["LM5LUU", 28, 10, 5, 1.1, 9.5, 20.4]; -LM4UU = ["LM4UU", 12, 8, 4, 0, 0, 0]; -LM4LUU = ["LM4LUU", 23, 8, 4, 0, 0, 0]; -LM3UU = ["LM3UU", 10, 7, 3, 0, 0, 0]; -LM3LUU = ["LM3LUU", 19, 7, 3, 0, 0, 0]; +// L od id gl gd gs theta, h1 +LM16UU = ["LM16UU", 37, 28, 16, 1.6, 27.0, 26.5]; +LM16LUU = ["LM16LUU", 70, 28, 16, 1.6, 27.0, 53.0]; +LM16UUOP = ["LM16UUOP", 37, 28, 16, 1.6, 27.0, 26.5, 80, 11]; +LM12UU = ["LM12UU", 30, 21, 12, 1.3, 20.0, 23.0]; +LM12LUU = ["LM12LUU", 57, 21, 12, 1.3, 20.0, 46.0]; +LM10UU = ["LM10UU", 29, 19, 10, 1.3, 18.0, 22.0]; +LM10LUU = ["LM10LUU", 55, 19, 10, 1.3, 18.0, 44.0]; +LM8UU = ["LM8UU", 24, 15, 8, 1.1, 14.3, 17.5]; +LM8LUU = ["LM8LUU", 45, 15, 8, 1.1, 14.3, 35.0]; +LM6UU = ["LM6UU", 19, 12, 6, 1.1, 11.5, 13.5]; +LM6LUU = ["LM6LUU", 35, 12, 6, 1.1, 11.5, 27.0]; +LM5UU = ["LM5UU", 15, 10, 5, 1.1, 9.5, 10.2]; +LM5LUU = ["LM5LUU", 28, 10, 5, 1.1, 9.5, 20.4]; +LM4UU = ["LM4UU", 12, 8, 4, 0, 0, 0]; +LM4LUU = ["LM4LUU", 23, 8, 4, 0, 0, 0]; +LM3UU = ["LM3UU", 10, 7, 3, 0, 0, 0]; +LM3LUU = ["LM3LUU", 19, 7, 3, 0, 0, 0]; linear_bearings = [LM3UU, LM4UU, LM5UU, LM6UU, LM8UU, LM10UU, LM12UU, LM16UU]; long_linear_bearings = [LM3LUU, LM4LUU, LM5LUU, LM6LUU, LM8LUU, LM10LUU, LM12LUU, LM16LUU]; +open_linear_bearings = [LM16UUOP]; use diff --git a/vitamins/sbr_rail.scad b/vitamins/sbr_rail.scad new file mode 100644 index 0000000..937a718 --- /dev/null +++ b/vitamins/sbr_rail.scad @@ -0,0 +1,124 @@ +// +// 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 . +// + +// +//! SBR rails +//! +//! The rails are drawn from the center of the rod. +//! `sbr_rail_center_height(type)` can be used to determine where the bottom of the rail is. +// +include <../utils/core/core.scad> +use +use +use +use + +function sbr_rail_diameter(type) = type[1]; //! Diameter of the rod +function sbr_rail_center_height(type) = type[2]; //! Height of the center above the bottom of the rail +function sbr_rail_base_width(type) = type[3]; //! Width of the rail base +function sbr_rail_carriage(type) = type[5]; //! Carriage to use with this rail +function sbr_rail_screw(type) = type[7]; //! Screw to fasten this rail + +module sbr_rail(type , l) { //! Draw an SBR rail + base_colour = grey(70); + screw_colour = grey(10); + d = sbr_rail_diameter(type); + h = sbr_rail_center_height(type); + B = sbr_rail_base_width(type); + T = type[4]; + C = type[8]; + S2 = sbr_rail_screw(type); + + S3 = type[9]; // Screw that fastens the rod to the base + S3L = type[10]; // length of that screw + + h1 = open_bearing_width(sbr_bearing(sbr_rail_carriage(type))); + theta = open_bearing_theta(sbr_bearing(sbr_rail_carriage(type))); + + vitamin(str("sbr_rail(", d, ", ", l, "): SBR", d, " rail, length ", l, "mm")); + + not_on_bom() + no_explode() + rod(d, l, center=true); + + base = (h1/2 + C/2) /2; // guess, not clear from drawings + + color(base_colour) + difference() { + linear_extrude(l - 5, center=true, convexity=2) + translate([0,h-(T/2),0]) + polygon([ + [-h1/2, -T/2], + [-h1/2 - T/2, T/2], + [-B/2, T/2], + [-B/2, -T/2], + [-base, -T/2], + [-d/4, -h+(d/2)], + [d/4, -h+(d/2)], + [base, -T/2], + [B/2, -T/2], + [B/2, T/2], + [h1/2 + T/2, T/2], + [h1/2, -T/2], + ]); + sbr_screw_locations(type, l) + translate([0,h-T+0.01,0]) + rotate([90,0,0]) + cylinder(r=screw_clearance_radius(S3), h=S3L, center=true); + sbr_screw_positions(type, l) + translate([0,T/2,0]) + rotate([90,0,0]) + cylinder(r=screw_clearance_radius(S2), h=T+0.1, center=true); + + } + + not_on_bom() + no_explode() + color(screw_colour) + sbr_screw_locations(type, l) + translate([0,h-T,0]) + rotate([270,0,0]) + screw(S3, S3L); +} + +module sbr_screw_locations(type, l) { //! Linear locations of screws + P = type[6]; + + count = floor(l / P); + first = (l - count * P)/2; + N = first == 0 ? P/2 : first; // we don't want screws right on the edge + + for (x = [N:P:l]) + translate([0,0,l/2 - x]) + children(); +} + +module sbr_screw_positions(type, l) { //! Screw positions + h = type[2]; + T = type[4]; + C = type[8]; + S2 = sbr_rail_screw(type); + + for (x = [-C/2, C/2]) + translate([x,h-T, 0]) + sbr_screw_locations(type, l) + children(); + + +} diff --git a/vitamins/sbr_rails.scad b/vitamins/sbr_rails.scad new file mode 100644 index 0000000..0c8ddec --- /dev/null +++ b/vitamins/sbr_rails.scad @@ -0,0 +1,31 @@ +// +// NopSCADlib Copyright Chris Palmer 2020 +// 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 . +// +include <../core.scad> +include <../vitamins/bearing_blocks.scad> + +// +// SBR Rails +// + +// d h B T carriage P S2 C S3 S3L +SBR16S = ["SBR16S", 16, 25, 40, 5, SBR16UU, 150, M5_cap_screw, 30, M5_cap_screw, 18 ]; + +sbr_rails = [SBR16S]; + +use