Étape 15 : L’intégralité du Code d’application Python
#! / usr/bin/env python ## pour Linux, BSD ou Mac OS x vous pouvez chmod + x sur ce script pour rendre exécutable # ### # Rover contrôle app ## permet des commandes simples de plusieurs octets. ## Écrite par Scott Beasley - # 2015 gratuit pour utiliser ou modifier. Profitez. # ### import sys import import série temps de Tkinter import * Importer tkFont importation tkMessageBox # créer la fenêtre de la classe application App (cadre): # Make le createWidgets def de fenêtre (self): self.connected = False self.message = StringVar () # faire une police peu pour boutons de jeu de la pince. helv6 = tkFont.Font (famille = « Helvetica », taille = 6, poids = « normal ») self.frame = trame (self.master) self.frame.pack () self.f1 = trame (self.frame) self.l1 = Label (self.f1, text = "Port Comm:") self.l1.pack (côté = gauche) self.comm_entry = entrée (self.f1, bd = 5, nom = "comm_entry") self.comm_entry.pack (côté = gauche) self.connectButton = bouton (self.f1, texte = "Connecter", commande = self. SerialConnect, name = "b_connect") self.connectButton.pack (côté = gauche) self.disconnectButton = bouton (self.f1, text = "Disconnect", commande = self. SerialDisconnect, nom = "b_disconnect") self.disconnectButton.pack (côté = droit) self.f1.grid (rang = 0, colonne = 0) self.f2 = LabelFrame (self.frame, bd = 3, secours = "groove", texte = "Ground Control") self.g_vert_fm = trame (self.f2) self.grip_vert = échelle (self.g_vert_fm, from_ = 0, to = 180) # Bind souris bouton 1 sortie pour définir le boom position self.grip_vert.bind ('', libre. GripperY) self.grip_vert.grid (rang = 0, colonne = 0, rowspan = 4, collant = W) self.master.bind ("", libre. GripperY) self.g_vert_fm.grid (rang = 0, colonne = 0, rowspan = 4, collant = W) self.leftforwardButton = bouton (self.f2, text = "\\ », commande = self. TurnLeft45, name = "b_left_forward") self.leftforwardButton.grid (rang = 0, colonne = 1) self.master.bind ("< un rel =" nofollow">", libre. TurnLeft45) self.leftButton = bouton (self.f2, text = "<", command = self. Tournegauche, name = "b_left") self.leftButton.grid (rang = 1, colonne = 1) self.master.bind ("< /a >< un rel =" nofollow">", libre. Tournegauche) self.rightforwardButton = bouton (self.f2, text = "/", command = self. TurnRight45, name = "b_right_forward") self.rightforwardButton.grid (rang = 0, colonne = 3) self.master.bind ("< /a >< un rel =" nofollow">", libre. TurnRight45) self.haltButton = bouton (self.f2, text = "Halt! ", commande = self. Halt, name = "b_halt") self.haltButton.grid (rang = 1, colonne = 2) self.master.bind ("< /a >< un rel =" nofollow">", libre. Halt) self.rightButton = bouton (self.f2, text = ">", command = self. Tournedroite, name = "b_right") self.rightButton.grid (rang = 1, colonne = 3) self.master.bind ("< /a >< un rel =" nofollow">", libre. Tournedroite) self.upButton = bouton (self.f2, text = "^", command = self. Avant, nom = "b_forward") self.upButton.grid (rang = 0, colonne = 2) self.master.bind ("< /a >< un rel =" nofollow">", libre. Self.leftdownButton avant) = bouton (self.f2, text = "/", command = self. TurnRight45, name = "b_left_down") self.leftdownButton.grid (rang = 2, colonne = 1) self.downButton = bouton (self.f2, text = "V", commande = auto. Inverser, name = "b_reverse") self.downButton.grid (ligne = 2, colonne = 2) self.master.bind ("< /a >< un rel =" nofollow">", libre. Self.f2.grid revers) (ligne = 1, colonne = 0, pady = 25) self.rightdownButton = bouton (self.f2, text = "\\ », commande = self. TurnLeft45, name = "b_right_down") self.rightdownButton.grid (ligne = 2, colonne = 3) self.g_horz_fm = trame (self.f2) self.grip_horz = échelle (self.g_horz_fm, from_ = 0, to = 180, orienter = HORIZONTAL) # Bind sur libération touche 1 souris pour définir la préhension du poste self.grip_horz.bind ('< /a >< un rel = "nofollow" >', libre. GripperX) self.grip_horz.grid (rang = 0, colonne = 0, columnspan = 7, collant = E) self.master.bind (« < u > », soi-même. GripperX) self.g_horz_fm.grid (rang = 4, colonne = 0, columnspan = 7, post-it = E) self.master.bind ("< /u >< /a >< un rel =" nofollow">< u > «, libre. Self.f_spd_dist GripperHome) = trame (self.frame) self.l_speed = Label (self.f_spd_dist, text = "vitesse:") self.l_speed.grid (rang = 0, colonne = 0) self.speed_spin = compteur (self.f_spd_dist, valeurs = (1, 2, 3), largeur = 2, commande = self. SetSpeed) self.speed_spin.grid (rang = 0, colonne = 1) self.l_dist = Label (self.f_spd_dist, text = "Distance:") self.l_dist.grid (rang = 0, colonne = 3) self.dist_spin = compteur (self.f_spd_dist, valeurs = ('Court', 'Moyen', 'Continu'), largeur = 10, commande = self. SetDistance) self.dist_spin.grid (rang = 0, colonne = 4) self.l_turns = Label (self.f_spd_dist, texte = "se transforme:") self.l_turns.grid (rang = 0, colonne = 5) self.turns_spin = compteur (self.f_spd_dist, valeurs = ('Hard', 'Soft'), largeur = 5, commande = self. SetTurns) self.turns_spin.grid (rang = 0, colonne = 6) self.f_spd_dist.grid (ligne = 2, colonne = 0) self.f3 = trame (self.frame) self.l2 = Label (self.f3, texte = "dernière action:") self.l2.pack (côté = gauche) self.l3 = Label (self.f3, texte = "", textvariable = self.message) self.l3.pack (côté = droit) self.f3.grid (rang = 5, colonne = 0, pady = 8) # définir l’état du bot boutons de commande. Activer lorsqu’il est connecté, # désactivés dans le cas contraire. def CtrlButtonsState (self, bstate): self.leftforwardButton.config (État = bstate) self.leftButton.config (État = bstate) self.rightforwardButton.config (État = bstate) self.rightButton.config (État = bstate) self.upButton.config (État = bstate) self.leftdownButton.config (État = bstate) self.downButton.config (État = bstate) self.rightdownButton.config (État = bstate) self.haltButton.config (État = bstate) self.disconnectButton.config (État = bstate) self.grip_horz.config (État = bstate) self.grip_vert.config (État = bstate) # définir l’état de l’entrée de port comm. Activer lorsqu’il est ne pas connecté, # désactivé lorsque le bot est connecté. def ConnCtrlsState (self, bstate): self.connectButton.config (État = bstate) self.comm_entry.config (État = bstate) # se connecter au port comm tapé dans le champ de saisie de comm. def SerialConnect (self): Essayez: # changer le self.ser de taux ici si différentes puis 9600 baud = serial. Série (self.comm_entry.get (), 9600) sauf IOError : tkMessageBox.showerror ("Invalid comm port", "port Comm not found.") retour à soi. ConnCtrlsState (désactivé) soi-même. CtrlButtonsState (NORMAL) self.message.set ("SerialConnect") self.connected = True time.sleep (3) # s’attarder un peu pour la connexion arrive # faire un peu après avoir parlé de bot de connexion. Si self.connected == True: (self.setbotParms) # déconnexion de la bot (ferme le port de comm). def SerialDisconnect (self): Essayez: # envoyer une commande Halt, juste au cas où le bot se déplace encore. Self.send_cmd ("h", "la halte!") Time.Sleep (1) self.ser.close () sauf IOError : imprimer "Pas pu fermer le port..." self.message.set ("SerialDisconnect") soi-même. ConnCtrlsState auto (NORMAL). CtrlButtonsState (personnes handicapées) self.connected = False time.sleep (2) # s’attarder un peu pour la déconnexion se produise # envoyer la commande à la comm ouvert port # la variable d’entrée d’action est un tuple qui permet de multy partie commandes def send_cmd (self, action, msg): si self.connected == True : pour val en action : self.ser.write (val) self.ser.flush () self.message.set (msg) # envoyer le bot une commande de tour à gauche. def tournegauche (self, événement = None): self.send_cmd (« a », "gauche") # envoyer le bot une commande turn-gauche-haut. def TurnLeft45 (self, événement = None): self.send_cmd ("q", « Left45 ») # envoyer le bot une commande de tour à droite. def tournedroite (self, événement = None): pièce self.send_cmd ","Right") # envoyer le bot une commande turn-droit-vers le haut. def TurnRight45 (self, événement = None): self.send_cmd ("e", « Right45 ») # envoyer le bot une commande vers l’avant. def vers l’avant (self, événement = None): self.send_cmd ("w", « Up ») # envoyer le bot une commande inverse. def inverse (self, événement = None): self.send_cmd (« z », « Down ») # envoyer le bot une commande Halt. def Halt (self, événement = None): self.send_cmd (« h », « Halte! ») # définir la pince (X). def GripperX (self, événement = None): # lire le contrôle slider et envoie la valeur au contrôleur bot # Remarque: 0 est complètement fermée et 180 est tous le chemin ouvert # il s’agit d’une commande de plusieurs octets. La commande + le servo set val # + un tampon clear commande (facultatif) grp_change = ('> ', chr (self.grip_horz.get ()), chr (255)) self.send_cmd (grp_change, « Pince X ») self.boomchange = None # définir la pince Y. def GripperY (self, événement = None): # lire le contrôle slider et envoie la valeur au contrôleur bot # Remarque: 0 est complètement vers le haut et 180 est tout en bas # il s’agit d’une commande de plusieurs octets. La commande + le servo set val # + un tampon clear commande (facultatif) grp_change = ('^ ', chr (self.grip_vert.get ()), chr (255)) self.send_cmd (grp_change, « Pince Y ») self.gripperchange = None # mettre la pince sur la position « maison ». def GripperHome (self, événement = None): self.send_cmd ("c", chr (255), « Pince Home ») self.grip_horz.set (90) self.grip_vert.set (90) # régler la vitesse du rover. def SetSpeed (self, événement = None): spd_str = self.speed_spin.get () if spd_str == "1": vitesse = 1 if spd_str == "2": vitesse = 2 if spd_str == "3": Vitesse = 3 # envoie une commande de plusieurs octets pour régler la vitesse. Self.send_cmd (('v', chr (vitesse)), « Définir la vitesse ») # définir la distance travled lorsqu’un pour ou rev est délivrée à # le rover. def SetDistance (self, événement = None): dist = 1 dist_str = self.dist_spin.get () if dist_str == "Court": dist = 1 if dist_str == "Medium": dist = 2 si dist_str == "Continu": dist = 3 # envoie une commande de plusieurs octets pour définir la distance. Self.send_cmd ((serait ', chr (dist)), « La valeur Distance ») # définir le style de la tour d’utiliser tournant. def SetTurns (self, événement = None): tourner = 1 turn_str = self.turns_spin.get () if turn_str == "Hard": tourner = 1 if turn_str == "Soft": tourner = 2 # envoie une commande de plusieurs octets pour définir le style de la tour. Self.send_cmd ((' t ', chr (tour)), « La valeur Turns ») def setbotParms (self): gites. Mettre un terme () soi-même. GripperHome (de) soi. SetSpeed (de) soi. SetDistance (de) soi. SetTurns () def __init__ (self, maître = None): Frame.__init__ (self, maître) self.pack () self.createWidgets () soi-même. CtrlButtonsState (désactivé) # Kick off la GUI (Tk) puis la taille et titre de la fenêtre app def de main (): racine = Tk () root.geometry ("450 x 360") root.wm_title ("Rover Control Center (RCC)") app = App (maître = racine) (app.mainloop) si __name__ == '__main__': main () < /u >< /a >