Prérequis : maîtriser les bases de la programmation Python (variables, boucles, entrées/sorties, fonctions)
Contexte de la mise en œuvre de l'activité : en classe, en présence de l'enseignant
Ressources, matériel, documents nécessaires :
- Bibliothèques Python : tkinter, serial
- Robot Braccio (ou tout autre robot disposant de servomoteurs compatibles Arduino)
- Une carte Arduino dans laquelle on a chargé le fichier "cmdbras.ino"
- Sur un ordinateur, un dossier contenant le fichier "braccio.png" et le programme Python
Présentation
Les bras robotisés sont très utilisés dans le monde industriel et notamment dans les secteurs de l'automobile ou de la médecine.
Nous allons réaliser l'interface de commande d'un bras Braccio en langage Python à l'aide des bibliothèques Tkinter et Serial. Le bras Braccio est piloté par une carte de type Arduino reliée à un ordinateur PC par un câble USB.
Le robot Braccio - Description
Le robot comporte six servomoteurs :
- Le moteur de base à une course angulaire de. Il doit être positionné à 90° et il faut envoyer les caractèresBx sur la liaison série.
- Le moteur d’épaule à une course angulaire de. Il doit être positionné à 45° et il faut envoyer les caractèresEx sur la liaison série.
- Le moteur de coude à une course angulaire de. Il doit être positionné à 180° et il faut envoyer les caractèresCx sur la liaison série.
- Le moteur de poignet à une course angulaire de. Il doit être positionné à 180° et il faut envoyer les caractèresPx sur la liaison série.
- Le moteur de main à une course angulaire de. il doit être positionné à 90° et il faut envoyer les caractèresMx sur la liaison série.
- Le moteur de doigt à une course angulaire de. Il doit être positionné à 10° et il faut envoyer les caractèresDx sur la liaison série.
Exemple :B90pour positionner la base.
Le robot Braccio - Illustration
Préparation
L’objectif est de commander l’angle de rotation d’un servomoteur par le biais d’une interface homme-machine (IHM) comportant un curseur de réglage et un bouton poussoir d’envoi de la valeur réglée.
On utilise la bibliothèque « Serial » pour communiquer avec la carte Arduino, par l'intermédiaire des méthodes suivantes :
- ser = serial.Serial("COMx",115200,timeout=1) permet d'initialiser la liaison série à 115200 bauds sur le COMx (x : numéro du port de communication utilisé par la carte Arduino).
- ser.write("message".encode('utf-8')) permet d'écrire le texte "message".
Le programme suivant permet de réaliser la commande du servomoteur de la base du robot par une IHM Tkinter :
from tkinter import Tk, Button, Label, Scale
import serial
# Ouverture de la liaison série
try:
ser = serial.Serial("COM8", 115200, timeout=1) # A modifier !
print(ser)
liaison=True
except:
print("Pas de liaison avec la carte Arduino !")
liaison=False
# Envoi des caractères sur la liaison série
def envoyer(datacmd) :
try:
ser.write((datacmd).encode('utf-8'))
except:
print("bp d'écriture")
def servomot():
b=str(curseur_base.get())
data = "B"+b
envoyer(data)
# L'IHM
fen = Tk()
fen.geometry("500x200")
fen.title("Commande du servomoteur")
label = Label(fen, text="Commande du servomoteur",fg="blue",font=("Arial", 22, "bold", "italic"))
label.place(x=50, y=10)
curseur_base = Scale(fen, orient='horizontal', from_=0, to=180, length=200)
curseur_base.place(x=145, y=50)
curseur_base.set(90)
bouton = Button(fen, text="envoyer", command=servomot)
bouton.place(x=220, y=100)
fen.mainloop()
if liaison : ser.close()
Bibliothèque Tkinter
Traitement des données avec Python
Le programme Python que vous allez compléter doit se trouver dans le même dossier que l'image "braccio.png".
La carte Arduino est équipée d'une l’interface de puissance qui permet de fournir le courant nécessaire aux servomoteurs du robot.
1. Complétez le programme suivant afin d’envoyer les différentes valeurs des curseurs à la carte Arduino.
from tkinter import Tk, Button, Label, Scale, PhotoImage, Canvas, Frame
import serial
try:
ser = serial.Serial("COM11", 115200, timeout=1)
print(ser)
liaison=True
except:
print("Pas de liaison avec la carte Arduino !")
liaison=False
# Envoi des caractères sur la liaison série
def envoyer(datacmd) :
try:
ser.write((datacmd).encode('utf-8'))
except:
print("bp d'écriture")
def bras():
b=str(curseur_base.get())
data = "B"+b
envoyer(data)
.........
# A compléter !
..........
fen = Tk()
fen.title("Commande du Robot Braccio")
zone = Frame(fen, width=573, height=569, borderwidth=2, relief='groove', bg='white')
zone.pack(padx=10, pady=10)
monimage = PhotoImage(file = "braccio.png")
canevas = Canvas(zone, width=563, height=559, bg='white')
canevas.place(x=0,y=0)
canevas.create_image(0, 0, anchor="nw", image=monimage)
.........
# A compléter !
..........
fen.mainloop()
if liaison : ser.close()