Boom och gripdon bot (15 / 15 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
#
# Möjliggör enkla multi-byte kommandon.
#
# 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)
# Binda på mus knappen 1 release till ange boom position
Self.grip_vert.BIND ('', själv. GripperY)
Self.grip_vert.Grid (rad = 0, kolumn = 0, rowspan = 4, 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)
# Binda på mus knappen 1 release till ange gripdon position
Self.grip_horz.BIND ("< /a >< en rel ="nofollow">", själv. GripperX)
Self.grip_horz.Grid (rad = 0, kolumn = 0, columnspan = 7, klibbiga = E)
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.f_spd_dist = ram (self.frame)
Self.l_speed = Label (self.f_spd_dist, text = "hastighet:")
Self.l_speed.Grid (rad = 0, kolumn = 0)
Self.speed_spin = nummerrutan (self.f_spd_dist, värden = (1, 2, 3),
bredd = 2, kommandot = själv. SetSpeed)
Self.speed_spin.Grid (rad = 0, kolumn = 1)
Self.l_dist = Label (self.f_spd_dist, text = "avstånd:")
Self.l_dist.Grid (rad = 0, kolumn = 3)
Self.dist_spin = nummerrutan (self.f_spd_dist,
värden = ("Kort", "Medel", "Kontinuerlig"),
bredd = 10, kommandot = själv. SetDistance)
Self.dist_spin.Grid (rad = 0, kolumn = 4)
Self.l_turns = Label (self.f_spd_dist, text = "visar:")
Self.l_turns.Grid (rad = 0, kolumn = 5)
Self.turns_spin = nummerrutan (self.f_spd_dist,
värden = ("Hårt", "Mjuk"),
bredd = 5, kommandot = själv. SetTurns)
Self.turns_spin.Grid (rad = 0, kolumn = 6)
Self.f_spd_dist.Grid (rad = 2, kolumn = 0)
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 = 5, 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)
# 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 9600
Self.ser = följetong. Följetong (self.comm_entry.get (), 9600)
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
# Gör vissa efter anslutning bot talar.
om self.connected == True:
self.setbotParms)
# 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
# action in variabeln är en tupel som möjliggör multy del kommandon
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
# Det här är en multi-byte kommando. Kommandot + servo ange val
# + en buffert rensa kommando (valfritt)
grp_change = (">", chr (self.grip_horz.get ()), chr (255))
Self.send_cmd (grp_change, "Gripper X")
Self.boomchange = ingen
# 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
# Det här är en multi-byte kommando. Kommandot + servo ange val
# + en buffert rensa kommando (valfritt)
grp_change = ('^ ', chr (self.grip_vert.get ()), chr (255))
Self.send_cmd (grp_change, "Gripper Y")
Self.gripperchange = ingen
# Set griparen "hem" position.
def GripperHome (self, event = ingen):
Self.send_cmd ('c', chr (255), "Gripper Home")
Self.grip_horz.set (90)
Self.grip_vert.set (90)
# Ställ in hastigheten på rover.
def SetSpeed (self, event = ingen):
spd_str = self.speed_spin.get)
om spd_str == "1":
hastighet = 1
om spd_str == "2":
hastighet = 2
om spd_str == "3":
hastighet = 3
# Skickar en multi-byte kommando ställa in hastigheten.
Self.send_cmd ("v", chr (hastighet), "Sätta fart")
# Ställ in avståndet travled när en för eller rev utfärdas till
# rover.
def SetDistance (self, event = ingen):
dist = 1
dist_str = self.dist_spin.get)
om dist_str == "Kort":
dist = 1
om dist_str == "Medium":
dist = 2
om dist_str == "Kontinuerlig":
dist = 3
# Skickar en multi-byte kommando för att ange avståndet.
Self.send_cmd ((skulle ", chr (dist)),"Ange avstånd")
# Ställ in tur stil att använda roterande.
def SetTurns (self, event = ingen):
vända = 1
turn_str = self.turns_spin.get)
om turn_str == "Hard":
vända = 1
om turn_str == "Mjuk":
vända = 2
# Skickar en multi-byte kommando ställa tur stil.
Self.send_cmd (('t ', chr (tur)), "Ställa in vänder")
def setbotParms (själv):
själv. Stoppa)
själv. GripperHome)
själv. SetSpeed)
själv. SetDistance)
själv. SetTurns)
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 360")
root.wm_title ("Rover Control Center (RCC)")
app = App (master = root)
app.mainloop)
om __name__ == "__main__":
(huvudsakliga)
< /u >< /a >