endmill-deflection-calc/tool-deflection.html

267 lines
17 KiB
HTML
Raw Permalink Normal View History

2026-08-21 08:33:27 +02:00
<!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&nbsp;=&nbsp;π·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&quot; to 3/8&quot; [&nbsp;ratio&nbsp;0.75&nbsp;] 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&quot; 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&quot; (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&quot; slot in 1018, 3/8&quot; solid carbide, 2&quot; 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&quot;</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&quot; stickout: L³ drops 4.88, deflection lands at <b>0.010&quot;</b>, and if you also lighten up to 120&nbsp;lbf it's <b>0.0063&quot;</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&quot; 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>