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 |
+
+
+
+### 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