diff --git a/README.md b/README.md index e8c80dd..11f69a6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,259 @@ -# motion-diagnostics-suite +# sv06-belt-recovery-stress-tests -Parametric OpenSCAD models and procedures for diagnosing layer shifts, belt tension, and motion instability in FDM 3D printers. \ No newline at end of file +Belt tension recovery and motion stability test models for bed-slinger 3D printers (e.g., SV06-class machines). + +--- +![](img/DSC_5098.webp) +## Purpose + +These models are designed to help recover from situations where printer motion accuracy has been degraded, typically due to: + +* Adjusting belt tension without a reference baseline +* Experiencing layer shifts during prints +* Replacing belts or modifying mechanical components + +This project provides: + +* Parametric OpenSCAD models +* A structured test procedure +* Guidance for interpreting failure modes + +--- + +## When To Use This + +Use these tests if you observe: + +* Sudden layer shifts (e.g., 3-5 mm offsets) +* Inconsistent dimensional accuracy +* Audible belt skipping or motor stutter +* After adjusting belt tensioners + +Here's an example of a case for a hand held radio where the top suddendly shift at the 20mm height. +![](img/20260318_215156_Wed.png) +--- + +## Models Included + +### 1. Cube (Baseline Test) + +* Dimensions: 40 × 40 × 40 mm +* Purpose: + + * Verify basic printer stability + * Detect gross mechanical issues + +--- + +### 2. Y-Bar (Axis Stress Test) + +* Dimensions: 20 × 150 × 50 mm +* Purpose: + + * Stress the Y-axis (bed movement) + * Detect belt slip under momentum and direction reversal + +**Important:** + +* Orient the 150 mm dimension front-to-back on the bed + +--- + +### 3. Tower (Long-Duration Test) + +* Dimensions: 18 × 18 × 120 mm +* Purpose: + + * Reveal issues that appear only over time + * Detect cumulative drift, resonance, or late-stage layer shifts + +--- + +## Print Procedure (Recommended Order) + +Run each model as a **separate print job**: + +1. **Cube** + + * Confirms system is not fundamentally broken + +2. **Y-Bar** + + * Directly tests axis tension and inertia behavior + +3. **Tower** + + * Tests stability over time and height + +--- + +## Suggested Slicer Settings (Orca Slicer) + +### Cube + +* Layer height: 0.20 mm +* Perimeters: 3 +* Infill: 20-25% (grid or gyroid) + +### Y-Bar + +* Layer height: 0.20 mm +* Perimeters: 3 +* Infill: 15-25% (grid recommended) + +### Tower + +* Layer height: 0.20 mm +* Perimeters: 3 +* Infill: 0-10% +* Brim: optional (only if adhesion is an issue) + +See the settings folder for settings used in Orca Slicer. + +--- + +## Belt Tension Guidance + +This project assumes GT2 belts (typical for most hobby printers). + +### Frequency Method (Recommended) + +Using a phone-based spectrum analyzer: + +* Target range: **90-110 Hz** +* Reference: ~110 Hz ? ~2 lb tension (Voron baseline) + +Procedure: + +1. Move bed so belt span ~ 150 mm +2. Pluck belt +3. Measure frequency +4. Adjust tensioner +5. Repeat until stable + +### Notes + +* Too loose: + + * Low frequency (<70 Hz) + * Layer shifts likely + +* Too tight: + + * High frequency (>120-130 Hz) + * Motor strain, possible missed steps + +--- + +## Interpreting Results + +### Good Result + +* Clean vertical alignment +* No sudden offsets +* Consistent layer stacking + +--- + +### Failure Modes + +#### Sudden Layer Shift + +* Cause: + + * Belt too loose + * Pulley slipping +* Action: + + * Increase tension slightly + * Check motor pulley set screws + +--- + +#### Repeated Shift at Same Height + +* Cause: + + * Mechanical obstruction + * Cable snag +* Action: + + * Inspect motion path + * Check wiring harness clearance + +--- + +#### Gradual Lean / Drift + +* Cause: + + * Frame or axis alignment issue +* Action: + + * Inspect rails, wheels, or rods + +--- + +#### Ringing / Ghosting (No Shift) + +* Cause: + + * High acceleration +* Action: + + * Reduce acceleration (not a belt issue) + +--- + +## Notes on Methodology + +These tests intentionally: + +* Emphasize repeated motion in one axis +* Increase inertial load with height +* Create conditions where marginal tension fails visibly + +This approach isolates motion system issues rather than general print quality. + +--- + +## OpenSCAD Usage + +Generate models: + +```bash +openscad -D 'model="cube"' -o cube_$(date +%Y%m%d_%H%M).stl stress_test_models.scad +openscad -D 'model="ybar"' -o ybar_$(date +%Y%m%d_%H%M).stl stress_test_models.scad +openscad -D 'model="tower"' -o tower_$(date +%Y%m%d_%H%M).stl stress_test_models.scad +``` + +--- + +## Provenance + +Generated with: + +* OpenSCAD +* Orca Slicer (recommended) +* Frequency-based belt tuning derived from: + + * Voron Design tuning methodology + +This project was developed with ChatGPT. +--- + +## License + +Recommend: MIT or CC-BY 4.0 for broad reuse. + +--- + +## Contributing + +Improvements welcome: + +* Additional test geometries +* Axis-specific stress models +* Automated calibration workflows + +--- \ No newline at end of file diff --git a/openscad/stress_test_models.scad b/openscad/stress_test_models.scad index 6fed3be..95fb68c 100644 --- a/openscad/stress_test_models.scad +++ b/openscad/stress_test_models.scad @@ -147,8 +147,48 @@ module rounded_box_uncentered(x, y, z, r) { square([x, y], center=false); } - module place_top_label(txt, x, y, z, center_it=false) { + + // --- parameters --- + margin = 2; // mm clearance from edges + + // usable space + usable_x = x - margin; + usable_y = y - margin; + + // choose orientation: run along long axis + rotate_text = (y > x); + + // limiting width after orientation + limit = rotate_text ? usable_y : usable_x; + + // crude text width estimate factor (~0.6 * size * chars) + est_char_width = 1.0; + est_len = len(txt) * est_char_width; + + // compute size that fits + auto_size = limit / est_len; + + // clamp to your preferred max size + final_size = min(label_size, auto_size); + + // placement + tx = center_it ? 0 : x/2; + ty = center_it ? 0 : y/2; + tz = center_it ? z/2 : z; + + translate([tx, ty, tz - label_depth]) + rotate([0, 0, rotate_text ? 90 : 0]) + linear_extrude(height=label_depth + 0.02) + text( + txt, + size=final_size, + font=label_font, + halign="center", + valign="center" + ); +} +module place_top_labelOLD(txt, x, y, z, center_it=false) { tx = center_it ? 0 : x/2; ty = center_it ? 0 : y/2; tz = center_it ? z/2 : z;