klipper/Load_Cell.html

1973 lines
No EOL
65 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="img/favicon.ico">
<meta name="generator" content="mkdocs-1.2.4, mkdocs-material-8.1.3">
<title>Load Cells - Klipper documentation</title>
<link rel="stylesheet" href="assets/stylesheets/main.edf004c2.min.css">
<link rel="stylesheet" href="assets/stylesheets/palette.e6a45f82.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="_klipper3d/css/extra.css">
<script>__md_scope=new URL(".",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-VEN1PGNQL4"),document.addEventListener("DOMContentLoaded",function(){document.forms.search&&document.forms.search.query.addEventListener("blur",function(){this.value&&gtag("event","search",{search_term:this.value})}),"undefined"!=typeof location$&&location$.subscribe(function(e){gtag("config","G-VEN1PGNQL4",{page_path:e.pathname})})})</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-VEN1PGNQL4"></script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="blue">
<script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)</script>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#load-cells" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="." title="Klipper documentation" class="md-header__button md-logo" aria-label="Klipper documentation" data-md-component="logo">
<img src="img/klipper.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Klipper documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Load Cells
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="blue" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7M9 21a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1H9v1z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="grey" data-md-color-accent="light-blue" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 1 7 7c0 2.38-1.19 4.47-3 5.74V17a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-2.26C6.19 13.47 5 11.38 5 9a7 7 0 0 1 7-7M9 21v-1h6v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1m3-17a5 5 0 0 0-5 5c0 2.05 1.23 3.81 3 4.58V16h4v-2.42c1.77-.77 3-2.53 3-4.58a5 5 0 0 0-5-5z"/></svg>
</label>
</form>
<div class="md-header__option">
<div class="md-select">
<button class="md-header__button md-icon" aria-label="Select language">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.36 14c.08-.66.14-1.32.14-2 0-.68-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2m-5.15 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95a8.03 8.03 0 0 1-4.33 3.56M14.34 14H9.66c-.1-.66-.16-1.32-.16-2 0-.68.06-1.35.16-2h4.68c.09.65.16 1.32.16 2 0 .68-.07 1.34-.16 2M12 19.96c-.83-1.2-1.5-2.53-1.91-3.96h3.82c-.41 1.43-1.08 2.76-1.91 3.96M8 8H5.08A7.923 7.923 0 0 1 9.4 4.44C8.8 5.55 8.35 6.75 8 8m-2.92 8H8c.35 1.25.8 2.45 1.4 3.56A8.008 8.008 0 0 1 5.08 16m-.82-2C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2 0 .68.06 1.34.14 2M12 4.03c.83 1.2 1.5 2.54 1.91 3.97h-3.82c.41-1.43 1.08-2.77 1.91-3.97M18.92 8h-2.95a15.65 15.65 0 0 0-1.38-3.56c1.84.63 3.37 1.9 4.33 3.56M12 2C6.47 2 2 6.5 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z"/></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a href="/" hreflang="en" class="md-select__link">
English
</a>
</li>
<li class="md-select__item">
<a href="/zh/" hreflang="zh" class="md-select__link">
简体中文
</a>
</li>
<li class="md-select__item">
<a href="/zh-Hant/" hreflang="zh-Hant" class="md-select__link">
繁體中文
</a>
</li>
<li class="md-select__item">
<a href="/hu/" hreflang="hu" class="md-select__link">
Magyar
</a>
</li>
<li class="md-select__item">
<a href="/it/" hreflang="it" class="md-select__link">
Italiano
</a>
</li>
<li class="md-select__item">
<a href="/fr/" hreflang="fr" class="md-select__link">
Français
</a>
</li>
</ul>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08z"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/Klipper3d/klipper/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
Klipper3d/klipper
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="." title="Klipper documentation" class="md-nav__button md-logo" aria-label="Klipper documentation" data-md-component="logo">
<img src="img/klipper.svg" alt="logo">
</a>
Klipper documentation
</label>
<div class="md-nav__source">
<a href="https://github.com/Klipper3d/klipper/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</div>
<div class="md-source__repository">
Klipper3d/klipper
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Overview.html" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="Features.html" class="md-nav__link">
Features
</a>
</li>
<li class="md-nav__item">
<a href="FAQ.html" class="md-nav__link">
Frequently Asked Questions
</a>
</li>
<li class="md-nav__item">
<a href="Releases.html" class="md-nav__link">
Releases
</a>
</li>
<li class="md-nav__item">
<a href="Config_Changes.html" class="md-nav__link">
Configuration Changes
</a>
</li>
<li class="md-nav__item">
<a href="Contact.html" class="md-nav__link">
Contact
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7">
Installation and Configuration
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation and Configuration" data-md-level="1">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Installation and Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_1" type="checkbox" id="__nav_7_1" >
<label class="md-nav__link" for="__nav_7_1">
Installation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Installation" data-md-level="2">
<label class="md-nav__title" for="__nav_7_1">
<span class="md-nav__icon md-icon"></span>
Installation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Installation.html" class="md-nav__link">
Installation
</a>
</li>
<li class="md-nav__item">
<a href="OctoPrint.html" class="md-nav__link">
OctoPrint for Klipper
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_2" type="checkbox" id="__nav_7_2" >
<label class="md-nav__link" for="__nav_7_2">
Configuration Reference
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Configuration Reference" data-md-level="2">
<label class="md-nav__title" for="__nav_7_2">
<span class="md-nav__icon md-icon"></span>
Configuration Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Config_Reference.html" class="md-nav__link">
Configuration reference
</a>
</li>
<li class="md-nav__item">
<a href="Rotation_Distance.html" class="md-nav__link">
Rotation distance
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="Config_checks.html" class="md-nav__link">
Configuration checks
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_4" type="checkbox" id="__nav_7_4" >
<label class="md-nav__link" for="__nav_7_4">
Bed Level
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Bed Level" data-md-level="2">
<label class="md-nav__title" for="__nav_7_4">
<span class="md-nav__icon md-icon"></span>
Bed Level
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Bed_Level.html" class="md-nav__link">
Bed leveling
</a>
</li>
<li class="md-nav__item">
<a href="Delta_Calibrate.html" class="md-nav__link">
Delta calibration
</a>
</li>
<li class="md-nav__item">
<a href="Probe_Calibrate.html" class="md-nav__link">
Probe calibration
</a>
</li>
<li class="md-nav__item">
<a href="BLTouch.html" class="md-nav__link">
BL-Touch
</a>
</li>
<li class="md-nav__item">
<a href="Manual_Level.html" class="md-nav__link">
Manual leveling
</a>
</li>
<li class="md-nav__item">
<a href="Bed_Mesh.html" class="md-nav__link">
Bed Mesh
</a>
</li>
<li class="md-nav__item">
<a href="Endstop_Phase.html" class="md-nav__link">
Endstop phase
</a>
</li>
<li class="md-nav__item">
<a href="Axis_Twist_Compensation.html" class="md-nav__link">
Axis Twist Compensation
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_5" type="checkbox" id="__nav_7_5" >
<label class="md-nav__link" for="__nav_7_5">
Resonance Compensation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Resonance Compensation" data-md-level="2">
<label class="md-nav__title" for="__nav_7_5">
<span class="md-nav__icon md-icon"></span>
Resonance Compensation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Resonance_Compensation.html" class="md-nav__link">
Resonance Compensation
</a>
</li>
<li class="md-nav__item">
<a href="Measuring_Resonances.html" class="md-nav__link">
Measuring Resonances
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="Pressure_Advance.html" class="md-nav__link">
Pressure advance
</a>
</li>
<li class="md-nav__item">
<a href="G-Codes.html" class="md-nav__link">
G-Codes
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7_8" type="checkbox" id="__nav_7_8" >
<label class="md-nav__link" for="__nav_7_8">
Command templates
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Command templates" data-md-level="2">
<label class="md-nav__title" for="__nav_7_8">
<span class="md-nav__icon md-icon"></span>
Command templates
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Command_Templates.html" class="md-nav__link">
Commands templates
</a>
</li>
<li class="md-nav__item">
<a href="Status_Reference.html" class="md-nav__link">
Status reference
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="TMC_Drivers.html" class="md-nav__link">
TMC drivers
</a>
</li>
<li class="md-nav__item">
<a href="Multi_MCU_Homing.html" class="md-nav__link">
Multiple Micro-controller Homing and Probing
</a>
</li>
<li class="md-nav__item">
<a href="Slicers.html" class="md-nav__link">
Slicers
</a>
</li>
<li class="md-nav__item">
<a href="Skew_Correction.html" class="md-nav__link">
Skew correction
</a>
</li>
<li class="md-nav__item">
<a href="Exclude_Object.html" class="md-nav__link">
Exclude Objects
</a>
</li>
<li class="md-nav__item">
<a href="Using_PWM_Tools.html" class="md-nav__link">
Using PWM tools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_8" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8">
Developer Documentation
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Developer Documentation" data-md-level="1">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Developer Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Code_Overview.html" class="md-nav__link">
Code overview
</a>
</li>
<li class="md-nav__item">
<a href="Kinematics.html" class="md-nav__link">
Kinematics
</a>
</li>
<li class="md-nav__item">
<a href="Protocol.html" class="md-nav__link">
Protocol
</a>
</li>
<li class="md-nav__item">
<a href="API_Server.html" class="md-nav__link">
API server
</a>
</li>
<li class="md-nav__item">
<a href="MCU_Commands.html" class="md-nav__link">
MCU commands
</a>
</li>
<li class="md-nav__item">
<a href="CANBUS_protocol.html" class="md-nav__link">
CANBUS protocol
</a>
</li>
<li class="md-nav__item">
<a href="Debugging.html" class="md-nav__link">
Debugging
</a>
</li>
<li class="md-nav__item">
<a href="Benchmarks.html" class="md-nav__link">
Benchmarks
</a>
</li>
<li class="md-nav__item">
<a href="CONTRIBUTING.html" class="md-nav__link">
Contributing to Klipper
</a>
</li>
<li class="md-nav__item">
<a href="Packaging.html" class="md-nav__link">
Packaging Klipper
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_9" type="checkbox" id="__nav_9" checked>
<label class="md-nav__link" for="__nav_9">
Device Specific Documents
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Device Specific Documents" data-md-level="1">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
Device Specific Documents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="Example_Configs.html" class="md-nav__link">
Example configurations
</a>
</li>
<li class="md-nav__item">
<a href="SDCard_Updates.html" class="md-nav__link">
SDCard updates
</a>
</li>
<li class="md-nav__item">
<a href="RPi_microcontroller.html" class="md-nav__link">
RPi microcontroller
</a>
</li>
<li class="md-nav__item">
<a href="Beaglebone.html" class="md-nav__link">
Beaglebone
</a>
</li>
<li class="md-nav__item">
<a href="Bootloaders.html" class="md-nav__link">
Bootloaders
</a>
</li>
<li class="md-nav__item">
<a href="Bootloader_Entry.html" class="md-nav__link">
Bootloader Entry
</a>
</li>
<li class="md-nav__item">
<a href="CANBUS.html" class="md-nav__link">
CANBUS
</a>
</li>
<li class="md-nav__item">
<a href="CANBUS_Troubleshooting.html" class="md-nav__link">
CANBUS Troubleshooting
</a>
</li>
<li class="md-nav__item">
<a href="TSL1401CL_Filament_Width_Sensor.html" class="md-nav__link">
TSL1401CL filament width sensor
</a>
</li>
<li class="md-nav__item">
<a href="Hall_Filament_Width_Sensor.html" class="md-nav__link">
Hall filament width sensor
</a>
</li>
<li class="md-nav__item">
<a href="Eddy_Probe.html" class="md-nav__link">
Eddy Current Inductive probe
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Load Cells
<span class="md-nav__icon md-icon"></span>
</label>
<a href="Load_Cell.html" class="md-nav__link md-nav__link--active">
Load Cells
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#related-documentation" class="md-nav__link">
Related Documentation
</a>
</li>
<li class="md-nav__item">
<a href="#using-load_cell_diagnostic" class="md-nav__link">
Using LOAD_CELL_DIAGNOSTIC
</a>
</li>
<li class="md-nav__item">
<a href="#calibrating-a-load-cell" class="md-nav__link">
Calibrating a Load Cell
</a>
<nav class="md-nav" aria-label="Calibrating a Load Cell">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#applying-a-known-force-or-load" class="md-nav__link">
Applying a Known Force or Load
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#reading-force-data" class="md-nav__link">
Reading Force Data
</a>
</li>
<li class="md-nav__item">
<a href="#taring-a-load-cell" class="md-nav__link">
Taring a Load Cell
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="Sponsors.html" class="md-nav__link">
Sponsors
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#related-documentation" class="md-nav__link">
Related Documentation
</a>
</li>
<li class="md-nav__item">
<a href="#using-load_cell_diagnostic" class="md-nav__link">
Using LOAD_CELL_DIAGNOSTIC
</a>
</li>
<li class="md-nav__item">
<a href="#calibrating-a-load-cell" class="md-nav__link">
Calibrating a Load Cell
</a>
<nav class="md-nav" aria-label="Calibrating a Load Cell">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#applying-a-known-force-or-load" class="md-nav__link">
Applying a Known Force or Load
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#reading-force-data" class="md-nav__link">
Reading Force Data
</a>
</li>
<li class="md-nav__item">
<a href="#taring-a-load-cell" class="md-nav__link">
Taring a Load Cell
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/Klipper3d/klipper/blob/master/docs/Load_Cell.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>
</a>
<h1 id="load-cells">Load Cells<a class="headerlink" href="#load-cells" title="Permanent link">&para;</a></h1>
<p>This document describes Klipper's support for load cells. Basic load cell
functionality can be used to read force data and to weigh things like filament.
A calibrated force sensor is an important part of a load cell based probe.</p>
<h2 id="related-documentation">Related Documentation<a class="headerlink" href="#related-documentation" title="Permanent link">&para;</a></h2>
<ul>
<li><a href="Config_Reference.html#load_cell">load_cell Config Reference</a></li>
<li><a href="G-Codes.html#load_cell">load_cell G-Code Commands</a></li>
<li><a href="Status_Reference.html#load_cell">load_cell Status Reference</a></li>
</ul>
<h2 id="using-load_cell_diagnostic">Using <code>LOAD_CELL_DIAGNOSTIC</code><a class="headerlink" href="#using-load_cell_diagnostic" title="Permanent link">&para;</a></h2>
<p>When you first connect a load cell its good practice to check for issues by
running <code>LOAD_CELL_DIAGNOSTIC</code>. This tool collects 10 seconds of data from the
load cell and resport statistics:</p>
<div class="highlight"><pre><span></span><code>$ LOAD_CELL_DIAGNOSTIC
// Collecting load cell data for 10 seconds...
// Samples Collected: 3211
// Measured samples per second: 332.0
// Good samples: 3211, Saturated samples: 0, Unique values: 900
// Sample range: [4.01% to 4.02%]
// Sample range / sensor capacity: 0.00524%
</code></pre></div>
<p>Things you can check with this data:</p>
<ul>
<li>The configured sample rate of the sensor should be close to the 'Measured
samples per second' value. If it is not you may have a configuration or wiring
issue.</li>
<li>'Saturated samples' should be 0. If you have saturated samples it means the
load sell is seeing more force than it can measure.</li>
<li>'Unique values' should be a large percentage of the 'Samples
Collected' value. If 'Unique values' is 1 it is very likely a wiring issue.</li>
<li>Tap or push on the sensor while <code>LOAD_CELL_DIAGNOSTIC</code> runs. If
things are working correctly ths should increase the 'Sample range'.</li>
</ul>
<h2 id="calibrating-a-load-cell">Calibrating a Load Cell<a class="headerlink" href="#calibrating-a-load-cell" title="Permanent link">&para;</a></h2>
<p>Load cells are calibrated using the <code>LOAD_CELL_CALIBRATE</code> command. This is an
interactive calibration utility that walks you though a 3 step process:</p>
<ol>
<li>First use the <code>TARE</code> command to establish the zero force value. This is the
<code>reference_tare_counts</code> config value.</li>
<li>Next you apply a known load or force to the load cell and run the
<code>CALIBRATE GRAMS=nnn</code> command. From this the <code>counts_per_gram</code> value is
calculated. See <a href="#applying-a-known-force-or-load">the next section</a> for some
suggestions on how to do this.</li>
<li>Finally, use the <code>ACCEPT</code> command to save the results.</li>
</ol>
<p>You can cancel the calibration process at any time with <code>ABORT</code>.</p>
<h3 id="applying-a-known-force-or-load">Applying a Known Force or Load<a class="headerlink" href="#applying-a-known-force-or-load" title="Permanent link">&para;</a></h3>
<p>The <code>CALIBRATE GRAMS=nnn</code> step can be accomplished in a number of ways. If your
load cell is under a platform like a bed or filament holder it might be easiest
to put a known mass on the platform. E.g. you could use a couple of 1KG filament
spools.</p>
<p>If your load cell is in the printer's toolhead a different approach is easier.
Put a digital scale on the printers bed and gently lower the toolhead onto the
scale (or raise the bed into the toolhead if your bed moves). You may be able to
do this using the <code>FORCE_MOVE</code> command. But more likely you will have to
manually moving the z axis with the motors off until the toolhead presses on the
scale.</p>
<p>A good calibration force would ideally be a large percentage of the load cell's
rated capacity. E.g. if you have a 5Kg load cell you would ideally calibrate it
with a 5kg mass. This might work well with under-bed sensors that have to
support a lot of weight. For toolhead probes this may not be a load that your
printer bed or toolhead can tolerate without damage. Do try to use at least 1Kg
of force, most printers should tolerate this without issue.</p>
<p>When calibrating make careful note of the values reported:</p>
<div class="highlight"><pre><span></span><code>$ CALIBRATE GRAMS=555
// Calibration value: -2.78% (-59803108), Counts/gram: 73039.78739,
Total capacity: +/- 29.14Kg
</code></pre></div>
<p>The <code>Total capacity</code> should be close to the theoretical rating of the load cell
based on the sensor's capacity. If it is much larger you could have used a
higher gain setting in the sensor or a more sensitive load cell. This isn't as
critical for 32bit and 24bit sensors but is much more critical for low bit width
sensors.</p>
<h2 id="reading-force-data">Reading Force Data<a class="headerlink" href="#reading-force-data" title="Permanent link">&para;</a></h2>
<p>Force data can be read with a GCode command:</p>
<div class="highlight"><pre><span></span><code>LOAD_CELL_READ
// 10.6g (1.94%)
</code></pre></div>
<p>Data is also continuously read and can be consumed from the load_cell printer
object in a macro:</p>
<div class="highlight"><pre><span></span><code>{% set grams = printer.load_cell.force_g %}
</code></pre></div>
<p>This provides an average force over the last 1 second, similar to how
temperature sensors work.</p>
<h2 id="taring-a-load-cell">Taring a Load Cell<a class="headerlink" href="#taring-a-load-cell" title="Permanent link">&para;</a></h2>
<p>Taring, sometimes called zeroing, sets the current weight reported by the
load_cell to 0. This is useful for measuring relative to a known weight. e.g.
when measuring a filament spool, using <code>LOAD_CELL_TARE</code> sets the weight to 0.
Then as filament is printed the load_cell will report the weight of the
filament used.</p>
<div class="highlight"><pre><span></span><code>LOAD_CELL_TARE
// Load cell tare value: 5.32% (445903)
</code></pre></div>
<p>The current tare value is reported in the printers status and can be read in
a macro:</p>
<div class="highlight"><pre><span></span><code>{% set tare_counts = printer.load_cell.tare_counts %}
</code></pre></div>
<h1 id="load-cell-probes">Load Cell Probes<a class="headerlink" href="#load-cell-probes" title="Permanent link">&para;</a></h1>
<h2 id="related-documentation_1">Related Documentation<a class="headerlink" href="#related-documentation_1" title="Permanent link">&para;</a></h2>
<ul>
<li><a href="Config_Reference.html#load_cell_probe">load_cell_probe Config Reference</a></li>
<li><a href="G-Codes.html#load_cell_probe">load_cell_probe G-Code Commands</a></li>
<li><a href="Status_Reference.html#load_cell_probe">load_cell_probe Statuc Reference</a></li>
</ul>
<h2 id="load-cell-probe-safety">Load Cell Probe Safety<a class="headerlink" href="#load-cell-probe-safety" title="Permanent link">&para;</a></h2>
<p>Because load cells are a direct nozzle contact probe there is a risk of
damage to your printer if too much force is used. The load cell probing system
includes a number of safety checks that try to keep your machine safe from
excessive force to the toolhead. It's important to understand what they are
and how they work as you can defeat most of them with poorly chosen config
values.</p>
<h4 id="calibration-check">Calibration Check<a class="headerlink" href="#calibration-check" title="Permanent link">&para;</a></h4>
<p>Every time a homing move starts, load_cell_probe checks
that the load_cell is calibrated. If not it will stop the move with an error:
<code>!! Load Cell not calibrated</code>.</p>
<h4 id="counts_per_gram"><code>counts_per_gram</code><a class="headerlink" href="#counts_per_gram" title="Permanent link">&para;</a></h4>
<p>This setting is used to convert raw sensor counts into grams. All the safety
limits are in gram units for your convenience. If the <code>counts_per_gram</code>
setting is not accurate you can easily exceed the safe force on the toolhead.
You should never guess this value. Use <code>LOAD_CELL_CALIBRATE</code> to find your load
cells actual <code>counts_per_gram</code>.</p>
<h4 id="trigger_force"><code>trigger_force</code><a class="headerlink" href="#trigger_force" title="Permanent link">&para;</a></h4>
<p>This is the force in grams that triggers the endstop to halt the homing move.
When a homing move starts the endstop tares itself with the current reading
from the load cell. <code>trigger_force</code> is measured from that tare value. There is
always some overshoot of this value when the probe collides with the bed,
so be conservative. e.g. a setting of 100g could result in 350g of peak force
before the toolhead stops. This overshoot will increase with faster probing
<code>speed</code>, a low ADC sample rate or <a href="Multi_MCU_Homing.html">multi MCU homing</a>.</p>
<h4 id="reference_tare_counts"><code>reference_tare_counts</code><a class="headerlink" href="#reference_tare_counts" title="Permanent link">&para;</a></h4>
<p>This is the baseline tare value that is set by <code>LOAD_CELL_CALIBRATE</code>.
This value works with <code>force_safety_limit</code> to limit the maximum force on the
toolhead.</p>
<h4 id="force_safety_limit"><code>force_safety_limit</code><a class="headerlink" href="#force_safety_limit" title="Permanent link">&para;</a></h4>
<p>This is the maximum absolute force, relative to <code>reference_tare_counts</code>,
that the probe will allow while homing or probing. If the MCU sees this
force exceeded it will shut down the printer with the error <code>!! Load cell
endstop: too much force!</code>. There are a number of ways this can be triggered:</p>
<p>The first risk this protects against is picking too large of a value for
<code>drift_filter_cutoff_frequency</code>. This can cause the drift filter to filter out
a probe event and continue the homing move. If this happens the
<code>force_safety_limit</code> acts as a backup protection.</p>
<p>The second problem is probing repeatedly in one place. Klipper does not retract
the probe when doing a single <code>PROBE</code> command. This can result
in force applied to the toolhead at the end of a probing cycle. Because
external forces can vary greatly between probing locations,
<code>load_cell_probe</code> performs a tare before beginning each probe. If you repeat
the <code>PROBE</code> command, load_cell_probe will tare the endstop at the current force.
Multiple cycles of this will result in ever-increasing force on the toolhead.
<code>force_safety_limit</code> stops this cycle from running out of control.</p>
<p>Another way this run-away can happen is damage to a strain gauge. If the metal
part is permanently bent it wil change the <code>reference_tare_counts</code> of the
device. This puts the starting tare value much closer to the limit making it
more likely to be violated. You want to be notified if this is happening
because your hardware has been permanently damaged.</p>
<p>The final way this can be triggered is due to temperature changes. If your
strain gauges are heated their <code>reference_tare_counts</code> may be very different
at ambient temperature vs operating temperature. In this case you may need
to increase the <code>force_safety_limit</code> to allow for thermal changes.</p>
<h4 id="load-cell-endstop-watchdog-task">Load Cell Endstop Watchdog Task<a class="headerlink" href="#load-cell-endstop-watchdog-task" title="Permanent link">&para;</a></h4>
<p>When homing the load_cell_endstop starts a task on the MCU to trac
measurements arriving from the sensor. If the sensor fails to send
measurements for 2 sample periods the watchdog will shut down the printer
with an error <code>!! LoadCell Endstop timed out waiting on ADC data</code>.</p>
<p>If this happens, the most likely cause is a fault from the ADC. Inadequate
grounding of your printer can be the root cause. The frame, power supply
case and pint bed should all be connected to ground. You may need to ground
the frame in multiple places. Anodized aluminum extrusions do not conduct
electricity well. You might need to sand the area where the grounding wire
is attached to make good electrical contact.</p>
<h2 id="load-cell-probe-setup">Load Cell Probe Setup<a class="headerlink" href="#load-cell-probe-setup" title="Permanent link">&para;</a></h2>
<p>This section covers the process for commissioning a load cell probe.</p>
<h3 id="verify-the-load-cell-first">Verify the Load Cell First<a class="headerlink" href="#verify-the-load-cell-first" title="Permanent link">&para;</a></h3>
<p>A <code>[load_cell_probe]</code> is also a <code>[load_cell]</code> and G-code commands related to
<code>[load_cell]</code> work with <code>[load_cell_probe]</code>. Before attempting to use a load
cell probe, follow the directions for
<a href="Load_Cell.html#calibrating-a-load-cell">calibrating the load cell</a> with
<code>CALIBRATE_LOAD_CELL</code> and checking its operation with <code>LOAD_CELL_DIAGNOSTIC</code>.</p>
<h3 id="verify-probe-operation-with-load_cell_test_tap">Verify Probe Operation With LOAD_CELL_TEST_TAP<a class="headerlink" href="#verify-probe-operation-with-load_cell_test_tap" title="Permanent link">&para;</a></h3>
<p>Use the command <code>LOAD_CELL_TEST_TAP</code> to test the operation of the load cell
probe before actually trying to probe with it. This command detects taps,
just like the PROBE command, but it does not move the z axis. By default, it
listens for 3 taps before ending the test. You have 30 seconds to do each
tap, if no taps are detected the command will time out.</p>
<p>If this test fails, check your configuration and <code>LOAD_CELL_DIAGNOSTIC</code>
carefully to look for issues.</p>
<p>Load cell probes don't support the <code>QUERY_ENDSTOPS</code> or <code>QUERY_PROBE</code>
commands. Use <code>LOAD_CELL_TEST_TAP</code> for testing functionality before probing.</p>
<h3 id="homing-macros">Homing Macros<a class="headerlink" href="#homing-macros" title="Permanent link">&para;</a></h3>
<p>Load cell probe is not an endstop and doesn't support <code>endstop:
prove:z_virtual_endstop</code>. For the time being you'll need to configure your z
axis with an MCU pin as its endstop. You won't actually be using the pin but
for the time being you have to configure something.</p>
<p>To home the axis with just the probe you need to set up a custom homing
macro. This requires setting up
<a href="Config_Reference.html#homing_override">homing_override</a>.</p>
<p>Here is a simple macro that can accomplish this. Note that the
<code>_HOME_Z_FROM_LAST_PROBE</code> macro has to be separate because of the way macros
work. The sub-call is needed so that the <code>_HOME_Z_FROM_LAST_PROBE</code> macro can
see the result of the probe in <code>printer.probe.last_z_result</code>.</p>
<div class="highlight"><pre><span></span><code>[gcode_macro _HOME_Z_FROM_LAST_PROBE]
gcode:
<span class="w"> </span>{% set z_probed = printer.probe.last_z_result %}
<span class="w"> </span>{% set z_position = printer.toolhead.position[2] %}
<span class="w"> </span>{% set z_actual = z_position - z_probed %}
<span class="w"> </span>SET_KINEMATIC_POSITION Z={z_actual}
[gcode_macro _HOME_Z]
gcode:
<span class="w"> </span>SET_GCODE_OFFSET Z=0 # load cell probes dont need a Z offset
<span class="w"> </span># position toolhead for homing Z, edit for your printers size
<span class="w"> </span>#G90 # absolute move
<span class="w"> </span>#G1 Y50 X50 F{5 * 60} # move to X/Y position for homing
<span class="w"> </span># soft home the z axis to its limit so it can be moved:
<span class="w"> </span>SET_KINEMATIC_POSITION Z={printer.toolhead.axis_maximum[2]}
<span class="w"> </span># Fast approach and tap
<span class="w"> </span>PROBE PROBE_SPEED={5 * 60} # override the speed for faster homing
<span class="w"> </span>_HOME_Z_FROM_LAST_PROBE
<span class="w"> </span># lift z to 2mm
<span class="w"> </span>G91 # relative move
<span class="w"> </span>G1 Z2 F{5 * 60}
<span class="w"> </span># probe at standard speed
<span class="w"> </span>PROBE
<span class="w"> </span>_HOME_Z_FROM_LAST_PROBE
<span class="w"> </span># lift z to 10mm for clearance
<span class="w"> </span>G91 # relative move
<span class="w"> </span>G1 Z10 F{5 * 60}
</code></pre></div>
<h3 id="suggested-probing-temperature">Suggested Probing Temperature<a class="headerlink" href="#suggested-probing-temperature" title="Permanent link">&para;</a></h3>
<p>Currently, we suggest keeping the nozzle temperature below the level that causes
the filament to ooze while homing and probing. 140C is a good starting
point. This temperature is also low enough not to scar PEI build surfaces.</p>
<p>Fouling of the nozzle and the print bed due to oozing filament is the #1 source
of probing error with the load cell probe. Klipper does not yet have a universal
way to detect poor quality taps due to filament ooze. The existing code may
decide that a tap is valid when it is of poor quality. Classifying these poor
quality taps is an area of active research.</p>
<p>Klipper also lacks support for re-locating a probe point if the
location has become fouled by filament ooze. Modules like <code>quad_gantry_level</code>
will repeatedly probe the same coordinates even if a probe previously failed
there.</p>
<p>Give the above it is strongly suggested not to probe at printing temperatures.</p>
<h3 id="hot-nozzle-protection">Hot Nozzle Protection<a class="headerlink" href="#hot-nozzle-protection" title="Permanent link">&para;</a></h3>
<p>The Voron project has a great macro for protecting your print surface from the
hot nozzle. See <a href="https://github.com/VoronDesign/Voron-Tap/blob/main/config/tap_klipper_instructions.md">Voron Tap's
<code>activate_gcode</code></a></p>
<p>It is highly suggested to add something like this to your config.</p>
<h3 id="nozzle-cleaning">Nozzle Cleaning<a class="headerlink" href="#nozzle-cleaning" title="Permanent link">&para;</a></h3>
<p>Before probing the nozzle should be clean. You could do this manually before
every print. You can also implement a nozzle scrubber and automate the process.
Here is a suggested sequence:</p>
<ol>
<li>Wait for the nozzle to heat up to probing temp (e.g. <code>M109 S140</code>)</li>
<li>Home the machine (<code>G28</code>)</li>
<li>Scrub the nozzle on a brush</li>
<li>Heat soak the print bed</li>
<li>Perform probing tasks: QGL, bed mesh etc.</li>
</ol>
<h3 id="temperature-compensation-for-nozzle-growth">Temperature Compensation for Nozzle Growth<a class="headerlink" href="#temperature-compensation-for-nozzle-growth" title="Permanent link">&para;</a></h3>
<p>If you are probing at a safe temperature, the nozzle will expand after
heating to printing temperatures. This will cause the nozzle to get longer
and closer to the print surface. You can compensate for this with
<a href="Config_Reference.html#z_thermal_adjust">[z_thermal_adjust]</a>. This adjustment will
work across a range of printing
temperatures from PLA to PC.</p>
<h4 id="calculating-the-temp_coeff-for-z_thermal_adjust">Calculating the <code>temp_coeff</code> for <code>[z_thermal_adjust]</code><a class="headerlink" href="#calculating-the-temp_coeff-for-z_thermal_adjust" title="Permanent link">&para;</a></h4>
<p>The easiest way to do this is to measure at 2 different temperatures.
Ideally these should be the upper and lower limits of the printing
temperature range. E.g. 180C and 290C. You can perform a <code>PROBE_ACCURACY</code> at
both temperatures and then calculate the difference of the <code>average z</code> at both.</p>
<p>The adjustment value is the change in nozzle length divided by the change in
temperature. e.g.</p>
<div class="highlight"><pre><span></span><code>temp_coeff = -0.05 / (290 - 180) = -0.00045455
</code></pre></div>
<p>The expected result is a negative number. Positive values for <code>temp_coeff</code> move
the nozzle closer to the bed and negative values move it further away.
Expect to have to move the nozzle further away as it gets longer when hot.</p>
<h4 id="configure-z_thermal_adjust">Configure <code>[z_thermal_adjust]</code><a class="headerlink" href="#configure-z_thermal_adjust" title="Permanent link">&para;</a></h4>
<p>Set up z_thermal_adjust to reference the <code>extruder</code> as the source of temperature
data. E.g.:</p>
<div class="highlight"><pre><span></span><code>[z_thermal_adjust nozzle]
temp_coeff=-0.00045455
sensor_type: temperature_combined
sensor_list: extruder
combination_method: max
min_temp: 0
max_temp: 400
max_z_adjustment: 0.1
</code></pre></div>
<h2 id="continuous-tare-filters-for-toolhead-load-cells">Continuous Tare Filters for Toolhead Load Cells<a class="headerlink" href="#continuous-tare-filters-for-toolhead-load-cells" title="Permanent link">&para;</a></h2>
<p>Klipper implements a configurable IIR filter on the MCU to provide continuous
tareing of the load cell while probing. Continuous taring means the 0 value
moves with drift caused by external factors like bowden tubes and thermal
changes. This is aimed at toolhead sensors and moving beds that experience lots
of external forces that change while probing.</p>
<h3 id="installing-scipy">Installing SciPy<a class="headerlink" href="#installing-scipy" title="Permanent link">&para;</a></h3>
<p>The filtering code uses the excellent <a href="https://scipy.org/">SciPy</a> library to
compute the filter coefficients based on the values your enter into the config.</p>
<p>Pre-compiled SciPi builds are available for Python 3 on 32 bit Raspberry Pi
systems. 32 bit + Python 3 is strongly recommended because it will streamline
your installation experience. It does work with Python 2 but installation can
take 30+ minutes and require installing additional tools.</p>
<div class="highlight"><pre><span></span><code>~/klippy-env/bin/pip<span class="w"> </span>install<span class="w"> </span>scipy
</code></pre></div>
<h3 id="filter-workbench">Filter Workbench<a class="headerlink" href="#filter-workbench" title="Permanent link">&para;</a></h3>
<p>The filter parameters should be selected based on drift seen on the printer
during normal operation. A Jupyter notebook is provided in scripts,
<a href="https://github.com/Klipper3d/klipper/blob/master/scripts/filter_workbench.ipynb">filter_workbench.ipynb</a>, to perform a
detailed investigation with real captured data and FFTs.</p>
<h3 id="filtering-suggestions">Filtering Suggestions<a class="headerlink" href="#filtering-suggestions" title="Permanent link">&para;</a></h3>
<p>For those just trying to get a filter working follow these suggestions:</p>
<ul>
<li>The only essential option is <code>drift_filter_cutoff_frequency</code>. A conservative
starting value is <code>0.5</code>Hz. Prusa shipped the MK4 with a setting of <code>0.8</code>Hz and
the XL with <code>11.2</code>Hz. This is probably a safe range to experiment with. This
value should be increased only until normal drift due to bowden tube force is
eliminated. Setting this value too high will result in slow triggering and
excess force going through the toolhead.</li>
<li>Keep <code>trigger_force</code> low. The default is <code>75</code>g. The drift filter keeps the
internal grams value very close to 0 so a large trigger force is not needed.</li>
<li>Keep <code>force_safety_limit</code> to a conservative value. The default value is 2Kg
and should keep your toolhead safe while experimenting. If you hit this limit
the <code>drift_filter_cutoff_frequency</code> value may be too high.</li>
</ul>
<h2 id="suggestions-for-load-cell-tool-boards">Suggestions for Load Cell Tool Boards<a class="headerlink" href="#suggestions-for-load-cell-tool-boards" title="Permanent link">&para;</a></h2>
<p>This section covers suggestions for those developing toolhead boards that want
to support [load_cell_probe]</p>
<h3 id="adc-sensor-selection-board-development-hints">ADC Sensor Selection &amp; Board Development Hints<a class="headerlink" href="#adc-sensor-selection-board-development-hints" title="Permanent link">&para;</a></h3>
<p>Ideally a sensor would meet these criteria:</p>
<ul>
<li>At least 24 bits wide</li>
<li>Use SPI communications</li>
<li>Has a pin can be used to indicate sample ready without SPI communications.
This is often called the "data ready" or "DRDY" pin. Checking a pin is much
faster than running an SPI query.</li>
<li>Has a programmable gain amplifier gain setting of 128. This should eliminate
the need for a separate amplifier.</li>
<li>Indicates via SPI if the sensor has been reset. Detecting resets avoids
timing errors in homing and using noisy data at startup. It can also help
users
track down wiring and grounding issues.</li>
<li>A selectable sample rate between 350Hz and 2Khz. Very high sample rates don't
turn out to be beneficial in our 3D printers because they produce so much
noise
when moving fast. Sample rates below 250Hz will require slower probing speeds.
They also increase the force on the toolhead due to longer delays between
measurements. E.g. a 500Hz sensor moving at 5mm/s has the same safety factor
as
a 100Hz sensor moving at only 1mm/s.</li>
<li>If designing for under-bed applications, and you want to sense multiple load
cells, use a chip that can sample all of its inputs simultaneously. Multiplex
ADCs that require switching channels have a settling of several samples after
each channel switch making them unsuitable for probing applications.</li>
</ul>
<p>Implementing support for a new sensor chip is not particularly difficult with
Klipper's <code>bulk_sensor</code> and <code>load_cell_endstop</code> infrastructure.</p>
<h3 id="5v-power-filtering">5V Power Filtering<a class="headerlink" href="#5v-power-filtering" title="Permanent link">&para;</a></h3>
<p>It is strongly suggested to use larger capacitors than specified by the ADC chip
manufacturer. ADC chips are usually targeted at low noise environments, like
battery powered devices. Sensor manufacturers suggested application notes
generally assume a quiet power supply. Treat their suggested capacitor values as
minimums.</p>
<p>3D printers put huge amounts of noise onto the 5V bus and this can ruin the
sensor's accuracy. Test the sensor on the board with a typical 3D printer power
supply and active stepper drivers before deciding on smoothing capacitor sizes.</p>
<h3 id="grounding-ground-planes">Grounding &amp; Ground Planes<a class="headerlink" href="#grounding-ground-planes" title="Permanent link">&para;</a></h3>
<p>Analog ADC chips contain components that are very vulnerable to noise and
ESD. A large ground plane on the first board layer under the chip can help with
noise. Keep the chip away from power sections and DC to DC converters. The board
should have proper grounding back to the DC supply.</p>
<h3 id="hx711-and-hx717-notes">HX711 and HX717 Notes<a class="headerlink" href="#hx711-and-hx717-notes" title="Permanent link">&para;</a></h3>
<p>This sensor is popular because of its low cost and availability in the
supply chain. However, this is a sensor with some drawbacks:</p>
<ul>
<li>The HX71x sensors use bit-bang communication which has a high overhead on the
MCU. Using a sensor that communicates via SPI would save resources on the tool
board's CPU.</li>
<li>The HX71x lacks a way to communicate reset events to the MCU. Klipper detects
resets with a timing heuristic but this is not ideal. Resets indicate a
problem with wiring or grounding.</li>
<li>For probing applications the HX717 version is strongly preferred because
of its higher sample rate (320 vs 80). Probing speed on the HX711 should be
limited to less than 2mm/s.</li>
<li>The sample rate on the HX71x cannot be set from klipper's config. If you have
the 10SPS version of the sensor (which is widely distributed) it needs to
be physically re-wired to run at 80SPS.</li>
</ul>
</article>
</div>
</div>
<a href="#" class="md-top md-icon" data-md-component="top" data-md-state="hidden">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg>
Back to top
</a>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer">
<a href="Eddy_Probe.html" class="md-footer__link md-footer__link--prev" aria-label="Previous: Eddy Current Inductive probe" rel="prev">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
Eddy Current Inductive probe
</div>
</div>
</a>
<a href="Sponsors.html" class="md-footer__link md-footer__link--next" aria-label="Next: Sponsors" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Sponsors
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": ".", "features": ["navigation.top", "search.suggest", "search.highlight", "search.share"], "translations": {"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "search": "assets/javascripts/workers/search.0bbba5b5.min.js"}</script>
<script src="assets/javascripts/bundle.e1a181d9.min.js"></script>
</body>
</html>