Bonjour
J'aimerais pouvoir traiter mes données issues d'Arduino. Par diverses recherches, j'ai trouvé une solution qui fonctionne plus ou moins bien : je récupère les données du moniteur série (arduino.readline), je nettoie mon fichier obtenu pour enlever les caractères "parasites" qui sont mis (fonction nettoie), j'écris les données dans un fichier texte puis je traite les données du fichier texte.
Mon code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #Importation des modules utilisés
import serial
import numpy as np
import matplotlib.pyplot as plt
from math import exp
from scipy.optimize import curve_fit
#Définition de la fonction pour la modélisation
def fonction( x, a):
return ((exp(1)**(-1*a*x)))
#Ouverture de la liaison série
try :
arduino=serial.Serial("COM3", baudrate=115200, timeout=1)
except:
print("Vérifier le port série")
#Initialisation des variables
rawdata=[]
compt=0
#Réception et stockage des données
while compt<50:
rawdata.append(str(arduino.readline()))
compt+=1
#Fonction de nettoyage pour supprimer
def nettoie(L):
newL=[]
for i in range (len(L)):
temp=L[i][2:]
newL.append(temp[:-5])
return newL
cleandata=nettoie(rawdata)
print(cleandata)
#Ecriture des données dans un fichier texte
#Une ligne par donnée
def write(L):
file=open("data.txt", mode="w")
for i in range(len(L)):
file.write(L[i]+"\n")
file.close()
write(cleandata)
temps,tension=np.loadtxt("data.txt", delimiter=";",unpack=True)
#modele=np.polyfit(logtension,temps,1)
#print("logtension = ",modele[0]," x temps + ",modele[1])
#print("tau = ")
#Modélisation des données expérimentales
params, covar = curve_fit(fonction, temps, tension, p0 = 1e-3)
print(params, covar)
modele = []
for val in temps:
modele.append(fonction(val, params))
#Affichage des données expérimentales + modélisées
plt.plot(temps, tension, 'o', label="valeurs expérimentales")
plt.plot(temps, modele, label="modele".format(*params))
plt.legend()
plt.title("modélisation de lacharge d'un condensateur")
plt.xlabel('Temps (s)')
plt.ylabel('U(condensateur) (V)')
plt.show() |
Mon principal problème vient de la présence de caractères vides dans le fichier de nettoyage.
Par exemple : ['', '', '0.000;0.06', '0.001;0.62', '0.003;1.12', '0.004;1.56', '0.005;1.95', '0.007;2.29', '0.008;2.59', '', '', '', '', '', '', '', '', '', '']
Dans le cas de cette expérience (charge d'un condensateur), je pourrais vouloir calculer le logarithme de la tension (la 2ème donnée) mais comme j'ai les caractères vides, j'ai une erreur "only size-1 arrays can be converted to Python scalars"
Ensuite, j'aimerais savoir si une autre méthode pour récupérer les données d'Arduino existait plus "jolie" : je trouve un peu fastidieuse et poussive cette méthode (avec le passage par un fichier texte).
J'ai un dernier problème (modélisation par l'exponentielle qui ne fonctionne pas) mais je vais faire la demande dans une autre discussion.
Merci pour votre aide.
Partager