Demo entry 6624941

Python

   

Submitted by anonymous on Jun 18, 2017 at 19:51
Language: Python 3. Code size: 8.6 kB.

from tkinter import *   # Librairie interface graphique
from math import cos,sin,pi     # Librairie maths --> Conversion angle
import serial   # Librairie com série
import struct # utile pour envoyer bytes via liaison serie

#Initialisation Serial
ser = serial.Serial()
ser.baudrate = 19200
ser.port = 'COM3'

fenetre = Tk() # Creation objet fenetre
fenetre.title("Commande MeArm")

#Fonctions aiguille
def degToRad(angle) :       # Converti angle en radians
    a = angle * (2*pi) / 360
    return a
def actuAiguille(angle) :   # Modifie dessin aiguille en fonction de l'angle
    x = 112 - 87 * cos(angle)
    y = 112 - 87 * sin(angle)
    canvas.coords(ligne, x, y, 112, 112)
#x = x0 + r*cos(t)
#y = y0 + r*sin(t)
#où (x0,y0) sont les coord du centre, r est le rayon, et t l'angle.
    
###############
#Gestion event
#   Les fonctions sont appelés après un appui sur la touche clavier correspondante
###############
posx = 0
posy = 0
posz = 0

def gauche(event):              # Fleche gauche (axe x)
    global posx
    if(posx > 0):
        posx = posx - 1         # Incrementer variable angle
        print(posx)             #**DEBUG**#
        rad = degToRad(posx)    # Convertir angle 
        actuAiguille(rad)       # Redessiner aiguille
        box.delete(0,"end") 
        box.insert(0,posx)      # Mettre a jour la valeur de l'angle
        ser.write(bytes(b'x') + bytes(str(posx), 'utf8')) # Envoyer commande

def droite(event):              # Fleche droite (axe x)
    global posx
    if(posx < 180):
        posx = posx + 1         # Incrementer variable angle
        print(posx)             #**DEBUG**#
        rad = degToRad(posx)    # Convertir angle 
        actuAiguille(rad)       # Redessiner aiguille
        box.delete(0,"end")
        box.insert(0,posx)      # Mettre a jour la valeur de l'angle
        ser.write(bytes(b'x') + bytes(str(posx), 'utf8')) # Envoyer commande

def haut(event):                        # Fleche haut (axe y)
    global posy
    if(posy < 180): posy = posy + 1     # Incrementer variable angle
    print(posy)                         #**DEBUG**#
    scaleY.set(posy)                    # Mise a jour slider 
    ser.write(bytes(b'y') + bytes(str(posy), 'utf8')) # Envoi commande

def bas(event):                         # Fleche bas (axe y)
    global posy
    if(posy > 0) : posy = posy - 1      # Incrementer variable angle
    print(posy)                         #**DEBUG**#
    scaleY.set(posy)                    # Mise a jour slider
    ser.write(bytes(b'y') + bytes(str(posy), 'utf8')) # Envoi commande
    
def plus(event):                        # Touche "Page Up" (axe z)
    global posz
    if(posz < 180): posz = posz + 1     # Incrementer variable angle
    print(posz)                         #**DEBUG**#
    scaleZ.set(posz)                    # Mise a jour slider
    ser.write(bytes(b'z') + bytes(str(posz), 'utf8')) # Envoi commande

def moins(event):                       # Touche "Page Down" (axe z)
    global posz
    if(posz > 0) : posz = posz - 1      # Incrementer variable angle
    print(posz)                         #**DEBUG**#
    scaleZ.set(posz)                    # Mise a jour slider
    ser.write(bytes(b'z') + bytes(str(posz), 'utf8')) # Envoi commande

##########################
#   Fcontion appelé après appui sur le bouton OK
#   pour definir l'angle de l'axe x
########################
def setBox():
    canvas.focus_set() 
    print(box.get())    #**DEBUG**#
    global posx
    posx = int(box.get())   # Recupérer valeur entrée 
    rad = degToRad(posx)    # convertir angle
    actuAiguille(rad)       # Redessiner aiguille
    ser.write(bytes(b'x') + bytes(str(posx), 'utf8')) # Envoi commande

#####################################
# Gestion axe Y et Z
# Appelé lorsque le slider concerné est bougé
######################################
def updateY(event):
    global posy
    posy = scaleY.get()     # Recuperer position slider
    print(posy)             #**DEBUG**#
    ser.write(bytes(b'y') + bytes(str(posy), 'utf8')) #Envoi commande
def updateZ(event):
    global posz
    posz = scaleZ.get()     # Recuperer position slider
    print(posz)             #**DEBUG**#
    ser.write(bytes(b'z') + bytes(str(posz), 'utf8')) #Envoi commande

##########################   
# Gestion PORT COM / Liaison serie
#########################

# Fonction appelé après appui sur bouton "Connect"
def connect():
    global posx
    global posy
    global posz
    global etatCOM
    if(ser.is_open == FALSE) : ser.open()   # Ouvrir liaison 
    print(ser.name)                         #**DEBUG**#
    etatCOM.set("Connexion")                # Changer texte etat connexion
    while(ser.read() != b'o'):              # Liaison préte
        continue
    etatCOM.set("Connecté")                 # Changer texte etat connexion
    posx = 90                               # Initialiser les srvos à 90 degres
    posy = 90
    posz = 90
    rad = degToRad(posx)                    # Convertir angle
    actuAiguille(rad)                       # Redessiner aiguille
    box.delete(0,"end")                     # Mettre a jour la valeur de l'angle
    box.insert(0,posx)
    scaleY.set(posy)                        # Mettre à jour position sliders
    scaleZ.set(posz)
    ser.write(bytes(b'x') + bytes(str(posx), 'utf8')) # Envoi des commandes pour les 3 axes
    ser.write(bytes(b'y') + bytes(str(posy), 'utf8'))
    ser.write(bytes(b'z') + bytes(str(posy), 'utf8'))

# Fonction appelé après appui sur bouton "Deconnecter"
def disconnect():
    global posx
    global posy
    posx = 0
    posy = 0
    posz = 0
    rad = degToRad(posx)                    # Convertir angle
    actuAiguille(rad)                       # Redessiner aiguille
    scaleY.set(posy)                        # Mettre à jour position slider
    scaleZ.set(posz)
    box.delete(0,"end")                     # Mettre a jour la valeur de l'angle
    box.insert(0,posx)
    ser.write(bytes(b'x') + bytes(str(posx), 'utf8')) # Envoi commandes
    ser.write(bytes(b'y') + bytes(str(posy), 'utf8'))
    ser.write(bytes(b'z') + bytes(str(posz), 'utf8'))
    ser.close()                             #Fermeture liaison
    etatCOM.set("Deconnecté")               # Changer texte etat connexion


#############################
 # GESTION AFFICHAGE FENETRE
 #
 # Mise en forme de l'interface
 #############################

#Affichage canvas + cercle avec aiguille
l = LabelFrame(fenetre, text="Contrôle de la rotation", padx=20, pady=20)

canvas = Canvas(l, width=300, height=200)
canvas.focus_set()
# Appel de la fonction correspondante lors de l'appui sur une touche du clavier
canvas.bind("<Left>", gauche)  
canvas.bind("<Right>", droite)
canvas.bind("<Up>", haut)
canvas.bind("<Down>", bas)
canvas.bind("<Next>", moins)
canvas.bind("<Prior>", plus)
#Aiguille
arc = canvas.create_arc(25,25,200,200, style='arc', extent=180)
ligne = canvas.create_line(25,112,112,112)
#Box choix nombre
box = Spinbox(l, from_=0, to=180)
bouton=Button(l, text="Ok", command=setBox)


#Gestion slider Inclinaison
lIncli = LabelFrame(fenetre, text="Contrôle inclinaison", padx=20, pady=20)
scaleY = Scale(lIncli, orient='vertical', from_=180, to=0,
      resolution=1, tickinterval=25, length=200,
      label='Inclinaison (Y)')
scaleY.bind("<ButtonRelease-1>", updateY)

#Gestion slider profondeur
lProfond = LabelFrame(fenetre, text="Contrôle profondeur", padx=20, pady=20)
scaleZ = Scale(lProfond, orient='vertical', from_=180, to=0,
      resolution=1, tickinterval=25, length=200,
      label='Profondeur (Z)')
scaleZ.bind("<ButtonRelease-1>", updateZ)

#Interface ports COM
lConnect = LabelFrame(fenetre, text="Interface COM", padx=20, pady=20)
connect=Button(lConnect, text="Connect", command=connect)
disconnect=Button(lConnect, text="Disconnect", command=disconnect)
etatCOM = StringVar(value = "Deconnecté")
etat = Label(lConnect, text="Deconnecté", textvariable = etatCOM)

# Mise en forme des elements
l.grid(column = 0, row = 0, columnspan = 2, sticky='nesw')
canvas.pack(side=TOP)
box.pack(side=LEFT)
bouton.pack(side=RIGHT)

lIncli.grid(column = 0, row = 2, sticky='nesw')
scaleY.pack()

lProfond.grid(column = 1, row = 2, sticky = 'nesw')
scaleZ.pack()

lConnect.grid(column = 0, row = 1, columnspan = 2, sticky = 'nesw')
connect.pack(side = TOP)
disconnect.pack(side = BOTTOM)
etat.pack(side = RIGHT)

fenetre.mainloop()

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).