My latest project is a better stepper motor driver for the desk clock. When I designed the clock, the resistor-based driver circuit was the quietest solution I could find. It was mostly silent, but over time the gears started to develop a slight rumbling sound. The motor itself seemed quiet, but the gears were starting to rattle. Another thing that really bothered me was the ridiculous cost to ship the tiny circuit board overseas. Shipping and customs costs were often 3X higher than the board itself.
I went searching for something better and believe I may have found a solution. The secret is to use a board called a CNC Shield V4 which is designed to allow an Arduino Nano to control three A4988 stepper motor drivers. The A4988 is replaced with a much better Trinamic TMC2208 driver. This reduces the noise and allows everything to run on 5V. A precision real time clock was added to serve as a reference timer.
Here is the bill of materials:
1) CNC Shield V4 – Amazon US$10.96 for 3 boards.
2) TMC2208 drivers – Amazon US$21.99 for 6 drivers.
3) Arduino Nano – Amazon US$16.99 for 3 modules.
4) DS3231 Real Time Clock – Amazon US$12.11 for 4 modules.
5) NEMA17 stepper motor – Amazon US$9.99 each.
The CNC Shield V4 was modified to fix a known bug and to wire the RTC into one of the unused driver ports.
Here is the circuit:

The TMC2208 was set to 16X microstepping mode. The algorithm adjusts the stepper motor delay to stay synchronized to the real time clock reference. The DS3231 is voltage and temperature compensated to stay accurate to around 1 minute per year. And the clock is significantly quieter.
One downside is that the CNC Shield V4 is huge compared to the custom driver that I was previously using. I am designing a new base to fit the larger circuit. It looks like it will fit. The ability to buy off-the-shelf components is a big advantage. It does not make sense to design a more compact custom circuit board.
Updates to the existing MyMiniFactory desk clock are coming soon. A larger version of the desk clock is also in progress. I designed it a while ago but did not release it because the gear noise was too high. That rattling noise is gone with this new driver circuit. And a wooden gear version of the clock is in progress.
Stay tuned for more information.
Steve
I encountered a couple of issues while building the Improved Clock Driver Circuit.
Problem 1: Uploading the Sketch to Arduino Initially, I couldn't upload the sketch to my Arduino. After troubleshooting without success, I came to these forums for help. While waiting for access, I found a solution, leading to a second problem: the sketch no longer compiled. Eventually, I resolved this too, but I don't fully understand why it worked.
I’m sharing my experience here for two reasons. 1) To help anyone facing similar issues. 2) To seek an explanation for why my solution worked.
Background: I'm working on building "The Tipping Marble Clock" from the Engineezy website, which references the Improved Clock Driver Circuit here for setting up a 1 RPM stepper motor.
Problem 1: When first tried to upload the code, I received the following error:
avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xf5
Google searches suggested several things to try, using the example sketch "Blink," using different cables, disconnecting connected devices. I also checked my wiring modifications. None of these fixed the problem. Another suggestion was to verify the IDE was set to the correct board. My box had "NANO" in white letters on a grey box and "EVERY BOARD" in green letters on white, which I assumed was a brand name. So in the IDE I had set the board to ”Arduino Nano” But I decided to check the “Boards Manager” in the IDE, I searched for "every" and I found Arduino megaAVR Boards with a listing for Arduino Every. I installed it, and selected it. Once I did that, I could upload "Blink," and I thought my problems were over.
Problem 2: When I reloaded Clock_Shield, it wouldn't compile, and gave this error:
C:\Users\micro\3D Objects\EngineezyMarbleClock\Clock_Shield\Clock_Shield.ino:150:15: error: expected ')' before '*' token static DS3231 RTC; // RTC register definition
While still waiting for forum access, I decided to ask ChatGPT AI. I uploaded the first 150 lines and asked it to determine the problem. It said there was a previous RTC definition. So even though the code compiled for the AVR Nano, I decided to do a search and replace, changing all instances of "RTC" to "Rtc". After this change, the code compiled and uploaded successfully. Testing showed that the stepper motor worked, and its speed would change depending on how the speed jumpers were set.
Interestingly, with "Rtc" in the code, it compiles for both the AVR Nano and the MegaAVR. But with "RTC," it only compiles for the AVR Nano.
While I'm glad it works, I'd love to know why this change made a difference.