Sand table v3: build fixes, bolted hub, counterweight, print guide
- print/ reorganised: v1-original (first export), v2-current, the v2.1-v2.7 fixes found while building, and v3/ with every printed part. - v3: deck screws you can reach, seam joints from outside, arm bolted straight to the hub, 6804 hub bearings with a 15 mm bore for connectors, clamp collar, counterweight, 12.5 mm sand ring for a raised floor, Uno turnaround plate. - print/README.md: full v3 parts list, what changed and why, assembly order. - docs/: diagrams for each change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No files matched your search
@@ -5,3 +5,6 @@
|
||||
.DS_Store
|
||||
*.swp
|
||||
*~
|
||||
|
||||
# Python
|
||||
__pycache__/
|
||||
@@ -2,8 +2,10 @@
|
||||
|
||||
A 12" kinetic sand table that draws patterns in sand. A steel ball rolls under glass, pulled by a magnet on a polar arm underneath. The case is about 12.5" across and 5" tall. The parts are 3D-printed for a Bambu P1S and designed in SolidCraft.
|
||||
|
||||
- `sand-table-v2.solidcraft`: the printable design. Bodies named `REF_*` are bought parts, modeled for fit only.
|
||||
- `sand-table-v2-assembly.step`: the full assembly, for viewing in any CAD tool.
|
||||
- `print/`: STL files for every printed part, numbered in print order. Print `00-fit-test-coupon` first.
|
||||
- `sand-table-v3.solidcraft`: the printable design (latest). Bodies named `REF_*` are bought parts, modeled for fit only. `sand-table-v2.solidcraft` is the previous version.
|
||||
- `print/v3/`: STL files for every printed part of the v3 build. **Use this set.** Print `00b-fit-test-6804` first. `print/README.md` has the parts list, print notes and assembly order; the older folders are kept for reference.
|
||||
- `software/`: the pattern player. Start it with `python3 -m sandtable web` for a web page with a library of designs; it drives the table from a computer over USB and erases between patterns. See `software/README.md`.
|
||||
- `pcb/`: an optional custom controller board (ESP32 + 2× DRV8825, FluidNC) that fits the Uno standoffs, with PCBWay order files. See `pcb/README.md`.
|
||||
- `sand-table-v2-assembly.step`: the v2 assembly, for viewing in any CAD tool.
|
||||
- `design-notes.md`: how it works, dimensions, parts to buy, hardware list and print settings.
|
||||
- `sand-table-v1.solidcraft`, `mechanism-mockups.solidcraft`: earlier layout and mechanism studies.
|
||||
@@ -1,8 +1,9 @@
|
||||
# Sand table: design notes
|
||||
|
||||
- **Printable design:** `sand-table-v2.solidcraft`. Bodies named `REF_*` are bought or on-hand parts, modeled only for fit.
|
||||
- **Printable design:** `sand-table-v3.solidcraft` (latest; `sand-table-v2.solidcraft` is kept as it was). Bodies named `REF_*` are bought or on-hand parts, modeled only for fit.
|
||||
- **Older files:** `sand-table-v1.solidcraft` (first layout) and `mechanism-mockups.solidcraft` (A vs B blocks).
|
||||
- **Print files:** `print/`
|
||||
- **Print files:** `print/README.md` has the full v3 parts list and says which folder each part comes from.
|
||||
- **Custom controller board (optional):** `pcb/`
|
||||
|
||||
## Size
|
||||
- 318 mm (12.5") across, about 129 mm (5.1") tall, plus stick-on feet.
|
||||
@@ -13,46 +14,61 @@
|
||||
- The pancake NEMA17 hangs under the center plate on 9 mm posts. Its screw slots allow ±3 mm for belt tension.
|
||||
- A 20T pulley drives the printed 80T hub pulley (4:1) through a 200 mm closed GT2 loop, at a 46 mm center distance.
|
||||
- **Hub:**
|
||||
- One printed part: the 80T pulley, the arm plate, and a hollow shaft (8 mm OD, 4.5 mm bore).
|
||||
- The shaft turns in 2× 608 bearings, set back-to-back in the center plate's housing, which has a lip between them.
|
||||
- The slip-ring adapter is glued on the shaft bottom and presses up on the lower bearing, which locks the shaft in place.
|
||||
- One printed part: the 80T pulley, the arm plate, and a hollow shaft (20 mm OD, **15 mm bore**, v3). Connectors (4-pin JST-XH, 6-pin JST-PH or Dupont 1×4) pass through the bore one at a time.
|
||||
- The shaft turns in 2× 6804 bearings (20 × 32 × 7), set back-to-back in the center plate's housing, which has a lip between them. Before v3 it was an 8 mm shaft in 2× 608s.
|
||||
- A clamp collar (part 11, one M3 pinch screw) on the shaft bottom presses up on the lower bearing's inner ring and locks the shaft in place. Loosen it and the hub lifts out.
|
||||
- **Slip ring:**
|
||||
- The rotor flange screws to the adapter (3× M3). The rotor wires go up the shaft bore, out a groove in the arm plate, and along the extrusion's side slot.
|
||||
- The stator body hangs below. A printed collar's tab rides in a fork on the center plate, which stops the body from turning.
|
||||
- **On the Comidox ring, the flange and body are one fixed housing (the stator). Only the center boss around the top wires turns (the rotor).** This was confirmed while building, 2026-10-25.
|
||||
- A printed coupler (part 26, `print/v3`) pegs into the clamp collar's 3 holes (12.5 mm radius). Its 1 mm socket holds the rotor boss (gel CA on the socket wall only), and the boss bottoming in it leaves the flange 0.5 mm clear. The slip ring now sits 3 mm lower than before.
|
||||
- The flange is not screwed to anything.
|
||||
- **Wiring (v3, bolted arm):** the arm motor cable and switch wires run along the extrusion's wire-side slot, across a groove on top of the hub (6 × 4.5 mm), and down the hub's 15 mm bore. Their plugs meet the slip ring's top-wire plugs under the hub, and the joined plugs push up inside the bore. Dupont 2.54 mm pairs: 4-pin (motor) and 2-pin (switch).
|
||||
- A printed holder (part 27) holds the housing still. Its cup surrounds the body with the flange resting on it, a peg sits in one flange hole, and its sleeve fits over the end of the post and is held by an M3×16 (v3; it was glued before). It replaced the stator collar, which only stopped rotation and let the housing flop. In v3 the post moved out to x 23.5–29, clear of the collar's pinch-screw lug, which reaches 21.1 mm from the center.
|
||||
- **Arm:**
|
||||
- 2020 T-slot, **220 mm long**, from x -80 to +140, bolted to the hub with 2× M5 T-nuts.
|
||||
- 2020 T-slot, **220 mm long**, from x -80 to +140.
|
||||
- It bolts straight down onto the hub's arm plate with 2× M5×12 socket heads, 17 mm each side of the center, from under the hub into T-nuts in the bottom slot (v3; the glued mounts `29`/`29b`/`29c` are gone). The arm and hub are built together on the bench and go into the table as one piece; the hub lifts out after loosening the clamp collar.
|
||||
- **Counterweight (part 34, v3):** bolted under the far half with 2× M5×10 (T-nuts at 66 and 102 mm from the center). Two pockets beside the rail on the wire side hold stacks of US quarters (24.3 mm, up to 8 each) under a screwed lid (part 35, 3× M3×8). About 7 quarters in the outer pocket balance the arm with the carriage halfway out; fine-tune by balancing the rail on a pencil at the hub center. Estimated imbalance before: 12 kg·mm with the carriage home, 7 halfway, 2 at the rim (arm motor taken as 140 g).
|
||||
- A 1 mm shim (part 30) sits between the motor bracket and the rail.
|
||||
- The in/out motor hangs upside down behind the back end on a printed bracket (T-nuts in the bottom slot).
|
||||
- The tip idler is a 608 in a printed flanged sleeve, on a printed 8 mm pin. No M8 bolt is needed.
|
||||
- The sleeve's belt groove is 7 mm for the 6 mm belt (`print/v2.6-idler-sleeve`). The first sleeve's groove was exactly 6 mm and dragged on the belt.
|
||||
- **Carriage:**
|
||||
- It rolls on 4× 608s on the upper lands of the extrusion's side faces. On the −y side the two rollers sit on flexure blades with 0.3 mm preload, so there's no slop.
|
||||
- The belt ends clamp into a toothed slot.
|
||||
- The magnet sits in a drop-in cup, 25 mm ahead of the carriage center. With a 1 mm felt pad on top, it touches the plexi floor.
|
||||
- **Homing:** a microswitch on top of the extrusion's back end. The carriage reaches it at rho ≈ 2, and its body is the rho-0 hard stop.
|
||||
- **Homing:**
|
||||
- A KW12 microswitch with a straight hinged lever sits on top of the extrusion's back end, turned so the lever faces the carriage (v2.1 mount).
|
||||
- A glue-on striker on the carriage presses the lever; it trips near rho 1–5, depending on the lever.
|
||||
- The end of the switch mount is the rho-0 hard stop. The switch body sits 0.5 mm behind it.
|
||||
- Set FluidNC `mpos_mm` so Y0 sits about 0.5 mm in front of the stop.
|
||||
- **Electronics:**
|
||||
- The Arduino Uno + CNC shield hangs upside down (components facing down) under the deck at 45°, on 4 printed standoffs, with the USB edge toward the wall.
|
||||
- The Arduino Uno + CNC shield hangs upside down (components facing down) under the deck at 45°. On the v3 deck it hangs from the turnaround plate (part 36, 2026-11-01), with the USB edge toward the centre. The deck's own standoffs put the USB edge 2.4 mm from the wall, too close for a plug.
|
||||
- Cables leave through a notch in the bottom of the wall. The bottom is open for access.
|
||||
|
||||
## Heights (z from the ground, mm)
|
||||
| Part | z |
|
||||
|---|---|
|
||||
| Slip ring body / flange | 19.8–34.8 / 34.8–36 |
|
||||
| Adapter | 36–42 |
|
||||
| Hub bearings | 42–49, 53–60 |
|
||||
| Slip ring body / flange / boss | 16.8–31.8 / 31.8–33 / 33–34.5 |
|
||||
| Coupler | 33.5–36 |
|
||||
| Clamp collar | 36–42 |
|
||||
| Hub bearings (6804) | 42–49, 53–60 |
|
||||
| Deck shelf | 51–56 |
|
||||
| Center plate | 56–60 |
|
||||
| Spin motor | 24.5–47 (shaft tip 71) |
|
||||
| Hub pulley | 60.5–69.5 |
|
||||
| Arm plate | 69.5–73 |
|
||||
| In/out belt | 70.5–76.5 |
|
||||
| Extrusion | 73–93 |
|
||||
| Arm plate | 69.5–74 (v3; was 73 + a 1 mm strip) |
|
||||
| Counterweight / lid | 63.5–80.5 / 80.5–82.5 |
|
||||
| In/out belt | 71.5–77.5 |
|
||||
| Extrusion | 74–94 |
|
||||
| Arm motor | 82–104.5 |
|
||||
| Rollers | 85.5–92.5 |
|
||||
| Carriage plate | 93–98 |
|
||||
| Rollers | 86.5–93.5 |
|
||||
| Carriage plate | 94–99 |
|
||||
| Magnet top / felt | 105.5 / 106.5 |
|
||||
| Plexi floor | 106.5–109.7 |
|
||||
| Sand gap | 16 |
|
||||
| Glass top / rim | 128.85 |
|
||||
|
||||
**Raised floor (this build, 2026-10-31):** the plexi floor sits on about 3.5 mm rubber stoppers on the ledge. That clears the magnet stack and stops the floor shifting. With it, use the 12.5 mm sand ring (`print/v3/21–24 …-12.5mm.stl`) so the glass stays flush with the rim. The sand gap becomes 12.5 mm: fine for a 3/8" or 5/16" ball, too small for a 1/2" one.
|
||||
|
||||
## Motor (pancake NEMA17, from the user's drawing)
|
||||
- **Body:** 42 × 42 × 22.5 ±0.8.
|
||||
- **Face:** boss Ø22 × 2; 4× M3 on a 31 mm square, 2.5 mm deep.
|
||||
@@ -64,7 +80,8 @@
|
||||
- `shaft_d` = **8.1**: every printed 8 mm shaft or pin that goes into a 608 (hub shaft, roller pins, idler pin).
|
||||
- 7.9 and 8.0 fell on and off; 8.1 grips.
|
||||
- The parts were re-exported after this change: 10 hub, 11 slip-ring adapter, 15 idler bracket, 17 carriage.
|
||||
- `brg_d` = **22.2**: every 608 pocket (center plate, idler sleeve).
|
||||
- `shaft2_d` = **20.1** (v3, not yet tested): the hub shaft into the 6804s. `brg2_d` = **32.2**: the center plate's 6804 pockets. Check both with `00b-fit-test-6804` and re-export the center plate and hub if another size fits better.
|
||||
- `brg_d` = **22.2**: every 608 pocket (idler sleeve; the center plate before v3).
|
||||
- 22.4 was loose, 22.2 a snug push, 22.0 too tight.
|
||||
- If the idler sleeve ever slips on its bearing, add a drop of CA.
|
||||
|
||||
@@ -73,13 +90,14 @@
|
||||
- 2× GT2 20T pulley (5 mm bore)
|
||||
- open GT2 belt (about 0.5 m)
|
||||
- 2020 T-slot (needs 220 mm)
|
||||
- 7× 608: 2 hub, 4 carriage, 1 idler
|
||||
- 7× 608: 4 carriage, 1 idler, 2 spare (the hub used them before v3)
|
||||
- Arduino Uno + CNC shield
|
||||
|
||||
## To buy
|
||||
- Slip ring: Comidox 12.5 mm capsule, 6 wires, 2 A. It carries 4 wires for the arm motor and 2 for the home switch.
|
||||
- Rotor: flange Ø24 × 1.2 with 3× Ø3.2 holes on an Ø18 circle, plus a Ø5 × 1.5 boss.
|
||||
- Stator: body Ø12.5 × 15.
|
||||
- 2× 6804-2RS bearing (20 × 32 × 7, also sold as 61804) for the hub (v3)
|
||||
- GT2 closed loop, 200 mm × 6 mm
|
||||
- 12" round glass, 1/8"
|
||||
- 12" round plexi disc, 1/8" (white or frosted)
|
||||
@@ -89,36 +107,50 @@
|
||||
- Felt pad (self-adhesive)
|
||||
- 4 rubber feet
|
||||
- 12 V 2 A power supply
|
||||
- KW12-style microswitch (20 × 10 × 6.4)
|
||||
- KW12 microswitch with a straight hinged lever (KW12-B, the 1.1" lever is best; about 20 × 10.5 × 6.5), not the roller version
|
||||
- Optional: TMC2208/2209 drivers (quieter)
|
||||
- Optional: 8 mm × 0.5 mm brass tube (spare shaft)
|
||||
|
||||
## Hardware
|
||||
| Qty | Part | Where |
|
||||
|---|---|---|
|
||||
| 8 | M3×16 + M3 nut | shell seam joints (2 per seam) |
|
||||
| 16 | M3×8 | deck → wall ledge (8); center plate → deck (8) |
|
||||
| 4 | M3×12 | spin motor (through the counterbored slots) |
|
||||
| 4 | M3×6 | arm motor → bracket |
|
||||
| 3 | M3×6 | slip ring flange → adapter |
|
||||
| 5 | M3×8 | roller washers (4), idler washer (1) |
|
||||
| 4 | M3×6 | Uno → standoffs |
|
||||
| 7 | M5 + slot-6 T-nut | hub 2× M5×12, idler bracket 2× M5×12, motor bracket 2× M5×8, switch mount 1× M5×8 |
|
||||
| 2 | M2×8 | microswitch |
|
||||
| Qty | Part | Head | Where |
|
||||
|---|---|---|---|
|
||||
| 16 | M3×8 + M3 hex nut | button head (ISO 7380) | shell seams, from outside (4 per seam); nuts drop into the seam plates' slots (v3) |
|
||||
| 8 | M3×12 | button head | deck → shell bosses, straight down (v3) |
|
||||
| 8 | M3×8 | button head (ISO 7380) | center plate → deck |
|
||||
| 2 | M3×12 or ×16 | button or socket | hub clamp collar pinch screw (1), slip-ring holder → post (1, M3×16) (v3) |
|
||||
| 4 | M3×12 | socket head | spin motor (flush in the 6.4 mm × 3 mm counterbored slots) |
|
||||
| 4 | M3×6 | socket head | arm motor → bracket |
|
||||
| 5 | M3×8 | button head | roller washers (4), idler washer (1) |
|
||||
| 8 | M3×6 | button head (4) + socket head (4) | turnaround plate `36` → deck standoffs (4, button heads in counterbores); Uno / controller board → plate standoffs (4) |
|
||||
| 9 | M5 + slot-6 drop-in T-nut | socket head (DIN 912) | idler bracket 2× M5×12 and hub 2× M5×12 (both in 9.5 mm counterbores), motor bracket 2× M5×8 (or ×10 with the 1 mm shim), switch mount 1× M5×8, counterweight 2× M5×10 (in 9.5 mm counterbores) |
|
||||
| 3 | M3×8 | button head | counterweight lid (v3) |
|
||||
| 2 | M2×8 | pan head, Phillips | microswitch, only with the `v2.1` mount. The `v2.5` peg mount needs no screws; the switch is glued onto 2 pegs. |
|
||||
|
||||
Glue: CA for the slip-ring adapter on the shaft, the magnet cup in the carriage, and the magnets.
|
||||
Head and length notes (checked against the model, 2026-10-24):
|
||||
- **Center plate screws need low heads:** the motor bracket's M5 heads sweep over them with 2.8 mm to spare with button heads, or 1.5 mm with socket heads.
|
||||
- **Slip-ring flange:** not screwed down. The flange is part of the fixed housing; see "How it works".
|
||||
- **M5 length into 2020:** the slot is about 6 mm deep before the solid center, so a screw must not reach more than about 6 mm past the face it clamps.
|
||||
- **Substitutes that also fit:**
|
||||
- Button heads for any M3 socket head except the slip ring.
|
||||
- M5×10 instead of M5×8 with 1 mm washers under the head: 1 each on the motor bracket, 2 on the switch mount.
|
||||
- M5×13 instead of M5×12, socket head only. M5 button heads are 9.5 mm across and won't fit the 9.5 mm counterbores.
|
||||
- **Tools:** 2, 2.5 and 4 mm hex keys and a #0 Phillips screwdriver.
|
||||
|
||||
## Print files (`print/`)
|
||||
Glue: CA for the coupler on the slip ring's spinning center, the magnet cup in the carriage, and the magnets. Nothing in the arm or hub is glued (v3).
|
||||
|
||||
## Print files (v2 set, `print/v2-current/`)
|
||||
For v3, use the "Full parts list (v3)" in `print/README.md`; it replaces this table.
|
||||
| File | Qty | Notes |
|
||||
|---|---|---|
|
||||
| 00-fit-test-coupon | 1 | Print first. Set `shaft_d` / `brg_d` from it, then re-export the parts below. |
|
||||
| 01–04 shell Q1–Q4 | 1 each | Q1 has the cable notch. Joint screws go at the 4 seams. |
|
||||
| 05–08 deck Q1–Q4 | 1 each | Q1 has the Arduino standoffs and goes under Shell Q1 (the 45° side). |
|
||||
| 05–08 deck Q1–Q4 | 1 each | Q1 has the Arduino standoffs and goes under Shell Q1 (the 45° side). Use the `v2-current` copy: the standoffs in `v1-original` are mirrored. |
|
||||
| 09 center plate | 1 | Bearing housing, spin-motor posts, slip-ring fork |
|
||||
| 10 hub 80T pulley | 1 | PETG; arm plate on the bed |
|
||||
| 11 slip-ring adapter, 12 stator collar | 1 each | |
|
||||
| 13 arm motor bracket | 1 | Needs tree supports |
|
||||
| 14 switch mount, 15 idler bracket, 16 idler sleeve | 1 each | |
|
||||
| 14 switch mount, 15 idler bracket, 16 idler sleeve | 1 each | Use the switch mount from `print/v2.1-switch-update/` |
|
||||
| 25 carriage striker | 1 | `print/v2.1-switch-update/`; glue onto the carriage's back edge |
|
||||
| 17 carriage, 18 magnet cup | 1 each | |
|
||||
| 19 roller washers ×4, 19b idler washer | | |
|
||||
| 20 magnet spacers 1/2/3 mm | 1 set | |
|
||||
@@ -126,14 +158,15 @@ Glue: CA for the slip-ring adapter on the shaft, the magnet cup in the carriage,
|
||||
|
||||
The full assembly for viewing is `sand-table-v2-assembly.step`.
|
||||
|
||||
The body names in `sand-table-v2.solidcraft` have SolidCraft's automatic split suffixes:
|
||||
In `sand-table-v3.solidcraft` the counterweight is `Counterweight` + `CounterweightLid`, with `REF_Quarters7` (7 quarters) and `REF_HubBolt*` / `REF_CWBolt*` showing the M5s; the old `HubRailMount` (29c) features are suppressed. The shell quarters are separate bodies, `ShellQ1`–`ShellQ4`. Each is a 90° revolve, not a split ring, because cuts on the split ring failed. The deck and sand ring still use split names. In `sand-table-v2.solidcraft` the names have SolidCraft's automatic split suffixes:
|
||||
- **Shell:** `Shell_Q1` = Q1, `Shell_Q1 (1)'` = Q2, `Shell_Q1 (1) (1)` = Q3, `Shell_Q1 (1)` = Q4.
|
||||
- **Deck and sand ring:** the same pattern, starting from `DeckShelf` and `SandRing`.
|
||||
- **Don't rename them.** It breaks the split steps.
|
||||
|
||||
## Print orientation
|
||||
- **Shell quarters:** upright. The joint blocks have 45° chamfers underneath.
|
||||
- **Shell quarters:** upright. The deck bosses have 45° undersides (v3).
|
||||
- **Deck sectors, center plate, hub, carriage:** upside down (top face on the bed).
|
||||
- **Arm motor bracket:** motor plate on the bed, with **tree supports** under the T-nut plate.
|
||||
- **Counterweight (34):** flat, pockets up, 100% infill if you can; its own weight counts.
|
||||
- **Everything else:** flat as modeled.
|
||||
- PETG is best for the hub, carriage and brackets. PLA is fine for the shell, deck and sand ring.
|
||||
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
@@ -0,0 +1,142 @@
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
SRC = '/home/ckoch/ComfyUI/output/sandtable/step{}_00001_.png'
|
||||
OUT = '/home/ckoch/Documents/sandTable/docs/build-guide.png'
|
||||
F = '/usr/share/fonts/truetype/noto/NotoSans-{}.ttf'
|
||||
MONO = '/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf'
|
||||
INK, GRAY, TEAL, RULE = (27, 36, 32), (90, 103, 98), (31, 128, 116), (214, 222, 218)
|
||||
|
||||
STEPS = [
|
||||
("Shell and deck",
|
||||
["Join the 4 shell quarters at the seams.",
|
||||
"Screw the 4 deck quarters onto the wall ledge. Deck Q1 (controller standoffs) goes under shell Q1 (cable notch)."],
|
||||
"8x M3x16 + nuts · 8x M3x8 button"),
|
||||
("Center plate and hub",
|
||||
["Screw the center plate onto the deck.",
|
||||
"Press the two 608 bearings into the housing, one from each side, and drop the hub shaft through."],
|
||||
"8x M3x8 button · 2x 608"),
|
||||
("Slip ring (seen from below)",
|
||||
["Glue the adapter onto the bottom of the shaft, pressing up on the lower bearing: no play, still spins freely.",
|
||||
"Push the printed coupler's 3 pegs into the adapter's holes (drop of CA); its slot slides over the top wires.",
|
||||
"Only the slip ring's center boss turns: press it into the coupler's socket with a dab of gel CA. The flange stays free.",
|
||||
"Slide the holder (part 27) up around the slip-ring body and onto the end of the tower; peg in a flange hole. Glue only its block to the tower."],
|
||||
"CA glue · coupler (26) · holder (27)"),
|
||||
("Spin motor (seen from below)",
|
||||
["Hang the motor under the center plate with its 20T pulley, and loop the 200 mm belt over the hub.",
|
||||
"Slide the motor in its slots to tension the belt, then tighten."],
|
||||
"4x M3x12 socket"),
|
||||
("Arm",
|
||||
["Bolt the 220 mm extrusion to the hub, 80 mm behind center and 140 mm ahead.",
|
||||
"Tip: idler bracket, 608 and sleeve. Back: motor bracket, arm motor, and the switch mount on top."],
|
||||
"4x M5x12 socket · 3x M5x8 · 7x T-nuts · 4x M3x6 · 1x 608"),
|
||||
("Carriage",
|
||||
["Fit the 4 roller bearings with washers and slide the carriage on.",
|
||||
"Loop the belt around the motor pulley and idler; clamp both ends in the carriage.",
|
||||
"Magnets and spacer in the cup, felt on top, glue in. Glue the striker on the back edge."],
|
||||
"5x M3x8 button · 4x 608 · 2x magnets"),
|
||||
("Electronics (seen from below)",
|
||||
["Mount the Arduino + CNC shield under deck Q1, components facing down.",
|
||||
"The arm motor (4 wires) and home switch (2 wires) run through the slip ring.",
|
||||
"Fit all 3 microstep jumpers per driver and set each DRV8825's current before plugging in motors."],
|
||||
"4x M3x6 socket"),
|
||||
("Close it up",
|
||||
["Test both axes with the floor off first.",
|
||||
"Then the plexi floor, sand ring, about 4 mm of fine sand, the 3/8\" ball, and finally the glass."],
|
||||
"~0.4 kg sand · 3/8\" steel ball"),
|
||||
]
|
||||
|
||||
W, M, G = 2400, 80, 70
|
||||
PW = (W - 2 * M - G) // 2
|
||||
f_title = ImageFont.truetype(F.format('Bold'), 84)
|
||||
f_sub = ImageFont.truetype(F.format('Regular'), 34)
|
||||
f_step = ImageFont.truetype(F.format('Bold'), 46)
|
||||
f_num = ImageFont.truetype(F.format('Bold'), 40)
|
||||
f_body = ImageFont.truetype(F.format('Regular'), 31)
|
||||
f_hw = ImageFont.truetype(MONO, 27)
|
||||
f_hwl = ImageFont.truetype(F.format('Bold'), 25)
|
||||
f_foot = ImageFont.truetype(F.format('Regular'), 29)
|
||||
f_footb = ImageFont.truetype(F.format('Bold'), 29)
|
||||
|
||||
|
||||
def wrap(draw, text, font, width):
|
||||
words, lines, cur = text.split(), [], ''
|
||||
for w in words:
|
||||
t = (cur + ' ' + w).strip()
|
||||
if draw.textlength(t, font=font) <= width:
|
||||
cur = t
|
||||
else:
|
||||
lines.append(cur)
|
||||
cur = w
|
||||
lines.append(cur)
|
||||
return lines
|
||||
|
||||
|
||||
def panel(i, title, bullets, hw):
|
||||
img = Image.open(SRC.format(i)).convert('RGB')
|
||||
img = img.resize((PW, round(img.height * PW / img.width)), Image.LANCZOS)
|
||||
tmp = ImageDraw.Draw(Image.new('RGB', (1, 1)))
|
||||
body = []
|
||||
for b in bullets:
|
||||
body.append(wrap(tmp, b, f_body, PW - 40))
|
||||
lh = 44
|
||||
hw_lines, cur = [], ''
|
||||
for tok in hw.split(' · '):
|
||||
t = (cur + ' · ' + tok) if cur else tok
|
||||
if tmp.textlength(t, font=f_hw) <= PW - 160:
|
||||
cur = t
|
||||
else:
|
||||
hw_lines.append(cur)
|
||||
cur = tok
|
||||
hw_lines.append(cur)
|
||||
h = 80 + img.height + 20 + sum(len(b) * lh + 10 for b in body) + 20 + 40 * len(hw_lines) + 10
|
||||
p = Image.new('RGB', (PW, h), 'white')
|
||||
d = ImageDraw.Draw(p)
|
||||
d.ellipse((0, 4, 64, 68), fill=TEAL)
|
||||
d.text((32, 36), str(i), font=f_num, fill='white', anchor='mm')
|
||||
d.text((86, 36), title, font=f_step, fill=INK, anchor='lm')
|
||||
y = 80
|
||||
p.paste(img, (0, y))
|
||||
y += img.height + 20
|
||||
for lines in body:
|
||||
d.ellipse((6, y + 15, 18, y + 27), fill=TEAL)
|
||||
for ln in lines:
|
||||
d.text((40, y), ln, font=f_body, fill=INK)
|
||||
y += lh
|
||||
y += 10
|
||||
y += 14
|
||||
d.text((0, y + 6), 'HARDWARE', font=f_hwl, fill=TEAL)
|
||||
for ln in hw_lines:
|
||||
d.text((150, y + 4), ln, font=f_hw, fill=GRAY)
|
||||
y += 40
|
||||
return p
|
||||
|
||||
|
||||
panels = [panel(i + 1, *s) for i, s in enumerate(STEPS)]
|
||||
rows = [panels[k:k + 2] for k in range(0, 8, 2)]
|
||||
head_h = 260
|
||||
foot_lines = [
|
||||
("Home switch: ", "use a KW12-B with a straight lever. Reprint the switch mount and glue on the striker from print/v2.1-switch-update."),
|
||||
("Fit first: ", "print 00-fit-test-coupon; every printed part is set for shaft 8.1 mm and bearing pocket 22.2 mm."),
|
||||
]
|
||||
foot_h = 70 + 50 * len(foot_lines) + 60
|
||||
H = head_h + sum(max(p.height for p in r) + 70 for r in rows) + foot_h
|
||||
canvas = Image.new('RGB', (W, H), 'white')
|
||||
d = ImageDraw.Draw(canvas)
|
||||
d.text((M, 70), 'Sand table build guide', font=f_title, fill=INK)
|
||||
d.text((M, 180), '12" polar kinetic sand table · 8 steps · printed parts: print/v2-current + print/v2.1-switch-update', font=f_sub, fill=GRAY)
|
||||
y = head_h
|
||||
for r in rows:
|
||||
d.line((M, y, W - M, y), fill=RULE, width=3)
|
||||
y += 40
|
||||
for k, p in enumerate(r):
|
||||
canvas.paste(p, (M + k * (PW + G), y))
|
||||
y += max(p.height for p in r) + 30
|
||||
d.line((M, y, W - M, y), fill=RULE, width=3)
|
||||
y += 40
|
||||
for b, t in foot_lines:
|
||||
d.text((M, y), b, font=f_footb, fill=INK)
|
||||
d.text((M + d.textlength(b, font=f_footb), y), t, font=f_foot, fill=INK)
|
||||
y += 50
|
||||
d.text((M, y + 10), 'Drawings: renders of the SolidCraft model, restyled with Qwen-Image-Edit in ComfyUI.', font=f_foot, fill=GRAY)
|
||||
canvas.save(OUT, optimize=True)
|
||||
print(OUT, canvas.size)
|
||||
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 307 KiB |
@@ -0,0 +1,57 @@
|
||||
"""Restyle CAD renders with Qwen-Image-Edit-2511 (Lightning 8-step) through the local ComfyUI API."""
|
||||
import json, sys, time, urllib.request, random
|
||||
|
||||
API = 'http://127.0.0.1:8188'
|
||||
|
||||
STYLE = ("Redraw this 3D CAD render as a clean technical illustration for an assembly instruction manual. "
|
||||
"Pure white background. Crisp dark outlines and flat soft shading, like a high-quality IKEA or LEGO instruction drawing. "
|
||||
"Keep every part exactly where it is, with the same shapes, proportions, colors, camera angle and framing. "
|
||||
"Do not add, remove, move or reshape any part. No text, no labels, no arrows, no numbers.")
|
||||
|
||||
|
||||
def workflow(image, prompt, prefix, seed):
|
||||
return {
|
||||
"1": {"class_type": "UNETLoader", "inputs": {"unet_name": "qwen_image_edit_2511_fp8mixed.safetensors", "weight_dtype": "default"}},
|
||||
"2": {"class_type": "LoraLoaderModelOnly", "inputs": {"model": ["1", 0], "lora_name": "Qwen-Image-Edit-2511-Lightning-8steps-V1.0-bf16.safetensors", "strength_model": 1.0}},
|
||||
"3": {"class_type": "ModelSamplingAuraFlow", "inputs": {"model": ["2", 0], "shift": 3.1}},
|
||||
"4": {"class_type": "CFGNorm", "inputs": {"model": ["3", 0], "strength": 1.0}},
|
||||
"5": {"class_type": "CLIPLoader", "inputs": {"clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors", "type": "qwen_image"}},
|
||||
"6": {"class_type": "VAELoader", "inputs": {"vae_name": "qwen_image_vae.safetensors"}},
|
||||
"7": {"class_type": "LoadImage", "inputs": {"image": image}},
|
||||
"8": {"class_type": "ImageScaleToTotalPixels", "inputs": {"image": ["7", 0], "upscale_method": "lanczos", "megapixels": 1.0, "resolution_steps": 16}},
|
||||
"9": {"class_type": "TextEncodeQwenImageEditPlus", "inputs": {"clip": ["5", 0], "prompt": prompt, "vae": ["6", 0], "image1": ["8", 0]}},
|
||||
"10": {"class_type": "TextEncodeQwenImageEditPlus", "inputs": {"clip": ["5", 0], "prompt": "", "vae": ["6", 0], "image1": ["8", 0]}},
|
||||
"11": {"class_type": "VAEEncode", "inputs": {"pixels": ["8", 0], "vae": ["6", 0]}},
|
||||
"12": {"class_type": "KSampler", "inputs": {"model": ["4", 0], "seed": seed, "steps": 8, "cfg": 1.0, "sampler_name": "euler",
|
||||
"scheduler": "simple", "positive": ["9", 0], "negative": ["10", 0],
|
||||
"latent_image": ["11", 0], "denoise": 1.0}},
|
||||
"13": {"class_type": "VAEDecode", "inputs": {"samples": ["12", 0], "vae": ["6", 0]}},
|
||||
"14": {"class_type": "SaveImage", "inputs": {"images": ["13", 0], "filename_prefix": prefix}},
|
||||
}
|
||||
|
||||
|
||||
def run(image, prompt, prefix, seed=None):
|
||||
seed = seed if seed is not None else random.randint(0, 2**31)
|
||||
body = json.dumps({"prompt": workflow(image, prompt, prefix, seed)}).encode()
|
||||
req = urllib.request.Request(API + '/prompt', data=body, headers={'Content-Type': 'application/json'})
|
||||
pid = json.load(urllib.request.urlopen(req))['prompt_id']
|
||||
t0 = time.time()
|
||||
while True:
|
||||
h = json.load(urllib.request.urlopen(f'{API}/history/{pid}'))
|
||||
if pid in h:
|
||||
st = h[pid].get('status', {})
|
||||
if st.get('status_str') == 'error':
|
||||
sys.exit(f'error: {json.dumps(st)[:2000]}')
|
||||
outs = [img for node in h[pid]['outputs'].values() for img in node.get('images', [])]
|
||||
if outs:
|
||||
f = outs[0]
|
||||
path = f"/home/ckoch/ComfyUI/output/{f['subfolder'] + '/' if f['subfolder'] else ''}{f['filename']}"
|
||||
print(f'{image} -> {path} ({time.time() - t0:.1f}s, seed {seed})', flush=True)
|
||||
return path
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
jobs = json.loads(sys.argv[1])
|
||||
for j in jobs:
|
||||
run(j['image'], j.get('prompt', STYLE), j['prefix'], j.get('seed'))
|
||||
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 877 KiB |
@@ -0,0 +1,302 @@
|
||||
# Print files
|
||||
|
||||
**Latest: v3.** The `v3/` folder now holds every printed part, including the ones that didn't change. The "Full parts list (v3)" table below has quantities and print notes.
|
||||
|
||||
| Folder | What |
|
||||
|---|---|
|
||||
| `v3/` | **The complete v3 set: every printed part.** New shell, deck, center plate, hub and slip-ring parts, seam plates and plugs, and a counterweight for the arm, plus copies of the unchanged parts (14–25). The rail bolts straight to the hub again (no `29c`). Print `00b-fit-test-6804` first. See "What changed in v3". |
|
||||
| `v2-current/` | The full v2 set, numbered in print order. Parts not replaced in a later folder still come from here. |
|
||||
| `v2.7-removable-arm/` | **Replaced by `v3`.** In v3 the rail bolts straight to the hub, so neither `29b` nor `29c` is used. `30` and `13` are copied into `v3/` unchanged. |
|
||||
| `v2.6-idler-sleeve/` | `16-idler-sleeve-wide.stl`: replaces `v2-current/16`. The belt groove is 7 mm instead of 6, so the belt no longer rubs both rims. |
|
||||
| `v2.5-switch-pegs/` | `14-switch-mount-pegs.stl`: the v2.1 switch mount with 2 pegs instead of M2 screw holes. The switch slides onto the pegs and is glued. Use it instead of the `v2.1` mount if you have no M2 screws. |
|
||||
| `v2.4-hub-adapter/` | **Replaced by `v2.7`; don't print `29`.** Still print `18-magnet-cup-short.stl`. |
|
||||
| `v2.3-uno-plate/` | Only for a `v1-original` deck Q1. **Not needed with the `v3` deck.** |
|
||||
| `v2.2-slip-ring-fix/` | **Replaced by `v3`** (new `26` coupler and `27` holder for the bigger hub). |
|
||||
| `v2.1-switch-update/` | **Also print these 2.** A new switch mount (it replaces `v2-current/14`) and a striker you glue onto the carriage. |
|
||||
| `v1-original/` | The first export, kept for reference. Don't print its `05-deck-Q1-arduino.stl`. |
|
||||
|
||||
## Full parts list (v3)
|
||||
| Part | Folder | Notes |
|
||||
|---|---|---|
|
||||
| 00b fit test 6804 | `v3` | **Print first.** Checks the new bearing fits (below). |
|
||||
| 01–04 shell Q1–Q4 | `v3` | Upright, as before. The deck bosses have a 45° underside, so no supports. |
|
||||
| 05–08 deck Q1–Q4 | `v3` | Upside down, as before. Deck Q1 has the correct Uno standoffs, so `28` isn't needed. |
|
||||
| 09 center plate | `v3` | Upside down, as before. |
|
||||
| 10 hub 80T pulley | `v3` | `10-hub-80T-pulley-bolted.stl`. PETG, arm plate on the bed, as before. The rail bolts to it with 2× M5×12 from underneath. |
|
||||
| 11 hub clamp collar | `v3` | Flat as modeled (the thin ring on top). Replaces the glued slip-ring adapter. |
|
||||
| 13 arm motor bracket (tall window) | `v3` | Copy of `v2.7/13`. Tree supports. |
|
||||
| 14 switch mount | `v3` | Print one: `14-switch-mount-pegs` (switch glued on 2 pegs) or `14-switch-mount-M2` (2× M2 screws). Unchanged from `v2.5` / `v2.1`. |
|
||||
| 15 idler bracket | `v3` | Unchanged from `v2-current`. |
|
||||
| 16 idler sleeve (wide) | `v3` | Unchanged from `v2.6`. |
|
||||
| 17 carriage | `v3` | Unchanged from `v2-current`. |
|
||||
| 18 magnet cup (short) | `v3` | Unchanged from `v2.4`. |
|
||||
| 19 roller washers, 19b idler washer, 20 magnet spacers | `v3` | Unchanged from `v2-current`. The washer file has all 4 washers; the spacer file has all 3 spacers. |
|
||||
| 21–24 sand ring | `v3` | 16 mm tall, unchanged from `v2-current`. **Floor raised on 3.5 mm rubber stoppers?** Print the `-12.5mm` files instead, so the glass still sits inside the rim. |
|
||||
| 25 carriage striker | `v3` | Unchanged from `v2.1`. |
|
||||
| 26 slip-ring coupler | `v3` | Bigger, to peg into the collar. |
|
||||
| 27 slip-ring holder | `v3` | Screws to the post now. |
|
||||
| 30 motor bracket shim | `v3` | Copy of `v2.7/30`. |
|
||||
| 31 seam plate low ×4, 32 seam plate high ×4 | `v3` | Flat as modeled, nut slots on top. |
|
||||
| 33 seam plug ×16 | `v3` | Flat. |
|
||||
| 34 counterweight | `v3` | Flat, pockets up, no supports. Use 100% infill (or as high as you like): its own weight counts. |
|
||||
| 35 counterweight lid | `v3` | Flat. |
|
||||
| 36 Uno turnaround plate | `v3` | **Print this.** Turns the Uno around so its USB faces the centre; on the v3 deck it faced the wall with no room for the plug. Flat face on the bed, standoffs up, no supports. See below. |
|
||||
| 12 stator collar, 28 Uno adapter plate, 29, 29b, 29c | — | Not used in v3. |
|
||||
|
||||
## What changed in v3 (rebuild fixes)
|
||||
Picture: `docs/v3-changes.png`.
|
||||
|
||||
### 0. Uno turned around (part 36, added 2026-11-01)
|
||||
- **Problem:** the v3 deck's standoffs hold the Uno with its USB jack pointing at the wall. The jack ends 2.4 mm from the wall, so a USB plug can't go in.
|
||||
- **Fix:** `36-uno-turnaround-plate.stl`, a 3.4 mm plate the size of the Uno (plus 2.5 mm all round), built like part 28:
|
||||
- It screws to the deck's 4 Uno standoffs with **4× M3×6 button heads**, sitting flush in counterbores (the 4 that held part 28 are the right ones; socket heads would stick out 1 mm).
|
||||
- Its own 4 standoffs (3.1 mm) hold the Uno turned half a turn, so the USB jack faces the centre. The Uno's own 4× M3×6 screw into them.
|
||||
- Both hole patterns are lopsided, so the plate fits the deck only one way, and the Uno fits the plate only one way.
|
||||
- The Uno sits 6.5 mm lower than before, the same as it did on part 28.
|
||||
- **Room for the plug:** the jack now ends 70 mm from the centre, and a USB-B plug reaches to about 37 mm. That leaves 10 mm to the slip-ring holder and 16 mm to the collar's screw lug. Run the cable down and round the side of the board to the notch in the wall.
|
||||
- **12 V:** the shield's power terminal turns to face the centre too, so the supply wires need about 7 cm more length inside the table.
|
||||
- **Checked in the model:** no clashes with the deck, center plate, hub, collar, slip ring and holder, spin motor or seam plates. The plate's corners stay 3.5 mm inside the wall and clear of the deck bosses.
|
||||
- **Printing:** flat face on the bed (the STL is already turned that way), standoffs up, no supports. PLA or PETG.
|
||||
|
||||
### 1. Deck screws you can reach
|
||||
- **Problem:** the 8 deck-to-shell screws were 150 mm from the center, under the floor ledge, which reaches in to 143 mm. A screwdriver couldn't get a straight line to them.
|
||||
- **Fix:** each shell quarter has 2 new bosses under the deck. Each has a 45° underside, so it prints upright without supports.
|
||||
- The screws now sit 137 mm from the center, 6 mm inside the ledge's tip, so a screwdriver goes straight down.
|
||||
- The deck holes moved to match.
|
||||
- Use M3×12 button heads; the pilot holes are 8 mm deep.
|
||||
|
||||
### 2. Seam joints from the outside
|
||||
- **Problem:** the old joint blocks were bolted sideways, only 4 mm from the wall, so a driver couldn't reach them.
|
||||
- **Fix:** the screws go straight through the wall from outside into a plate on the inside.
|
||||
- Each seam gets a low plate (`31`, below the deck) and a high plate (`32`, above the deck), with 4 screws per seam.
|
||||
- Drop an M3 nut into each plate's slot from the top, hold the plate against the inside of the wall, and drive M3×8 button heads from outside.
|
||||
- Each screw head sits in a 6.2 mm counterbore. A plug (`33`) presses in flush on top to hide it.
|
||||
- **Clearance:** the high plates stay clear of the arm (in the model). The idler bracket and sleeve pass underneath (below 79 mm high), the carriage plate passes 2 mm above, and the rail tip and rollers stay at least 4 mm inside the plates' inner face.
|
||||
- **Modeling note:** the shell quarters are now built as four separate 90° pieces instead of one ring split in four. The exported meshes were checked and repaired, so the walls are true to within 0.02 mm.
|
||||
|
||||
### 3. Arm bolted straight to the hub, at both ends
|
||||
Picture: `docs/arm-bolted-counterweight.png`.
|
||||
|
||||
- **Problem:** with `29b`/`29c`, the mount was glued to the hub and the rail was held by 2 side bolts at the motor end only. The far half of the rail just sat on the hub, and the glued wall carried the motor's weight, so the arm could flex. (`29b`'s wall also hit the spin motor's shaft tip; `29c` was the fix for that.)
|
||||
- **Fix:** no hub mount at all. The rail bolts straight down onto the hub with **2× M5×12 socket heads, 17 mm each side of the center**, into T-nuts in the rail's bottom slot. That's how the very first build was done.
|
||||
- The bolts go in from under the hub, in counterbores in the pulley. The heads end up under the hub, so the arm and hub are bolted together on the bench and go into the table as one piece.
|
||||
- That's fine now because the v3 hub lifts out: undo the collar (one screw) and the arm and hub come out together. See the assembly order below.
|
||||
- The hub's arm plate is 1 mm thicker (top at 74 mm, where `29c`'s strip was), so every height stays the same. Keep the 1 mm shim (`30`) under the motor bracket and the short magnet cup.
|
||||
- The wire groove across the top of the hub is bigger (6 mm wide, 4.5 mm deep) and goes on the wire side, opposite the belt.
|
||||
- No glue anywhere in the arm or hub.
|
||||
- **Clearances checked in the model:** the hub plate and bolt heads clear the spin belt, the spin motor's pulley and shaft tip at every angle, and the carriage at every position.
|
||||
|
||||
### 4. Connectors through the hub
|
||||
- **Problem:** the hub shaft was 8 mm (sized for the 608 bearings) with a 4.5 mm hole, so only bare wires fit.
|
||||
- **Fix:** the hub turns on **2× 6804 bearings (20 × 32 × 7 mm)** instead of the 608s. They're the same thickness, so every height stays the same.
|
||||
- **Shaft:** now 20 mm, with a **15 mm hole**. A 4-pin JST-XH, a 6-pin JST-PH or a Dupont 1×4 housing fits through, one connector at a time.
|
||||
- **Where the plugs meet (changed with the bolted arm):** the arm's own wires go *down* through the hub on the bench, and the slip ring's wires plug into them under the hub. The joined plugs then push up inside the hub's 15 mm hole, out of the way. Nothing is soldered or crimped in the table.
|
||||
- **Plugs:** Dupont 2.54 mm is easiest (female on one side, male on the other): a 4-pin pair for the arm motor and a 2-pin pair for the switch. If the motor cable already ends in a 4-pin female plug, crimp male pins in a 1×4 housing onto the slip ring's 4 motor wires. Two joined Dupont pairs fit side by side in the hole.
|
||||
- **Clamp collar (`11`):** replaces the glued slip-ring adapter. It holds the hub down with one M3 pinch screw, so the hub can be taken out again.
|
||||
- **Coupler (`26`):** bigger, so its 3 pegs reach into the collar. It still glues to the slip ring's spinning center, and its side slot lets the wires slip in sideways.
|
||||
- **Holder (`27`):** screws to its post with an M3×16 instead of being glued. The post moved out 8 mm, clear of the collar.
|
||||
- **Fit test first:** print `00b-fit-test-6804`.
|
||||
- **Pockets** (32.0 / 32.2 / 32.4, left to right): the bearing should press in with a snug push. The center plate uses 32.2.
|
||||
- **Stubs** (19.9 / 20.0 / 20.1 / 20.2): the bearing should go on with a firm push and not fall off. The hub uses 20.1.
|
||||
- If another size fits better, tell me which. The center plate and hub re-export from `brg2_d` and `shaft2_d`.
|
||||
- **Clearances checked in the model:**
|
||||
- The pinch-screw lug reaches 21.1 mm from the center as it turns; the holder post starts at 23.5 mm.
|
||||
- The spin motor body sits 4.9 mm from the bigger bearing housing, or 1.9 mm with its slots pushed all the way in.
|
||||
|
||||
### 5. Counterweight
|
||||
- **Problem:** the arm motor hangs off the back end, so the arm is heavy on that side. With the carriage halfway out, it's about 7 kg·mm out of balance (roughly 70 g sitting 100 mm out on the far side would fix it).
|
||||
- **Fix:** a printed counterweight box (`34`) bolts under the far half of the rail with 2× M5×10 into T-nuts in the bottom slot, 66 and 102 mm from the hub center.
|
||||
- Its 2 round pockets sit beside the rail on the wire side (opposite the belt). Each takes a stack of up to 8 **US quarters** (24.3 mm); steel nuts, washers or fishing weights also work.
|
||||
- A lid (`35`) closes the pockets with 3× M3×8 button heads on the outer edge.
|
||||
- **How many quarters:** start with **7 in the outer pocket** (the one nearer the tip; it counts more). Then balance the arm on a pencil (assembly step 4 below) and add or remove quarters until it sits level. The motor's real weight is the main unknown, so trust the pencil over the count.
|
||||
- It's balanced with the carriage halfway out. At either end of its travel the arm is now about 5 kg·mm off balance, compared with 12 before.
|
||||
- **Clearances checked in the model:** it stays under the carriage's rollers and roller-washer screws (1.3 mm below the screw heads), clear of the carriage's belt clamp and the arm belt (it doesn't go past the rail's belt-side face), and clear of the idler bracket. As the arm turns, it passes over the center-plate screw heads with 1.8 mm to spare and stays outside the spin motor's pulley.
|
||||
|
||||
### Assembly order (center)
|
||||
Build the shell and deck first (next section), then:
|
||||
|
||||
1. **Bearings:** press one 6804 into each pocket of the center plate, from the top and from the bottom, until each sits on the lip between them.
|
||||
2. **Spin motor:** hang it under the center plate with its 20T pulley, screws loose and the motor slid toward the center so the belt will go on easily.
|
||||
3. **Arm, on the bench:**
|
||||
- Motor bracket with the 1 mm shim under it (2× M5), arm motor and pulley, switch mount and switch.
|
||||
- Carriage, slid on from the tip end, then the idler bracket, bearing, sleeve and washer, then the arm belt.
|
||||
- Drop T-nuts into the rail's bottom slot: 2 for the hub at 63 and 97 mm from the rail's back end (17 mm each side of the hub center, which is 80 mm from the back end), and 2 for the counterweight at 146 and 182 mm.
|
||||
- Counterweight (`34`) under the far half with 2× M5×10, pockets on the wire side.
|
||||
4. **Balance:** push the carriage to the middle of its travel (magnet about 66 mm past the hub center). Lay the rail across a round pencil at the hub center (80 mm from the back end) and add quarters to the outer pocket until it sits level. Then screw on the lid (3× M3×8).
|
||||
5. **Wires down through the hub:** run the arm motor cable and the switch wires (with their plugs on) along the rail's wire-side slot to the middle. Lay them in the hub's top groove and feed the plugs down through the hub's hole, so they hang out of the bottom of the shaft.
|
||||
6. **Hub onto the rail:** set the hub on the rail's bottom face, groove on the wire side, holes over the 2 T-nuts. Bolt it with 2× M5×12 socket heads from under the hub.
|
||||
7. **Spin belt:** slip the 200 mm belt over the bottom of the hub shaft and onto the hub pulley.
|
||||
8. **Arm into the table:** lower the hub shaft through both bearings, hooking the belt around the spin motor's pulley on the way down. The shoulder rests on the top bearing's inner ring, and the plugs hang out under the center plate.
|
||||
9. **Collar:** from below, slide it over the hanging plugs and onto the shaft bottom, thin ring up against the lower bearing, peg holes facing down. Tighten the pinch screw (M3×12 or ×16) until it grips.
|
||||
10. **Belt tension:** slide the spin motor out until the belt is snug and tighten its 4 screws from above (swing the arm aside).
|
||||
11. **Plug in:** plug the slip ring's top-wire plugs into the arm's plugs, then push the joined plugs up into the hub's hole.
|
||||
12. **Coupler:** slide its side slot over the top wires. Glue its socket onto the slip ring's spinning center (gel CA on the socket wall only).
|
||||
13. **Holder:**
|
||||
- Set the slip ring's body in the holder: flange on the disc, peg in a flange hole.
|
||||
- Slide the holder's sleeve up onto the post. Turn the arm so the coupler's 3 pegs go into the collar's 3 holes.
|
||||
- Fix it with an M3×16 through the sleeve into the post.
|
||||
|
||||
**Taking the arm out later:**
|
||||
1. Holder screw out, then lower the slip ring and coupler off the collar's pegs.
|
||||
2. Pull the joined plugs down out of the hub and unplug them.
|
||||
3. Turn the arm until the collar's pinch screw faces you and loosen it.
|
||||
4. Loosen the spin motor's 4 screws and slide it in to slacken the belt.
|
||||
5. Lift the arm and hub straight up. The belt comes with the hub.
|
||||
6. On the bench, the 2 hub bolts and 2 counterweight bolts undo from below.
|
||||
|
||||
### Assembly order (shell and deck)
|
||||
1. Stand the 4 shell quarters in a ring.
|
||||
2. At each seam, fit a high plate (above the deck line) and a low plate (below it) against the inside, with nuts in their slots. Drive 4× M3×8 button heads from outside, then press in the plugs.
|
||||
- The low plates can also go in later from underneath, since the bottom is open.
|
||||
3. Set the deck quarters on the ledge and bosses, and fix them with 8× M3×12 button heads straight down through the deck.
|
||||
4. Screw the center plate to the deck (8× M3×8), as before.
|
||||
|
||||
### Hardware changes
|
||||
- **Buy:** 2× 6804-2RS bearings (20 × 32 × 7 mm, also sold as 61804). The two hub 608s become spares.
|
||||
- **Deck to shell:** 8× M3×12 button heads instead of M3×8.
|
||||
- **Seams:** 16× M3×8 button heads and 16× M3 hex nuts. The 8× M3×16 + nuts from the old joints are no longer used.
|
||||
- **Collar:** 1× M3×12 or M3×16. **Holder:** 1× M3×16. Two of the old seam-joint M3×16s work for both.
|
||||
- **Arm to hub:** 2× M5×12 socket heads (M5×13 also works) and 2 T-nuts. The 2× M5×10 from `29b` move to the counterweight.
|
||||
- **Counterweight:** 2× M5×10 and 2 T-nuts, 3× M3×8 button heads for the lid, and about 7 US quarters (or steel nuts or washers).
|
||||
- **Plugs:** a 4-pin and a 2-pin Dupont 2.54 mm pair (male and female housings and pins).
|
||||
|
||||
## What changed in v2.7 (removable arm)
|
||||
**Replaced in v3:** the rail now bolts straight to the hub, so `29b` (and `29c`) aren't used. The shim `30` and the tall-window bracket `13` still are.
|
||||
|
||||
- **Why:**
|
||||
- With `v2.4/29`, the strip is glued to the hub. The bolts holding the rail to it go in from below, where they can't be reached once the hub is in.
|
||||
- That made the arm permanent. The 1 mm strip was also the only link between rail and hub outside the hub plate, so it could flex.
|
||||
- **Why not bolts at all 4 corners:**
|
||||
- The carriage runs over almost the whole rail, and its rollers hang down to 2.5 mm above the side slot.
|
||||
- The belt and belt clamp run 1 mm from the belt side of the rail.
|
||||
- The only place a side bolt can go is the motor end, behind where the carriage stops at home.
|
||||
- **`29b-hub-rail-mount.stl`:**
|
||||
- **Strip and pegs:** the same 1 mm strip over the hub plate, with the same 2 pegs into the hub's M5 holes.
|
||||
- **Wall:** 4 mm thick, along the rail's wire side (away from the belt), from the hub to 2 mm short of the rail's back end.
|
||||
- It stays 1 mm under the carriage's rollers along their path.
|
||||
- At the motor end, where the carriage never reaches, it is taller and has 2 bolt holes.
|
||||
- **Glue (to the hub only):**
|
||||
- the pegs
|
||||
- the strip on the hub plate
|
||||
- the wall's bottom edge on the hub pulley's top rim
|
||||
- the wall's inner face against the hub plate's side
|
||||
- **Bolts:** 2× M5×10 (button or socket head) go sideways through the wall into drop-in T-nuts in the rail's wire-side slot.
|
||||
- **Wires:** a notch lines up with the hub's wire groove. A 3 × 2 mm groove along the wall's outer face carries the slip-ring wires to the motor end.
|
||||
- **Printing:** the STL is already turned so the wall's outer face is on the bed. Tree supports go only under the 2 pegs. PETG.
|
||||
- **`30-motor-bracket-shim.stl`:**
|
||||
- A 1 mm plate between the motor bracket and the rail, with 2 holes for the bracket's M5s.
|
||||
- It replaces the end of the old strip, so all heights stay the same: short magnet cup, motor pulley 1 mm higher.
|
||||
- With it, M5×10 works on the motor bracket without washers.
|
||||
- **`13-arm-motor-bracket-SUPPORTS-tall-window.stl`:**
|
||||
- The belt window in the bracket is 2 mm taller, now 10 mm. Since `v2.4` raised the arm (and the belt) by 1 mm, the belt rubbed the top of the old window by 0.5 mm. That rub is likely part of the stiffness you felt in the belt.
|
||||
- Otherwise the same as `v2-current/13`. Print it the same way: motor plate on the bed, tree supports.
|
||||
- **Not reprinting it?** File the window's top edge up 1–2 mm instead.
|
||||
- **Checked in the model:**
|
||||
- The carriage, rollers and roller washers clear the new wall at home, over the hub, and every step in between.
|
||||
- Nothing new clashes with the hub, rail, motor bracket, switch mount, spin pulley or belts.
|
||||
- **Assembly order:**
|
||||
1. **At the hub, before gluing:**
|
||||
- Slide the spin belt over the hub's arm plate and down onto the hub pulley.
|
||||
- Feed the slip ring's top wires up the shaft and lay them in the groove on top of the hub.
|
||||
2. **Glue the mount onto the hub:**
|
||||
- Pegs into the 2 holes, with the wall on the side where the groove opens.
|
||||
- The wires go out through the wall's notch, then into the groove on its outer face.
|
||||
- Let it cure.
|
||||
3. **On the bench:**
|
||||
- Motor bracket with the shim between it and the rail (2× M5), then the arm motor and pulley.
|
||||
- The carriage, slid on from the tip end.
|
||||
- The idler bracket, bearing, sleeve and washer, then the belt.
|
||||
- Drop 2 T-nuts into the wire-side slot at the motor end, about 8 and 18 mm from the rail's end.
|
||||
4. **Set the arm on the mount:**
|
||||
- The rail sits on the strip with its wire-side face against the wall, and the rail's back end 2 mm past the wall's end.
|
||||
- Line up the T-nuts with the wall's holes and fit 2× M5×10.
|
||||
5. **After:**
|
||||
- Wires along the groove to the motor end, then up to the switch and the motor.
|
||||
- Spin motor (screws on top of the center plate; swing the arm aside).
|
||||
- Switch mount and switch, short magnet cup with the 3 mm spacer, striker.
|
||||
- **To take the arm off later:** undo the 2 side bolts, unplug the motor and switch, and lift the arm straight up. The motor, carriage and idler come with it. The mount stays on the hub.
|
||||
- **Not removable:** the spin belt. It's trapped under the mount, as it was with `v2.4`.
|
||||
- **Picture:** `docs/removable-arm-mount.png`.
|
||||
|
||||
## What changed in v2.6 (wider idler groove)
|
||||
- **Why:** the old sleeve's groove between its two rims was exactly 6.0 mm, the same as the 6 mm belt, so the belt dragged on both rims.
|
||||
- **`16-idler-sleeve-wide.stl`:**
|
||||
- The groove is now 7 mm, with 0.5 mm spare above and below the belt, still lined up with the motor pulley.
|
||||
- A 0.5 mm ledge inside the bottom sets the bearing height. It touches only the bearing's outer ring.
|
||||
- The rims are the same size (Ø29), and the bearing pocket is still `brg_d` (22.2).
|
||||
- **Fitting:** push the 608 out of the old sleeve. Press it into the new one from the top, the side with the thicker rim, until it sits on the ledge. The thin rim goes down, toward the bracket, 0.5 mm above it.
|
||||
- **Printing:** flat as modeled, thin rim on the bed.
|
||||
|
||||
## What changed in v2.5 (switch mount with pegs)
|
||||
- **Why:** no M2 screws on hand.
|
||||
- **`14-switch-mount-pegs.stl`:** the same as the `v2.1` mount, but the 2 M2 holes are now 2 pegs, Ø2 mm and 5.5 mm tall, with pointed tips. They sit at the same spots, 9.5 mm apart.
|
||||
- KW12 mounting holes are about Ø2.2–2.3 mm, so the switch slides on with a little play.
|
||||
- The pegs are 1 mm shorter than the switch is thick, so they don't stick out the top.
|
||||
- **Fitting:** slide the switch onto the pegs, lever facing the carriage, pressed flat on the plate. Put a drop of CA on each peg where it comes through, plus a thin line along the switch's bottom edge. Keep glue away from the lever hinge.
|
||||
- **Printing:** flat, pegs up. Print the pegs slowly, or with "slow down for small layers" on, so they come out round.
|
||||
- **Diagram:** `docs/switch-mount-pegs.png`.
|
||||
|
||||
## What changed in v2.4 (hub-to-rail adapter)
|
||||
**Replaced by v2.7.** Use `29b` and its assembly order instead. The short magnet cup below still applies.
|
||||
|
||||
- **Why:** the hub's 2 rail bolts go in from underneath, so they can't be reached once the hub is in the center plate. The same goes for the idler and motor bracket bolts and the arm motor's screws.
|
||||
- **`29-hub-rail-adapter.stl`:** a 1 mm strip under the rail, 146 mm long.
|
||||
- **Hub end:** 2 pegs glue into the hub's M5 holes, plus glue on the arm-plate face.
|
||||
- **Idler end:** an M5×8 bolt goes into a T-nut, beyond the spin pulley's reach.
|
||||
- **Motor end:** the arm motor bracket's own 2 bolts pass through it.
|
||||
- **Printing:** flat, top face down, pegs up.
|
||||
- **`18-magnet-cup-short.stl`:** 1 mm shorter than `v2-current/18`, because the arm now sits 1 mm higher. Use only the 3 mm magnet spacer.
|
||||
- **Assembly order (checked against the model):**
|
||||
1. **Before gluing, at the hub:**
|
||||
- Slide the 200 mm spin belt over the top of the hub's arm plate and down onto the hub pulley.
|
||||
- Feed the slip ring's top wires up the shaft and lay them in the groove on top of the hub, out its side.
|
||||
2. **On the bench:**
|
||||
- Bolt the strip (its motor end flush with the rail's back end) and the motor bracket to the rail; the bracket's 2 M5s go through the strip.
|
||||
- Fit the arm motor (4× M3×6) with its pulley 1 mm higher than usual.
|
||||
- Slide the carriage on from the tip end **before** the idler bracket; its belt-clamp tab can't pass the bracket base or the sleeve.
|
||||
- Fit the idler bracket (2× M5×12), then the bearing, sleeve and washer.
|
||||
- Put in the strip's idler-side M5×8.
|
||||
- Loop the belt around both pulleys and clamp it in the carriage.
|
||||
3. **Glue the arm onto the hub.** The pegs go in the hub's M5 holes. Turn it so the hub groove's opening faces the rail's wire side, away from the belt.
|
||||
4. **Afterwards:**
|
||||
- Route the wires up into the side slot.
|
||||
- The spin motor goes on from below; its screws are on top of the center plate, so swing the arm aside.
|
||||
- Fit the switch mount and switch (from the top), the short magnet cup with the 3 mm spacer, and the striker.
|
||||
- **Diagram:** `docs/hub-rail-adapter.png`.
|
||||
|
||||
## What changed in v2.3 (Uno adapter plate)
|
||||
- **Why:** the `v1-original` deck Q1 has the Uno hole pattern flipped across the board. In the Uno's normal orientation, two of the holes land 1.3 mm from old standoffs.
|
||||
- **The fix:** `28-uno-adapter-plate.stl` turns the Uno 90° and shifts it so every Uno hole is at least 8.5 mm from every old standoff. No glue is needed.
|
||||
- **The plate:** 3.4 mm thick.
|
||||
- **Old standoffs:** it screws to all 4 with M3×6 button heads, which sit flush in Ø6.4 × 1.9 mm counterbores.
|
||||
- **Uno:** 4 standoffs, 3 mm tall, take the Uno with M3×6.
|
||||
- **Fit:** the Uno sits 6.4 mm lower than first designed, and its USB end now faces sideways. It still clears the shell bottom and the wall.
|
||||
- **Printing:** flat, standoffs up. `docs/uno-adapter-plate.png` shows the layout.
|
||||
|
||||
## What changed in v2.2 (slip ring)
|
||||
- **The fault:** on the Comidox ring, the flange and body are one fixed housing; only the center boss around the top wires turns. Screwing the flange to the adapter locked the hub.
|
||||
- **The coupler:** `26-slip-ring-coupler.stl` is a Ø22 × 2.5 mm disc.
|
||||
- **Top:** 3 pegs push into the adapter's 3 old screw holes, with a drop of CA.
|
||||
- **Bottom:** a Ø5.3 × 1 mm socket takes the boss, with a small dab of gel CA on the socket wall only.
|
||||
- **Gap:** the boss bottoms in the socket, which leaves the flange 0.5 mm clear.
|
||||
- **Slot:** a side slot lets it slide onto the wires without unthreading them.
|
||||
- **The holder:** `27-slip-ring-holder.stl` replaces the stator collar, which only stopped rotation and let the body flop.
|
||||
- **Fit:** its cup goes around the slip-ring body and its block slides over the end of the fork tower. The block butting the tower's end sets the height.
|
||||
- **Stopping rotation:** the flange rests on the cup's top face, and a Ø2.6 peg sits in one Ø3.2 flange hole.
|
||||
- **Glue:** only the block to the tower. Leave the slip ring loose in the cup; the small play keeps its internal bearings from binding.
|
||||
- **Printing:** print it as modeled, block end down.
|
||||
- **Flange:** not screwed down.
|
||||
- **Printing:** print it flat with the pegs up, in PLA or PETG.
|
||||
- **Before printing:** check the boss is about Ø5 mm and sticks out about 1.5 mm.
|
||||
|
||||
## What changed in v2.1 (home switch)
|
||||
- **Switch mount:** in `v2-current`, the switch sat with its lever running along the arm, so the carriage pushed the lever end-on and could bend or jam it. `14-switch-mount.stl` turns the KW12 switch 90°, so its lever faces the carriage. The two M2 holes are 9.5 mm apart, side by side across the arm, 8.1 mm from the switch end of the mount.
|
||||
- **Lever edge:** the switch's lever edge sits 0.5 mm behind the end of the mount, so the carriage stops against the plastic mount, not the switch.
|
||||
- **Striker:** `25-carriage-striker.stl` is a 5 × 18 × 4.5 mm block. Glue it (CA) on top of the carriage, against its back edge (the edge that faces the arm motor), centered side to side, with its back face flush with the carriage edge. It presses the lever along its full height.
|
||||
- **Switch to use:** KW12 with a straight hinged lever (KW12-B, ideally the 1.1" lever), not the roller.
|
||||
- **Not printed yet?** If you'd rather not reprint the mount, drill two 1.7 mm holes in the old one at those positions.
|
||||
|
||||
## What changed in v2
|
||||
Only `05-deck-Q1-arduino.stl` has a different shape. In v1, the 4 Uno standoffs on the deck are mirrored, so a real Uno (or the custom board in `pcb/`) won't line up with them. v2 moves them to the right spots.
|
||||
|
||||
The other 25 files have the same shape in both folders. Parts already printed from v1 are fine to keep.
|
||||