diff --git a/README.md b/README.md index 5ce6766..c59c1df 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,121 @@ -# create-svelte +# Brick Monorail -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte). +Parametric Lego-compatible monorail tracks, designed specifically for 3d printing. +Two orders of magnitude cheaper than buying used. -## Creating a project +Since the parts are made parametric, you can have any length or curve radius you want, +but these are the original tracks you can replicate -If you're seeing this, you've probably already done this step. Congrats! +As an overview, or why it's worth a try: They print rapidly on modern printers, and cost barely anything. -```bash -# create a new project in the current directory -npm create svelte@latest +| Preset | Cost | Time | Image | +| ----------------------------- | ----- | ---- | -------------------------------------------------------------------------------- | +| C15 | ~10ct | 45m | ![C15](./assets/generated/C15.png) | +| C7 | ~5ct | 15m | ![C7](./assets/generated/C7.png) | +| S25 | ~12ct | 1h | ![S25](./assets/generated/S25.png) | +| S10 | ~5ct | 15m | ![S10](./assets/generated/S10.png) | +| S5 | ~5ct | 15m | ![S5](./assets/generated/S5.png) | +| S4 | ~5ct | 15m | ![S4](./assets/generated/S4.png) | +| Classic Full Curve (R28 90°) | ~25ct | 2h | ![Classic Full Curve](./assets/generated/Classic%20Full%20Curve.png) | +| Classic Half Curve (R28 45°) | ~12ct | 1h | ![Classic Half Curve](./assets/generated/Classic%20Half%20Curve.png) | +| Classic Full Straight (L32) | ~20ct | 1.5h | ![Classic Full Straight](./assets/generated/Classic%20Full%20Straight.png) | +| Classic Half Straight (L16) | ~10ct | 45m | ![Classic Half Straight](./assets/generated/Classic%20Half%20Straight.png) | +| Classic Quarter Straight (L8) | ~5ct | 15m | ![Classic Quarter Straight](./assets/generated/Classic%20Quarter%20Straight.png) | -# create a new project in my-app -npm create svelte@latest my-app -``` +You can also generate your own custom rails with any length, radius or angle. -## Developing +Todo: ramps, switches, train assembly -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: +## Design differences -```bash -npm run dev +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. -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` +Because of that, I decided to instead of having a support part on the bottom, I'd carve out space for +a 1x2 plate, which you can fit there for the same effect. -## Building +The monorail tracks are also solid now, which is not something you can do in injection molding but leaves +a really nice surface finish at the bottom of the rail for us. -To create a production version of your app: +For now, I also use non-baseplate aligned joints for curves. While this means you can't just snap the rails +on a baseplate, it enables you to use straight rails at non-90 degree angles which I think is an absolute +win over the original design since the 45 degree curves are useless outside of joining them with switches. -```bash -npm run build -``` +_These are 3d printing optimized, compatible rails, not replicas. Replicas print horribly due to support._ -You can preview the production build with `npm run preview`. +### Optional Differences -> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. +#### Operating on r25 instead of r28 + +What difference do these three studs make? +With this radius we can take advantage of the pythagorean triples `3/4/5` and `7/24/25` to stay on the stud +grid with turntables. + +- Curve C15 +- Curve C7 +- Straight S25 +- Straight S10 +- Straight S5 +- Straight S4 + +How it fits + +- Two C15 and one C7 make exactly a 90 degree turn, where every part stays on the stud grid. +- An s-curve with C15 moves over 20 studs, diagonals can be done with any length divisible by 5 +- An s-curve with C7 moves two studs, but diagonals require a full S25 to land cleanly again. + +![](./assets/r25.svg) + +## Printing + +To be compatible with standard bricks, the following print settings are strongly advised + +- Nozzle: **0.4**, this is equivalent to 1 LDU. +- Layer height: **0.2**, less than that is barely better and just causes more problems than it solves. + If you want to go lower, it's advisable to use heights that satisfy `0.4 % h == 0` such as 0.1. + - **Make sure your initial layer height is either 0.2 or 0.4!** +- Supports: **yes**, normal, don't use tree supports. +- Set your "Initial Layer Horizontal Expansion" to a value that works for you, for example -0.2mm to compensate for elephant's foot. + Alternatively, you can trim the extra plastic off by hand. + +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. + +### Inserts + +_This is optional and increases difficulty and print time, but I highly recommened it._ + +Studs and anti-studs print rather inconsistently at the orientation of the rail. +To combat that, I added the option to pre-print stud and anti-stud inserts at perfect orientation and insert them mid-print. +Because the layer is immediately covered up, the plastic will adhere like it would if it was printed in one go. + +This also allows you to pre-select the best inserts without having to print a full rail only to have one bad stud. + +- In Cura, insert a "Pause at layer" at the last layer where the insert spots are not covered yet. +- If you use Klipper, use "Search and replace" with `; LAYER:32` to `; LAYER:32\nPAUSE`. + +### Filament + +| Color | RAL | PLA Supplier | ABS Supplier | +| ----------------- | ---------- | ------------ | ------------ | +| Light Bluish Gray | `RAL 7040` | dasfilament | | +| 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. + +_Notes for newcomers:_ + +- 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) can 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/assets/generated/AntiStudInsert.png b/assets/generated/AntiStudInsert.png index e69de29..929334f 100644 Binary files a/assets/generated/AntiStudInsert.png and b/assets/generated/AntiStudInsert.png differ diff --git a/assets/generated/C15.png b/assets/generated/C15.png index e69de29..de6c02d 100644 Binary files a/assets/generated/C15.png and b/assets/generated/C15.png differ diff --git a/assets/generated/C7.png b/assets/generated/C7.png index e69de29..bd37754 100644 Binary files a/assets/generated/C7.png and b/assets/generated/C7.png differ diff --git a/assets/generated/Classic Full Curve.png b/assets/generated/Classic Full Curve.png index e69de29..a2f3e7b 100644 Binary files a/assets/generated/Classic Full Curve.png and b/assets/generated/Classic Full Curve.png differ diff --git a/assets/generated/Classic Full Straight.png b/assets/generated/Classic Full Straight.png index e69de29..01249ad 100644 Binary files a/assets/generated/Classic Full Straight.png and b/assets/generated/Classic Full Straight.png differ diff --git a/assets/generated/Classic Half Curve.png b/assets/generated/Classic Half Curve.png index e69de29..a2f3e7b 100644 Binary files a/assets/generated/Classic Half Curve.png and b/assets/generated/Classic Half Curve.png differ diff --git a/assets/generated/Classic Half Straight.png b/assets/generated/Classic Half Straight.png index e69de29..2886ea8 100644 Binary files a/assets/generated/Classic Half Straight.png and b/assets/generated/Classic Half Straight.png differ diff --git a/assets/generated/Classic Quarter Straight.png b/assets/generated/Classic Quarter Straight.png index e69de29..fddce6d 100644 Binary files a/assets/generated/Classic Quarter Straight.png and b/assets/generated/Classic Quarter Straight.png differ diff --git a/assets/generated/S10.png b/assets/generated/S10.png index e69de29..a8531e5 100644 Binary files a/assets/generated/S10.png and b/assets/generated/S10.png differ diff --git a/assets/generated/S25.png b/assets/generated/S25.png index e69de29..f276239 100644 Binary files a/assets/generated/S25.png and b/assets/generated/S25.png differ diff --git a/assets/generated/S4.png b/assets/generated/S4.png index e69de29..8b80ed4 100644 Binary files a/assets/generated/S4.png and b/assets/generated/S4.png differ diff --git a/assets/generated/S5.png b/assets/generated/S5.png index e69de29..11df8c7 100644 Binary files a/assets/generated/S5.png and b/assets/generated/S5.png differ diff --git a/assets/generated/StudInsert.png b/assets/generated/StudInsert.png index e69de29..50c8757 100644 Binary files a/assets/generated/StudInsert.png and b/assets/generated/StudInsert.png differ diff --git a/assets/generated/Switch R25.png b/assets/generated/Switch R25.png index e69de29..dcbee07 100644 Binary files a/assets/generated/Switch R25.png and b/assets/generated/Switch R25.png differ diff --git a/track.scad b/track.scad index 9263295..b8ff60e 100644 --- a/track.scad +++ b/track.scad @@ -1,7 +1,7 @@ include ; /* [Print Settings] */ -Tolerance = 0.2; +Tolerance = 0.4; // Mid-print stud inserts allowing the studs to be printed facing up seperately StudInserts = true; // Mid-print slot inserts eliminating the need for supports @@ -69,10 +69,10 @@ module antiStudInsert(carve=true, depth=$studHeight * 2, supportHeight=$LDU * 4, difference() { union() { cube([$tile * 2, $tile, depth + supportHeight], anchor=FRONT+BOTTOM); - translate([0, $tile + supportWidth + (carve ? 0 : $LDU / 2), 0]) + translate([0, $tile + supportWidth + (carve ? 0 : Tolerance), 0]) cube([ - $tile * 2 + supportWidth + (carve ? 0 : $LDU), - supportWidth + $tile * 0.6 + (carve ? 0 : $LDU), + $tile * 2 + supportWidth + (carve ? 0 : Tolerance * 2), + supportWidth + $tile * 0.6 + (carve ? 0 : Tolerance * 2), depth + supportHeight ], anchor=BACK+BOTTOM); } @@ -97,9 +97,9 @@ module studInsert(carve=true, supportThickness = $LDU * 4) { cube([supportThickness, $tile + $stud, $stud], anchor=RIGHT); translate([-supportThickness, 0, $stud / 2]) cube([ - supportThickness + (carve ? 0 : $LDU), - $tile + $stud + $LDU + (carve ? 0 : $LDU), - $stud + $LDU * 1.5 + (carve ? 0 : $LDU) + supportThickness + (carve ? 0 : Tolerance * 2), + $tile + $stud + $LDU + (carve ? 0 : Tolerance * 2), + $stud + $LDU * 1.5 + (carve ? 0 : Tolerance * 2) ], anchor=RIGHT+TOP); } @@ -341,6 +341,7 @@ module monorailSwitch() { } } +union() { if (Type == "rail") { if (Angle == 0) monorailStraight(); @@ -357,6 +358,7 @@ if (Type == "rail") { translate([0, 55, 0]) cube([100, 60, 100], FRONT); } } +} // endCapStraight();