diff --git a/portail_coulissant/porcou.py b/portail_coulissant/porcou.py index 73168ca..bf69558 100644 --- a/portail_coulissant/porcou.py +++ b/portail_coulissant/porcou.py @@ -152,8 +152,8 @@ def mot (cont): obj['last_time'] = scene.objects['System']['time'] # Modele 3D -> Arduino - if scene.objects['System']['twins']: - if scene.objects['Moteur']['pin_o'] is not None: + if scene.objects['System']['twins'] and obj['prior_real']: + if scene.objects['Moteur']['pin_o'] is not None : if scene.objects['Moteur']['pin_f'] is not None: scene.objects['Moteur']['pin_f'].write(0) scene.objects['Moteur']['pin_o'].write(1) @@ -174,14 +174,14 @@ def mot (cont): obj['last_time'] = scene.objects['System']['time'] # Modele 3D -> Arduino - if scene.objects['System']['twins']: + if scene.objects['System']['twins'] and obj['prior_real']: if scene.objects['Moteur']['pin_f'] is not None: if scene.objects['Moteur']['pin_o'] is not None: scene.objects['Moteur']['pin_o'].write(0) scene.objects['Moteur']['pin_f'].write(1) # Arrêrer - if obj['open']== False and obj['close'] == False : + if obj['open']== False and obj['close'] == False and obj['prior']: # Physique obj['speed']= 0 @@ -189,7 +189,7 @@ def mot (cont): obj['last_time'] = scene.objects['System']['time'] # Modele 3D -> Arduino - if scene.objects['System']['twins']: + if scene.objects['System']['twins'] and obj['prior_real']: if scene.objects['Moteur']['pin_f'] is not None: if scene.objects['Moteur']['pin_o'] is not None: scene.objects['Moteur']['pin_o'].write(0) @@ -208,7 +208,7 @@ def fdc_o (cont): obj = cont.owner # Arduino -> Modele 3D - if scene.objects['System']['twins']: + if scene.objects['System']['twins'] and obj['prior_real']: if obj['pin'] is not None: if obj['pin'].read()==True and obj['activated_real'] == False : obj['activated_real'] = True @@ -216,13 +216,13 @@ def fdc_o (cont): obj['activated_real'] = False # Etat capteur en fonction de la grille : worldPosition.x : 0 -> 65.5 et localPosition.x : 0 -> 218 - if scene.objects['Portail'].localPosition.x <= 0 and obj['activated'] == False : + if scene.objects['Portail'].localPosition.x <= 0 and obj['activated'] == False and obj['prior']: obj['activated'] = True - if scene.objects['Portail'].localPosition.x > 0 and obj['activated'] == True : + if scene.objects['Portail'].localPosition.x > 0 and obj['activated'] == True and obj['prior']: obj['activated'] = False # Forçage par clic - if obj['click'] == True: + if obj['click'] == True and obj['prior']: obj['activated'] = True # Couleurs @@ -237,7 +237,7 @@ def fdc_f (cont): obj = cont.owner # Arduino -> Modele 3D - if scene.objects['System']['twins']: + if scene.objects['System']['twins'] and obj['prior_real']: if obj['pin'] is not None: if obj['pin'].read()==True and obj['activated_real'] == False : obj['activated_real'] = True @@ -245,13 +245,13 @@ def fdc_f (cont): obj['activated_real'] = False # Etat capteur en fonction de la grille : worldPosition.x : 0 -> 65.5 et localPosition.x : 0 -> 218 - if scene.objects['Portail'].localPosition.x >= 218 and obj['activated'] == False : + if scene.objects['Portail'].localPosition.x >= 218 and obj['activated'] == False and obj['prior']: obj['activated'] = True - if scene.objects['Portail'].localPosition.x < 218 and obj['activated'] == True : + if scene.objects['Portail'].localPosition.x < 218 and obj['activated'] == True and obj['prior']: obj['activated'] = False # Forçage par clic - if obj['click'] == True: + if obj['click'] == True and obj['prior']: obj['activated'] = True # Couleurs @@ -422,43 +422,3 @@ def system_reset (): 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 diff --git a/portail_coulissant/porcou_cmd.py b/portail_coulissant/porcou_cmd.py index 441b140..8717783 100644 --- a/portail_coulissant/porcou_cmd.py +++ b/portail_coulissant/porcou_cmd.py @@ -12,6 +12,7 @@ from porcou_lib import * # Bibliothèque utilisateur du portail coulissant # - Gyrophare : gyr(True | False) # - Ouvrir le portail (moteur sens trigo) : mot_o(True | False) # - Fermer le portail (moteur sens horaire) : mot_f(True | False) +# - Définir la vitesse du moteur : mot_vitesse (vitesse) , vitesse en rad / s, si vitesse est omis la valeur par défaut est 125.6 rad /s ( 20 tr / s )) # - Emetteur pour le capteur barrage IR : ir_emet(True | False) # # Capteurs (valeur retournée = True ou False) : @@ -25,6 +26,16 @@ from porcou_lib import * # Bibliothèque utilisateur du portail coulissant # # Gestion du temps : # - Temporisation en seconde : tempo(duree) +# - Réinitialisation de la valeur du temp (t) : reset_t() +# +# Acquisition de données : +# - Lancer l'enregistrement : daq([variable1, variable2, ... ]) +# - Afficher les graphiques : plot([variable1, variable2, ... ]) +# +# Jumelage : +# - Démarrer le jumelage : jumeau({brochage}) +# - Arrêter le jumelage : jumeau_stop({brochage}) +# - Définir les règles d'activation : jumeau_mode({brochage}) # ############################################################################### @@ -64,21 +75,27 @@ def commandes(): # 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) - + # jumeau_mode(True,True, False, False) + # jumeau_mode() + # Fermeture - mot_digitset (1256) # Vitesse par défaut 125,6 rad /s ( 20 tr / s ) + mot_vitesse (1256) # Vitesse par défaut 125,6 rad /s ( 20 tr / s ) while fdc_f() ==False : gyr(True) mot_o(False) mot_f(True) mot_f(False) gyr(False) - + + tempo(1) + jumeau_mode_object ('gyr', True, False) + tempo(1) + + # jumeau_mode(True, True, True, True) + # 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 ) + mot_vitesse () # Vitesse par défaut 125,6 rad /s ( 20 tr / s ) + mot_vitesse (2000) # Vitesse par défaut 125,6 rad /s ( 20 tr / s ) while fdc_o() ==False : gyr(True) mot_f(False) diff --git a/portail_coulissant/porcou_doc.py b/portail_coulissant/porcou_doc.py index 0e1b5a5..55d3024 100644 --- a/portail_coulissant/porcou_doc.py +++ b/portail_coulissant/porcou_doc.py @@ -19,12 +19,11 @@ system_card_description ={} # Jumeau numérique card_twins_title="Jumeau numérique" -card_twins_text=""" jumeau(brochage) -> Active le jumeau réel.\n +card_twins_text=""" jumeau(brochage) -> Démarrer le jumelage.\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. """ + jumeau_stop() -> Arrêter le jumelage.\n + jumeau_mode(entrées réelles, entrées \n numériques, sorties réelles, sorties \n numériques) -> Définit les modes d'activation + des entrées/sorties : True pour activer \n (par défaut), False pour désactiver. """ # 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 @@ -38,7 +37,7 @@ card_pin_title="Brochage" card_pin_text=""" Le brochage est un dictionnaire qui permet \n d'associer les objets 3D du jumeau \n numérique aux broches du jumeau réel, brochage = { nom:[type, broche, mode] } : - nom : nom de l'objet 3D, - - type : a (analogique) ou d (numérique), + - type : a (analogique) ou d (binaire), - broche : numéro de la broche de carte, - mode : i (entrée), o (sortie) ou p (pwm). Par exemple : brochage = { 'gyr':['d', 3, 'o'] }.\n @@ -113,7 +112,7 @@ 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 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 + 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. diff --git a/portail_coulissant/porcou_lib.py b/portail_coulissant/porcou_lib.py index c7f334a..9ab59a6 100644 --- a/portail_coulissant/porcou_lib.py +++ b/portail_coulissant/porcou_lib.py @@ -1,6 +1,6 @@ import bge # Bibliothèque Blender Game Engine (UPBGE) import twin_threading # Multithreading (multitâches) -from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série +from twin_serial import jumeau, jumeau_stop, serial_close, jumeau_mode_system, jumeau_mode_object # Liaison série from twin_daq import get, daq, csv_generate, plot, plot_generate # Acquisition des données import time @@ -50,11 +50,8 @@ 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']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s ) - else: - scene.objects['Moteur']['speed_setting']=speed +def mot_vitesse (speed=125.6): + scene.objects['Moteur']['speed_setting']=speed # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s ) # Ordre pour le capteur barrage IR def ir_emet(order): @@ -66,28 +63,22 @@ def ir_emet(order): # Compte-rendu du capteur fin de course portail ouvert def fdc_o (): - 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']: + if scene.objects['Microrupteur fdc ouvert']['activated'] or scene.objects['Microrupteur fdc ouvert']['activated_real']: return True return False # Compte-rendu du capteur fin de course portail fermé def fdc_f (): - 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']: + if scene.objects['Microrupteur fdc ferme']['activated'] or scene.objects['Microrupteur fdc ferme']['activated_real']: return True 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']['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 - return True + if scene.objects['Recepteur IR']['activated'] or scene.objects['Recepteur IR']['activated_real']: + return True + return False ############################################################################### # Boutons poussoirs @@ -95,17 +86,13 @@ def ir_recep (): # Compte-rendu du bouton pousssoir coté rue def bp_ext (): - 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']: + if scene.objects['Bp cote rue']['activated'] or scene.objects['Bp cote rue']['activated_real']: return True return False # Compte-rendu du bouton pousssoir coté cour def bp_int (): - 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']: + if scene.objects['Bp cote cour']['activated'] or scene.objects['Bp cote cour']['activated_real']: return True return False @@ -113,43 +100,11 @@ def bp_int (): # 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 +# Mode de jumelage (règles d'activation) +def jumeau_mode (input_real=True, input_digital=True, output_real=True, output_digital=True): + input_objs= ['Microrupteur fdc ouvert', 'Microrupteur fdc ferme', 'Bp cote cour','Bp cote rue', 'Recepteur IR'] + output_objs= ['Led', 'Moteur', 'Emetteur IR'] + jumeau_mode_system (input_objs, output_objs, input_real, input_digital, output_real, output_digital) ############################################################################### # Cycle diff --git a/portail_coulissant/portail_coulissant-17.blend b/portail_coulissant/portail_coulissant-17.blend index e47825b..78a0fc4 100644 Binary files a/portail_coulissant/portail_coulissant-17.blend and b/portail_coulissant/portail_coulissant-17.blend differ diff --git a/twin.py b/twin.py index db6cf51..c9a76b4 100644 --- a/twin.py +++ b/twin.py @@ -640,17 +640,15 @@ def cycle_click(cont): return # Activation - if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['System']['manip_mode']==0: + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['System']['manip_mode']==0 and obj['prior']: obj.color = color_activated obj['activated'] = True obj['click'] = True - # Modele 3d -> Arduino : FIXME # Désactivation - if cont.sensors['Click'].status == JUST_RELEASED: + if cont.sensors['Click'].status == JUST_RELEASED and obj['prior']: obj['activated'] = False obj['click'] = False - # Modele 3d -> Arduino : FIXME if cont.sensors['MO'].positive: obj.color = color_hl else: @@ -709,8 +707,8 @@ def cycle_bp(cont): obj = cont.owner # Arduino -> Modele 3D - if scene.objects['System']['twins']: - if obj['pin'] is not None: + if scene.objects['System']['twins'] and obj['prior_real']: + if obj['pin'] is not None : if obj['pin'].read()==True and obj['activated_real'] == False : obj['activated_real'] = True if obj['pin'].read()==False and obj['activated_real'] == True : @@ -735,21 +733,27 @@ def cycle_voy(cont): # Activation if obj['activated'] and obj_on.visible == False: - obj_on.setVisible(True,False) - obj.setVisible(False,False) + + # Modele 3D + if obj['prior']: + obj_on.setVisible(True,False) + obj.setVisible(False,False) # Modele 3D -> Arduino - if scene.objects['System']['twins']: + if scene.objects['System']['twins'] and obj['prior_real']: if obj['pin'] is not None: obj['pin'].write(1) # Désactivation if obj['activated']==False and obj_on.visible == True: - obj.setVisible(True,False) - obj_on.setVisible(False,False) + + # Modele 3D + if obj['prior']: + obj.setVisible(True,False) + obj_on.setVisible(False,False) # Modele 3D -> Arduino - if scene.objects['System']['twins']: + if scene.objects['System']['twins'] and obj['prior_real']: if obj['pin'] is not None: obj['pin'].write(0) diff --git a/twin_doc.py b/twin_doc.py index b0dea5a..c881278 100644 --- a/twin_doc.py +++ b/twin_doc.py @@ -150,7 +150,7 @@ card_sleep_title="Gestion du temps" card_sleep_text=""" tempo(x) \n -> Marque un temps d'arrêt de x secondes. Vous pouvez alors créer des temporisations \n dans le déroulement du script.\n get_t() \n -> Retourne le temps écoulé en seconde \n depuis le démarrage du cycle. \n - set_t(x) -> Définir la valeur du temps avec x. \n + set_t(x) -> Définir la valeur (x) du temps. \n reset_t() -> Réinitialiser la valeur du temps.""" card_sleep_url=[["Doc. Python v3 Fr : sleep","https://docs.python.org/fr/3/library/time.html#time.sleep"]] card_description.update({"sleep-card" : [card_sleep_title, card_sleep_text, card_sleep_url]}) diff --git a/twin_serial.py b/twin_serial.py index e238def..8d474e4 100644 --- a/twin_serial.py +++ b/twin_serial.py @@ -152,14 +152,20 @@ def config(port, speed): # Jumeau ############################################################################### +## # Créer une broche +## + def jumeau_get_pin(board, name, brochage): for pin in brochage : if pin ==name: return board.get_pin(brochage[pin][0]+':'+str(brochage[pin][1])+':'+brochage[pin][2]) return None +## # Activer le jumelage +## + def jumeau (brochage=None): # Carte @@ -175,10 +181,59 @@ def jumeau (brochage=None): else: return None +## # Désactiver le jumelage +## + def jumeau_stop (): serial_close(scene.objects['System']['board']) +## +# Définir les modes d'activation du jumelage pour le systeme +## + +def jumeau_mode_system (input_objs, output_objs, input_real, input_digital, output_real, output_digital): + + # Entrées numériques + if input_digital: + for obj in input_objs: + scene.objects[obj]['prior']=True + else: + for obj in input_objs: + scene.objects[obj]['prior']=False + + # Entrées réelles + if input_real: + for obj in input_objs: + scene.objects[obj]['prior_real']=True + else: + for obj in input_objs: + scene.objects[obj]['prior_real']=False + + # Sorties numériques + if output_digital: + for obj in output_objs: + scene.objects[obj]['prior']=True + else: + for obj in output_objs: + scene.objects[obj]['prior']=False + + # Sorties réelles + if output_real: + for obj in output_objs: + scene.objects[obj]['prior_real']=True + else: + for obj in output_objs: + scene.objects[obj]['prior_real']=False + +## +# Définir les modes d'activation du jumelage pour un objet 3D +## + +def jumeau_mode_object (name, priority_real=True, priority_digital=True): + scene.objects[pin_config[name][0][0]]['prior_real']=priority_real + scene.objects[pin_config[name][0][0]]['prior']=priority_digital + ############################################################################### # Message ###############################################################################