jumeaux-numeriques/portail_coulissant/porcou.py

268 lines
10 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import bge # Bibliothèque Blender Game Engine (UPBGE)
import twin # Bibliothèque de l'environnement 3D des jumeaux numériques
import math
import time
###############################################################################
# porcou.py
# @title: Commandes pour le portail coulissant
# @project: Blender-EduTech
# @lang: fr
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
# @copyright: Copyright (C) 2020-2022 Philippe Roy
# @license: GNU GPL
###############################################################################
# Récupérer la scène UPBGE
scene = bge.logic.getCurrentScene()
# Couleurs
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
# JUST_DEACTIVATED = bge.logic.KX_SENSOR_JUST_DEACTIVATED
###############################################################################
# Initialisation de la scène
###############################################################################
def init(cont):
if cont.sensors['Init'].positive == False: # 1 seule fois
return False
twin.manip_init() # Manipulation du modèle 3D
twin.cmd_init() # Commandes
# Mémorisation de la position et orientation des composants du système
scene.objects['Portail']['init_lx']=scene.objects['Portail'].worldPosition.x
scene.objects['Portail']['init_ly']=scene.objects['Portail'].worldPosition.y
scene.objects['Portail']['init_lz']=scene.objects['Portail'].worldPosition.z
scene.objects['Engrenage']['init_rx']=scene.objects['Engrenage'].worldOrientation.to_euler().x
scene.objects['Engrenage']['init_ry']=scene.objects['Engrenage'].worldOrientation.to_euler().y
scene.objects['Engrenage']['init_rz']=scene.objects['Engrenage'].worldOrientation.to_euler().z
system_init() # Initialisation du système
###############################################################################
# Actionneurs
###############################################################################
##
# Gyrophare
# Modele 3d -> Arduino : FIXME
# Arduino -> Modele 3d : FIXME
##
def gyr (cont):
if scene.objects['System']['run']:
obj = cont.owner
if obj['activated'] and scene.objects['Led-on'].visible == False:
scene.objects['Led-on'].setVisible(True,False)
scene.objects['Led'].setVisible(False,False)
if obj['activated']==False and scene.objects['Led-on'].visible == True:
scene.objects['Led'].setVisible(True,False)
scene.objects['Led-on'].setVisible(False,False)
##
# Moteur et portail
# Modele 3d -> Arduino : FIXME
# Arduino -> Modele 3d : FIXME
##
def mot (cont):
if scene.objects['System']['run']:
obj = cont.owner
vitesse = 0.05
pas_portail = 2.35619/0.3 # pas echelle 1:1 = 2.35619 -> pas à l'échelle de la maquette (0,3) : 2.35619/0.3 = 7,85396
pas_engrenage = math.pi/7 # z = 14
obj_engrenage = scene.objects['Engrenage']
obj_portail = scene.objects['Portail']
obj_portail['x']= scene.objects['Portail'].localPosition.x # Affichage de la position du portail
if obj['open']:
obj_engrenage.applyRotation((0, 0, -pas_engrenage*vitesse), True)
obj_portail.applyMovement((-pas_portail*vitesse, 0, 0), True)
# else: # Pas de priorité
if obj['close']:
obj_engrenage.applyRotation((0, 0, pas_engrenage*vitesse), True)
obj_portail.applyMovement((pas_portail*vitesse, 0, 0), True)
###############################################################################
# Capteurs fin de course
###############################################################################
##
# Etat capteur fin de course portail ouvert
# Modele 3d -> Arduino : FIXME
# Arduino -> Modele 3d : FIXME
##
def fdc_o (cont):
if scene.objects['System']['run'] :
obj = cont.owner
# 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 :
obj['activated'] = True
if scene.objects['Portail'].localPosition.x > 0 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é
# Modele 3d -> Arduino : FIXME
# Arduino -> Modele 3d : FIXME
##
def fdc_f (cont):
if scene.objects['System']['run'] :
obj = cont.owner
# 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 :
obj['activated'] = True
if scene.objects['Portail'].localPosition.x < 218 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
###############################################################################
# Capteur barrage
###############################################################################
##
# Emetteur IR
##
def ir_emet (cont):
if scene.objects['System']['run'] :
obj = cont.owner
obj_recepteur=scene.objects['Recepteur IR']
if obj['active'] and scene.objects['Emetteur IR Led-on'].visible == False:
scene.objects['Emetteur IR Led-on'].setVisible(True,False)
scene.objects['Emetteur IR Led'].setVisible(False,False)
obj.color = color_active
obj_recepteur.color = color_active
obj_recepteur['active'] = True
if obj['active']==False and scene.objects['Emetteur IR Led-on'].visible == True:
scene.objects['Emetteur IR Led'].setVisible(True,False)
scene.objects['Emetteur IR Led-on'].setVisible(False,False)
obj.color = color_passive
obj_recepteur.color = color_passive
obj_recepteur['active'] = False
###############################################################################
# Boutons
###############################################################################
# Modele 3d -> Arduino : FIXME
# Arduino -> Modele 3d : FIXME
# Arduino -> numérique
# bt_a_m_txt = txt_extrac_bool(serial_msg,"bt_a_m: ")
# bt_a_d_txt = txt_extrac_bool(serial_msg,"bt_a_d: ")
# bt_b_m_txt = txt_extrac_bool(serial_msg,"bt_b_m: ")
# bt_b_d_txt = txt_extrac_bool(serial_msg,"bt_b_d: ")
# bt_c_m_txt = txt_extrac_bool(serial_msg,"bt_c_m: ")
# bt_c_d_txt = txt_extrac_bool(serial_msg,"bt_c_d: ")
# bp_phy('Bp Am', bt_a_m_txt)
# bp_phy('Bp Ad', bt_a_d_txt)
# bp_phy('Bp Bm', bt_b_m_txt)
# bp_phy('Bp Bd', bt_b_d_txt)
# bp_phy('Bp Cm', bt_c_m_txt)
# bp_phy('Bp Cd', bt_c_d_txt)
# # Affichage de l'activation physique des boutons
# def bp_phy(obj_name, bp_phy_sig):
# obj=scene.objects[obj_name]
# if bp_phy_sig =="0":
# obj['actif_phy'] = True
# obj.color = couleur_jaune
# else:
# if obj['actif_phy']:
# obj['actif_phy'] = False
# obj.color = couleur_orange
###############################################################################
# Système
###############################################################################
##
# Initialisation du système
# Le moteur est géré en continue.
##
def system_init ():
system_reset()
##
# Réinitialisation du système
##
def system_reset ():
# Grille à l'état initial
# applyRotationTo(scene.objects['System'], 0, 0, 0)
scene.objects['Portail'].worldPosition.x = scene.objects['Portail']['init_lx']
scene.objects['Portail'].worldPosition.y = scene.objects['Portail']['init_ly']
scene.objects['Portail'].worldPosition.z = scene.objects['Portail']['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)
# Gyrophare à l'état initial
scene.objects['Led'].setVisible(True,False)
scene.objects['Led-on'].setVisible(False,False)
# Capteur barrage IR
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['Microrupteur fdc ouvert']['activated']=False
scene.objects['Microrupteur fdc ferme']['activated']=False
scene.objects['Bp cote cour']['activated'] =False
scene.objects['Bp cote rue']['activated'] =False
scene.objects['Emetteur IR']['activated'] =False
scene.objects['Emetteur IR']['active'] =False
scene.objects['Recepteur IR']['activated'] =False
scene.objects['Recepteur IR']['active'] =False