Ajout des modes d'activation des entrées et des sorties

This commit is contained in:
Philippe Roy 2023-02-01 06:06:50 +01:00
parent 9056a81e76
commit dcf642df38
8 changed files with 130 additions and 140 deletions

View File

@ -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

View File

@ -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)

View File

@ -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.

View File

@ -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

28
twin.py
View File

@ -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)

View File

@ -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]})

View File

@ -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
###############################################################################