Bonjour,
Je souhaite récupérer via Python des données acquises par une carte Arduino : je sais que le programme Arduino est fonctionnel (quand je saisis les paramètres demandés normalement dans Python, l'acquisition se fait correctement avec des valeurs cohérentes).
Par contre, quand je veux utiliser le programme Python, les données ne sont pas enregistrées (du moins la plupart du temps, de rares fois avec les mêmes paramètres, j'obtiens quand même des valeurs) : après avoir saisi mes paramètres portcom, periode, duree et acquisition, l''acquisition se lance mais je ne vois apparaître que le compteur (compt) et le séparateur "-" mais aucune donnée à la suite. A la fin de l'acquisition, j'obtiens (logiquement puisque aucune donnée n'est reçue) un message d'erreur à la ligne 70 "temps,tension=np.loadtxt("chargecondo.txt", delimiter=";",unpack=True) ValueError: not enough values to unpack (expected 2, got 0)"
Je ne comprends pas pourquoi les données ne sont pas prises en compte.
Merci d'avance pour votre aide
Le programme Arduino associé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # Importation des modules utilisés import serial import time import matplotlib.pyplot as plt import numpy as np from math import exp from scipy.optimize import curve_fit # Définition de la fonction pour la modélisation def fonction( x, a, b): """ Fonction qui permet de définir une fonction pour optimiser la modélisation de valeurs expérimentales Entrées : la variable x et les paramètres de la fonction a et b Résultat : valeur calculée de la fonction au point x """ return a *(1- np.exp(-1/b*x)) #a=tension de charge E, b=tau=cste de temps # Initialisation des variables arduino = None rawdata = [] nbrPoints = 0 tension = [] temps = [] def acquisition(nbrPoints): # Ouverture de la liaison série portcom=input("Saisir le numéro de port (COM) de l'Arduino :") portcom="COM"+portcom try: arduino = serial.Serial(portcom, baudrate=250000, timeout=3) except Exception as e: print("Vérifier le port série:", e) return time.sleep(1) periode=input("Saisir la période d'échantillonnage (en ms) : ") arduino.write(periode.encode("ascii")) time.sleep(1) duree=input("Saisir la durée totale (en ms) : ") arduino.write(duree.encode("ascii")) time.sleep(1) acquisition=input("Saisir S pour lancer l'acquisition : ") arduino.write(acquisition.encode("ascii")) nbrPoints=int(duree)//int(periode) # Réception et stockage des données print("Début de l'acquisition...") compt = 0 while compt < nbrPoints: data_read = arduino.readline().decode()[:-2] rawdata.append(data_read) print(compt, rawdata[compt], sep=" - ") compt += 1 print("Fin de l'acquisition.") arduino.close() acquisition(nbrPoints) def write(L): file=open("chargecondo.txt", mode="w") for i in range(len(L)): file.write(L[i]+"\n") file.close() # Remplissage des variables temps et tension à partir de l'acquisition write(rawdata) temps,tension=np.loadtxt("chargecondo.txt", delimiter=";",unpack=True)
Code Arduino : Sélectionner tout - Visualiser dans une fenêtre à part
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 // Déclaration des variables du programme unsigned long baud = 250000; // flux de la liaison série int delai = 1000; // délai d'attente pour être sûr de décharger le condensateur // Variables d'acquisition int timeRes ; // période d'échantillonnage en ms int dureeAcquisition ; // durée totale de l'acquisition en s unsigned long tempsZero; unsigned long tempsCourant; int topDepart = 0; //variable pour lancer l'acquisiti String envoi; unsigned long tempsPrec; // Broches de branchement au circuit byte mesureTension = 0; //broche analogique de mesure de la tension aux bornes de C byte chargeCondo = 3; //broche pour décharger initialement le condensateur void setup() { Serial.begin(baud); tempsPrec = millis(); tempsZero = millis(); envoi = "0"; //configure la broche commandePin en tant que sortie pinMode(chargeCondo, OUTPUT) ; //on décharge le condensateur en le mettant à 0V digitalWrite(chargeCondo, LOW) ; //Affichage d'un texte pour présenter le programme Serial.println("******* Etude de la charge d'un condensateur *******"); Serial.println(""); //on attend 1sec pour être sur de l'avoir déchargé delay(delai) ; } // Boucle principale void loop() { tempsCourant = millis() - tempsZero; if ( topDepart == 0) { reglages(); } else { if (tempsCourant <= dureeAcquisition) { if (tempsCourant >= tempsPrec) lecture(); } } } void reglages() { while (topDepart == 0) { envoi = Serial.readString(); Serial.print("Saisir la période d'échantillonnage (en ms) : "); while (Serial.available() == 0 ); { timeRes = Serial.parseInt(); //on enregistre la valeur saisie dans timeRes Serial.println(timeRes); delay(100); //délai de temporisation } Serial.print("Saisir la durée d'acquisition (en ms) : "); while (Serial.available() == 0 ); { dureeAcquisition = Serial.parseInt(); //on enregistre la valeur saisie dans dureeAcquisition Serial.println(dureeAcquisition); delay(100); //délai de temporisation } Serial.println("Saisir S pour lancer l'acquisition : "); while (Serial.available() == 0 ); { topDepart = 1; tempsPrec = 0; tempsZero = millis(); Serial.print("t"); // donne la date en seconde Serial.print('\t'); Serial.println("Uc"); // donne la valeur recalculée de la tension Serial.print("s"); // donne la date en seconde Serial.print('\t'); Serial.println("V"); // donne la valeur recalculée de la tension } } } void lecture() { //on met à 5V le générateur pour voir la charge digitalWrite(chargeCondo, HIGH) ; float tension; // Lecture et conversion des données tension = analogRead(mesureTension) * 5.0 / 1024; // mesure analogique et conversion en tension // Envoie les données Serial.print(tempsCourant / 1000.0, 3); // donne la date en seconde Serial.print('\t'); Serial.println(tension, 2); // donne la valeur recalculée de tension aux bornes de C tempsPrec += timeRes; }
Partager