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 ## permite comandos simples de varios bytes. ## 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) # Bind Mouse botón 1 release para establecer el self.grip_vert.bind de posición de la pluma ('', del uno mismo. GripperY) self.grip_vert.grid (fila = 0, columnas = 0, rowspan = 4, 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) # Bind en lanzamiento de botón 1 del ratón para fijar la pinza colocar self.grip_horz.bind ('< /a >< un rel = "nofollow" >', del uno mismo. GripperX) self.grip_horz.grid (fila = 0, columnas = 0, columnspan = 7, pegajoso = E) self.master.bind («< u >», yo. 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.f_spd_dist = self.l_speed marco (self.frame) = Label (self.f_spd_dist, texto = "velocidad:") self.l_speed.grid (fila = 0, columna = 0) self.speed_spin = despliega (self.f_spd_dist, valores = (1, 2, 3), anchura = 2, comando = a uno mismo. SetSpeed) self.speed_spin.grid (fila = 0, columna = 1) self.l_dist = etiqueta (self.f_spd_dist, texto = "distancia:") self.l_dist.grid (fila = 0, columnas = 3) self.dist_spin = despliega (self.f_spd_dist, valores = ('Corto', 'Medio', 'Continua'), ancho = 10, comando = uno mismo. SetDistance) self.dist_spin.grid (fila = 0, columna = 4) self.l_turns = Label (self.f_spd_dist, texto = "convierte:") self.l_turns.grid (fila = 0, columna = 5) self.turns_spin = despliega (self.f_spd_dist, valores = ('Duro', 'Suave'), ancho = 5, comando = a uno mismo. SetTurns) self.turns_spin.grid (fila = 0, columna = 6) self.f_spd_dist.grid (fila = 2, columna = 0) 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 = 5, 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) # 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 9600 aquí si es diferente entonces self.ser = serial. Serie (self.comm_entry.get (), 9600) 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 # hacer algo después de conexión bot hablar. Si self.connected == True: self.setbotParms () # 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 para el open comm port # la variable de entrada acción es una tupla que permite multy parte comandos 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!") # Set la garra (X). DEF GripperX (sí, evento = None): # leer el control deslizante y envíe el valor al controlador de bot # Nota: 0 es completamente cerrada y 180 son todos el # de manera abierta este es un comando de múltiples byte. El comando + el servo sistema val # + un búfer comando clear (opcional) grp_change = ('> ', chr (self.grip_horz.get ()), chr (255)) self.send_cmd (grp_change, "Pinza X") self.boomchange = ninguna # establece la definición de pinza Y. GripperY (sí, evento = None): # leer el control deslizante y envíe el valor al controlador de bot # Nota: 0 es hacia arriba y 180 es hacia abajo # este es un comando de múltiples byte. El comando + el servo sistema val # + un búfer comando clear (opcional) grp_change = ('^ ', chr (self.grip_vert.get ()), chr (255)) self.send_cmd (grp_change, "Pinza Y") self.gripperchange = None # Coloque la pinza en la posición "home". DEF GripperHome (sí, evento = None): self.send_cmd ('c', chr (255), "Pinza Inicio") self.grip_vert.set self.grip_horz.set (90) (90) # configurar la velocidad de la rover. DEF SetSpeed (evento del uno mismo, = None): spd_str = self.speed_spin.get () if spd_str == "1": velocidad = 1 si spd_str == "2": velocidad = 2 si spd_str == "3": velocidad = 3 # envía un comando de múltiples byte para establecer la velocidad. Self.send_cmd (('v', chr (velocidad)), "Set Speed") # Set la distancia travled cuando un para o rev es expedido a # el rover. DEF SetDistance (sí, evento = None): dist = 1 dist_str = self.dist_spin.get () si dist_str == "Corto": dist = 1 si dist_str == "Medio": dist = 2 si dist_str == "Continua": dist = 3 # envía un comando de múltiples byte para definir la distancia. Self.send_cmd ((sería ', chr (dist)), "Establecer distancia") # definir el estilo de vuelta con giro. DEF SetTurns (evento del uno mismo, = None): gire a la = 1 turn_str = self.turns_spin.get () si turn_str == "Duro": gire = 1 si turn_str == "Suave": gire = 2 # envía un comando de múltiples byte para definir el estilo de la vuelta. Self.send_cmd ((' t ', chr (vuelta)), "Establecer turnos") def setbotParms (self): self. Detener () uno mismo. (GripperHome) uno mismo. SetSpeed () uno mismo. (SetDistance) uno mismo. SetTurns () def __init__ (self, maestro = None): 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 360") root.wm_title ("Rover Control Center (RCC)") app = aplicación (maestro = raíz) (app.mainloop) si __name__ == '__main__': principal () < /u >< /a >