Bonjour à tous,
Je rencontre des difficultés sur un bout de programme assez simple.
Pour présenter le problème, je mesure une erreur en degré en fonction du temps. Mon système mécanique fait que mon signal comporte des paliers, or pour traiter ce signal, je dois me débarrasser de tout offset et ne garder que les "plateaux" avec donc des valeurs qui vont osciller autour de 0, normal pour une erreur.
Or, malgré les quelques cours d'algo que j'ai eu, je ne sais pas trop comment faire, j'ai testé différentes méthodes, mais qui me donnaient pas mal de bugs, et j'imagine qu'on peut coder ça proprement.
Voici le code :Je vais essayer d'expliquer un peu le code : Je reçois des tensions, que je convertis en degrés, à chaque passage à 0 de l'angle 1 j'ai un nouveau pallier. J'ai essayé de détecter ce passage et de soustraire l'offset, ça marche presque mais j'ai quelques points qui restent n'importe où et je n'arrive pas à m'en débarrasser. J'ai essayé de garder seulement les points compris dans un intervalle raisonnable autour de 0, sans, succès, que des messages d'erreurs (avec pourtant une simple boucle if).Code:import serial import matplotlib.pyplot as plt import time valeurs=[] angles1 = [] temps=[] serie=serial.Serial('COM3',9600) # ouvre une liaison serie en 9600bps plt.style.use('bmh') plt.ylabel("teta") plt.xlabel("temps en s") plt.ion() # on entre en mode interactif start=time.time() # mesure de l'instant initial i=0 while (i<100): mesure1, mesure2 = map(float, serie.readline().split()) # lit la donnee sur la laison serie angle1 = mesure1 / (1/180) angle2 = mesure2 / (1/180) if i == 3: ref = (angle2-(angle1)*(1/25)) angles1 += [angle1] if -1 <= angle1 <= 1: ref = (angle2-(angle1)*(1/25)) instant=time.time()-start # calcul du temps ecoule depuis l'instant initial if i >= 3: #les premiers points ne sont pas fiables temps.append(instant) # ajout de instant a la liste des temps valeur = (angle2-(angle1)*(1/25))-ref valeurs.append(valeur) print(mesure1,instant) # affiche dans la console les coordonnees du point print(mesure2,instant) plt.plot(temps,valeurs,marker='o') # trace la courbe plt.draw() # affiche la courbe en mode interactif i=i+1 plt.ioff() # on quitte le mode interactif pour rendre la main a l'utilisateur sur la courbe plt.show()
Voici le graphe de base :
Merci d'avance !
-----