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.
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.
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 :
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
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"