John's Vademecum

Try to learn something about everything, and everything about something -Thomas Huxley “Darwin's bulldog” (1824-1895)

User Tools

Site Tools


public:watches:watchwinder_python_code

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
public:watches:watchwinder_python_code [24/05/22 07:14 BST] gm4slvpublic:watches:watchwinder_python_code [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-<-[[.:start]] 
- 
- 
-====== 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 ==== 
- 
-<WRAP col2> 
- 
-{{:public:watches:pyboard.jpg?200|}} 
- 
-{{:public:watches:winder_1.jpg?200|}} 
- 
-{{:public:watches:winder_2.jpg?200|}} 
- 
-{{:public:watches:winder_3.jpg?200|}} 
- 
-</WRAP> 
- 
-=== more to come === 
- 
-<todo>add some photos</todo> FIXME 
- 
- 
-=== Code === 
- 
-microPython  code for Pyboard to control continuous rotation servo. 
- 
-<code python> 
- 
-# 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) 
-  
- 
-</code> 
- 
- 
-==== Page Info ==== 
- 
-Page created Sun May 22 00:52:45 2022 by John Pumford-Green 
- 
-Page last updated: ~~LASTMOD~~ 
- 
-==== tags ==== 
- 
-{{tag>watches python}} 
- 
  
public/watches/watchwinder_python_code.1653372888.txt.gz · Last modified: (external edit)