diff --git a/monte_charge/README.md b/monte_charge/README.md index a7610ca..3920aa6 100644 --- a/monte_charge/README.md +++ b/monte_charge/README.md @@ -2,10 +2,38 @@ Ce jumeau numérique permet la programmation en Python d'une maquette réelle d'un monte-charge. -Le modèle 3D est basée sur la maquette développée par l'entreprise A4 technologie. Les documents techniques et pédagogiques signés A4 Technologie sont diffusés librement sous licence Creative Commons BY-NC-SA. +## Maquette numérique + +Le modèle 3D est basé sur la maquette développée par l'entreprise A4 technologie. Les documents techniques et pédagogiques signés A4 Technologie sont diffusés librement sous licence Creative Commons BY-NC-SA. Site internet de la maquette A4 Technologie : https://www.a4.fr/wiki/index.php?title=Monte_charge_(BE-MCHA) -Ce jumeau numérique fait partie du projet open source Blender-EduTech (Blender/UPBGE pour l'Enseignement Technologique). +## Instructions -Site internet du projet Blender-EduTech : https://gitlab.com/blender-edutech/digital_twin +Le script Python qui permet la commande du monte-charge est le fichier **'montchg_cmd.py'**. Il est éditable avec tout éditeur (Spyder, Emacs, Atom, ...). + +#### Actions + +Les actions (ordre = True ou False) sont : +- Monter la cabine (moteur sens trigo) : **mot_m (True | False)** +- Descendre la cabine (moteur sens horaire) : **mot_d (True | False)** + +#### Capteurs + +Les compte-rendus (valeur retournée = True ou False) des capteurs sont : +- Capteur présence cabine niveau 0 : **pc_0()** +- Capteur présence cabine niveau 1 : **pc_1()** + +#### Pupitre + +Les consignes (valeur retournée = True ou False) du pupitre sont : +- Bouton poussoir d'appel niveau 0 : **ba_0()** +- Bouton poussoir d'appel niveau 1: **ba_1()** + +Les retours d'informations (allumer = True ou False) du pupitre sont : +- Voyant témoin d'étage niveau 0 : **voy_0()** +- Voyant témoin d'étage niveau 1 : **voy_1()** + +#### Gestion du temps + +Les temporisations : **tempo(duree)** avec la durée en seconde diff --git a/monte_charge/montchg.py b/monte_charge/montchg.py index a07fc78..c872947 100644 --- a/monte_charge/montchg.py +++ b/monte_charge/montchg.py @@ -55,212 +55,145 @@ def init(cont): system_init() # Initialisation du système +############################################################################### +# Voyants +############################################################################### + +## +# Etat voyant 0 +# Modele 3d -> Arduino : FIXME +# Arduino -> Modele 3d : FIXME +## + +def voy_0 (cont): + if scene.objects['System']['run']: + obj = cont.owner + if obj['activated'] and scene.objects['Led niveau 0-on'].visible == False: + scene.objects['Led niveau 0-on'].setVisible(True,False) + scene.objects['Led niveau 0'].setVisible(False,False) + if obj['activated']==False and scene.objects['Led niveau 0-on'].visible == True: + scene.objects['Led niveau 0'].setVisible(True,False) + scene.objects['Led niveau 0-on'].setVisible(False,False) + +## +# Etat voyant 1 +# Modele 3d -> Arduino : FIXME +# Arduino -> Modele 3d : FIXME +## + +def voy_1 (cont): + if scene.objects['System']['run']: + obj = cont.owner + if obj['activated'] and scene.objects['Led niveau 1-on'].visible == False: + scene.objects['Led niveau 1-on'].setVisible(True,False) + scene.objects['Led niveau 1'].setVisible(False,False) + if obj['activated']==False and scene.objects['Led niveau 1-on'].visible == True: + scene.objects['Led niveau 1'].setVisible(True,False) + scene.objects['Led niveau 1-on'].setVisible(False,False) + ############################################################################### # Actionneurs ############################################################################### ## -# Action du simulateur pour le moteur +# Moteur et cabine +# Modele 3d -> Arduino : FIXME +# Arduino -> Modele 3d : FIXME ## -# def sml_moteur (cont): -# if scene.objects['System']['run']: -# obj = cont.owner -# pas_rot = math.pi/7 # z = 14 -# pas = 2.35619/0.3 # pas echelle 1:1 = 2.35619 -> pas à l'échelle de la maquette (0,3) : 2.35619/0.3 = 7,85396 -# vitesse = 0.05 -# engrenage_obj = scene.objects['Engrenage'] -# portail_obj = scene.objects['Portail'] -# if obj['actif_ouvrir']: -# # print (scene.objects['Portail'].worldPosition.x) -# engrenage_obj.applyRotation((0, 0, -pas_rot*vitesse), True) -# portail_obj.applyMovement((-pas*vitesse, 0, 0), True) -# # else: -# if obj['actif_fermer']: -# # print (scene.objects['Portail'].worldPosition.x) -# engrenage_obj.applyRotation((0, 0, pas_rot*vitesse), True) -# portail_obj.applyMovement((pas*vitesse, 0, 0), True) +def mot (cont): + if scene.objects['System']['run']: + 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 + 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) + # 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) ############################################################################### -# Capteurs fin de course +# Capteurs ############################################################################### ## -# Etat capteur fin de course portail ouvert +# Etat capteur présence cabine niveau 0 +# Modele 3d -> Arduino : FIXME +# Arduino -> Modele 3d : FIXME ## -# def sml_fdc_ouvert (cont): -# if scene.objects['System']['run'] : -# obj = cont.owner -# obj_etat=obj['actif'] -# obj_microrupteur=scene.objects['Microrupteur fdc ouvert'] -# # 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['actif'] == False : -# obj['actif'] = True -# if scene.objects['Portail'].localPosition.x > 0 and obj_microrupteur['actif'] == False and obj['actif'] == True : -# obj['actif'] = False -# #Forçage -# if obj_microrupteur['actif'] == True: -# obj['actif'] = True -# #Couleurs -# if obj['actif'] == True and obj_microrupteur.color !=couleur_jaune: -# obj_microrupteur.color =couleur_jaune -# if obj['actif'] == False : -# if obj_microrupteur['MO'] == True and obj_microrupteur.color !=couleur_blanc: -# obj_microrupteur.color =couleur_blanc -# if obj_microrupteur['MO'] == False and obj_microrupteur.color !=couleur_orange: -# obj_microrupteur.color =couleur_orange +def pc_0 (cont): + if scene.objects['System']['run'] : + obj = cont.owner + + # Etat capteur en fonction de la position de la cabine : localPosition.z entre -40 et -42 + if scene.objects['Cabine'].localPosition.z <-40 and scene.objects['Cabine'].localPosition.z >-42 and obj['activated'] == False : + obj['activated'] = True + if (scene.objects['Cabine'].localPosition.z > -40 or scene.objects['Cabine'].localPosition.z <-42) and obj['activated'] == True : + obj['activated'] = False + + # Forçage (click) + if obj['click'] == True: + obj['activated'] = True + + # Couleurs + if obj['activated'] == True and obj.color !=color_activated: + obj.color =color_activated + if obj['activated'] == False : + if obj['mo'] == True and obj.color !=color_hl: + obj.color =color_hl + if obj['mo'] == False and obj.color !=color_active: + obj.color =color_active ## -# Etat capteur fin de course portail fermé +# Etat capteur présence cabine niveau 1 +# Modele 3d -> Arduino : FIXME +# Arduino -> Modele 3d : FIXME ## -# def sml_fdc_ferme (cont): -# if scene.objects['System']['run'] : -# obj = cont.owner -# obj_etat=obj['actif'] -# obj_microrupteur=scene.objects['Microrupteur fdc ferme'] -# # 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['actif'] == False : -# obj['actif'] = True -# if scene.objects['Portail'].localPosition.x < 218 and obj_microrupteur['actif'] == False and obj['actif'] == True : -# obj['actif'] = False -# #Forçage -# if obj_microrupteur['actif'] == True: -# obj['actif'] = True -# #Couleurs -# if obj['actif'] == True and obj_microrupteur.color !=couleur_jaune: -# obj_microrupteur.color =couleur_jaune -# if obj['actif'] == False : -# if obj_microrupteur['MO'] == True and obj_microrupteur.color !=couleur_blanc: -# obj_microrupteur.color =couleur_blanc -# if obj_microrupteur['MO'] == False and obj_microrupteur.color !=couleur_orange: -# obj_microrupteur.color =couleur_orange +def pc_1 (cont): + if scene.objects['System']['run'] : + obj = cont.owner + + # Etat capteur en fonction de la position de la cabine : localPosition.z entre 0 et -2 + if scene.objects['Cabine'].localPosition.z <0 and scene.objects['Cabine'].localPosition.z >-2 and obj['activated'] == False : + obj['activated'] = True + if (scene.objects['Cabine'].localPosition.z > 0 or scene.objects['Cabine'].localPosition.z <-2) and obj['activated'] == True : + obj['activated'] = False + + # Forçage (click) + if obj['click'] == True: + obj['activated'] = True + + # Couleurs + if obj['activated'] == True and obj.color !=color_activated: + obj.color =color_activated + if obj['activated'] == False : + if obj['mo'] == True and obj.color !=color_hl: + obj.color =color_hl + if obj['mo'] == False and obj.color !=color_active: + obj.color =color_active ############################################################################### -# Système +# Boutons ############################################################################### -## -# Initialisation du système -# # Le moteur est géré en continue. -## - -def system_init (): - system_reset() - -## -# Réinitialisation du système -## - -def system_reset (): - - # Voyants aux états initiaux - scene.objects['Led niveau 0'].setVisible(True,False) - scene.objects['Led niveau 0-on'].setVisible(False,False) - scene.objects['Led niveau 1'].setVisible(True,False) - scene.objects['Led niveau 1-on'].setVisible(False,False) - - # Cabine - # # applyRotationTo(scene.objects['System'], 0, 0, 0) - scene.objects['Cabine'].worldPosition.x = scene.objects['Cabine']['init_lx'] - scene.objects['Cabine'].worldPosition.y = scene.objects['Cabine']['init_ly'] - scene.objects['Cabine'].worldPosition.z = scene.objects['Cabine']['init_lz'] - scene.objects['Contrepoids'].worldPosition.x = scene.objects['Contrepoids']['init_lx'] - scene.objects['Contrepoids'].worldPosition.y = scene.objects['Contrepoids']['init_ly'] - scene.objects['Contrepoids'].worldPosition.z = scene.objects['Contrepoids']['init_lz'] - - # # Moteur à l'état initial - # rres=0.001 # resolution rotation - # obj1=scene.objects['Engrenage'] - # while (obj1.localOrientation.to_euler().y) > 1.1*rres : - # obj1.applyRotation((0, 0, -rres), True) - # while (obj1.localOrientation.to_euler().y) < -1.1*rres : - # obj1.applyRotation((0, 0, rres), True) - - # I/O à l'état initial - scene.objects['Led niveau 0']['activated']=False - scene.objects['Led niveau 1']['activated']=False - scene.objects['Bp niveau 0']['activated']=False - scene.objects['Bp niveau 1']['activated']=False - scene.objects['Microrupteur niveau 0']['activated']=False - scene.objects['Microrupteur niveau 1']['activated']=False - -## -# Boucle principale -## - -def system_run (): - - # # Lecture de la liaison série : programme Arduino : berceau_arduino.ino - # serial_msg = str(serial_comm.readline()) # Communication série : arduino -> modele 3d - - # # Affiche le message uniquement - # if serial_msg.find("Print")>0 or serial_msg.find("Debug")>0 or serial_msg.find("Echo")>0: - # print ("Communication port série : ", serial_msg) - # serial_msg="" - # return - - # Voyant niveau 0 - # Modele 3d -> Arduino : FIXME - # Arduino -> Modele 3d : FIXME - if scene.objects['Led niveau 0']['activated']==True and scene.objects['Led niveau 0-on'].visible == False: - scene.objects['Led niveau 0-on'].setVisible(True,False) - scene.objects['Led niveau 0'].setVisible(False,False) - if scene.objects['Led niveau 0']['activated']==False and scene.objects['Led niveau 0-on'].visible == True: - scene.objects['Led niveau 0'].setVisible(True,False) - scene.objects['Led niveau 0-on'].setVisible(False,False) - - # Voyant niveau 1 - # Modele 3d -> Arduino : FIXME - # Arduino -> Modele 3d : FIXME - if scene.objects['Led niveau 1']['activated']==True and scene.objects['Led niveau 1-on'].visible == False: - scene.objects['Led niveau 1-on'].setVisible(True,False) - scene.objects['Led niveau 1'].setVisible(False,False) - if scene.objects['Led niveau 1']['activated']==False and scene.objects['Led niveau 1-on'].visible == True: - scene.objects['Led niveau 1'].setVisible(True,False) - scene.objects['Led niveau 1-on'].setVisible(False,False) - - # Moteur et cabine - # Modele 3d -> Arduino : FIXME - # Arduino -> Modele 3d : FIXME - obj = cont.owner - pas_rot = math.pi/7 # z = 14 - pas = 2.35619/0.3 # pas echelle 1:1 = 2.35619 -> pas à l'échelle de la maquette (0,3) : 2.35619/0.3 = 7,85396 - vitesse = 0.05 - obj_moteur = scene.objects['Moteur'] - obj_vissansfin = scene.objects['Moteur vis sans fin'] - obj_pignon = scene.objects['Moteur pignon'] - obj_cabine = scene.objects['Cabine'] - obj_contrepoids = scene.objects['Contrepoids'] - obj_cable = scene.objects['Cable'] - if obj_moteur['up']: - # print (scene.objects['Portail'].worldPosition.x) - obj_cabine.applyMovement((0, 0, pas*vitesse), True) - # engrenage_obj.applyRotation((0, 0, -pas_rot*vitesse), True) - # else: - if obj_moteur['down']: - # print (scene.objects['Portail'].worldPosition.x) - obj_cabine.applyMovement((0, 0, -pas*vitesse), True) - # engrenage_obj.applyRotation((0, 0, pas_rot*vitesse), True) - - # print ("serial_msg : ", serial_msg) - # roll_txt = txt_extrac(serial_msg,"Roll (Rx): ", " Pitch") - # # pitch_txt= txt_extrac(serial_msg,"Pitch (Ry): ", " \\r\\n") - # pitch_txt = txt_extrac(serial_msg,"Pitch (Ry): ", " bt_a_m:") - # if roll_txt !="" and pitch_txt !="" : - # obj1=scene.objects['Plateau'] - # roll=float(roll_txt)/57.3 - # pitch=float(pitch_txt)/57.3 - # # print ("Roll : ", roll, " Pitch : ", pitch) - # applyRotationTo(scene.objects['Plateau'], roll,0, 0) - # applyRotationTo(scene.objects['Plateau'], roll,pitch, 0) - # scene.objects['Plateau']['roll']=roll - # scene.objects['Plateau']['pitch']=pitch - - # Capteurs - # Modele 3d -> Arduino : FIXME - # Arduino -> Modele 3d : FIXME +# Modele 3d -> Arduino : FIXME +# Arduino -> Modele 3d : FIXME # Arduino -> numérique # bt_a_m_txt = txt_extrac_bool(serial_msg,"bt_a_m: ") @@ -288,44 +221,44 @@ def system_run (): # obj.color = couleur_orange ############################################################################### -# Interface +# Système ############################################################################### ## -# Highlight sur les éléments cliquables du systèmes +# Initialisation du système +# # Le moteur est géré en continue. ## -def hl(cont): - obj = cont.owner - name=obj.name - - # Activation - if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['System']['run']: - scene.objects[name].color = color_hl - - # Désactivation - if cont.sensors['MO'].status == JUST_RELEASED: - scene.objects[name].color = color_active +def system_init (): + system_reset() ## -# Click sur les éléments cliquables du systèmes (activation numérique) +# Réinitialisation du système ## -def click(cont): - obj = cont.owner - name=obj.name +def system_reset (): - # Activation - if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['System']['manip_mode']==0: - scene.objects[name].color = color_activated - obj['activated'] = True - # Modele 3d -> Arduino : FIXME + # Voyants aux états initiaux + scene.objects['Led niveau 0'].setVisible(True,False) + scene.objects['Led niveau 0-on'].setVisible(False,False) + scene.objects['Led niveau 1'].setVisible(True,False) + scene.objects['Led niveau 1-on'].setVisible(False,False) - # Désactivation - if cont.sensors['Click'].status == JUST_RELEASED: - obj['activated'] = False - # Modele 3d -> Arduino : FIXME - if cont.sensors['MO'].positive: - scene.objects[name].color = color_hl - else: - scene.objects[name].color = color_active + # Cabine + # applyRotationTo(scene.objects['System'], 0, 0, 0) + scene.objects['Cabine'].worldPosition.x = scene.objects['Cabine']['init_lx'] + scene.objects['Cabine'].worldPosition.y = scene.objects['Cabine']['init_ly'] + scene.objects['Cabine'].worldPosition.z = scene.objects['Cabine']['init_lz'] + scene.objects['Contrepoids'].worldPosition.x = scene.objects['Contrepoids']['init_lx'] + scene.objects['Contrepoids'].worldPosition.y = scene.objects['Contrepoids']['init_ly'] + scene.objects['Contrepoids'].worldPosition.z = scene.objects['Contrepoids']['init_lz'] + + # Moteur à l'état initial : pas utile + + # I/O à l'état initial + scene.objects['Led niveau 0']['activated']=False + scene.objects['Led niveau 1']['activated']=False + scene.objects['Bp niveau 0']['activated']=False + scene.objects['Bp niveau 1']['activated']=False + scene.objects['Microrupteur niveau 0']['activated']=False + scene.objects['Microrupteur niveau 1']['activated']=False diff --git a/monte_charge/montchg_cmd.py b/monte_charge/montchg_cmd.py index 1953aba..94b2720 100644 --- a/monte_charge/montchg_cmd.py +++ b/monte_charge/montchg_cmd.py @@ -9,19 +9,21 @@ from montchg_lib import * # Bibliothèque portail coulissant # Instructions élémentaires pour le monte-charge # # Actions (ordre = True ou False) : -# - Allumer voyant niveau 0 : voy_0 (True|False) -# - Allumer voyant niveau 1 : voy_1 (True|False) -# - Monter le monte-charge (moteur sens trigo) : mot_m (True|False) -# - Descendre le monte-charge (moteur sens horaire) : mot_d (True|False) +# - Monter le monte-charge (moteur sens trigo) : mot_m (True | False) +# - Descendre le monte-charge (moteur sens horaire) : mot_d (True | False) # # Capteurs (valeur retournée = True ou False) : # - Capteur présence cabine niveau 0 : pc_0() # - Capteur présence cabine niveau 1 : pc_1() # -# Pupitre (valeur retournée = True ou False) : +# Les consigne du pupitre (valeur retournée = True ou False) : # - Bouton poussoir appel niveau 0 : ba_0() # - Bouton poussoir appel niveau 1 : ba_1() # +# Les retours d'informations du pupitre (allumer = True ou False) : +# - Voyant témoin d'étage niveau 0 : voy_0 (True | False) +# - Voyant témoin d'étage niveau 1 : voy_1 (True | False) +# # Gestion du temps : # - Temporisation en seconde : tempo(duree) # @@ -42,9 +44,21 @@ def commandes(): print ("Ok go !!") # Ecrire votre code ici ... - voy_0(True) # Activer le voyant du niveau 0 while True: - pass + + if ba_0()==True: + voy_1(False) + voy_0(True) + mot_m(False) + mot_d(True) + + if ba_1()==True: + voy_0(False) + voy_1(True) + mot_d(False) + mot_m(True) + + # pass fin() # A garder diff --git a/monte_charge/montchg_lib.py b/monte_charge/montchg_lib.py index d7826fa..605fcd8 100644 --- a/monte_charge/montchg_lib.py +++ b/monte_charge/montchg_lib.py @@ -29,15 +29,7 @@ board = None board_it = None # Iterator (input) # Brochage du jumeau numérique -bp_int_pin = None -bp_ext_pin = None -fdc_o_pin = None -fdc_f_pin = None -ir_emett_pin = None -ir_recept_pin = None -mot_o_pin = None -mot_f_pin = None -gyr_pin = None +# FIXME # UPBGE constants JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED @@ -129,8 +121,6 @@ def end(): # Jumeau numérique if scene.objects['System']['twins']: - # serial_msg = "FI\n" - # twins_serial.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) jumeau_close() # Thread @@ -147,42 +137,28 @@ def quit(): end() ############################################################################### -# Actionneurs +# Voyants ############################################################################### # Ordre pour le voyant 0 def voy_0 (order): scene.objects['Led niveau 0']['activated']=order - # if order: - # scene.objects['Led niveau 0-on'].setVisible(True,False) - # scene.objects['Led niveau 0'].setVisible(False,False) - # else: - # scene.objects['Led niveau 0'].setVisible(True,False) - # scene.objects['Led niveau 0-on'].setVisible(False,False) - # global gyr_pin - # if scene.objects['System']['twins'] : - # if ordre : - # gyr_pin.write(1) - # else: - # gyr_pin.write(0) # Ordre pour le voyant 1 def voy_1 (order): scene.objects['Led niveau 1']['activated']=order - # if order: - # scene.objects['Led niveau 1-on'].setVisible(True,False) - # scene.objects['Led niveau 1'].setVisible(False,False) - # else: - # scene.objects['Led niveau 1'].setVisible(True,False) - # scene.objects['Led niveau 1-on'].setVisible(False,False) + +############################################################################### +# Actionneurs +############################################################################### # Ordre pour le moteur phase monter def mot_m (order): - scene.objects['Led niveau 1']['up']=order + scene.objects['Moteur']['up']=order # Ordre pour le moteur phase descendre def mot_d (order): - scene.objects['Ensemble moteur']['down']=ordre + scene.objects['Moteur']['down']=order ############################################################################### # Capteurs @@ -346,7 +322,7 @@ def jumeau_close(): scene.objects['System']['twins'] = False scene.objects['Twins-text']['Text'] = "Connection fermée." -# Configuration du port +# Configuration manuelle du port # FIXME def jumeau_config(port, speed): pass diff --git a/monte_charge/monte_charge-3.blend b/monte_charge/monte_charge-3.blend index 61444a6..a44a775 100644 Binary files a/monte_charge/monte_charge-3.blend and b/monte_charge/monte_charge-3.blend differ diff --git a/portail_coulissant/README.md b/portail_coulissant/README.md index f557678..99ff397 100644 --- a/portail_coulissant/README.md +++ b/portail_coulissant/README.md @@ -2,11 +2,13 @@ Ce jumeau numérique permet la programmation en Python d'une maquette réelle d'un portail coulissant. +## Maquette numérique + Le modèle 3D est basé sur la maquette développée par l'entreprise A4 technologie. Les documents techniques et pédagogiques signés A4 Technologie sont diffusés librement sous licence Creative Commons BY-NC-SA. Site internet de la maquette A4 Technologie : https://www.a4.fr/wiki/index.php?title=Portail_coulissant_(BE-APORT-COUL) -## Instructions et missions +## Instructions Le script Python qui permet la commande du portail est le fichier **'porcou_cmd.py'**. Il est éditable avec tout éditeur (Spyder, Emacs, Atom, ...). @@ -14,15 +16,15 @@ Le script Python qui permet la commande du portail est le fichier **'porcou_cmd. Les actions (ordre = True ou False) sont : - Gyrophare : **gyr (True|False)** -- Ouvrir le portail (moteur sens trigo) : **mot_o (True|False)** -- Fermer le portail (moteur sens horaire) : **mot_f (True|False)** -- Emetteur pour le capteur barrage IR : **ir_emet(True|False)** +- Ouvrir le portail (moteur sens trigo) : **mot_o (True | False)** +- Fermer le portail (moteur sens horaire) : **mot_f (True | False)** +- Emetteur pour le capteur barrage IR : **ir_emet(True | False)** #### Capteurs Les compte-rendus (valeur retournée = True ou False) des capteurs sont : -- Capteur fin de course portail ouvert : **fc_o()** -- Capteur fin de course portail fermé : **fc_f()** +- Capteur fin de course portail ouvert : **fdc_o()** +- Capteur fin de course portail fermé : **fdc_f()** - Capteur barrage IR (absence d'obstacle) : **ir_recep()** #### Pupitre diff --git a/portail_coulissant/porcou.py b/portail_coulissant/porcou.py index ad368c9..26ae0d2 100644 --- a/portail_coulissant/porcou.py +++ b/portail_coulissant/porcou.py @@ -19,14 +19,12 @@ import time scene = bge.logic.getCurrentScene() # Couleurs - couleur_magenta = (0.800, 0.005, 0.315,1) # bouton non activable : magenta couleur_orange = (0.799, 0.130, 0.063,1) # bouton activable : orange couleur_blanc = (0.8, 0.8, 0.8, 1) # bouton focus : blanc couleur_jaune = (0.8, 0.619, 0.021, 1) # bouton activé : jaune # Constantes UPBGE - JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED ACTIVATE = bge.logic.KX_INPUT_ACTIVE @@ -113,10 +111,10 @@ def sml_fdc_ouvert (cont): obj['actif'] = True if scene.objects['Portail'].localPosition.x > 0 and obj_microrupteur['actif'] == False and obj['actif'] == True : obj['actif'] = False - #Forçage + # Forçage if obj_microrupteur['actif'] == True: obj['actif'] = True - #Couleurs + # Couleurs if obj['actif'] == True and obj_microrupteur.color !=couleur_jaune: obj_microrupteur.color =couleur_jaune if obj['actif'] == False : diff --git a/portail_coulissant/portail_coulissant-14.blend b/portail_coulissant/portail_coulissant-14.blend index f986626..0f034d0 100644 Binary files a/portail_coulissant/portail_coulissant-14.blend and b/portail_coulissant/portail_coulissant-14.blend differ diff --git a/twin.py b/twin.py index 8a0ad14..dfb8fd2 100644 --- a/twin.py +++ b/twin.py @@ -21,6 +21,7 @@ import twin_about # About # @license: GNU GPL # # Cet environnement 3D est programmable en Python. Il est destiné à la découverte de la programmation de système pluritechnologique. +# ############################################################################### # UPBGE scene @@ -32,7 +33,6 @@ sys.setrecursionlimit(10**5) # Limite sur la récursivité (valeur par défaut # EEVEE eevee = bpy.context.scene.eevee -# fps_time=0.0 # Config file twin_config = ET.parse('twin_config.xml') @@ -41,6 +41,10 @@ twin_config_tree = twin_config.getroot() # Couleurs color_cmd = (0.8, 0.8, 0.8, 1) # Blanc color_cmd_hl = (0.8, 0.619, 0.021, 1) # Jaune +color_passive = (0.800, 0.005, 0.315,1) # bouton non activable : magenta +color_active = (0.799, 0.130, 0.063,1) # bouton activable : orange +color_hl = (0.8, 0.8, 0.8, 1) # bouton focus : blanc +color_activated = (0.8, 0.619, 0.021, 1) # bouton activé : jaune # Constantes JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED @@ -130,13 +134,13 @@ def cmd_init(): scene.objects['ResetView-Hl'].setVisible(False,False) scene.objects['Doc-cmd-Hl'].setVisible(False,False) scene.objects['About-cmd-Hl'].setVisible(False,False) - scene.objects['Twins-icon'].setVisible(False,True) + # scene.objects['Twins-icon'].setVisible(False,True) # UI : Text, ... scene.objects['Cmd-text']['Text']="" scene.objects['Cmd-text'].setVisible(True,False) scene.objects['Twins-text']['Text']="Connection fermée." - scene.objects['Twins-text'].setVisible(False,False) + # scene.objects['Twins-text'].setVisible(False,False) # Windows windows=("Doc", "Doc_chap-general", "Doc_chap-system", "Doc_chap-python", "About") @@ -440,7 +444,7 @@ def manip_wheel(cont): ## -# Mise en route et pause du cycle +# Validation du code Python ## def python_validation(file): @@ -461,6 +465,10 @@ def python_validation(file): scene.objects['Cmd-text'].setVisible(False,False) return True +## +# Mise en route et pause du cycle +## + def cycle_run (): # Pause @@ -492,7 +500,7 @@ def cycle_run (): # Arrêt de la pause else: - # FIXME : Relancer Ropy + # FIXME : Relancer la maquette pass ## @@ -519,3 +527,46 @@ def cycle_end (cont): scene.objects['Pause-Hl'].setVisible(False,False) scene.objects['Run'].setVisible(True,False) scene.objects['Run'].restorePhysics() + +## +# Highlight sur les éléments cliquables du systèmes +## + +def cycle_hl(cont): + obj = cont.owner + name=obj.name + + # Activation + if cont.sensors['MO'].status == JUST_ACTIVATED and scene.objects['System']['run']: + scene.objects[name].color = color_hl + scene.objects[name]['mo'] = True + + # Désactivation + if cont.sensors['MO'].status == JUST_RELEASED: + scene.objects[name].color = color_active + scene.objects[name]['mo'] = False + +## +# Click sur les éléments cliquables du systèmes (activation numérique) +## + +def cycle_click(cont): + obj = cont.owner + name=obj.name + + # Activation + if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['System']['manip_mode']==0: + scene.objects[name].color = color_activated + obj['activated'] = True + obj['click'] = True + # Modele 3d -> Arduino : FIXME + + # Désactivation + if cont.sensors['Click'].status == JUST_RELEASED: + obj['activated'] = False + obj['click'] = False + # Modele 3d -> Arduino : FIXME + if cont.sensors['MO'].positive: + scene.objects[name].color = color_hl + else: + scene.objects[name].color = color_active diff --git a/twin_about.py b/twin_about.py index d5d85c6..788a88e 100644 --- a/twin_about.py +++ b/twin_about.py @@ -36,6 +36,7 @@ ACTIVATE = bge.logic.KX_INPUT_ACTIVE ## def open(): + scene.objects['System']['manip_mode']=9 # Fenêtre modale About scene.active_camera = scene.objects["Camera-About"] # scene.removeOverlayCollection(bpy.data.collections['Hud']) # Crash de UPBGE sur la supression de l'Overlay scene.objects['Twins-icon'].setVisible(False,True) # Crash de UPBGE sur la supression de l'Overlay @@ -72,6 +73,7 @@ def open(): def close(cont): if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + scene.objects['System']['manip_mode']=0 # Enlever la fenêtre modale scene.active_camera = scene.objects["Camera"] # scene.addOverlayCollection(scene.cameras['Camera-Hud'], bpy.data.collections['Hud']) # Crash de UPBGE sur la supression de l'Overlay scene.objects['Twins-icon'].setVisible(True,True) # Crash de UPBGE sur la supression de l'Overlay diff --git a/twin_config.xml b/twin_config.xml index 2f742d8..a8e0b1f 100644 --- a/twin_config.xml +++ b/twin_config.xml @@ -1,6 +1,6 @@ - 1339 - 753 + 1458 + 821 \ No newline at end of file diff --git a/twin_doc.py b/twin_doc.py index 36ae756..949f1e4 100644 --- a/twin_doc.py +++ b/twin_doc.py @@ -232,6 +232,7 @@ def open(): init() # Placer la tablette + scene.objects['System']['manip_mode']=8 # Fenêtre modale Documentation scene.active_camera = scene.objects["Camera-Doc"] # scene.removeOverlayCollection(bpy.data.collections['Hud']) # Crash de UPBGE sur la supression de l'Overlay scene.objects['Twins-icon'].setVisible(False,True) # Crash de UPBGE sur la supression de l'Overlay @@ -280,6 +281,7 @@ def open(): def close(cont): if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive : + scene.objects['System']['manip_mode']=0 # Enlever la fenêtre modale scene.active_camera = scene.objects["Camera"] # scene.addOverlayCollection(scene.cameras['Camera-Hud'], bpy.data.collections['Hud']) # Crash de UPBGE sur la supression de l'Overlay scene.objects['Twins-icon'].setVisible(True,True) # Crash de UPBGE sur la supression de l'Overlay diff --git a/volet_roulant/volet_roulant-1.blend b/volet_roulant/volet_roulant-1.blend index 5059826..8ec5871 100644 Binary files a/volet_roulant/volet_roulant-1.blend and b/volet_roulant/volet_roulant-1.blend differ diff --git a/volet_roulant/volrou.py b/volet_roulant/volrou.py index 12de2dd..dc6ce76 100644 --- a/volet_roulant/volrou.py +++ b/volet_roulant/volrou.py @@ -11,22 +11,18 @@ import time # @authors: Philippe Roy # @copyright: Copyright (C) 2022 Philippe Roy # @license: GNU GPL -# -# Commandes déclenchées par/sur le simulateur (sml_*) ############################################################################### # Récupérer la scène UPBGE scene = bge.logic.getCurrentScene() # Couleurs - -couleur_magenta = (0.800, 0.005, 0.315,1) # bouton non activable : magenta -couleur_orange = (0.799, 0.130, 0.063,1) # bouton activable : orange -couleur_blanc = (0.8, 0.8, 0.8, 1) # bouton focus : blanc -couleur_jaune = (0.8, 0.619, 0.021, 1) # bouton activé : jaune +color_passive = (0.800, 0.005, 0.315,1) # bouton non activable : magenta +color_active = (0.799, 0.130, 0.063,1) # bouton activable : orange +color_hl = (0.8, 0.8, 0.8, 1) # bouton focus : blanc +color_activated = (0.8, 0.619, 0.021, 1) # bouton activé : jaune # Constantes UPBGE - JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED ACTIVATE = bge.logic.KX_INPUT_ACTIVE diff --git a/volet_roulant/volrou_cmd.py b/volet_roulant/volrou_cmd.py index 16061ca..7dadc6c 100644 --- a/volet_roulant/volrou_cmd.py +++ b/volet_roulant/volrou_cmd.py @@ -1,4 +1,4 @@ -from volroul_lib import * # Bibliothèque volet roulant +from volrou_lib import * # Bibliothèque volet roulant ############################################################################### # volrou_cmd.py