from Stepper import Stepper import time stepper_time_interval_seconds = 0.1 # Pin order: [ENB|MS1|MS2|MS3|RST|SLP|STP|DIR] stepper_A = Stepper([4, 7, 6, 5, 0, 0, 3, 2], "Stepper A", stepper_time_interval_seconds) stepper_B = Stepper([10, 11, 12, 13, 0, 0, 9, 8], "Stepper B", stepper_time_interval_seconds) stepper_C = Stepper([16, 17, 18, 19, 0, 0, 15, 14], "Stepper C", stepper_time_interval_seconds) stepper_D = Stepper([22, 23, 24, 25, 0, 0, 21, 20], "Stepper D", stepper_time_interval_seconds) print "Created 4 steppers" stepper_A.go() # stepper_B.go() # stepper_C.go() # stepper_D.go() time.sleep(2) # Sleep 5 seconds stepper_A.move_to_position(32.0) print("Moved goal to 32") time.sleep(4) # Sleep 5 seconds stepper_B.move_to_position(-26.0) print("Moved goal to 32")
class Osc2Steppers: """Class that listens for OSC messages, and forwards them as target positions for stepper motors""" stepper_time_interval_seconds = 0.02 def __init__(self, osc_ip='0.0.0.0', osc_port=12000): """Create our stepper object and osc server object""" self.debug = True # listen for OSC messages on port 12000 (Wekinator default) self.stepper_count = 2 #4 # Pin order: [ENB|MS1|MS2|MS3|RST|SLP|STP|DIR] self.stepper_A = Stepper([4, 5, 6, 7, 0, 0, 3, 2], "Stepper A", self.stepper_time_interval_seconds) self.stepper_B = Stepper([10, 11, 12, 13, 0, 0, 9, 26], "Stepper B", self.stepper_time_interval_seconds) self.stepper_C = Stepper([16, 17, 18, 19, 0, 0, 15, 14], "Stepper C", self.stepper_time_interval_seconds) self.stepper_D = Stepper([22, 23, 24, 25, 0, 0, 21, 20], "Stepper D", self.stepper_time_interval_seconds) print "Created 4 steppers" self.OSCServer = OSC.OSCServer((osc_ip, osc_port)) self.OSCServer.addMsgHandler('/wek/outputs', self.wek_outputs_handler) self.OSCServer.addMsgHandler('/tenta_emg', self.tenta_emg_handler) print "Tentacle Control is listening for OSC message /wek/outputs, ip %s port %s" % ( osc_ip, osc_port) def go(self): """Start steppers self-updating, and start our OSC server listening""" #self.stepper_A.go() self.stepper_B.go() self.stepper_C.go() self.stepper_D.go() self.OSCServer.serve_forever() def tenta_emg_handler(self, addr, tags, data, client_address): emg_avg = data[0] if emg_avg < 125: self.stepper_D.move_to_position(0) #position of closed elif emg_avg < 300: pos_interp = 0 - ((emg_avg - 125) / float(300 - 125)) * 200 self.stepper_D.move_to_position(pos_interp) #in between else: self.stepper_D.move_to_position(-200) #position of closed def wek_outputs_handler(self, addr, tags, data, client_address): """Callback that is called when we receive an osc message with path '/wek/outputs'""" # 0 controls back and front # 1 controls side to side data[0] *= 200 data[1] *= 200 if self.debug: print "OSCMessage '%s' from %s: %s" % (addr, client_address, data) if (len(data) != self.stepper_count): print "Error: Expected %s OSC values, got %s" % ( self.stepper_count, len(data)) return # HERE'S THE MAGIC! # Pass on values to our stepper motors #self.stepper_A.move_to_position(data[0]) self.stepper_B.set_delay() self.stepper_B.move_to_position(data[0]) #self.stepper_C.move_to_position(data[2]) self.stepper_C.set_delay() self.stepper_C.move_to_position(data[1])