commit e5b26e0ee09819a301006e01b303022a3d776864 Author: Thea Schöbl Date: Sat Feb 24 19:14:16 2024 +0100 feat: end cap diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1567411 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.stl diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed35590 --- /dev/null +++ b/README.md @@ -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 diff --git a/lib/BOSL b/lib/BOSL new file mode 160000 index 0000000..4ce427a --- /dev/null +++ b/lib/BOSL @@ -0,0 +1 @@ +Subproject commit 4ce427a8a38786e5f74b728c1e33d9fe7d4904d2 diff --git a/track.scad b/track.scad new file mode 100644 index 0000000..c3912b8 --- /dev/null +++ b/track.scad @@ -0,0 +1,112 @@ +include ; +include ; +include ; + +$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();