Acquisition qui ne se fait pas
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:
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:
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;
} |