endmill-deflection-calc/tool-deflection.html
2026-08-21 06:33:27 +00:00

267 lines
17 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>