mirror of
https://forge.apps.education.fr/blender-edutech/jumeaux-numeriques.git
synced 2024-01-27 06:56:18 +01:00
Modification de la vitesse du moteur numérique pour le monte-charge
This commit is contained in:
parent
1028e85f38
commit
ddb3ffe0cc
@ -18,7 +18,7 @@ scene = bge.logic.getCurrentScene()
|
||||
|
||||
# Configuration des variables publiques
|
||||
# 'nom_variable' :
|
||||
# - Objet 3D : [nom de l'objet 3D, propriété du stockage de la valeur (activate ou activated_real)]
|
||||
# - Objet 3D : [nom de l'objet 3D, propriété du stockage de la valeur (activate ou activated_real), échelle (1 si ommis)]
|
||||
# - Configuration de la broche : [nom de la propriété stockant l'object broche (pyfirmata), type de broche par défaut('d','a' ou 'p'), 'mode de la broche par défaut ('i' ou 'o')]
|
||||
# - Configuration du graphique : ['marque', 'type de ligne', 'couleur', linewidth]] (matplotlib)
|
||||
#
|
||||
@ -27,6 +27,7 @@ scene = bge.logic.getCurrentScene()
|
||||
# Ce distinguo ne concerne que les entrées, les sorties réelles sont forcées par les sorties numériques et vice-versa.
|
||||
|
||||
public_vars = {
|
||||
't' : [['System','time'], [], []],
|
||||
'voy_0' : [['Led niveau 0','activated'], ['pin', 'd','o'], []],
|
||||
'voy_1' : [['Led niveau 1','activated'], ['pin', 'd','o'], []],
|
||||
'pc_0' : [['Microrupteur niveau 0','activated_real'], [], []],
|
||||
@ -38,7 +39,13 @@ public_vars = {
|
||||
'ba_1' : [['Bp niveau 1','activated'], ['pin', 'd','i'], []],
|
||||
'ba_1_r' : [['Bp niveau 1','activated_real'], [], []],
|
||||
'mot_m' : [['Moteur','up',], ['pin_up', 'd','o'], []],
|
||||
'mot_d' : [['Moteur','down'], ['pin_down', 'd','o'], []]}
|
||||
'mot_d' : [['Moteur','down'], ['pin_down', 'd','o'], []],
|
||||
'mot_angle' : [['Moteur','alpha'], [], []],
|
||||
'mot_vitesse' : [['Moteur','speed'], [], []],
|
||||
'mot_pas' : [['Moteur','step'], [], []],
|
||||
'cabine_z' : [['Cabine','z', 1/0.333], [], []],
|
||||
'cabine_vitesse' : [['Cabine','speed', 1/0.333], [], []],
|
||||
'cabine_pas' : [['Cabine','step', 1/0.333], [], []]}
|
||||
|
||||
# Couleurs
|
||||
color_passive = (0.800, 0.005, 0.315,1) # bouton non activable : magenta
|
||||
@ -120,24 +127,36 @@ def get_public_vars():
|
||||
|
||||
def mot (cont):
|
||||
if scene.objects['System']['run']:
|
||||
fps = 60 # frame per second
|
||||
obj = cont.owner
|
||||
vitesse = 0.015
|
||||
pas_cabine = 10 # Diam axe = 3 mm -> 1 tour = 3*math.pi
|
||||
pas_pignon = pas_cabine/(3*math.pi) # Z pignon = 48 dents
|
||||
pas_vissansfin = pas_pignon*48
|
||||
obj_vissansfin = scene.objects['Moteur vis sans fin']
|
||||
obj_pignon = scene.objects['Moteur pignon']
|
||||
obj_cabine = scene.objects['Cabine']
|
||||
obj_cabine['z']= scene.objects['Cabine'].localPosition.z # Affichage de l'altitude de la cabine
|
||||
obj_contrepoids = scene.objects['Contrepoids']
|
||||
obj_cable = scene.objects['Cable'] # FIXME : plus tard
|
||||
obj_cable = scene.objects['Cable'] # FIXME : animation du cable -> plus tard
|
||||
|
||||
# Roue et vis sans fin
|
||||
z = 48 # nb dents pignon
|
||||
diam_axe = 3 # diamètre de l'axe moteur
|
||||
obj['step']= obj['speed_setting'] / fps # Vitesse du moteur numérique : 1,3 rad /s par défaut
|
||||
obj_pignon['step'] = obj['step'] / z
|
||||
obj_cabine['step'] = obj_pignon['step'] * (math.pi*diam_axe)
|
||||
|
||||
# Monter
|
||||
if obj['up']:
|
||||
obj_vissansfin.applyRotation((0, 0, pas_vissansfin*vitesse), True)
|
||||
obj_pignon.applyRotation((pas_pignon*vitesse, 0, 0), True)
|
||||
obj_cabine.applyMovement((0, 0, pas_cabine*vitesse), True)
|
||||
obj_contrepoids.applyMovement((0, 0, -pas_cabine*vitesse), True)
|
||||
|
||||
# Physique
|
||||
obj_vissansfin.applyRotation((0, 0, obj['step']), True)
|
||||
obj['alpha']= obj['alpha']+obj['step']
|
||||
if scene.objects['System']['time'] != obj['last_time']:
|
||||
obj['speed']= (obj['step'])/(scene.objects['System']['time']-obj['last_time'])
|
||||
obj_pignon.applyRotation((obj_pignon['step'], 0, 0), True)
|
||||
obj_cabine.applyMovement((0, 0, obj_cabine['step']), True)
|
||||
obj_cabine['z']= obj_cabine['z']+obj_cabine['step'] # Echelle pas pris en compte
|
||||
if scene.objects['System']['time'] != obj['last_time']:
|
||||
obj_cabine['speed']= obj_cabine['step']/(scene.objects['System']['time']-obj['last_time'])
|
||||
obj_contrepoids.applyMovement((0, 0, -obj_cabine['step']), True)
|
||||
obj['last_time'] = scene.objects['System']['time']
|
||||
|
||||
# Modele 3D -> Arduino
|
||||
if scene.objects['System']['twins']:
|
||||
@ -149,14 +168,35 @@ def mot (cont):
|
||||
# Descendre
|
||||
# else: # Pas de priorité
|
||||
if obj['down']:
|
||||
obj_vissansfin.applyRotation((0, 0, -pas_vissansfin*vitesse), True)
|
||||
obj_pignon.applyRotation((-pas_pignon*vitesse, 0, 0), True)
|
||||
obj_cabine.applyMovement((0, 0, -pas_cabine*vitesse), True)
|
||||
obj_contrepoids.applyMovement((0, 0, pas_cabine*vitesse), True)
|
||||
|
||||
# Physique
|
||||
obj_vissansfin.applyRotation((0, 0, -obj['step']), True)
|
||||
obj['alpha']= obj['alpha']-obj['step']
|
||||
if scene.objects['System']['time'] != obj['last_time']:
|
||||
obj['speed']= (-obj['step'])/(scene.objects['System']['time']-obj['last_time'])
|
||||
obj_pignon.applyRotation((-obj_pignon['step'], 0, 0), True)
|
||||
obj_cabine.applyMovement((0, 0, -obj_cabine['step']), True)
|
||||
obj_cabine['z']= obj_cabine['z']-obj_cabine['step'] # Echelle pas pris en compte
|
||||
if scene.objects['System']['time'] != obj['last_time']:
|
||||
obj_cabine['speed']= -obj_cabine['step']/(scene.objects['System']['time']-obj['last_time'])
|
||||
obj_contrepoids.applyMovement((0, 0, obj_cabine['step']), True)
|
||||
obj['last_time'] = scene.objects['System']['time']
|
||||
|
||||
# Modele 3D -> Arduino
|
||||
if scene.objects['System']['twins']:
|
||||
if scene.objects['Moteur']['pin_d'] is not None:
|
||||
if scene.objects['Moteur']['pin_m'] is not None:
|
||||
scene.objects['Moteur']['pin_m'].write(0)
|
||||
scene.objects['Moteur']['pin_d'].write(1)
|
||||
|
||||
# Arrêter
|
||||
if obj['up']== False and obj['down'] == False :
|
||||
|
||||
# Physique
|
||||
obj['speed']= 0
|
||||
obj_cabine['speed']= 0
|
||||
obj['last_time'] = scene.objects['System']['time']
|
||||
|
||||
# Modele 3D -> Arduino
|
||||
if scene.objects['System']['twins']:
|
||||
if scene.objects['Moteur']['pin_d'] is not None:
|
||||
@ -274,4 +314,10 @@ def system_reset ():
|
||||
scene.objects['Microrupteur niveau 1']['activated_real']=False
|
||||
scene.objects['Moteur']['up']=False
|
||||
scene.objects['Moteur']['down']=False
|
||||
|
||||
scene.objects['Moteur']['alpha']=0
|
||||
scene.objects['Moteur']['speed']=0
|
||||
scene.objects['Moteur']['speed_setting']=31.4 # Vitesse du moteur numérique : 31,4 rad /s ( 5 tr / s )
|
||||
scene.objects['Moteur']['step']=0
|
||||
scene.objects['Cabine']['z']=0
|
||||
scene.objects['Cabine']['speed']=0
|
||||
scene.objects['Cabine']['step']=0
|
||||
|
@ -39,14 +39,51 @@ from montchg_lib import * # Bibliothèque utilisateur du monte-charge
|
||||
|
||||
def commandes():
|
||||
|
||||
# Ecrire votre code ici ...
|
||||
while True:
|
||||
# Init -> Descendre
|
||||
while pc_0() ==False :
|
||||
voy_0(True)
|
||||
voy_1(False)
|
||||
tempo(0.5)
|
||||
mot_m(False)
|
||||
mot_d(True)
|
||||
mot_d(False)
|
||||
voy_0(False)
|
||||
print ("")
|
||||
|
||||
# Monter
|
||||
mot_digitset (500)
|
||||
t0,z0, a0= get('t'), get('cabine_z'), get('mot_angle')
|
||||
print ("Début monter : cabine_z : "+str(round(z0,3)) + " - mot_angle : " + str(round(a0,3)))
|
||||
while pc_1() ==False :
|
||||
voy_1(True)
|
||||
tempo(0.5)
|
||||
mot_d(False)
|
||||
mot_m(True)
|
||||
mot_pas, mot_vitesse, cabine_pas, cabine_vitesse= get('mot_pas'), get('mot_vitesse'), get('cabine_pas'), get('cabine_vitesse')
|
||||
mot_m(False)
|
||||
voy_1(False)
|
||||
t1,z1, a1= get('t'), get('cabine_z'), get('mot_angle')
|
||||
print ("Fin monter : cabine_z : "+str(round(z1,3)) + " - mot_angle : " + str(round(a1,3)))
|
||||
print ("")
|
||||
print ("Monter : "+str(round(t1-t0,3)) +" s - distance : " +str(round(z1-z0,3))+" mm - angle : " +str(round(a1-a0,3))+
|
||||
" rad - cabine_vitesse : " +str(round(cabine_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
|
||||
" rad/s - cabine_pas : " +str(round(cabine_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
|
||||
print ("")
|
||||
|
||||
# Descendre
|
||||
mot_digitset () # 5 tr/s
|
||||
t0,z0, a0= get('t'), get('cabine_z'), get('mot_angle')
|
||||
print ("Début descendre : cabine_z : "+str(round(z0,3)) + " - mot_angle : " + str(round(a0,3)))
|
||||
while pc_0() ==False :
|
||||
voy_0(True)
|
||||
mot_m(False)
|
||||
mot_d(True)
|
||||
mot_pas, mot_vitesse, cabine_pas, cabine_vitesse= get('mot_pas'), get('mot_vitesse'), get('cabine_pas'), get('cabine_vitesse')
|
||||
mot_d(False)
|
||||
voy_0(False)
|
||||
t1,z1, a1= get('t'), get('cabine_z'), get('mot_angle')
|
||||
print ("Fin descendre : cabine_z : "+str(round(z1,3)) + " - mot_angle : " + str(round(a1,3)))
|
||||
print ("")
|
||||
print ("Descendre : "+str(round(t1-t0,3)) +" s - distance : " +str(round(z1-z0,3))+" mm - angle : " +str(round(a1-a0,3))+
|
||||
" rad - cabine_vitesse : " +str(round(cabine_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
|
||||
" rad/s - cabine_pas : " +str(round(cabine_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
|
||||
|
||||
fin() # A garder
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import bge # Bibliothèque Blender Game Engine (UPBGE)
|
||||
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
|
||||
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
|
||||
from twin_plot import plot, get # Visualisation des données
|
||||
import time
|
||||
|
||||
###############################################################################
|
||||
@ -46,6 +47,13 @@ def mot_m (order):
|
||||
def mot_d (order):
|
||||
scene.objects['Moteur']['down']=order
|
||||
|
||||
# Réglage de la vitesse du moteur numérique
|
||||
def mot_digitset (speed=None):
|
||||
if speed==None:
|
||||
scene.objects['Moteur']['speed_setting']=31.4 # Vitesse du moteur numérique : 31,4 rad /s ( 5 tr / s )
|
||||
else:
|
||||
scene.objects['Moteur']['speed_setting']=speed
|
||||
|
||||
###############################################################################
|
||||
# Capteurs
|
||||
###############################################################################
|
||||
@ -96,7 +104,8 @@ def truncate(n, decimals=0):
|
||||
return int(n* multiplier)/multiplier
|
||||
|
||||
def get_t ():
|
||||
return truncate(scene.objects['System']['time'], 3)
|
||||
# return truncate(scene.objects['System']['time'], 3)
|
||||
return round(scene.objects['System']['time'], 3)
|
||||
|
||||
def set_t (date):
|
||||
scene.objects['System']['time']=date
|
||||
|
Binary file not shown.
@ -122,22 +122,26 @@ def get_public_vars():
|
||||
|
||||
def mot (cont):
|
||||
if scene.objects['System']['run']:
|
||||
fps = 60 # frame per second
|
||||
obj = cont.owner
|
||||
obj_engrenage = scene.objects['Engrenage']
|
||||
obj_portail = scene.objects['Portail']
|
||||
|
||||
# Réducteur
|
||||
r = 1/100 # Rapport de réduction
|
||||
|
||||
# Crémaillaire
|
||||
fps = 60 # frame per second
|
||||
pas_dent = 7.85 # 7.85 mm soit 2.35 m (bender)
|
||||
z = 14 # nb dents
|
||||
obj['step']= scene.objects['Moteur']['speed_setting'] / fps # Vitesse du moteur numérique : 1,3 rad /s par défaut
|
||||
obj_portail['step'] = (pas_dent * z)/(2*math.pi) * obj['step']
|
||||
obj['step']= obj['speed_setting'] / fps # Vitesse du moteur numérique : 1,3 rad /s par défaut
|
||||
obj_engrenage['step']= obj['step'] * r
|
||||
obj_portail['step'] = obj_engrenage['step'] * (pas_dent * z)/(2*math.pi)
|
||||
|
||||
# Ouvrir
|
||||
if obj['open']:
|
||||
|
||||
# Physique
|
||||
obj_engrenage.applyRotation((0, 0, -obj['step']), True)
|
||||
obj_engrenage.applyRotation((0, 0, -obj_engrenage['step']), True)
|
||||
obj['alpha']= obj['alpha']-obj['step']
|
||||
if scene.objects['System']['time'] != obj['last_time']:
|
||||
obj['speed']= (-obj['step'])/(scene.objects['System']['time']-obj['last_time'])
|
||||
@ -159,7 +163,7 @@ def mot (cont):
|
||||
if obj['close']:
|
||||
|
||||
# Physique
|
||||
obj_engrenage.applyRotation((0, 0, obj['step']), True)
|
||||
obj_engrenage.applyRotation((0, 0, obj_engrenage['step']), True)
|
||||
obj['alpha']= obj['alpha']+obj['step']
|
||||
if scene.objects['System']['time'] != obj['last_time']:
|
||||
obj['speed']= (obj['step'])/(scene.objects['System']['time']-obj['last_time'])
|
||||
@ -396,7 +400,7 @@ def system_reset ():
|
||||
scene.objects['Moteur']['close']=False
|
||||
scene.objects['Moteur']['alpha']=0
|
||||
scene.objects['Moteur']['speed']=0
|
||||
scene.objects['Moteur']['speed_setting']=1.3 # Vitesse du moteur numérique : 1,3 rad /s
|
||||
scene.objects['Moteur']['speed_setting']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s )
|
||||
scene.objects['Moteur']['step']=0
|
||||
scene.objects['Portail']['x']=0
|
||||
scene.objects['Portail']['speed']=0
|
||||
|
@ -28,9 +28,6 @@ from porcou_lib import * # Bibliothèque utilisateur du portail coulissant
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# Brochage du portail coulissant
|
||||
brochage={}
|
||||
|
||||
###############################################################################
|
||||
# Fonctions
|
||||
###############################################################################
|
||||
@ -48,12 +45,12 @@ def commandes():
|
||||
mot_o(True)
|
||||
mot_o(False)
|
||||
gyr(False)
|
||||
print ("")
|
||||
|
||||
# Fermeture
|
||||
mot_digitset (10) # 1,3 rad/s par défaut
|
||||
|
||||
tf_d,xf_d, af_d= get('t'), get('portail_x'), get('mot_angle')
|
||||
print ("Début fermeture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
|
||||
mot_digitset (1256) # Vitesse par défaut 125,6 rad /s ( 20 tr / s )
|
||||
t0,x0, a0= get('t'), get('portail_x'), get('mot_angle')
|
||||
print ("Début fermeture : portail_x : "+str(round(x0,3)) + " - mot_angle : " + str(round(a0,3)))
|
||||
while fdc_f() ==False :
|
||||
gyr(True)
|
||||
mot_o(False)
|
||||
@ -61,19 +58,18 @@ def commandes():
|
||||
mot_pas, mot_vitesse, portail_pas, portail_vitesse= get('mot_pas'), get('mot_vitesse'), get('portail_pas'), get('portail_vitesse')
|
||||
mot_f(False)
|
||||
gyr(False)
|
||||
|
||||
mot_digitset () # 1,3 rad/s par défaut
|
||||
print ("Fin fermeture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
|
||||
tf_f,xf_f, af_f= get('t'), get('portail_x'), get('mot_angle')
|
||||
t1,x1, a1= get('t'), get('portail_x'), get('mot_angle')
|
||||
print ("Fin fermeture : portail_x : "+str(round(x1,3)) + " - mot_angle : " + str(round(a1,3)))
|
||||
print ("")
|
||||
print ("Fermeture : "+str(round(tf_f-tf_d,3)) +" s - distance : " +str(round(xf_f-xf_d,3))+" mm - angle : " +str(round(af_f-af_d,3))+
|
||||
print ("Fermeture : "+str(round(t1-t0,3)) +" s - distance : " +str(round(x1-x0,3))+" mm - angle : " +str(round(a1-a0,3))+
|
||||
" rad - portail_vitesse : " +str(round(portail_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
|
||||
" rad/s - portail_pas : " +str(round(portail_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
|
||||
print ("")
|
||||
|
||||
# Ouverture
|
||||
print ("")
|
||||
to_d,xo_d, ao_d= get('t'), get('portail_x'), get('mot_angle')
|
||||
print ("Début ouverture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
|
||||
mot_digitset () # Vitesse par défaut 125,6 rad /s ( 20 tr / s )
|
||||
t0,x0, a0= get('t'), get('portail_x'), get('mot_angle')
|
||||
print ("Début ouverture : portail_x : "+str(round(x0,3)) + " - mot_angle : " + str(round(a0,3)))
|
||||
while fdc_o() ==False :
|
||||
gyr(True)
|
||||
mot_f(False)
|
||||
@ -81,10 +77,10 @@ def commandes():
|
||||
mot_pas, mot_vitesse, portail_pas, portail_vitesse= get('mot_pas'), get('mot_vitesse'), get('portail_pas'), get('portail_vitesse')
|
||||
mot_o(False)
|
||||
gyr(False)
|
||||
print ("Fin ouverture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
|
||||
to_f,xo_f, ao_f= get('t'), get('portail_x'), get('mot_angle')
|
||||
t1,x1, a1= get('t'), get('portail_x'), get('mot_angle')
|
||||
print ("Fin ouverture : portail_x : "+str(round(x1,3)) + " - mot_angle : " + str(round(a1,3)))
|
||||
print ("")
|
||||
print ("Ouverture : "+str(round(to_f-to_d,3)) +" s - distance : " +str(round(xo_f-xo_d,3))+" mm - angle : " +str(round(ao_f-ao_d,3))+
|
||||
print ("Ouverture : "+str(round(t1-t0,3)) +" s - distance : " +str(round(x1-x0,3))+" mm - angle : " +str(round(a1-a0,3))+
|
||||
" rad - portail_vitesse : " +str(round(portail_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
|
||||
" rad/s - portail_pas : " +str(round(portail_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
|
||||
|
||||
|
@ -1,10 +1,7 @@
|
||||
import bge # Bibliothèque Blender Game Engine (UPBGE)
|
||||
import subprocess # Multiprocessus
|
||||
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading (multitâches)
|
||||
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
|
||||
from twin_plot import plot, get # Visualisation des données
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
###############################################################################
|
||||
@ -49,7 +46,7 @@ def mot_f (order):
|
||||
# Réglage de la vitesse du moteur numérique
|
||||
def mot_digitset (speed=None):
|
||||
if speed==None:
|
||||
scene.objects['Moteur']['speed_setting']=1.3 # 1,3 rad/s par défaut
|
||||
scene.objects['Moteur']['speed_setting']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s )
|
||||
else:
|
||||
scene.objects['Moteur']['speed_setting']=speed
|
||||
|
||||
|
Binary file not shown.
@ -1,7 +1,7 @@
|
||||
<data>
|
||||
<screen>
|
||||
<width>1609</width>
|
||||
<height>905</height>
|
||||
<width>1568</width>
|
||||
<height>882</height>
|
||||
<quality>1</quality>
|
||||
</screen>
|
||||
</data>
|
@ -28,6 +28,9 @@ plot_config = system.get_public_vars()
|
||||
|
||||
def get(data):
|
||||
if data in plot_config:
|
||||
if len (plot_config[data][0])>2: # Echelle à prendre en compte
|
||||
return(scene.objects[plot_config[data][0][0]][plot_config[data][0][1]]*plot_config[data][0][2])
|
||||
else:
|
||||
return(scene.objects[plot_config[data][0][0]][plot_config[data][0][1]])
|
||||
else:
|
||||
print ("Erreur sur l'accès aux variables par get("+data+"), la variable '"+data+"' absente du système.")
|
||||
|
Binary file not shown.
@ -1,6 +1,7 @@
|
||||
import bge # Bibliothèque Blender Game Engine (UPBGE)
|
||||
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
|
||||
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
|
||||
from twin_plot import plot, get # Visualisation des données
|
||||
import time
|
||||
|
||||
###############################################################################
|
||||
|
Loading…
Reference in New Issue
Block a user