Paso 15: Listado de código para la aplicación de Python
#! / usr/bin/env python ## para Linux, BSD o Mac OSX puedes chmod + x en esta secuencia de comandos para hacer ejecutable # ### # Rover control app ## escrito por Scott Beasley - 2015 # gratis para usar o modificar. Disfrutar. # ### import sys import importación serie tiempo de import Tkinter * importación de tkFont importación tkMessageBox # crear la ventana de la clase de aplicación de la aplicación (Frame): # hacer la ventana def createWidgets (self): self.connected = False self.message = CadenaVar () # hacer una pequeña fuente para la garra botones. helv6 = tkFont.Font (familia = 'Helvetica', tamaño = 6, peso = 'normal') self.frame = marco (self.master) self.frame.pack () self.f1 = self.l1 marco (self.frame) = Label (self.f1, texto = "Puerto de comunicación:") self.l1.pack (lado = izquierda) self.comm_entry = entrada (self.f1, bd = 5, nombre = "comm_entry") self.comm_entry.pack (lado = izquierda) self.connectButton = botón (self.f1, texto = "Conectar", comando = uno mismo. SerialConnect, nombre = "b_connect") self.connectButton.pack (lado = izquierda) self.disconnectButton = botón (self.f1, texto = "Desconectado", comando = a uno mismo. SerialDisconnect, nombre = "b_disconnect") self.disconnectButton.pack (lado = a la derecha) self.f1.grid (fila = 0, columna = 0) self.f2 = LabelFrame (self.frame, bd = 3, alivio = "surco", texto = "Ground Control") self.g_vert_fm = marco (self.f2) self.grip_vert = escala (self.g_vert_fm, from_ = 0, a = 180) self.grip_vert.grid (fila = 0, columna = 0, rowspan = 4, pegajosa = W) self.grip_vert_set = botón (self.g_vert_fm, texto = comando "Set" = uno mismo. GripperY, nombre = "b_grip_vert_set", ancho = 1, altura = 2, font = helv6) self.grip_vert_set.grid (fila = 5, columna = 0, pegajosa = W) self.master.bind ("", del uno mismo. GripperY) self.g_vert_fm.grid (fila = 0, columnas = 0, rowspan = 4, pegajosa = W) self.leftforwardButton = botón (self.f2, texto = "\\", comando = uno mismo. TurnLeft45, nombre = "b_left_forward") self.leftforwardButton.grid (fila = 0, columnas = 1) self.master.bind ("< un rel =" nofollow">", del uno mismo. Self.leftButton de TurnLeft45) = botón (self.f2, texto = "<", comando = a uno mismo. Izquierda, nombre = "b_left") self.leftButton.grid (fila = 1, columna = 1) self.master.bind ("< /a >< un rel =" nofollow">", del uno mismo. Self.rightforwardButton de izquierda) = botón (self.f2, texto = "por" comando = a uno mismo. TurnRight45, nombre = "b_right_forward") self.rightforwardButton.grid (fila = 0, columnas = 3) self.master.bind ("< /a >< un rel =" nofollow">", del uno mismo. Self.haltButton de TurnRight45) = botón (self.f2, texto = "detener! ", comando = a uno mismo. Alto, nombre = "b_halt") self.haltButton.grid (fila = 1, columna = 2) self.master.bind ("< /a >< un rel =" nofollow">", del uno mismo. Self.rightButton de alto) = botón (self.f2, texto = ">", comando = a uno mismo. TurnRight, nombre = "b_right") self.rightButton.grid (fila = 1, columna = 3) self.master.bind ("< /a >< un rel =" nofollow">", del uno mismo. TurnRight) self.upButton = botón (self.f2, texto = "^", comando = a uno mismo. Adelante, nombre = "b_forward") self.upButton.grid (fila = 0, columna = 2) self.master.bind ("< /a >< un rel =" nofollow">", del uno mismo. Self.leftdownButton adelante) = botón (self.f2, texto = "por" comando = a uno mismo. TurnRight45, nombre = "b_left_down") self.leftdownButton.grid (row = 2, columna = 1) self.downButton = botón (self.f2, texto = "V", comando = a uno mismo. Inversa, nombre = "b_reverse") self.downButton.grid (row = 2, columna = 2) self.master.bind ("< /a >< un rel =" nofollow">", del uno mismo. Self.f2.grid de reversa) (fila = 1, columna = 0, pady = 25) self.rightdownButton = botón (self.f2, texto = "\\", comando = a uno mismo. TurnLeft45, nombre = "b_right_down") self.rightdownButton.grid (fila = 2, columna = 3) self.g_horz_fm = marco (self.f2) self.grip_horz = escala (self.g_horz_fm, from_ = 0, a = 180, Oriente = HORIZONTAL) self.grip_horz.grid (fila = 0, columna = 0, columnspan = 7, pegajosa = E) self.grip_horz_set = botón (self.g_horz_fm, texto = comando "Set" = uno mismo. GripperX, nombre = "b_grip_horz_set", ancho = 1, altura = 2, font = helv6) self.grip_horz_set.grid (fila = 0, columna = 8) self.master.bind («< u >», uno mismo. GripperX) self.g_horz_fm.grid (row = 4, columna = 0, columnspan = 7, pegajosa = E) self.master.bind ("< /u >< /a >< un rel =" nofollow">< u >, del uno mismo. GripperHome) self.f3 = self.l2 marco (self.frame) = Label (self.f3, texto = "última acción:") self.l2.pack (lado = izquierda) self.l3 = Label (self.f3, texto = "", textvariable = self.message) self.l3.pack (lado = a la derecha) self.f3.grid (fila = 3, columna = 0, pady = 8) # establecer el estado del bot botones de control. Activar cuando se conecta, # deshabilitado de lo contrario. DEF CtrlButtonsState (self, bstate): self.leftforwardButton.config (estado = bstate) self.leftButton.config (estado = bstate) self.rightforwardButton.config (estado = bstate) self.rightButton.config (estado = bstate) self.upButton.config (estado = bstate) self.leftdownButton.config (estado = bstate) self.downButton.config (estado = bstate) self.rightdownButton.config (estado = bstate) self.haltButton.config (estado = bstate) self.disconnectButton.config (estado = bstate) self.grip_horz.config (estado = bstate) self.grip_vert.config (estado = bstate) self.grip_horz_set.config (estado = bstate) self.grip_vert_set.config (estado = bstate) # establecer el estado de la entrada de Puerto comm. Activar cuando no está conectado, # deshabilitado cuando está conectado el bot. DEF ConnCtrlsState (self, bstate): self.connectButton.config (estado = bstate) self.comm_entry.config (estado = bstate) # Conecte al puerto comm escribió en el campo de entrada de comm. DEF SerialConnect (self): tratar: # cambiar el baud velocidad 57600 aquí si es diferente entonces self.ser = serial. Serie (self.comm_entry.get (), 57600) excepto IOError: tkMessageBox.showerror ("Invalid comm port", "Puerto de comunicación no encontrado.") volver a uno mismo. ConnCtrlsState (desactivado) uno mismo. CtrlButtonsState (NORMAL) self.message.set ("SerialConnect") self.connected = True time.sleep (3) # detención un poco para la conexión a pasar # desconectar desde el bot (cerca del puerto de comunicación). DEF SerialDisconnect (self): tratar: # enviar un comando de interrupción en caso de que el bot está todavía avanzando. Self.send_cmd ('h', "Halt!") time.sleep (1) self.ser.close () excepto IOError: Imprimir "Podría no cerrar puerto.." self.message.set ("SerialDisconnect") uno mismo. ConnCtrlsState ser (NORMAL). CtrlButtonsState (desactivado) self.connected = False time.sleep (2) # un poco para la desconexión de la detención a pasar # enviar el comando al puerto comm abierto def send_cmd (self, acción, msg): si self.connected == True: de val en acción: self.ser.write (val) self.ser.flush () self.message.set (msg) # enviar el bot un comando de la vuelta a la izquierda. DEF izquierda (sí, evento = None): self.send_cmd («a», «izquierda») # enviar el bot un comando turn-izquierda-arriba. DEF TurnLeft45 (self, evento = None): self.send_cmd ('q', "Left45") # enviar el bot un comando de girar a la derecha. DEF TurnRight (sí, evento = None): self.send_cmd ('s', «Derecho») # enviar el bot un comando de la vuelta, derecha y arriba. DEF TurnRight45 (self, evento = None): self.send_cmd ('e', "Right45") # enviar el bot un comando hacia adelante. DEF adelante (sí, evento = None): self.send_cmd ('w', "Up") # enviar el bot un comando inverso. DEF inversa (sí, evento = None): self.send_cmd ('z', "Down") # enviar el bot un comando detener. DEF alto (sí, evento = None): self.send_cmd ('h', "Halt!") # Establecer a la garra (X). DEF GripperX (evento del uno mismo, = None): # leer el control deslizante y envíe el valor al controlador de bot # Nota: 0 es completamente cerrada y 180 son todas la grp_change de manera abierta = ('> ', chr (self.grip_horz.get ()), chr (255)) self.send_cmd (grp_change, "Pinza X") # establece la definición de pinza Y. GripperY (evento del uno mismo, = None): # leer el control deslizante y envíe el valor al controlador de bot # Nota : 0 es hacia arriba y 180 es hacia abajo grp_change = ('^ ', chr (self.grip_vert.get ()), chr (255)) self.send_cmd (grp_change, "Pinza Y") # Coloque la pinza en la posición "home". DEF GripperHome (evento del uno mismo, = ninguna): self.send_cmd ('c', chr (255), "Pinza Inicio") def __init__ (uno mismo, maestro = ninguna): Frame.__init__ (self, maestro) self.pack () self.createWidgets () uno mismo. CtrlButtonsState (desactivado) # Kick off el GUI (Tk) y tamaño y título de la ventana de la aplicación def principal (): raíz = Tk () root.geometry ("450 x 350") root.wm_title ("Rover Control Center (RCC)") app = aplicación (maestro = raíz) (app.mainloop) si __name__ == '__main__': principal () < br >