Modification de la vitesse du moteur numérique pour le portail coulissant

This commit is contained in:
Philippe Roy 2023-01-19 02:27:47 +01:00
parent 13240fd440
commit 1028e85f38
9 changed files with 90 additions and 69 deletions

View File

@ -45,7 +45,7 @@ card_data_title="Accès aux données"
card_data_text=""" get(variable) \n -> Retourne la valeur de la variable à \n l'instant t. Par exemple : val = get('ba_0').\n
Entrées/sorties : 'ba_0', 'ba_1', 'pc_0', 'pc_1', \n 'mot_m', 'mot_d', 'voy_0' et 'voy_1'.\n
Variables réels (si il y a jumelage) : 'ba_0_r', \n 'ba_1_r', 'pc_0_r', 'pc_1_r'.\n
Autres variables : 'mot_angle', 'mot_vitesse', \n 'cabine_z'."""
Autres variables : 't' (temps), 'mot_angle', 'mot_vitesse', \n 'cabine_z'."""
card_data_url=[]
system_card_description.update({"data-card" : [card_data_title, card_data_text, card_data_url]})

View File

@ -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'], [], []],
'bp_ext' : [['Bp cote rue','activated'], ['pin', 'd','i'], ['o','-', 'green', 1]],
'bp_ext_r' : [['Bp cote rue','activated_real'], [], ['o','--', 'green', 1]],
'bp_int' : [['Bp cote cour','activated'], ['pin', 'd','i'], ['o','-', 'darkgreen', 1]],
@ -38,8 +39,11 @@ public_vars = {
'mot_o' : [['Moteur','open'], ['pin_open', 'd','o'], ['o','-', 'violet', 1]],
'mot_f' : [['Moteur','close'], ['pin_close', 'd','o'], ['o','-', 'darkviolet', 1]],
'mot_angle' : [['Moteur','alpha'], [], ['o','-', 'blue', 1]],
'mot_vitesse' : [['Moteur','omega'], [], ['o','-', 'darkblue', 1]],
'mot_vitesse' : [['Moteur','speed'], [], ['o','-', 'darkblue', 1]],
'mot_pas' : [['Moteur','step'], [], []],
'portail_x' : [['Portail','x'], [], ['o','-', 'turquoise', 1]],
'portail_vitesse' : [['Portail','speed'], [], ['o','-', 'darkturquoise', 1]],
'portail_pas' : [['Portail','step'], [], []],
'gyr' : [['Led','activated'], ['pin', 'd','o'], ['o','-', 'gold', 1]],
'ir_emet' : [['Emetteur IR', 'activated'], ['pin', 'd','o'],['o','-', 'red', 1]],
'ir_recep' : [['Recepteur IR','activated'], ['pin', 'd','i'],['o','-', 'darkred', 1]],
@ -119,33 +123,30 @@ def get_public_vars():
def mot (cont):
if scene.objects['System']['run']:
obj = cont.owner
vitesse = 0.05 # valeur empirique
pas_portail = 2.35619/0.3 # pas echelle 1:1 = 2.35619 -> pas à l'échelle de la maquette (0,3) : 2.35619/0.3 = 7,85396 valeur empirique
pas_engrenage = math.pi/7 # z = 14 valeur empirique
obj_engrenage = scene.objects['Engrenage']
obj_portail = scene.objects['Portail']
# # obj_portail['x']= scene.objects['Portail'].localPosition.x # Affichage de la position du portail
# speed= obj['speed'] # 0,5 en tour / seconde -> course de 500 mm en 4s
# speed= 0.1
# scene.objects['System']['scale']=0.33
# # speed= obj['speed'] # 0,2 en tour / seconde -> course de 500 mm en 20s
# gear_radius = ((obj_engrenage['diameter'])/2) *(1/scene.objects['System']['scale']) # diametre : 40 mm et scale : 0,0033
# if obj['close']:
# print ("speed :", speed)
# print ("gear_radius :", gear_radius)
# print ("Vitesse engrenage : ", speed * 2 * math.pi*(1/60), pas_engrenage*vitesse)
# print ("Vitesse portail : ", speed * 2 * math.pi * gear_radius*(1/60), pas_portail*vitesse)
# print ("Ratio Vitesse portail/ Vitesse engrenage : ",( speed * 2 * math.pi * gear_radius*(1/60))/(speed * 2 * math.pi *(1/60)), pas_portail/pas_engrenage)
# 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']
# Ouvrir
if obj['open']:
# obj_engrenage.applyRotation((0, 0, -speed * 2 * math.pi), True)
# obj_portail.applyMovement((-speed * math.pi * gear_diameter, 0, 0), True)
obj_engrenage.applyRotation((0, 0, -pas_engrenage*vitesse), True)
obj_portail.applyMovement((-pas_portail*vitesse, 0, 0), True)
# Physique
obj_engrenage.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_portail.applyMovement((-obj_portail['step'], 0, 0), True)
obj_portail['x']= obj_portail['x']-obj_portail['step'] # Echelle pris en compte par le scale de 'System' : 0,3)
if scene.objects['System']['time'] != obj['last_time']:
obj_portail['speed']= -obj_portail['step']/(scene.objects['System']['time']-obj['last_time'])
obj['last_time'] = scene.objects['System']['time']
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
if scene.objects['Moteur']['pin_o'] is not None:
@ -156,10 +157,17 @@ def mot (cont):
# Fermer
# else: # Pas de priorité
if obj['close']:
# obj_engrenage.applyRotation((0, 0, speed * 2 * math.pi*(1/60)), True)
# obj_portail.applyMovement((speed * 2 * math.pi * gear_radius*(1/60), 0, 0), True)
obj_engrenage.applyRotation((0, 0, pas_engrenage*vitesse), True)
obj_portail.applyMovement((pas_portail*vitesse, 0, 0), True)
# Physique
obj_engrenage.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_portail.applyMovement((obj_portail['step'], 0, 0), True)
obj_portail['x']= obj_portail['x']+obj_portail['step'] # Echelle pris en compte par le scale de 'System' : 0,3)
if scene.objects['System']['time'] != obj['last_time']:
obj_portail['speed']= obj_portail['step']/(scene.objects['System']['time']-obj['last_time'])
obj['last_time'] = scene.objects['System']['time']
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
@ -171,6 +179,11 @@ def mot (cont):
# Arrêrer
if obj['open']== False and obj['close'] == False :
# Physique
obj['speed']= 0
obj_portail['speed']= 0
obj['last_time'] = scene.objects['System']['time']
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
if scene.objects['Moteur']['pin_f'] is not None:
@ -178,7 +191,6 @@ def mot (cont):
scene.objects['Moteur']['pin_o'].write(0)
scene.objects['Moteur']['pin_f'].write(0)
###############################################################################
# Capteurs fin de course
###############################################################################
@ -382,6 +394,13 @@ def system_reset ():
scene.objects['Led']['activated']=False
scene.objects['Moteur']['open']=False
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']['step']=0
scene.objects['Portail']['x']=0
scene.objects['Portail']['speed']=0
scene.objects['Portail']['step']=0
scene.objects['Microrupteur fdc ouvert']['activated']=False
scene.objects['Microrupteur fdc ouvert']['activated_real']=False
scene.objects['Microrupteur fdc ferme']['activated']=False

View File

@ -41,17 +41,7 @@ brochage={}
def commandes():
# # Mise en place : Fermeture
# print ("Version sans sécurité : sans réouverture")
# print ("Mise en place : Fermeture")
# while fdc_f() ==False :
# gyr(True)
# mot_o(False)
# mot_f(True)
# mot_f(False)
# gyr(False)
# Init
# Init -> Ouverture
while fdc_o() ==False :
gyr(True)
mot_f(False)
@ -60,46 +50,46 @@ def commandes():
gyr(False)
# Fermeture
tf_d= get_t()
xf_d= get('portail_x')
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)))
while fdc_f() ==False :
gyr(True)
mot_o(False)
mot_f(True)
print (get('portail_x'), get('mot_angle'), get('mot_vitesse'))
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)
tf_f = get_t()
xf_f= get('portail_x')
print ("Fermeture : "+str(round(tf_f-tf_d,3)) +" s - distance : " +str(round(xf_f-xf_d,3))+" m")
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')
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))+
" 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")
# Ouverture
to_d= get_t()
xo_d= get('portail_x')
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)))
while fdc_o() ==False :
gyr(True)
mot_f(False)
mot_o(True)
print (get('portail_x'), get('mot_angle'), get('mot_vitesse'))
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)
to_f = get_t()
xo_f= get('portail_x')
print ("Ouverture : "+str(round(to_f-to_d,3)) +" s - distance : " +str(round(xf_f-xf_d,3))+" m")
# plot(['gyr'])
# plot(['bp_ext'])
# plot(['gyr', 'bp_ext', 'bp_int'])
# while True:
# print (get_t())
# gyr(True)
# tempo(0.25)
# gyr(False)
# tempo(0.25)
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')
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))+
" 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")
fin() # A garder
###############################################################################
# En: External call << DONT CHANGE THIS SECTION >>
# Fr: Appel externe << NE PAS MODIFIER CETTE SECTION >>

View File

@ -47,7 +47,7 @@ card_data_title="Accès aux données"
card_data_text=""" get(variable) \n -> Retourne la valeur de la variable à \n l'instant t. Par exemple : val = get('bp_ext').\n
Entrées/sorties : 'bp_ext', 'bp_int', 'fdc_o', \n 'fdc_f', 'mot_o', 'mot_f', 'gyr', 'ir_emet', \n 'ir_recep'.\n
Variables réels (si il y a jumelage) : 'bp_ext_r', \n 'bp_int_r', 'fdc_o_r', 'fdc_f_r', 'ir_recep_r'.\n
Autres variables : 'mot_angle', \n 'mot_vitesse', 'portail_x'."""
Autres variables : 't' (temps), 'mot_angle', \n 'mot_vitesse', 'portail_x', 'portail_vitesse'."""
card_data_url=[]
system_card_description.update({"data-card" : [card_data_title, card_data_text, card_data_url]})
@ -64,10 +64,14 @@ system_card_description.update({"plot-card" : [card_plot_title, card_plot_text,
# Ouvrir et fermer
card_movement_title="Ouvrir et fermer"
card_movement_text=""" mot_o(True | False) \n -> Ouvrir le portail (moteur sens trigo).\n
card_movement_text=""" mot_o(True | False) \n -> Ouvrir le portail (moteur sens trigo).
mot_f(True | False) \n -> Fermer le portail (moteur sens horaire).\n
fdc_o() \n -> Capteur fin de course portail ouvert.\n Retourne True si le portail est ouvert. \n
fdc_f() \n -> Capteur fin de course portail fermé.\n Retourne True si le portail est fermé."""
fdc_o() \n -> Capteur fin de course portail ouvert.
fdc_f() \n -> Capteur fin de course portail fermé.\n
mot_digitset(vitesse) -> Change la vitesse \n du moteur numérique en rad/s. Si 'vitesse' \n est ommis, elle sera réinitialisée."""
# fdc_o() \n -> Capteur fin de course portail ouvert.\n Retourne True si le portail est ouvert. \n
# fdc_f() \n -> Capteur fin de course portail fermé.\n Retourne True si le portail est fermé.\n
card_movement_url=[]
system_card_description.update({"movement-card" : [card_movement_title, card_movement_text, card_movement_url]})

View File

@ -46,6 +46,13 @@ def mot_o (order):
def mot_f (order):
scene.objects['Moteur']['close']=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
else:
scene.objects['Moteur']['speed_setting']=speed
# Ordre pour le capteur barrage IR
def ir_emet(order):
scene.objects['Emetteur IR']['active']=order

View File

@ -1,7 +1,7 @@
<data>
<screen>
<width>1325</width>
<height>745</height>
<width>1609</width>
<height>905</height>
<quality>1</quality>
</screen>
</data>

View File

@ -28,9 +28,10 @@ plot_config = system.get_public_vars()
def get(data):
if data in plot_config:
return scene.objects[plot_config[data][0][0]][plot_config[data][0][1]]
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.")
return None
###############################################################################
# Création du graphique

View File

@ -45,7 +45,7 @@ card_data_title="Accès aux données"
card_data_text=""" get(variable) \n -> Retourne la valeur de la variable à \n l'instant t. Par exemple : val = get('bp_m').\n
Entrées/sorties : 'bp_m', 'bp_a', 'bp_d', \n 'mot_m', 'mot_d', 'fdc_h', 'fdc_b', 'bp_auto', \n 'voy_auto', 'lum'.\n
Variables réels (si il y a jumelage) : 'bp_m_r', \n 'bp_a_r', 'bp_d_r', 'fdc_h_r', 'fdc_b_r', \n 'bp_auto_r', 'lum_r'.\n
Autres variables : 'mot_angle', 'mot_vitesse'."""
Autres variables : 't' (temps), 'mot_angle', 'mot_vitesse'."""
card_data_url=[]
system_card_description.update({"data-card" : [card_data_title, card_data_text, card_data_url]})