Use this if you have already set a value in your config and need to calibrate based on physical measurement (e.g., extruder calibration).
Method 2: Belt Drive (GT2 Pulley)
Calculates rotation distance for X/Y axes based on belt pitch and pulley teeth.
Method 3: Lead Screw
Calculates rotation distance for Z axis based on screw pitch and starts.
Understanding Klipper Rotation Distance
In Klipper firmware, rotation_distance is the distance (in millimeters) that the axis moves with one full revolution of the stepper motor. This parameter replaced the traditional "steps per mm" configuration found in Marlin, simplifying the calculation of hardware changes.
How to Calibrate Your Extruder
Extruder calibration is the most common reason for calculating a new rotation distance. To calibrate accurately:
Mark the filament 120mm away from the extruder intake.
Command the extruder to extrude 100mm (G1 E100 F60).
Measure how much filament is left between the intake and your mark. If 22mm remains, your actual extruded distance was 98mm (120 – 22).
Enter your current rotation_distance, the 100mm request, and the 98mm actual measurement into the calculator above.
Common Hardware Values
GT2 Belt with 20-tooth Pulley: Rotation distance is 40.0 (2mm pitch * 20 teeth).
GT2 Belt with 16-tooth Pulley: Rotation distance is 32.0 (2mm pitch * 16 teeth).
Standard T8 Lead Screw (4 starts, 2mm pitch): Rotation distance is 8.0 (2mm * 4 starts).
Standard T8 Lead Screw (1 start, 2mm pitch): Rotation distance is 2.0 (2mm * 1 start).
Note: Microsteps and steps-per-revolution (e.g., 1.8° or 0.9° motors) do not change the rotation_distance value. Klipper calculates the necessary pulses automatically based on the stepper config.
function calculateCalibration() {
var currentRD = parseFloat(document.getElementById('current_rd').value);
var requested = parseFloat(document.getElementById('requested_dist').value);
var actual = parseFloat(document.getElementById('actual_dist').value);
var resultDiv = document.getElementById('calibration_result');
if (isNaN(currentRD) || isNaN(requested) || isNaN(actual) || requested === 0) {
resultDiv.style.display = 'block';
resultDiv.style.background = '#fce8e8';
resultDiv.style.color = '#d93025';
resultDiv.style.borderLeftColor = '#d93025';
resultDiv.innerHTML = "Please enter valid numeric values for all fields.";
return;
}
var newRD = (currentRD * actual) / requested;
resultDiv.style.display = 'block';
resultDiv.style.background = '#e8f0fe';
resultDiv.style.color = '#1a73e8';
resultDiv.style.borderLeftColor = '#1a73e8';
resultDiv.innerHTML = "New rotation_distance: " + newRD.toFixed(3);
}
function calculateBelt() {
var pitch = parseFloat(document.getElementById('belt_pitch').value);
var teeth = parseFloat(document.getElementById('pulley_teeth').value);
var resultDiv = document.getElementById('belt_result');
if (isNaN(pitch) || isNaN(teeth)) {
resultDiv.style.display = 'block';
resultDiv.style.background = '#fce8e8';
resultDiv.style.color = '#d93025';
resultDiv.innerHTML = "Please enter valid numeric values.";
return;
}
var rd = pitch * teeth;
resultDiv.style.display = 'block';
resultDiv.style.background = '#e8f0fe';
resultDiv.style.color = '#1a73e8';
resultDiv.innerHTML = "Rotation Distance: " + rd.toFixed(2);
}
function calculateScrew() {
var pitch = parseFloat(document.getElementById('screw_pitch').value);
var starts = parseFloat(document.getElementById('screw_starts').value);
var resultDiv = document.getElementById('screw_result');
if (isNaN(pitch) || isNaN(starts)) {
resultDiv.style.display = 'block';
resultDiv.style.background = '#fce8e8';
resultDiv.style.color = '#d93025';
resultDiv.innerHTML = "Please enter valid numeric values.";
return;
}
var rd = pitch * starts;
resultDiv.style.display = 'block';
resultDiv.style.background = '#e8f0fe';
resultDiv.style.color = '#1a73e8';
resultDiv.innerHTML = "Rotation Distance: " + rd.toFixed(2);
}