Skip to content

Instantly share code, notes, and snippets.

@Nagasaki45
Created May 8, 2014 09:43
Show Gist options
  • Save Nagasaki45/d12aebaf8fb7638969a0 to your computer and use it in GitHub Desktop.
Save Nagasaki45/d12aebaf8fb7638969a0 to your computer and use it in GitHub Desktop.
import Tkinter as tk
import serial
ANGLE_MIN = 0
ANGLE_MAX = 180
SERVO_MIN = 1
SERVO_MAX = 4
# Assign Arduino's serial port address
# Windows example
# usbport = 'COM3'
# Linux example
# usbport = '/dev/ttyUSB0'
# MacOSX example
# usbport = '/dev/tty.usbserial-FTALLOK2'
usbport = '/dev/tty.usbserial-FTALLOK2'
# ser = serial.Serial(usbport, 9600, timeout=1)
class ServoController(object):
def __init__(self):
win = tk.Tk()
win.wm_title('Servo Controller')
# radio buttons for servo selection
self.servo = tk.IntVar()
for s in range(SERVO_MIN, SERVO_MAX + 1):
rb = tk.Radiobutton(win, text='Servo {}'.format(s),
command=self.set_angle_from_memory,
variable=self.servo, value=s)
rb.pack()
# slider
self.slider = tk.Scale(win, command=self.slider_move,
from_=ANGLE_MIN, to=ANGLE_MAX,
orient="horizontal")
self.slider.pack()
# remember servos angles
self.angles = {}
def set_angle_from_memory(self):
angle = self.angles.get(self.servo.get(), 0)
self.slider.set(angle)
def slider_move(self, angle):
servo = self.servo.get()
if not servo: # prevent calling "move" upon creation
return
angle = int(angle)
self.move(servo, angle)
self.angles[servo] = angle
@staticmethod
def move(servo, angle):
if not (ANGLE_MIN <= angle <= ANGLE_MAX and
SERVO_MIN <= servo <= SERVO_MAX):
raise ValueError('Servo parameters out of bounds.')
# send serial commands
# ser.write(chr(255))
# ser.write(chr(servo))
# ser.write(chr(angle))
if __name__ == '__main__':
s = ServoController()
tk.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment