""" Moteur Stirling """ import serial import serial.tools.list_ports import matplotlib.pyplot as plt from matplotlib import animation import matplotlib.colors as mcolors import numpy as np # calcul_PV permet de tracer : # - tous les cycles avec num_cycle=None # - un unique cycle avec num_cycle= numéro cycle souhaité # ToDo Compléter le code def calcul_PV(dataN, num_cycle=None, Po=1e5, unite='mm3'): """ dataN = tableau de lignes de la forme [i, k, Pdiscr, t] i = n° de la fente comptée à partir du PMH k = nombre de tours (nombre de passages au PMH) Pdiscr = pression différentielle renvoyée par CAN Arduino (bits) t = instant de mesure (µs) num_cycle = n° du cycle souhaité = l'une des valeurs de k dans data Po : pression atmosphérique en Pa unite : 'mm3' ou 'm3' ou 'SI' """ assert unite in ['mm3', 'm3', 'SI'], "Unité incorrecte ('mm3', 'm3' ou 'SI)" if num_cycle is None: # Calculs pour tous les cycles data = dataN else: # Calculs pour le cycle spécifié par num_cycle assert float(num_cycle) in dataN[:,1], "n° cycle incorrect" data = np.array([l for l in dataN if l[1]==float(num_cycle)]) # Caractéristiques mécaniques du moteur L = # Longueur bielle piston moteur (mm) R = # Rayon maneton bielle moteur (mm) D = # Diamètre piston moteur (mm) S = # Surface piston moteur (mm**2) dtheta = # Angle entre 2 fentes (rad) Vmin = # Volume minimum du cylindre moteur (mm**3) # Calcul du volume du gaz dans le cylindre moteur i = # n° fente à partir du PMH theta = # Angle correspondant à la fente n°i OB = # Position piston V = # Volume (mm**3) if unite in ['m3', 'SI']: V *= 1e-9 # Capteur de pression différentielle Sb = # Sensibilité = dV/dPréelle = 1.03/1000 V/Pa # Pression dPd = # Pression différentielle discrétisée en bits dPv = # Pression différentielle en V dPr = # Pression différentielle réelle en Pa P = # Pression absolue en Pa # Instant de mesure t = # t en µs (cf. sketch Arduino) return P, V, t # Fonction utilitaire portArduino(bauds): # - détection des ports disponibles # - recherche du port auquel la carte Arduino est connectée # - définition de la vitesse de transmission def portArduino(bauds): ports = list(serial.tools.list_ports.comports()) print('Liste des ports détectés') # Liste des ports for p in ports: print(p.description) # Recherche du port Arduino # CDC = Communications Device Class (protocole) if "CDC" in p.description or "Arduino" in p.description: # Vitesse de transmission port = serial.Serial(p.device, bauds) # Affichage informations print('\nNom du port : ',port.name) # Nom du port print('Port ouvert : ',port.is_open) # Vérifie que le port est ouvert print('Transmission : ', port.baudrate) # Vitesse de transmission return port # Communication bauds = 115200 # Cf. sketch arduino : Serial.begin(bauds) port = portArduino(bauds) # Récupération et ouverture du port Arduino separateurColonnes = ';' # Cf. sketch Arduino (';' ou '\t' = tabulation...) finLecture = 'Stop' # Cf. sketch Arduino critère d'arrêt lecture # Enregistrement des données dans une liste unite = 'mm3' Po = 1e5 # Pression atmosphérique ou 0 si pression différentielle mesures = [] # Liste de chaînes (cf. ci-dessous) Ncycles = 20 cpt = 0 while True: # Boucle "infinie" cpt += 1 ligne = port.readline() # Lecture d'une ligne sur le port série ligne = ligne.strip() # Suppression caractères invisibles ligne = ligne.decode("utf-8") # readline -> binaire, conversion print(ligne) # Vérification visuelle dans le shell if not finLecture in ligne: mesures.append(ligne) # ligne = string if finLecture in ligne or cpt // 50 > Ncycles - 1: # Sortie boucle break # Sortie de la boucle while port.close() # Fermeture du port série # mesures = liste chaînes (lignes) -> data = [listes de chaînes (colonnes)] data = [] for s in mesures: L = s.split(separateurColonnes) # ligne = str -> liste de str = colonnes data.append(L) # data -> dataN = tableau numpy bidimensionnel et conversion des colonnes en float dataN = np.array(data, dtype=float) P, V, t = calcul_PV(dataN,1) plt.plot(V, P) plt.show() ## Stokage dans un fichier # Enregistrement des mesures dans un fichier dossier = "" # Dossier courant (dossier de ce fichier python) nom_fichier = "stirling20.txt" # A personnaliser chemin = dossier + nom_fichier fichier = open(chemin, "w+") # Ouverture du fichier en écriture for ligne in mesures: # Boucle sur toutes les lignes fichier.write(ligne + '\n') # Ecriture de la ligne dans le fichier fichier.close() # Fermeture du fichier ## Lecture du fichier et création du tableau de données # ToDo ## Puissance # ToDo