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

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)
Le programme Arduino associé
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;
}