System works great. Firmware changes are final (i think)
The only thing you'd have to worry about is the motor.
If you cant find same motor, you going to have to make changes to the design to hold your motor as well as how it drives threaded rod.
The way this works is:
When spool makes full turn, 5V relay will activate motor that moves the guide. Guide move distance depends on how long relay stay active. That time is changed in firmware.
25RPM motor set to 3 seconds will move around 1.75mm so you get the idea.
Once guide reaches either end of the rail, it will push momentary button placed on either end. Pushing those buttons reverses motor direction
Threaded rod goes through the nut that sits inside the guide piece.
So when motor turns, guide moves by the nut inside it.
Momentary buttons on each end activate very special relay (bistable). That relay is triggering the [two channel relay] that does the reversal.
Second 12V 1A power supply to drive 2 channel relay and the motor separately.
12v 2 channel relay (basic)
5v bistable relay (connect terminals and it closes, connect again and it opens)
5v relay (basic)
2 momentary push buttons
8mm diameter threaded rod and a nut. Length of the rods is chosed based on the distance guide has to travel. Wider the spool, longer travel needed. rod is about 220mm
8mm smooth rod.
linear motion bearing LM8UU (sits inside the guide)
12V 30x30x10 cooling fan (optional) If cooling fan mount is used, consider printing my own drive gear for needed clearance.
Screws, wires, connectors, soldering tool if you don't want to deal with connectors.
This is relay wiring diagram and the kinds of relay i used.
I use Arduino 1.8.9
Required library: QTRSensors by Pololu
Library can be downloaded from Tools/Manage Libraries
Processor/ATMega328p (old bootloader)
COM/What ever number device is connected to
Locate: pinMode(12, INPUT);
Add under: pinMode(A4, OUTPUT);
Locate: digitalWrite(12, HIGH);
Add under: digitalWrite(A4, LOW);
Locate: bool logOn=false;
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 3000; //Change this to adjust how far guide moves each spool rotation
void setup ()
startMillis = millis();
void loop ()
currentMillis = millis();
if (currentMillis - startMillis >= period)
Locate: guide_angle = (guide_angle + 1.17); } //Move the guide +1.17 degree for 1.75mm filament
guide_angle = (guide_angle + 1.17);
startMillis = currentMillis;