Remote control Gripper bot (15 / 16 steg)
Steg 15: Kodlista för Python
#! / usr/bin/env python
#
# För Linux, BSD eller Mac OSX kan du chmod + x för detta skript för att göra körbar
#
###########
# Rover kontroll app
#
# Skriven av Scott Beasley - 2015
# Gratis att använda eller ändra. Njuta av.
#
###########
importera sys
importera följetong
Importera tid
från Tkinter import *
importera tkFont
importera tkMessageBox
# Skapa fönstret för tillämpningen
klass App (ram):
# Gör fönstret
def createWidgets (själv):
Self.Connected = False
Self.Message = StringVar)
# Göra små teckensnitt för gripdon som knappar.
helv6 = tkFont.Font (familj = "Helvetica",
storlek = 6, vikt = "normalt")
Self.Frame = ram (self.master)
Self.Frame.Pack)
Self.F1 = ram (self.frame)
Self.L1 = Label (self.f1, text = "Comm Port:")
Self.L1.Pack (sida = vänster)
Self.comm_entry = posten (self.f1, bd = 5, namn = "comm_entry")
Self.comm_entry.Pack (sida = vänster)
self.connectButton = knappen (self.f1, text = "Anslut",
kommandot = själv. SerialConnect,
namn = "b_connect")
self.connectButton.pack (sida = vänster)
self.disconnectButton = knappen (self.f1, text = "Koppla från",
kommandot = själv. SerialDisconnect,
namn = "b_disconnect")
self.disconnectButton.pack (sida = höger)
Self.F1.Grid (rad = 0, kolumn = 0)
Self.F2 = LabelFrame (self.frame, bd = 3, lättnad = "räffla",
text = "Ground Control")
Self.g_vert_fm = ram (self.f2)
Self.grip_vert = skala (self.g_vert_fm, from_ = 0 och = 180)
Self.grip_vert.Grid (rad = 0, kolumn = 0, rowspan = 4, klibbiga = W)
Self.grip_vert_set = knappen (self.g_vert_fm, text = "Satt",
kommandot = själv. GripperY,
namn = "b_grip_vert_set",
bredd = 1, höjd = 2,
Font = helv6)
Self.grip_vert_set.Grid (rad = 5, kolumn = 0, klibbiga = W)
Self.master.BIND ("", själv. GripperY)
Self.g_vert_fm.Grid (rad = 0, kolumn = 0, rowspan = 4, klibbiga = W)
self.leftforwardButton = knappen (self.f2, text = "\\",
kommandot = själv. TurnLeft45,
namn = "b_left_forward")
self.leftforwardButton.grid (rad = 0, kolumn = 1)
Self.master.BIND ("< en rel =" nofollow">", själv. TurnLeft45)
self.leftButton = knappen (self.f2, text = "<",
kommandot = själv. Svängvänster, name = "b_left")
self.leftButton.grid (rad = 1, kolumn = 1)
Self.master.BIND ("< /a >< en rel =" nofollow">", själv. Svängvänster)
self.rightforwardButton = knappen (self.f2, text = "/",
kommandot = själv. TurnRight45,
namn = "b_right_forward")
self.rightforwardButton.grid (rad = 0, kolumn = 3)
Self.master.BIND ("< /a >< en rel =" nofollow">", själv. TurnRight45)
self.haltButton = knappen (self.f2, text = "Halt!",
kommandot = själv. Stopp, name = "b_halt")
self.haltButton.grid (rad = 1, kolumn = 2).
Self.master.BIND ("< /a >< en rel =" nofollow">", själv. Halt)
self.rightButton = knappen (self.f2, text = ">",
kommandot = själv. Svänghöger, name = "b_right")
self.rightButton.grid (rad = 1, kolumn = 3)
Self.master.BIND ("< /a >< en rel =" nofollow">", själv. Svänghöger)
self.upButton = knappen (self.f2, text = "^",
kommandot = själv. Framåt, name = "b_forward")
self.upButton.grid (rad = 0, kolumn = 2)
Self.master.BIND ("< /a >< en rel =" nofollow">", själv. Framåt)
self.leftdownButton = knappen (self.f2, text = "/",
kommandot = själv. TurnRight45,
namn = "b_left_down")
self.leftdownButton.grid (rad = 2, kolumn = 1)
self.downButton = knappen (self.f2, text = "V",
kommandot = själv. Omvänd, name = "b_reverse")
self.downButton.grid (rad = 2, kolumn = 2)
Self.master.BIND ("< /a >< en rel =" nofollow">", själv. Vända på)
Self.F2.Grid (rad = 1, kolumn = 0, pady = 25)
self.rightdownButton = knappen (self.f2, text = "\\",
kommandot = själv. TurnLeft45,
namn = "b_right_down")
self.rightdownButton.grid (rad = 2, kolumn = 3)
Self.g_horz_fm = ram (self.f2)
Self.grip_horz = skala (self.g_horz_fm, from_ = 0 och = 180,
Orient = horisontell)
Self.grip_horz.Grid (rad = 0, kolumn = 0, columnspan = 7, klibbiga = E)
Self.grip_horz_set = knappen (self.g_horz_fm, text = "Satt",
kommandot = själv. GripperX,
namn = "b_grip_horz_set",
bredd = 1, höjd = 2,
Font = helv6)
Self.grip_horz_set.Grid (rad = 0, kolumn = 8)
Self.master.BIND (< u >, själv. GripperX)
Self.g_horz_fm.Grid (rad = 4, kolumn = 0, columnspan = 7, klibbiga = E)
Self.master.BIND ("< /u >< /a >< en rel =" nofollow">< u >", själv. GripperHome)
Self.F3 = ram (self.frame)
Self.L2 = Label (self.f3, text = "Last action:")
Self.L2.Pack (sida = vänster)
Self.L3 = Label (self.f3, text = "", textvariable = self.message)
Self.L3.Pack (sida = höger)
Self.F3.Grid (rad = 3, kolumn = 0, pady = 8)
# Ställ in tillståndet för bot kontrollknappar. Aktivera när ansluten,
# Inaktiveras annars.
def CtrlButtonsState (self, bstate):
self.leftforwardButton.config (state = bstate)
self.leftButton.config (state = bstate)
self.rightforwardButton.config (state = bstate)
self.rightButton.config (state = bstate)
self.upButton.config (state = bstate)
self.leftdownButton.config (state = bstate)
self.downButton.config (state = bstate)
self.rightdownButton.config (state = bstate)
self.haltButton.config (state = bstate)
self.disconnectButton.config (state = bstate)
Self.grip_horz.config (state = bstate)
Self.grip_vert.config (state = bstate)
Self.grip_horz_set.config (state = bstate)
Self.grip_vert_set.config (state = bstate)
# Set state comm inskeppningshamnen. Aktivera när du inte är ansluten,
# Inaktiverad när bot är ansluten.
def ConnCtrlsState (self, bstate):
self.connectButton.config (state = bstate)
Self.comm_entry.config (state = bstate)
# Anslut till comm port skrivit i fältet comm.
def SerialConnect (själv):
försök:
# Ändra baudfrekvens här om olika sedan 57600
Self.ser = följetong. Följetong (self.comm_entry.get (), 57600)
utom IOError:
tkMessageBox.showerror ("Ogiltig comm port", "Comm hamnen finns inte." ")
returnera
själv. ConnCtrlsState (inaktiverad)
själv. CtrlButtonsState (NORMAL)
Self.Message.set ("SerialConnect")
Self.Connected = sant
Time.Sleep (3) # Dwell lite för anslutningen ska ske
# Koppla från bot (nära comm hamnen).
def SerialDisconnect (själv):
försök:
# Skicka ett stopp kommando bara i fall bot är fortfarande rörliga.
Self.send_cmd ("h", "Stopp!")
Time.Sleep (1)
Self.ser.Close)
utom IOError:
skriva ut "kunde inte stänger port..."
Self.Message.set ("SerialDisconnect")
själv. ConnCtrlsState (NORMAL)
själv. CtrlButtonsState (inaktiverad)
Self.Connected = False
Time.Sleep (2) # Dwell lite för urkopplingen hända
# Skicka kommandot till den öppna comm porten
def send_cmd (själv, handla, msg):
om self.connected == True:
val i aktion:
Self.ser.write (val)
Self.ser.flush)
Self.Message.set (msg)
# Skicka bot ett sväng vänster kommando.
def svängvänster (själv, event = ingen):
Self.send_cmd ("a", "vänster")
# Skicka bot ett turn-vänster-upp kommando.
def TurnLeft45 (self, event = ingen):
Self.send_cmd ("q", "Left45")
# Skicka bot ett turn-rätt kommando.
def svänghöger (själv, event = ingen):
Self.send_cmd ('s ","Rätt")
# Skicka bot ett turn-höger-upp kommando.
def TurnRight45 (self, event = ingen):
Self.send_cmd ("e", "Right45")
# Skicka bot ett framåt kommando.
def framåt (själv, event = ingen):
Self.send_cmd ("w", "Up")
# Skicka bot en omvänd kommando.
def omvänd (själv, event = ingen):
Self.send_cmd ("z", "Ned")
# Skicka bot ett stopp kommando.
def stopp (själv, event = ingen):
Self.send_cmd ("h", "Stopp!")
# Set griparen (X).
def GripperX (self, event = ingen):
# Läs skjutreglaget och skicka värdet till bot controller
# Observera: 0 är ända sluten och 180 är hela vägen öppen
grp_change = (">", chr (self.grip_horz.get ()), chr (255))
Self.send_cmd (grp_change, "Gripper X")
# Set griparen Y.
def GripperY (self, event = ingen):
# Läs skjutreglaget och skicka värdet till bot controller
# Observera: 0 är hela vägen upp och 180 är ända ner
grp_change = ('^ ', chr (self.grip_vert.get ()), chr (255))
Self.send_cmd (grp_change, "Gripper Y")
# Set griparen "hem" position.
def GripperHome (self, event = ingen):
Self.send_cmd ('c', chr (255), "Gripper Home")
def __init__ (själv, master = ingen):
Frame.__init__ (själv, master)
Self.Pack)
self.createWidgets)
själv. CtrlButtonsState (inaktiverad)
# Kick off den GUI (Tk) och sedan storlek och titel fönstret app
def (huvudsakliga):
rot = Tk)
root.Geometry ("450 x 350")
root.wm_title ("Rover Control Center (RCC)")
app = App (master = root)
app.mainloop)
om __name__ == "__main__":
(huvudsakliga)
< br >