Initiation à la Robotique
L’objectif est d’aborder, à l’aide d’une application de robotique mobile,
les notions élémentaires de programmation.
C’est également l’occasion de présenter les différentes thématiques étudiées dans une école d’ingénieurs de type généraliste.
Présentation du Système
La communication entre le microcontrôleur et le servomoteur dynamixel se fait via une liaison de type RS232.
Le périphérique UART6 est alors utilisé côté microcontrôleur pour transmettre un message à destination du servomoteur.
Test du programme
Envoi d’un caractère avec un terminal série
PROJET SOURCE
Télécharger le fichier suivant, à extraire dans le répertoire Documents.
WORKSPACE_F411_DXL_STM32CUBEIDE.zip
Dans un terminal, taper :
$ stm32cubeide
à l’ouverture, choisir : workspace : WORKSPACE_F411_DXL_STM32CUBEIDE
Compilation du projet : Project –> build All ( CTRL+B )
A l’issue de la compilation, s’il n’y a pas d’erreur de syntaxe, il se crée un exécutable .elf, compréhensible par le microcontrôleur
Debugging du projet : Debug panel :
appuyer ensuite sur le ‘bug button’ et choisir …Debug
L’exécutable (*.elf) devrait alors être chargé dans la cible.
Il faut ensuite lancer le programme (run) en appuyant sur F8.
Pour observer des données, il faut arrêtre le programme avec le debogueur.
Pour ajouter des points d’arrêt ( breakpoint ), double cliquer dans la marge. Les variables sont observables dans la fenêtre ‘variable’ ou ‘watch expression’ ( window -> show view -> Expressions ).
TERMINAL SERIE
Branchons l’adaptateur USB zigbee sur le PC.
Il se crée un fichier /dev/ttyUSB0
Dans un terminal :
$ minicom -D /dev/ttyUSB0
Afin de tester le programme :
- Placer un point d’arrêt à la ligne 40
- Envoyer le caractère ‘f’ à l’aide du terminal série
- Vérifier que le programme s’arrête bien à la ligne 40
- exécuter la ligne 40 en appuyant sur F6.
- Le moteur devrait se mettre en rotation. Vérifier avec le debogueur la présence du caractère ‘f’ dans la variable car_received
Envoi d’un caractère avec une IHM en python
Nous remplaçons ici le terminal série par un programme python afin d’avoir un interface plus conviviale.
#! /usr/bin/python3
import serial
import time
from tkinter import *
import struct
port='/dev/ttyUSB0'
baudrate=115200
serBuffer = ""
########################################################################
# FUNCTIONS
########################################################################
def onPushAvant():
ser.write(b'f')
def onPushStop():
ser.write(b's')
########################################################################
# MAIN
########################################################################
if __name__ == "__main__" :
try:
ser = serial.Serial(port, baudrate, bytesize=8, parity='N', stopbits=1, timeout=None, rtscts=False, dsrdtr=False)
print("serial port " + ser.name + " opened")
except Exception:
print("error open serial port: " + port)
exit()
ui=Tk()
ui.title("SERIAL SEND ORDER")
ui.geometry("200x200")
avantButton=Button(ui, text="AVANT", font=("Arial",10, "bold"), bg="seagreen3", fg="black", bd=3, relief=RAISED, command=onPushAvant)
avantButton.pack()
stopButton=Button(ui, text="STOP", font=("Arial",10, "bold"), bg="seagreen3", fg="black", bd=3, relief=RAISED, command=onPushStop)
stopButton.pack()
ui.mainloop() # MAIN LOOP
########################################################################
Pour lancer le programme, dans un terminal :
$ chmod +x sendOrder.py
$ ./sendOrder.py
Modification du Programme
On souhaite désormais pouvoir piloter le robot dans tous les sens ( avant, arrière, gauche, droite, stop ).
Modifier les programmes microcontroleur et python pour intégrer ces modifications.
REMARQUE : Chaque moteur a un identifiant ( 1 et 2 ).
si je veux modifier la vitesse de rotation du moteur 1, j’écris : dxl_setGoalVelocity(1, 140);
pour le moteur 2 : dxl_setGoalVelocity(2, 140);.
Ecriture du programme en mémoire Flash
Pour que notre programme s’exécute dans notre microcontrôleur à chaque mise sous tension, il faut l’écrire en mémoire flash.
L’exécutable est :
/nucleoF411_getting_started/Debug/nucleoF411_getting_started.elf
Il faut donc se placer avec le navigateur de fichiers dans le réperoire WORKSPACE_F411_DXL_STM32CUBEIDE/nucleoF411_getting_started/Debug, ouvrir un terminal dans ce répertoire, et taper :
$ openocd -s /share/openocd/scripts -f board/st_nucleo_f4.cfg -f flash_board.cfg -c "myFlash nucleoF411_getting_started.elf"