Mise en place de règles de priorité

This commit is contained in:
Philippe Roy 2023-01-31 18:37:22 +01:00
parent b799039e6e
commit 9056a81e76
9 changed files with 166 additions and 75 deletions

View File

@ -24,7 +24,7 @@ scene = bge.logic.getCurrentScene()
#
# 'nom_variable_r' est la valeur réelle de la variable (valeur numérique) 'nom_variable' issue du jumelage numérique.
# Dans ce cas, il n'y a pas configuration de broche car elle est présente sur la variable 'nom_variable'.
# Ce distinguo ne concerne que les entrées, les sorties réelles sont forcées par les sorties numériques et vice-versa.
# Ce distinguo ne concerne que les entrées, car il n'y pas de lecture des "sorties réelles".
public_vars = {
't' : [['System','time','a'], [], []],

Binary file not shown.

View File

@ -19,12 +19,13 @@ scene = bge.logic.getCurrentScene()
# Configuration des variables publiques
# 'nom_variable' :
# - Objet 3D : [nom de l'objet 3D, propriété associée à la valeur (activate ou activated_real), type de la valeur ('d' (digital, binary), 'a', (analog) ou 'n' (numeric)), é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 de la broche : [nom de la propriété stockant l'object broche (pyfirmata),
# type de broche par défaut : 'd' (digital), 'a' (analog) ou 'p' (pwm)), mode de la broche par défaut : 'i' (input) ou 'o' (output)]
# - Configuration du graphique : ['marque', 'type de ligne', 'couleur', linewidth]] (Codification de Matplotlib)
#
# 'nom_variable_r' est la valeur réelle de la variable (valeur numérique) 'nom_variable' issue du jumelage numérique.
# Dans ce cas, il n'y a pas configuration de broche car elle est présente sur la variable 'nom_variable'.
# Ce distinguo ne concerne que les entrées, les sorties réelles sont forcées par les sorties numériques et vice-versa.
# Ce distinguo ne concerne que les entrées, car les sorties sont pilotées par le numérique.
public_vars = {
't' : [['System','time','a'],[],[]],
@ -44,7 +45,7 @@ public_vars = {
'portail_x' : [['Portail','x','a'],[],['.','-','turquoise',1]],
'portail_vitesse' : [['Portail','speed','a'],[],['.','-','darkturquoise',1]],
'portail_pas' : [['Portail','step','a'],[],[]],
'gyr' : [['Led','activated','d'],['pin','d','.'],['.','-','gold',1]],
'gyr' : [['Led','activated','d'],['pin','d','o'],['.','-','gold',1]],
'ir_emet' : [['Emetteur IR','activated','d'],['pin','d','o'],['.','-','red',1]],
'ir_recep' : [['Recepteur IR','activated','d'],['pin','d','i'],['.','-','darkred',1]],
'ir_recep_r' : [['Recepteur IR','activated_real','d'],[],['.','--','darkred',1]]}
@ -370,12 +371,31 @@ def system_init ():
def system_reset ():
# Entrées à l'état initial
objs= ['Microrupteur fdc ouvert', 'Microrupteur fdc ferme', 'Bp cote cour','Bp cote rue']
for obj in objs:
scene.objects[obj]['activated']=False
scene.objects[obj]['activated_real']=False
scene.objects['Recepteur IR']['activated'] =False
scene.objects['Recepteur IR']['active'] =False
scene.objects['Recepteur IR']['activated_real'] =True # Absence d'obstacle -> True, présence d'obstacle -> False
# Grille à l'état initial
scene.objects['Portail']['x']=0
scene.objects['Portail']['speed']=0
scene.objects['Portail']['step']=0
scene.objects['Portail'].worldPosition.x = scene.objects['Portail']['init_lx']-scene.objects['System']['init_lx']+scene.objects['System'].worldPosition.x
scene.objects['Portail'].worldPosition.y = scene.objects['Portail']['init_ly']-scene.objects['System']['init_ly']+scene.objects['System'].worldPosition.y
scene.objects['Portail'].worldPosition.z = scene.objects['Portail']['init_lz']-scene.objects['System']['init_lz']+scene.objects['System'].worldPosition.z
# Moteur à l'état initial
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']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s )
scene.objects['Moteur']['step']=0
rres=0.001 # resolution rotation
obj1=scene.objects['Engrenage']
while (obj1.localOrientation.to_euler().y) > 1.1*rres :
@ -384,37 +404,61 @@ def system_reset ():
obj1.applyRotation((0, 0, rres), True)
# Gyrophare à l'état initial
scene.objects['Led']['activated']=False
scene.objects['Led'].setVisible(True,False)
scene.objects['Led-on'].setVisible(False,False)
# Capteur barrage IR
scene.objects['Emetteur IR']['activated'] =False
scene.objects['Emetteur IR']['active'] =False
scene.objects['Emetteur IR Led'].setVisible(True,False)
scene.objects['Emetteur IR Led-on'].setVisible(False,False)
scene.objects['Emetteur IR'].color = color_passive
scene.objects['Recepteur IR'].color = color_passive
# I/O à l'état initial
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']=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
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
scene.objects['Microrupteur fdc ferme']['activated_real']=False
scene.objects['Bp cote cour']['activated'] =False
scene.objects['Bp cote cour']['activated_real'] =False
scene.objects['Bp cote rue']['activated'] =False
scene.objects['Bp cote rue']['activated_real'] =False
scene.objects['Emetteur IR']['activated'] =False
scene.objects['Emetteur IR']['activated_real'] =False
scene.objects['Emetteur IR']['active'] =False
scene.objects['Recepteur IR']['activated'] =False
scene.objects['Recepteur IR']['active'] =False
scene.objects['Recepteur IR']['activated_real'] =True # Absence d'obstacle -> True, présence d'obstacle -> False
# Priorités activées
objs= ['Led', 'Moteur', 'Microrupteur fdc ouvert', 'Microrupteur fdc ferme',
'Bp cote cour','Bp cote rue', 'Emetteur IR', 'Recepteur IR']
for obj in objs:
scene.objects[obj]['prior']=True
scene.objects[obj]['prior_real']=True
# scene.objects['Led']['activated']=False
# scene.objects['Led']['prior']=True
# scene.objects['Led']['prior_real']=True
# scene.objects['Moteur']['open']=False
# scene.objects['Moteur']['close']=False
# scene.objects['Moteur']['prior_real']=True
# scene.objects['Moteur']['prior_real']=True
# scene.objects['Moteur']['alpha']=0
# scene.objects['Moteur']['speed']=0
# 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
# scene.objects['Portail']['step']=0
# scene.objects['Microrupteur fdc ouvert']['activated']=False
# scene.objects['Microrupteur fdc ouvert']['activated_real']=False
# scene.objects['Microrupteur fdc ouvert']['prior']=True
# scene.objects['Microrupteur fdc ouvert']['prior_real']=True
# scene.objects['Microrupteur fdc ferme']['activated']=False
# scene.objects['Microrupteur fdc ferme']['activated_real']=False
# scene.objects['Microrupteur fdc ferme']['prior']=True
# scene.objects['Microrupteur fdc ferme']['prior_real']=True
# scene.objects['Bp cote cour']['activated'] =False
# scene.objects['Bp cote cour']['activated_real'] =False
# scene.objects['Bp cote cour']['prior'] =True
# scene.objects['Bp cote cour']['prior_real'] =True
# scene.objects['Bp cote rue']['activated'] =False
# scene.objects['Bp cote rue']['activated_real'] =False
# scene.objects['Bp cote rue']['prior'] =True
# scene.objects['Bp cote rue']['prior_real'] =True
# scene.objects['Emetteur IR']['activated'] =False
# scene.objects['Emetteur IR']['active'] =False
# scene.objects['Emetteur IR']['prior']=True
# scene.objects['Emetteur IR']['prior_real']=True
# scene.objects['Recepteur IR']['activated'] =False
# scene.objects['Recepteur IR']['prior'] =True
# scene.objects['Recepteur IR']['active'] =False
# scene.objects['Recepteur IR']['activated_real'] =True # Absence d'obstacle -> True, présence d'obstacle -> False
# scene.objects['Recepteur IR']['prior_real'] =True

View File

@ -28,6 +28,14 @@ from porcou_lib import * # Bibliothèque utilisateur du portail coulissant
#
###############################################################################
# Brochage du portail coulissant
brochage={
'bp_ext' : [],'bp_int' : [],
'fdc_o' : [],'fdc_f' : [],
'mot_o' : [],'mot_f' : [],
'gyr' : [],
'ir_emet' : [],'ir_recep' : []}
###############################################################################
# Fonctions
###############################################################################
@ -47,50 +55,36 @@ def commandes():
gyr(False)
print ("")
# Données
# daq(['mot_angle', 'mot_vitesse', 'portail_x', 'portail_vitesse'])
reset_t()
daq(['bp_ext', 'bp_ext_r', 'bp_int', 'bp_int_r', 'fdc_o', 'fdc_o_r', 'fdc_f', 'fdc_f_r', 'mot_o', 'mot_f', 'gyr', 'mot_angle', 'mot_vitesse', 'portail_x', 'portail_vitesse', 'ir_emet', 'ir_recep', 'ir_recep_r'])
# daq(['bp_ext', 'bp_ext_r', 'bp_int', 'bp_int_r', 'fdc_o', 'fdc_o_r', 'fdc_f', 'fdc_f_r', 'mot_o', 'mot_f', 'gyr'])
reset_t()
plot(['mot_angle', 'mot_vitesse', 'portail_x', 'portail_vitesse'])
# plot([['bp_ext', 'bp_ext_r'], ['bp_int', 'bp_int_r'], ['fdc_o', 'fdc_o_r'], ['fdc_f', 'fdc_f_r'], 'mot_o', 'mot_f', 'gyr', ['mot_angle', 'mot_vitesse', 'portail_x', 'portail_vitesse']])
# Jumelage
jumeau_mode(True,True)
# Fermeture
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)
mot_f(True)
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)
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(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
jumeau_mode(True,False)
mot_digitset () # Vitesse par défaut 125,6 rad /s ( 20 tr / s )
mot_digitset (2000) # 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)
mot_o(True)
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)
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(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")
plot([['bp_ext', 'bp_ext_r'], ['bp_int', 'bp_int_r'], ['fdc_o', 'fdc_o_r'], ['fdc_f', 'fdc_f_r'], 'mot_o', 'mot_f', 'gyr', ['mot_angle', 'mot_vitesse', 'portail_x', 'portail_vitesse']])
fin() # A garder

View File

@ -19,10 +19,14 @@ system_card_description ={}
# Jumeau numérique
card_twins_title="Jumeau numérique"
card_twins_text=""" jumeau(brochage) \n -> Active le jumeau réel.\n
'brochage' permet de faire le lien entre les \n deux jumeaux (plus de précision sur la \n page "Brochage").\n
jumeau_stop() \n -> Désactive le jumeau réel.\n
Avec "carte=jumeau(brochage)", on peut \n utiliser l'objet 'carte' pour communiquer \n directement avec le protocole Firmata."""
card_twins_text=""" jumeau(brochage) -> Active le jumeau réel.\n
"brochage" permet de faire le lien entre les \n deux jumeaux (voir la page "Brochage").\n
jumeau_stop() -> Désactive le jumeau réel.\n
jumeau_mode(réel, numérique) -> Définit \n les règles de priorité du jumelage :
- réel=True | False : active | désactive \n les entrées réelles,
- numérique=True | False : active | désactive \n les entrées numériques. """
# Avec "carte=jumeau(brochage)", on peut \n utiliser l'objet 'carte' pour communiquer \n directement avec le protocole Firmata.
# jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n
# Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n
# La vitesse par défaut est 115200 baud."""
@ -108,10 +112,12 @@ system_card_description.update({"model-card" : [card_model_title, card_model_tex
# Firmata
card_firmata_title="Protocole Firmata"
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\n
broche = carte.get_pin('type:numéro:mode') \n -> Créer une entrée/sortie (broche) \n - type : a (analogique) ou d (numérique) \n - mode : i (entrée) , o (sortie) ou p (pwm). \n
broche.read() \n -> Retourne la valeur de la broche.\n
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
card_firmata_text=""" Firmata est le protocole de communication \n entre les deux jumeaux via la liaison série.
Lors du jumelage, il faut récupérer l'objet \n 'carte' avec "carte = jumeau(brochage)". \n
broche = carte.get_pin('type:numéro:mode') \n -> Créer une entrée/sortie (broche) : \n - type : a (analogique) ou d (numérique), \n - mode : i (entrée) , o (sortie) ou p (pwm). \n
valeur = broche.read() -> Lit la broche.\n
broche.write(valeur) -> Écrire sur la broche.
"""
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})

View File

@ -66,24 +66,27 @@ def ir_emet(order):
# Compte-rendu du capteur fin de course portail ouvert
def fdc_o ():
if scene.objects['Microrupteur fdc ouvert']['activated'] or scene.objects['Microrupteur fdc ouvert']['activated_real']:
if scene.objects['Microrupteur fdc ouvert']['prior'] and scene.objects['Microrupteur fdc ouvert']['activated']:
return True
if scene.objects['Microrupteur fdc ouvert']['prior_real'] and scene.objects['Microrupteur fdc ouvert']['activated_real']:
return True
else:
return False
# Compte-rendu du capteur fin de course portail fermé
def fdc_f ():
if scene.objects['Microrupteur fdc ferme']['activated'] or scene.objects['Microrupteur fdc ferme']['activated_real']:
if scene.objects['Microrupteur fdc ferme']['prior'] and scene.objects['Microrupteur fdc ferme']['activated']:
return True
if scene.objects['Microrupteur fdc ferme']['prior_real'] and scene.objects['Microrupteur fdc ferme']['activated_real']:
return True
else:
return False
# Compte-rendu du capteur barrage IR
# Absence d'obstacle -> True, présence d'obstacle -> False
def ir_recep ():
if scene.objects['Recepteur IR']['activated'] or scene.objects['Recepteur IR']['activated_real']==False:
if scene.objects['Recepteur IR']['prior'] and scene.objects['Recepteur IR']['activated']==False:
return False
if scene.objects['Recepteur IR']['prior_real'] and scene.objects['Recepteur IR']['activated_real']==False:
return False
else:
return True
###############################################################################
@ -92,18 +95,62 @@ def ir_recep ():
# Compte-rendu du bouton pousssoir coté rue
def bp_ext ():
if scene.objects['Bp cote rue']['activated'] or scene.objects['Bp cote rue']['activated_real']:
if scene.objects['Bp cote rue']['prior'] and scene.objects['Bp cote rue']['activated']:
return True
if scene.objects['Bp cote rue']['prior_real'] and scene.objects['Bp cote rue']['activated_real']:
return True
else:
return False
# Compte-rendu du bouton pousssoir coté cour
def bp_int ():
if scene.objects['Bp cote cour']['activated'] or scene.objects['Bp cote cour']['activated_real']:
if scene.objects['Bp cote cour']['prior'] and scene.objects['Bp cote cour']['activated']:
return True
if scene.objects['Bp cote cour']['prior_real'] and scene.objects['Bp cote cour']['activated_real']:
return True
else:
return False
###############################################################################
# Jumelage
###############################################################################
# Priorité du jumelage
# prior et prior_real : les deux jumeaux pilotent avec une priorité à l'activation (valeur par défaut),
# prior : uniquement le jumeau numérique est pilotant
# prior_real : uniquement le jumeau réel est pilotant
def jumeau_mode (priority_real=True, priority_digital=True):
# Jumeau numérique
if priority_digital:
scene.objects['Microrupteur fdc ouvert']['prior']=True
scene.objects['Microrupteur fdc ferme']['prior']=True
scene.objects['Bp cote cour']['prior'] =True
scene.objects['Bp cote rue']['prior'] =True
scene.objects['Recepteur IR']['prior'] =True
else:
scene.objects['Microrupteur fdc ouvert']['prior']=False
scene.objects['Microrupteur fdc ferme']['prior']=False
scene.objects['Bp cote cour']['prior'] =False
scene.objects['Bp cote rue']['prior'] =False
scene.objects['Recepteur IR']['prior'] =False
# Jumeau réel
if priority_real:
scene.objects['Microrupteur fdc ouvert']['prior_real']=True
scene.objects['Microrupteur fdc ferme']['prior_real']=True
scene.objects['Bp cote cour']['prior_real'] =True
scene.objects['Bp cote rue']['prior_real'] =True
scene.objects['Recepteur IR']['prior_real'] =True
else:
scene.objects['Microrupteur fdc ouvert']['prior_real']=False
scene.objects['Microrupteur fdc ferme']['prior_real']=False
scene.objects['Bp cote cour']['prior_real'] =False
scene.objects['Bp cote rue']['prior_real'] =False
scene.objects['Recepteur IR']['prior_real'] =False
def broche_mode (priority_real=True, priority_digital=True):
pass
###############################################################################
# Cycle
###############################################################################

Binary file not shown.

View File

@ -24,7 +24,7 @@ scene = bge.logic.getCurrentScene()
#
# 'nom_variable_r' est la valeur réelle de la variable (valeur numérique) 'nom_variable' issue du jumelage numérique.
# Dans ce cas, il n'y a pas configuration de broche car elle est présente sur la variable 'nom_variable'.
# Ce distinguo ne concerne que les entrées, les sorties réelles sont forcées par les sorties numériques et vice-versa.
# Ce distinguo ne concerne que les entrées, car il n'y pas de lecture des "sorties réelles".
public_vars = {
't' : [['System','time','a'], [], []],