feat: end cap

This commit is contained in:
2024-02-24 19:14:16 +01:00
commit e5b26e0ee0
4 changed files with 160 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.stl

46
README.md Normal file
View File

@@ -0,0 +1,46 @@
# Parametric Monorail
## Design differences
Injection molding has vastly different requirements to 3d printing.
Due to this the original rails print absolutely horribly due to the copious amounts of supports needed.
Surfaces printed on supports just never look good.
Because of that, I decided to instead of having a support part on the bottom, I'd carve out space for
two stacked 1x2 plates, as well as a special two-high printable brick you can use for compatibility with the
old support mounts.
_These are 3d printing optimized, compatible rails, not replicas. Replicas print horribly due to support._
## Printing
To be compatible with standard bricks, the following print settings are recommended
- Nozzle: 0.4, this is equivalent to 1 LDU.
- Layer height: 0.1, though 0.2 will also do. Refrain from using 0.15, since that does not cleanly divides the LDU.
- Supports: Tree (normal supports may print faster, but lead to way worse results. But ymmv).
My prints were done on a modified SecKit SK-Go2 running Klipper, with 10k acceleration and 150mm/s print speed for a good
balance of speed and quality. A short rail will take about an hour to print.
### Filament
| Color | RAL Color | Pantone | PLA | ABS |
| ----------------- | ---------- | ------- | ----------------------------------------------------------------------------------------------------------- | --- | --- |
| Light Bluish Gray | `RAL 7040` | | [dasfilament 20,56€/kg](https://www.dasfilament.de/filament-spulen/pla-1-75-mm/8/pla-filament-1-75-mm-grau) | |
| Light Gray | `RAL 7005` | | | | |
- None of these colors will be an exact match, just the texture of 3d printing it can make a huge difference, but usually fall close enough in the range.
- The original rails will be in _Light Gray_, not _Light Bluish Gray_, but since I barely own any pre- 2004 color change bricks I chose to match my other bricks instead.
- Most bricks are injection molded from ABS, however I find PLA to be much more easy and safe to handle.
- PLA starts to deform at 60°C, so don't leave it in the sun or in your car.
- PLA is brittle. While ABS deforms with force applied to it, PLA will just snap.
- ABS is harder to print, an enclosure is a must, and warping can be difficult to handle.
#### Printing Safety
In case you are new to 3D printing:
- Most filaments (including PLA) release toxic gases when _burned_
- FDM printing can cause fine particle emission
- ABS when heated to normal printing temperatures can release styrene fumes

1
lib/BOSL Submodule

Submodule lib/BOSL added at 4ce427a8a3

112
track.scad Normal file
View File

@@ -0,0 +1,112 @@
include <lib/BOSL/shapes.scad>;
include <lib/BOSL/transforms.scad>;
include <lib/BOSL/constants.scad>;
$LDU=0.4;
$stud=12 * $LDU;
$studHeight=4 * $LDU;
$tile=20 * $LDU;
$plate=8 * $LDU;
$studBrim=$tile - $stud;
$studSupport=8 * $LDU;
$fillet=$LDU / 2;
$edgeTolerance=$LDU / 2;
$len = 20;
//translate([28.75, -232, -5.75]) rotate([0, 0, 90]) import("straight.stl");
$baseHeight = $tile;
$baseWidth = 4 * $tile;
$teeth = 5;
$teethTolerance = $LDU;
$teethRailWidth = 10 * $LDU;
$teethWidth = $tile / $teeth;
$teethDepth = 3 * $LDU;
module tooth() {
$height = $teethWidth - $teethTolerance;
$rail = $teethRailWidth / 2;
$topY = $height / 2;
$midY = $teethTolerance / 2;
$endX = $rail + $teethDepth;
translate([0, $teethWidth / 2, 0]) linear_extrude($plate) polygon(points=[
[$rail, $topY],
[$endX, $midY],
[$endX, -$midY],
[$rail, -$topY],
[-$rail, -$topY],
[-$endX, -$midY],
[-$endX, $midY],
[-$rail, $topY]
]);
}
module brickSlot(w=1, l=1, h=3) {
cuboid([$tile * w, $tile * l, $plate * h], align=V_DOWN);
mirror_copy([1, 0, 0])
mirror_copy([0, 1, 0])
translate([$tile / 2, $tile / 2, 0])
cyl(d=$fillet, h=$plate * h, align=V_DOWN, $fn=12);
difference () {
cuboid([$stud+2*$LDU, $stud+2*$LDU, $studHeight], align=V_TOP);
mirror_copy([1, -1, 0])
mirror_copy([1, 0, 0])
translate([$stud / 2, 0, 0])
cyl(d=2*$LDU, h=$studHeight, align=V_TOP+V_RIGHT, $fn=12);
}
mirror_copy([1, 0, 0])
mirror_copy([0, 1, 0])
translate([$stud/2+$LDU, $stud/2+$LDU, 0])
cyl(d=$fillet, h=$studHeight, align=V_TOP, $fn=12);
}
module endCap() {
$width = $baseWidth - $plate * 2;
union() {
difference() {
union() {
cuboid([$width, $tile * 2, $tile], edges=EDGE_BOT_FR+EDGE_BOT_RT+EDGE_BOT_LF);
mirror_copy([0, 1, 0])
translate([0, $tile / 2, 0])
cyl(l=$width + $studHeight * 2, d=$stud, orient=ORIENT_X, $fn=24);
translate([$tile, -$tile, 0]) cuboid([8 * $LDU, $LDU, $tile], align=V_RIGHT+V_FRONT);
}
mirror_copy([1, 0, 0])
mirror_copy([0, 1, 0])
translate([$width / 2, $tile / 2, 0])
torus(d2=$edgeTolerance, d=$stud, orient=ORIENT_X, $fn=24);
translate([$plate, $tile / 2, $tile - $LDU]) cube([$LDU, $tile, $LDU]);
translate([$width + $plate - $LDU, $tile / 2, $tile - $LDU]) cube([$LDU, $tile, $LDU]);
mirror_copy([1, 0, 0])
translate([$tile / 2, -$tile / 2, $tile / 2 - $plate])
brickSlot();
translate([-$tile, -$tile, 0]) cuboid([8 * $LDU, $LDU, $tile], align=V_LEFT+V_BACK);
place_copies([[-$tile, -$tile + $LDU], [$tile + 8 * $LDU, -$tile, 0]])
mirror_copy([1, 0, 0], cp=[-4 * $LDU, 0, 0])
cyl(d=$fillet, h=$tile, $fn=12);
}
translate([0, $teethTolerance / 2, $tile / 2]) cuboid([$teethRailWidth, $tile * 2 - $teethTolerance, $plate], align=V_TOP);
translate([0, -$tile, $tile / 2]) group() {
for (i = [0:(2 * $teeth - 1)]) {
translate([0, i * $teethWidth, 0]) tooth();
}
};
}
}
endCap();