Torque Analysis of a Motorized Filament Rewinder
Introduction
It has long been a goal of mine to build a motorized filament spool holder for my multi-material 3D printer. The idea is to have a motorized spool holder that can automatically rewind the unused filament back to its spool after a filament swap, so that the idling filament doesn’t get tangled mid-print. There are various attempts in the open-source 3D printing community at building such a device, and I also have a simple prototype a while ago:
However, one of the key challenges in building such a device is to estimate the torque required to rewind the filament back to the spool. This estimate is essential for choosing the appropriate motor and drive mechanism (e.g., diameter of the drive roller) for the rewinder.
In this post, I’ll analyze the torque requirements for a motorized filament rewinder and discuss the key factors that affect the torque.
Disclaimer: The analysis is based on a spherical-cow model and may not capture all the complexities of the real-world rewinder. However, my hope is that it should provide a good starting point for my motorized filament rewinder.
Torque Analysis
To carry out the torque analysis, I need to model the rewinding process. My analysis here will ignore any friction that is outside the scope of the rewinder itself (e.g., friction in the filament path, air resistance, etc.). The analysis will focus on the mass of the filament spool and the force required to rewind the filament back to the spool at a certain linear acceleration.
Thus, I consider the following disassembly of a typical filament spool to model the mass distribution of the spool:
The disaassembly consists of four parts:
- The spool core
- Two spool disks
- The filament
It happens that both the spool core and the filament are hollow cylinders. With a mild approximation by ignoring the patterns on the disks, we can view the disks as “hollow cylinders” as well — the approximation is quite valid given that the disks are thin and weigh little in the entire spool.
The key to the analysis is to compute the moment of inertia of each part of the spool. The moment of inertia of a hollow cylinder is given by:
\[I = \frac{1}{2} m (r_1^2 + r_2^2)\]where $m$ is the mass of the cylinder, $r_1$ is the inner radius, and $r_2$ is the outer radius.
So I take out calipers and a kitchen scale to measure the dimensions and mass of these spool components:
spool_hole_radius = 54.7 / 2 * 1e-3 # m
spool_rim_radius = 100e-3 # m
spool_disk_weight = 53e-3 # kg
spool_core_weight = 44e-3 # kg
spool_core_thickness = 3.5e-3 # m
full_spool_weight = 1 # kg
The outer radius of the filament component changes as filament is used up. Assuming the filament is wound uniformly, we can compute this radius as a function of the remaining filament weight:
min_filament_radius = spool_hole_radius + spool_core_thickness
max_filament_radius = spool_disk_weight
def filament_radius_from_weight(filament_weight: float):
"""Given the weight of the filament on the spool, returns the radius of the filament that is left on the spool."""
return min_filament_radius + (max_filament_radius - min_filament_radius) * filament_weight / full_spool_weight
The overall moment of inertia of the spool is the sum of the moments of inertia of the core, the two disks, and the filament. It is a function of the weight of the filament on the spool:
def moments_of_inertia(filament_weight: float):
"""
Returns the moments of inertia (kg m^2) of the spool and filament together.
"""
# the MOI of the one side rims
disk_moi = 1/2 * spool_side_rim_weight * (spool_rim_radius**2 + spool_hole_radius**2)
# the MOI of the center ring
core_moi = 1/2 * spool_core_weight * ((spool_hole_radius + spool_core_thickness)**2 + spool_hole_radius**2)
# filament MOI
filament_moi = 1/2 * filament_weight * (filament_radius_from_weight(filament_weight)**2 + min_filament_radius**2)
# total MOI
return disk_moi * 2 + core_moi + filament_moi
Finally, we compute the torque required to rewind the filament, at a given filament weight and at a certain linear acceleration. The key equation is:
\[\tau = \frac{r_{\text{roller}}}{r_{\text{rim}} r_{\text{filament}} } I a\]where $\tau$ is the torque, $I$ is the moment of inertia, $a$ is the linear acceleration, $r_{\text{roller}}$ is the radius of the roller, $r_{\text{rim}}$ is the radius of the spool rim, and $r_{\text{filament}}$ is the radius of the filament on the spool.
def torque_for_acceleration(filament_weight: float, acceleration: float, roller_radius: float):
"""
Returns the torque (N . m) acting on the rim that is required to accelerate the filament at the given unload acceleration (m/s^2)
"""
filament_radius = filament_radius_from_weight(filament_weight)
angular_acceleration = acceleration / filament_radius # rad/s^2
torque = moments_of_inertia(filament_weight) * angular_acceleration
return torque * roller_radius / spool_rim_radius
Plotting
I can now plot the torque required to rewind the filament at a certain acceleration, given the weight of the filament on the spool. The ideal acceleration I want to achieve is around 300 mm/s^2, and the roller radius in my rewinder design is 26 mm. Pluggging these values into the above function and plotting over the range of filament weights, I get the following torque curve:
So now I know that with my current design, I need a motor that can provide at least ~0.05kg.cm of torque to rewind the filament!
I can now also find out the range of roller radii given a particular motor torque and speed. The speed of the motor is a function of the linear speed of the filament, the radius of the roller, and the radius of the filament on the spool:
def motor_speed(filament_weight: float, speed: float, roller_radius: float):
filament_radius = filament_radius_from_weight(filament_weight)
spool_rotational_speed = speed / filament_radius
return spool_rotational_speed * spool_rim_radius / roller_radius
With above, we know that can plot both the required motor torque and the motor speed for a given roller radius:
So for example, if the motor is rated at 0.035kg.cm of torque at 500RPM, I should be able to use a roller radius between ~17mm to ~19mm.
The code for this analysis is available in this Google Colab notebook.
Enjoy Reading This Article?
Here are some more articles you might like to read next: