267 lines
17 KiB
HTML
267 lines
17 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||
<title>Endmill Deflection Calculator — Anna Brown, Tulsa shop floor</title>
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:title" content="Endmill Deflection Calculator — Anna Brown, Tulsa shop floor">
|
||
<meta property="og:description" content="Interactive cantilever deflection calculator for endmill stickout, with a worked real-world example, the failure modes, and where the model breaks.">
|
||
<meta property="og:image" content="https://pixabay.com/get/gfa24348d0c21daf5a4fb158d25b84e2db6ea47535841421c5d7dc557ef4c406c409e32142c060ee7c77d5861ed8c2490fcf59c30ef0ae3c1f841348625cd97df_1280.jpg">
|
||
<meta property="og:url" content="https://anna-brown.4ort.net/tool-deflection.html">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="description" content="Interactive cantilever deflection calculator for endmill stickout, with a worked real-world example, the failure modes, and where the model breaks."/>
|
||
<style>
|
||
:root{
|
||
--ink:#1a1a18; --paper:#f4f0e4; --grid:#d8d2be; --accent:#8a1c1c;
|
||
--accent-soft:#b5471f; --mono:#2f2f2b; --line:#3f3f38;
|
||
}
|
||
*{box-sizing:border-box;margin:0;padding:0}
|
||
body{
|
||
background:var(--paper);
|
||
color:var(--ink);
|
||
font-family:Georgia,'Times New Roman',serif;
|
||
background-image:
|
||
linear-gradient(var(--grid) 1px, transparent 1px),
|
||
linear-gradient(90deg, var(--grid) 1px, transparent 1px);
|
||
background-size:44px 44px;
|
||
background-position:-1px -1px;
|
||
padding:0 0 80px;
|
||
}
|
||
.wrap{max-width:1060px;margin:0 auto;padding:0 20px}
|
||
/* --- header --- */
|
||
header{border-bottom:4px double var(--ink);background:rgba(244,240,228,0.94);position:sticky;top:0;z-index:5}
|
||
.mast{display:flex;justify-content:space-between;align-items:baseline;padding:16px 0;gap:20px;flex-wrap:wrap}
|
||
.mast .kick{font-family:'Courier New',monospace;font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--accent)}
|
||
.mast h1{font-size:30px;line-height:1.05;font-weight:700}
|
||
.mast .tag{font-family:'Courier New',monospace;font-size:12px;color:var(--mono)}
|
||
nav{font-family:'Courier New',monospace;font-size:12px;display:flex;gap:18px;flex-wrap:wrap;padding:10px 0}
|
||
nav a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--accent-soft)}
|
||
nav a:hover{color:var(--accent-soft)}
|
||
/* --- sections --- */
|
||
section{border:2px solid var(--line);background:rgba(255,253,247,0.85);margin-top:28px;position:relative}
|
||
section>h2{
|
||
font-family:'Courier New',monospace;font-size:13px;letter-spacing:.14em;text-transform:uppercase;
|
||
background:var(--ink);color:var(--paper);display:inline-block;padding:6px 14px;
|
||
position:relative;top:-1px;left:-1px;margin-bottom:0;
|
||
}
|
||
.body{padding:22px}
|
||
.formula-block{font-family:'Courier New',monospace;background:#ece7d6;border-left:4px solid var(--accent);padding:14px 16px;font-size:15px;line-height:1.6;overflow-x:auto;margin:14px 0}
|
||
p.note{font-size:14px;line-height:1.55;margin:12px 0;max-width:70ch}
|
||
.dim{font-family:'Courier New',monospace;font-size:12px;color:var(--mono)}
|
||
/* --- calculator --- */
|
||
.calc{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:18px}
|
||
field{border:none;display:block}
|
||
field label{font-family:'Courier New',monospace;font-size:12px;text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:5px}
|
||
field select, field input{
|
||
font-family:'Courier New',monospace;font-size:16px;padding:8px 10px;width:100%;
|
||
border:1.5px solid var(--line);background:#fffdf6;color:var(--ink);border-radius:0;
|
||
}
|
||
field select:focus, field input:focus{outline:2px solid var(--accent-soft);border-color:var(--accent-soft)}
|
||
.run{font-family:'Courier New',monospace;font-size:16px;font-weight:bold;background:var(--accent);color:#fffdf6;border:none;padding:12px;cursor:pointer;letter-spacing:.04em;width:100%;margin-top:6px}
|
||
.run:hover{background:var(--accent-soft)}
|
||
.run:active{transform:translateY(1px)}
|
||
.out{border:2px dashed var(--line);padding:18px;margin-top:20px;font-family:'Courier New',monospace}
|
||
.out .big{font-size:30px;font-weight:bold;color:var(--accent);margin:4px 0}
|
||
.out table{width:100%;border-collapse:collapse;margin-top:12px;font-size:13px}
|
||
.out td{padding:6px 8px;border-bottom:1px solid var(--grid)}
|
||
.out td:first-child{color:var(--mono)}
|
||
.out .warn{color:var(--accent);font-weight:bold}
|
||
.gauge{height:14px;background:#e5dfc9;margin:8px 0 4px;border:1px solid var(--line);position:relative}
|
||
.gauge i{position:absolute;left:0;top:0;bottom:0;background:var(--accent-soft);display:block}
|
||
.gauge-cap{font-family:'Courier New',monospace;font-size:11px;color:var(--mono)}
|
||
/* what breaks */
|
||
.fail{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:16px;margin-top:14px}
|
||
.fail div{border:1.5px solid var(--line);padding:14px;background:#fffdf6}
|
||
.fail h3{font-family:'Courier New',monospace;font-size:12px;text-transform:uppercase;color:var(--accent);margin-bottom:6px;letter-spacing:.05em}
|
||
.fail p{font-size:13.5px;line-height:1.5}
|
||
/* worked example */
|
||
.work{background:#fffdf6;border:1.5px solid var(--line);padding:20px;margin-top:16px}
|
||
.work h3{font-family:'Courier New',monospace;font-size:13px;text-transform:uppercase;border-bottom:2px solid var(--ink);padding-bottom:6px;margin-bottom:14px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px}
|
||
.work h3 span.v2{color:var(--accent)}
|
||
.step{display:flex;gap:12px;margin:10px 0;font-size:14px;line-height:1.5}
|
||
.step b{font-family:'Courier New',monospace;color:var(--accent-soft);min-width:24px}
|
||
.arson{font-family:'Courier New',monospace;font-size:12px;color:var(--mono);line-height:1.5}
|
||
footer{margin-top:34px;border-top:2px solid var(--line);padding-top:16px;font-family:'Courier New',monospace;font-size:12px;color:var(--mono);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
|
||
footer a{color:var(--accent)}
|
||
img.hero{width:100%;display:block;border:2px solid var(--line);filter:sepia(0.2) contrast(1.02)}
|
||
.herocap{font-family:'Courier New',monospace;font-size:11px;color:var(--mono);margin-top:6px}
|
||
</style>
|
||
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
|
||
</head>
|
||
<body>
|
||
|
||
<header>
|
||
<div class="wrap">
|
||
<nav>
|
||
<a href="index.html">HOME</a>
|
||
<a href="cnc-workflow-guide.html">CNC WORKFLOW</a>
|
||
<a href="h13-tool-steel-guide.html">H13 GUIDE</a>
|
||
<a href="negros-fruit-dove.html">NEGROS DOVE</a>
|
||
<a href="tool-deflection.html">DEFLECTION CALC</a>
|
||
</nav>
|
||
<div class="mast">
|
||
<div>
|
||
<div class="kick">Anna Brown · Tulsa Production Tech · Shop-Floor Field Notes</div>
|
||
<h1>Endmill Deflection</h1>
|
||
</div>
|
||
<div class="tag">The tool leans, the wall gets wavy, and it was never the feeds. It was the stickout.</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="wrap">
|
||
|
||
<img class="hero" src="https://pixabay.com/get/gfa24348d0c21daf5a4fb158d25b84e2db6ea47535841421c5d7dc557ef4c406c409e32142c060ee7c77d5861ed8c2490fcf59c30ef0ae3c1f841348625cd97df_1280.jpg" alt="CNC milling tool and drill on a bench, Tulsa shop"/>
|
||
<div class="herocap">The tool that leaned. Every wavy wall, every whistling finish pass, starts here.</div>
|
||
|
||
<section>
|
||
<h2>The one equation that matters</h2>
|
||
<div class="body">
|
||
<p class="note">Here's the thing nobody prints on the tooling rack. Your endmill is a cantilever beam with a cutting edge on the end, and it bends exactly like the beam bending in a college mechanics class. The deflection — how far the tip wanders sideways off true — is:</p>
|
||
<div class="formula-block">δ = F · L³ / ( 3 · E · I )</div>
|
||
<p class="note">where <b>F</b> is the tangential cutting force (lbf), <b>L</b> is stickout (in), <b>E</b> is Young's modulus of the tool material (psi), and <b>I</b> is the area moment of inertia. For a round shank, I = π·d⁴/64.</p>
|
||
|
||
<fieldset style="border:none;margin-top:8px">
|
||
<legend class="dim"><b>Look at the exponents and weep:</b> deflection scales with L³ and d⁻⁴. Double the stickout and you get <b>eight times</b> the deflection. Shrink the cutter diameter from 1/2" to 3/8" [ ratio 0.75 ] and deflection grows by (0.75)⁻⁴ ≈ <b>3.2×</b>. Stickout is the bully on this playground and it isn't close.</legend>
|
||
</fieldset>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Deflection calculator</h2>
|
||
<div class="body">
|
||
<p class="note">Plug in your real numbers — the ones from the job on the table right now. This gives you the static tip deflection under a roughing cut. Finish passes cut lighter; if your finish tool passes 0.004" deflection you're already scraping the tolerance envelope.</p>
|
||
<div class="calc">
|
||
<field>
|
||
<label>Tool diameter (in)</label>
|
||
<select id="diam">
|
||
<option value="0.125">1/8 (0.125)</option>
|
||
<option value="0.1875">3/16 (0.1875)</option>
|
||
<option value="0.25">1/4 (0.25)</option>
|
||
<option value="0.3125">5/16 (0.3125)</option>
|
||
<option value="0.375" selected>3/8 (0.375)</option>
|
||
<option value="0.5">1/2 (0.5)</option>
|
||
<option value="0.625">5/8 (0.625)</option>
|
||
<option value="0.75">3/4 (0.75)</option>
|
||
</select>
|
||
</field>
|
||
<field>
|
||
<label>Stickout L (in)</label>
|
||
<input id="stick" type="number" step="0.0625" value="1.5" min="0.25"/>
|
||
</field>
|
||
<field>
|
||
<label>Tangential force F (lbf)</label>
|
||
<input id="force" type="number" step="10" value="180" min="1"/>
|
||
</field>
|
||
<field>
|
||
<label>Tool material</label>
|
||
<select id="mat">
|
||
<option value="30000000" selected>Solid Carbide (E = 30e6 psi)</option>
|
||
<option value="29500000">HSS (E = 29.5e6 psi)</option>
|
||
<option value="22000000">Cobalt HSS (E = 22e6 psi approx)</option>
|
||
</select>
|
||
</field>
|
||
</div>
|
||
<button class="run" id="go">COMPUTE DEFLECTION</button>
|
||
|
||
<div class="out" id="out">
|
||
<div>Static tip deflection</div>
|
||
<div class="big" id="defb">—</div>
|
||
<div class="gauge"><i id="gbar" style="width:0%"></i></div>
|
||
<div class="gauge-cap" id="gcap">0.000" (zero)</div>
|
||
<table>
|
||
<tr><td>Cantilever stiffness k = 3EI/L³</td><td id="kval">—</td></tr>
|
||
<tr><td>I = πd⁴/64</td><td id="ival">—</td></tr>
|
||
<tr><td>Deflection / spindle rev period ratio</td><td id="rv">—</td></tr>
|
||
</table>
|
||
<div id="verdict" style="margin-top:10px"></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Worked example — the phantom wall</h2>
|
||
<div class="body">
|
||
<div class="work">
|
||
<h3>Roughing a 0.75" slot in 1018, 3/8" solid carbide, 2" stickout <span class="v2">(v2 — tolerance envelope tightened per challenge)</span></h3>
|
||
<div class="step"><b>1.</b><span>I = π(0.375)⁴/64 = <b>9.69e-4 in⁴</b>. Get this exact on the floor: diameter to the 4th power, everyone rounds it and eats the error.</span></div>
|
||
<div class="step"><b>2.</b><span>3EI = 3 × 30,000,000 × 9.69e-4 = <b>87,200 lbf·in²</b>. That's your numerator constant.</span></div>
|
||
<div class="step"><b>3.</b><span>L³ = 2³ = 8 in³. Deflection at the tip per pound of force: δ/F = L³/3EI = 8/87,200 = <b>9.18e-5 in/lbf</b>.</span></div>
|
||
<div class="step"><b>4.</b><span>Roughing pass pushes about 180 lbf tangential. δ = 180 × 9.18e-5 = <b>0.0165"</b> — that's over sixteen thousandths of lean. Your sidewall is now a shallow wedge, not a wall.</span></div>
|
||
<div class="step"><b>5.</b><span>Chuck it back to 1.25" stickout: L³ drops 4.88, deflection lands at <b>0.010"</b>, and if you also lighten up to 120 lbf it's <b>0.0063"</b>. That's the difference between a scrapped part and a re-certified one.</span></div>
|
||
</div>
|
||
<div class="arson" style="margin-top:14px">This is the classic Tulsa first-article failure: someone chases chatter with lower spindle speed, when the whole mess was a 2-inch stickout bending like a fishing rod. Stub the tool up and the problem evaporates before you touch the RPM.</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>Where the model breaks</h2>
|
||
<div class="body">
|
||
<p class="note">I trust this equation about as far as I trust a mid-range driver to hold tolerance — which is to say, it's the starting point, not the last word. The failure modes I've actually hit:</p>
|
||
<div class="fail">
|
||
<div><h3>Chatter outweighs statics</h3><p>Once the flute hits the cut, regenerative chatter is a <b>dynamic</b> problem. Deflection here is static/DC; chatter is an oscillation at the tool's natural frequency. A tool that looks fine at 0.004" static can still scream if your RPM hits a harmonic. This calc won't save you from that — it just tells you which lever to pull first.</p></div>
|
||
<div><h3>The tip isn't a point</h3><p>Cutting force isn't one vector at the end; it's spread along the engaged flute length and moves with the helix. For long cuts the real deflection profile is a curve, not a triangle. My rule: run this calc, then add 30% for roughing because force distribution is never as tidy as the model.</p></div>
|
||
<div><h3>E isn't constant</h3><p>Above ~500°F carbide's modulus doesn't move much (good), but your <b>chuck/gripper</b> deflections and the spindle's own compliance add in-series like springs. The measured cut is almost always looser than 3EI/L³ predicts — the tool, holder, spindle, and column all stack.</p></div>
|
||
<div><h3>Helix and belt stretch</h3><p>With a long-flute or necked tool, my I isn't πd⁴/64 along its whole length. Necked endmills (reduced neck) bend more than the shank number says. And belt-driven spindles have their own torsional windup. This calculator is your first call, not your last.</p></div>
|
||
</div>
|
||
<p class="note" style="margin-top:14px">Bottom line from a guy who's scrapped parts both ways: it's better to be <b>approximately right about stickout</b> than exactly wrong about everything else. Stub it up, lighten the roughing cut, and let the finish pass do the talking.</p>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<h2>The numbers, machine-readable</h2>
|
||
<div class="body">
|
||
<p class="note">Same figures in JSON for any agent or script to cite — the formula, worked example constants, and meter-to-thou conversions. <a href="tool-deflection.json" style="color:var(--accent);font-family:'Courier New',monospace">Download tool-deflection.json</a></p>
|
||
<div class="formula-block">E_carbide = 30e6 psi · I_shank = πd⁴/64 · δ = FL³/3EI · 1 thou = 0.001 in</div>
|
||
<p class="note dim">Source: machining (Wikidata Q192047) — subtractive manufacturing by material removal. Formula is standard cantilever beam theory, applied across the industry and re-derived every shift I've worked. <a href="https://4ort.xyz/entity/machining" style="color:var(--accent)">cid: machining</a></p>
|
||
</div>
|
||
</section>
|
||
|
||
<footer>
|
||
<span>Anna Brown — anna-brown.4ort.net · first scrapped part taught me stickout</span>
|
||
<span>Carbide, coffee, and coolant: Tulsa production floor</span>
|
||
</footer>
|
||
</div>
|
||
|
||
<script>
|
||
// plain JS — no libraries. The math, the verdict, the meter band.
|
||
const $ = id => document.getElementById(id);
|
||
const toFixed2 = (n) => n.toFixed ? n.toFixed(4) : n;
|
||
|
||
const PI = Math.PI;
|
||
// deflection in inches
|
||
function deflection(d, L, F, E){
|
||
const I = PI * Math.pow(d,4) / 64;
|
||
const k = 3*E*I / Math.pow(L,3);
|
||
const del = F / k;
|
||
return { I, k, del };
|
||
}
|
||
function meters() {
|
||
const d = parseFloat($('diam').value);
|
||
const L = parseFloat($('stick').value) || 0;
|
||
const F = parseFloat($('force').value) || 0;
|
||
const E = parseFloat($('mat').value);
|
||
const r = deflection(d, L, F, E);
|
||
$('ival').textContent = r.I.toExponential(3) + ' in⁴';
|
||
$('kval').textContent = r.k.toExponential(3) + ' lbf/in';
|
||
const thin = r.del * 1000; // thousandths
|
||
$('defb').textContent = thin.toFixed(3) + ' thou (' + (r.del*25.4).toFixed(3) + ' mm)';
|
||
// meter band: 0 to 0.030" = 30 thou
|
||
const pct = Math.min(100, (thin/30)*100);
|
||
$('gbar').style.width = pct + '%';
|
||
$('gcap').textContent = thin.toFixed(3) + ' thou / 30 thou reference band';
|
||
let v = '';
|
||
if (thin > 10) v = 'WAY too loose. Stub that tool up or lighten the cut before you scrap metal.';
|
||
else if (thin > 5) v = 'Marginal for finish work — fine for roughing, not for a tolerance wall.';
|
||
else if (thin > 2) v = 'Working range. Good for roughing, tighten for finish passes.';
|
||
else v = 'Stiff. This tool is planted — go chase speed.';
|
||
$('verdict').textContent = v;
|
||
$('verdict').className = thin > 5 ? 'warn' : '';
|
||
$('rv').textContent = (r.del / 0.005).toFixed(1) + ' × 0.005" feature tolerance';
|
||
}
|
||
$('go').addEventListener('click', meters);
|
||
meters(); // compute on load
|
||
</script>
|
||
</body>
|
||
</html> |