Table of Contents
Watchwinder
Home Brew Winder
I built a simple watch-winder to keep automatic watches fully wound when not being worn. Mainly as a small project to play with a pyBoard and a servo motor.
A short piece of microPython makes the servo turn, first one direction, then then other, then a pause, at a speed that makes sure a watch is fully wound overnight. The speed depends on the required number of turns to achieve full-wind, which depends on the watch movement, and whether the movement winds in one or other, or both, rotational directions.
The watch is placed in a plastic box attached to the servo motor and the motor is simple clamped in a panavise
, with the axis of the servo at about 45°
Photos
add some photos
Python Code
microPython code for Pyboard to control continuous rotation servo.
# main.py -- put your code here! import pyb servo1 = pyb.Servo(1) # LED colours # red flash = motor stopped # green on = manual stop for 120 seconds # yellow on/flash = motor running # blue flash = 5 seconds before a change of state ledr = pyb.LED(1) ledg = pyb.LED(2) ledy = pyb.LED(3) ledb = pyb.LED(4) # servo speeds to achieve approx 6 rpm in either direction. ccw = 14 cw = -7 stop = 0 # 12 minute cycle : # observed turns complete per stage: # 2 min CW = ~11 turns # 4 min stop # 2 min CCW = ~ 12 turns # 4 min stop # 23 turns / 12 min = 115 turns / hour # ETA 2836-2 requires 650 turns / day for full winding # this would take 5.6 hours on winder per day to guarantee full wind. period = 120 # seconds # turn LEDs off (unneccesary?) ledr.off() ledg.off() ledy.off() ledb.off() # interrupt function to allow changing/removing watch def stop_servo(): # red LED on at start of interruption ledr.on() ledy.off() # turn off any flashing LEDs during interruption tim4.callback(None) # flash blue LED to signal stop imminent flash_blue() # stop servo servo1.speed(0) # red LED off and green LED on to indicate "safe to proceed" ledr.off() ledg.on() # pause for 2 minute pyb.delay(120 * 1000) # flash blue LED to signal re-start imminent flash_blue() # green LED off to indicate end of interruption. ledg.off() pyb.hard_reset() # after resumption from interrupt the next stage will usually be a # "stop" period, assuming the interrupt occurred during a "run" period # perhaps need to look at the best way of resuming? or even quit() # at the end of the stop_servo() interrupt and then manually reset via the # RST button? # main programme resumes where it left off.... return def cycle_led(): ledb.on() pyb.delay(500) ledy.on() pyb.delay(500) ledg.on() pyb.delay(500) ledr.on() pyb.delay(500) ledb.off() ledy.off() ledg.off() ledr.off() return def flash_blue(): t = 0 while t < 10: ledb.toggle() pyb.delay(500) t += 1 return def rotate_cw(p): # solid yellow LED when going CW ledy.on() servo1.speed(cw, 1000) pyb.delay(p * 1000) flash_blue() ledy.off() return def rotate_ccw(p): # flash yellow LED when going CCW tim4.callback(lambda t: ledy.toggle()) servo1.speed(ccw, 1000) pyb.delay(p * 1000) flash_blue() tim4.callback(None) ledy.off() return def pause(p): # flash red LED during motor pause period tim4.callback(lambda t: ledr.toggle()) servo1.speed(stop, 1000) pyb.delay(p * 1000) flash_blue() tim4.callback(None) ledr.off() return # USR on-board switch used to pause running to allow # watch to be removed / changed sw = pyb.Switch() # callback to run the function that pauses the operation sw.callback(stop_servo) #timer to flash LEDs tim4 = pyb.Timer(4, freq=2) cycle_led() # the main loop while True: rotate_cw(period) pause(2 * period) rotate_ccw(period) pause(2 * period)
Page Info
Page created Sun May 22 00:52:45 2022 by John Pumford-Green
Page last updated: 02/07/22 13:43 BST