mirror of
https://forge.apps.education.fr/blender-edutech/jumeaux-numeriques.git
synced 2024-01-27 06:56:18 +01:00
Finalisation du moteur physique du monte-charge
This commit is contained in:
parent
fdd0729f66
commit
62ca444e49
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Binary file not shown.
@ -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
|
||||
|
@ -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 :
|
||||
|
Binary file not shown.
61
twin.py
61
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
|
||||
|
@ -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
|
||||
|
@ -1,6 +1,6 @@
|
||||
<data>
|
||||
<screen>
|
||||
<width>1339</width>
|
||||
<height>753</height>
|
||||
<width>1458</width>
|
||||
<height>821</height>
|
||||
</screen>
|
||||
</data>
|
@ -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
|
||||
|
Binary file not shown.
@ -11,22 +11,18 @@ import time
|
||||
# @authors: Philippe Roy <philippe.roy@ac-grenoble.fr>
|
||||
# @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
|
||||
|
@ -1,4 +1,4 @@
|
||||
from volroul_lib import * # Bibliothèque volet roulant
|
||||
from volrou_lib import * # Bibliothèque volet roulant
|
||||
|
||||
###############################################################################
|
||||
# volrou_cmd.py
|
||||
|
Loading…
Reference in New Issue
Block a user