mirror of
https://forge.apps.education.fr/blender-edutech/jumeaux-numeriques.git
synced 2024-01-27 06:56:18 +01:00
Documentation sur la lecture et acquisition de données
This commit is contained in:
parent
70125297bf
commit
9fec0d0c86
1
asset/icons/doc/game-icons/system/calculator.svg
Normal file
1
asset/icons/doc/game-icons/system/calculator.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#ffffff" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M95 25v462h322V25H95zm193 18h80v18h-80V43zM114 83h284v84H114V83zm22 46v18h88v-18h-88zm-22 54h58v58h-58v-58zm76 0h58v58h-58v-58zm74 0h58v58h-58v-58zm76 0h58v58h-58v-58zm-208 18v22h22v-22h-22zm76 0v22h22v-22h-22zm74 0v22h22v-22h-22zm76 0v22h22v-22h-22zm-244 56h58v58h-58v-58zm76 0h58v58h-58v-58zm74 0h58v58h-58v-58zm76 0h58v58h-58v-58zm-208 18v22h22v-22h-22zm76 0v22h22v-22h-22zm74 0v22h22v-22h-22zm76 0v22h22v-22h-22zm-244 56h58v58h-58v-58zm76 0h58v58h-58v-58zm74 0h58v58h-58v-58zm76 0h58v132h-58V331zm-208 18v22h22v-22h-22zm76 0v22h22v-22h-22zm74 0v22h22v-22h-22zm76 0v96h22v-96h-22zm-244 56h58v58h-58v-58zm76 0h58v58h-58v-58zm74 0h58v58h-58v-58zm-132 18v22h22v-22h-22zm76 0v22h22v-22h-22zm74 0v22h22v-22h-22z" fill="#000000" fill-opacity="1"></path></g></svg>
|
After Width: | Height: | Size: 981 B |
1
asset/icons/doc/game-icons/system/database.svg
Normal file
1
asset/icons/doc/game-icons/system/database.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#ffffff" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M256 19.11c-48.03 0-91.515 6.572-122.235 16.82-15.36 5.123-27.503 11.218-35.225 17.308C90.82 59.328 88 64.702 88 69.278c0 4.574 2.82 9.948 10.54 16.038 7.722 6.09 19.865 12.184 35.225 17.308 30.72 10.247 74.204 16.82 122.235 16.82 48.03 0 91.515-6.573 122.235-16.82 15.36-5.124 27.503-11.22 35.225-17.308 7.72-6.09 10.54-11.464 10.54-16.04 0-4.574-2.82-9.948-10.54-16.038-7.722-6.09-19.865-12.185-35.225-17.308C347.515 25.682 304.03 19.11 256 19.11zM88 99.434v92.63c0 5.84 5.338 13.804 19.285 21.862 13.947 8.058 35.283 15.424 61.976 20.564 53.387 10.283 120.093 10.283 173.48 0 26.692-5.14 48.028-12.505 61.975-20.563C418.662 205.87 424 197.905 424 192.067V99.434c-10.135 7.894-23.752 14.42-40.19 19.903-33.272 11.098-78.19 17.727-127.81 17.727-49.62 0-94.538-6.63-127.81-17.727-16.438-5.483-30.055-12.01-40.19-19.903zm0 122.75v95.32c0 5.84 5.338 13.803 19.285 21.86 13.947 8.06 35.283 15.425 61.976 20.566 53.387 10.282 120.093 10.282 173.48 0 26.692-5.14 48.028-12.506 61.975-20.564 13.947-8.058 19.285-16.022 19.285-21.86v-95.322c-3.18 2.475-6.685 4.812-10.47 7-16.58 9.578-39.446 17.215-67.46 22.61-56.023 10.79-124.117 10.79-180.14 0-28.014-5.395-50.88-13.032-67.46-22.61-3.785-2.188-7.29-4.525-10.47-7zm0 125.44v98.035h.386c.994 3.89 4.026 8.27 10.154 13.102 7.722 6.09 19.865 12.185 35.225 17.308 30.72 10.248 74.204 16.82 122.235 16.82 48.03 0 91.515-6.572 122.235-16.82 15.36-5.123 27.503-11.218 35.225-17.308 6.128-4.833 9.16-9.213 10.154-13.102H424V347.623c-3.18 2.475-6.685 4.813-10.47 7-16.58 9.58-39.446 17.215-67.46 22.61-56.023 10.79-124.117 10.79-180.14 0-28.014-5.395-50.88-13.03-67.46-22.61-3.785-2.187-7.29-4.525-10.47-7z" fill="#000000" fill-opacity="1"></path></g></svg>
|
After Width: | Height: | Size: 1.9 KiB |
1
asset/icons/doc/game-icons/system/magnifying-glass.svg
Normal file
1
asset/icons/doc/game-icons/system/magnifying-glass.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#ffffff" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M333.78 20.188c-39.97 0-79.96 15.212-110.405 45.656-58.667 58.667-60.796 152.72-6.406 213.97l-15.782 15.748 13.25 13.25 15.75-15.78c61.248 54.39 155.3 52.26 213.968-6.407 60.887-60.886 60.888-159.894 0-220.78C413.713 35.4 373.753 20.187 333.78 20.187zm0 18.562c35.15 0 70.285 13.44 97.158 40.313 53.745 53.745 53.744 140.6 0 194.343-51.526 51.526-133.46 53.643-187.5 6.375l.218-.217c-2.35-2.05-4.668-4.17-6.906-6.407-2.207-2.206-4.288-4.496-6.313-6.812l-.218.22c-47.27-54.04-45.152-135.976 6.374-187.502C263.467 52.19 298.63 38.75 333.78 38.75zm0 18.813c-30.31 0-60.63 11.6-83.81 34.78-46.362 46.362-46.362 121.234 0 167.594 10.14 10.142 21.632 18.077 33.905 23.782-24.91-19.087-40.97-49.133-40.97-82.94 0-15.323 3.292-29.888 9.22-43-4.165 20.485.44 40.88 14.47 54.907 24.583 24.585 68.744 20.318 98.624-9.562 29.88-29.88 34.146-74.04 9.56-98.625-2.375-2.376-4.943-4.473-7.655-6.313 45.13 8.648 79.954 46.345 84.25 92.876 4.44-35.07-6.82-71.726-33.813-98.72-23.18-23.18-53.47-34.78-83.78-34.78zM176.907 297.688L42.094 432.5l34.562 34.563L211.47 332.25l-34.564-34.563zM40 456.813L24 472.78 37.22 486l15.968-16L40 456.812z" fill="#000000" fill-opacity="1"></path></g></svg>
|
After Width: | Height: | Size: 1.4 KiB |
@ -12,7 +12,7 @@
|
||||
# Documentation du système
|
||||
################################################################################
|
||||
|
||||
system_card=["twins-card", "pin-card", "firmata-card", "plot-card", "movement-card", "board-card", "model-card", "arduino-card"]
|
||||
system_card=["twins-card", "pin-card", "data-card", "plot-card", "movement-card", "board-card", "model-card", "firmata-card", "arduino-card"]
|
||||
system_card_description ={}
|
||||
|
||||
# Jumeau numérique
|
||||
@ -36,26 +36,28 @@ card_pin_text=""" Le brochage est un dictionnaire qui permet \n d'associer les o
|
||||
- broche : numéro de la broche de carte,
|
||||
- mode : i (entrée), o (sortie) ou p (pwm).
|
||||
Par exemple : brochage = { 'ba_0':['d', 3, 'o'] }.\n
|
||||
Les objets numériques du jumeau sont : \n 'ba_0', 'ba_1', 'pc_0', 'pc_1', 'mot_m', 'mot_d', \n 'voy_0' et 'voy_1'."""
|
||||
Les objets numériques du jumeau sont : \n 'ba_0', 'ba_1', 'pc_0', 'pc_1', 'mot_m', 'mot_d', \n 'voy_0' et 'voy_1'."""
|
||||
card_pin_url=[]
|
||||
system_card_description.update({"pin-card" : [card_pin_title, card_pin_text, card_pin_url]})
|
||||
|
||||
# Firmata
|
||||
card_firmata_title="Protocole Firmata"
|
||||
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\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
|
||||
broche.read() \n -> Retourne la valeur de la broche.\n
|
||||
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
|
||||
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
|
||||
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})
|
||||
# Données
|
||||
card_data_title="Accès aux données"
|
||||
card_data_text=""" get(variable) \n -> Retourne la valeur de la variable à \n l'instant t. Par exemple : val = get('ba_0').\n
|
||||
Entrées/sorties : 'ba_0', 'ba_1', 'pc_0', 'pc_1', \n 'mot_m', 'mot_d', 'voy_0' et 'voy_1'.\n
|
||||
Variables réels (si il y a jumelage) : 'ba_0_r', \n 'ba_1_r', 'pc_0_r', 'pc_1_r'.\n
|
||||
Autres variables : 'mot_angle', 'mot_vitesse', \n 'cabine_z'."""
|
||||
card_data_url=[]
|
||||
system_card_description.update({"data-card" : [card_data_title, card_data_text, card_data_url]})
|
||||
|
||||
# Monitoring
|
||||
card_plot_title="Chronogramme"
|
||||
card_plot_text=""" plot([valeurs]) \n -> Affiche le chronogramme des valeurs \n spécifiées. Blender étant cadencé à 60 fps, \n la fréquence d'acquisition est 16 ms.
|
||||
card_plot_title="Acquisition de données"
|
||||
card_plot_text=""" plot([variables]) \n -> Affiche le chronogramme des variables \n spécifiées.
|
||||
Par exemple : plot(['ba_0', 'cabine_z']).\n
|
||||
Les entrées/sorties peuvent être suivies : \n ba_0', 'ba_1', 'pc_0', 'pc_1', 'mot_m', 'mot_d', \n 'voy_0' et 'voy_1'.\n
|
||||
Les autres valeurs pouvant être suivies : \n 'moteur_angle', 'moteur_vitesse', 'cabine_z'."""
|
||||
card_plot_url=[["Bibliothèque Matplotlib","https://matplotlib.org/"]]
|
||||
csv([variables]) \n -> Déclenche l'acquisition de données afin \n de génèrer un fichier de données CSV à \n l'arrêt du cycle.\n
|
||||
Les variables pouvant être suivies sont les \n mêmes que celles de la page "Données"."""
|
||||
# Blender étant cadencé à 60 fps, la fréquence \n d'acquisition est 16 ms."""
|
||||
card_plot_url=[["Bibliothèque Matplotlib","https://matplotlib.org/"],
|
||||
["Wikipedia Français : fichier CSV","https://fr.wikipedia.org/wiki/Comma-separated_values"]]
|
||||
system_card_description.update({"plot-card" : [card_plot_title, card_plot_text, card_plot_url]})
|
||||
|
||||
# Ouvrir et fermer
|
||||
@ -85,6 +87,15 @@ card_model_url=[["A4 Technologie","https://www.a4.fr"],
|
||||
["Maquette A4 Technologie","https://www.a4.fr/wiki/index.php?title=Monte_charge_(BE-MCHA)"]]
|
||||
system_card_description.update({"model-card" : [card_model_title, card_model_text, card_model_url]})
|
||||
|
||||
# Firmata
|
||||
card_firmata_title="Protocole Firmata"
|
||||
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\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
|
||||
broche.read() \n -> Retourne la valeur de la broche.\n
|
||||
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
|
||||
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
|
||||
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})
|
||||
|
||||
# Arduino
|
||||
card_arduino_title="Arduino"
|
||||
card_arduino_text=""" Arduino une plateforme open-source de \n développement électronique basée sur le \n microcontrôleur de la famille ATmega.
|
||||
|
@ -90,11 +90,26 @@ def ba_1 ():
|
||||
def tempo (duree):
|
||||
time.sleep(duree)
|
||||
|
||||
# t (temps)
|
||||
def truncate(n, decimals=0):
|
||||
multiplier = 10**decimals
|
||||
return int(n* multiplier)/multiplier
|
||||
|
||||
def get_t ():
|
||||
return truncate(scene.objects['System']['time'], 3)
|
||||
|
||||
def set_t (date):
|
||||
scene.objects['System']['time']=date
|
||||
|
||||
def reset_t ():
|
||||
scene.objects['System']['time']=0
|
||||
|
||||
# Arrêt
|
||||
def stop():
|
||||
if scene.objects['System']['twins']:
|
||||
serial_close(scene.objects['System']['board'])
|
||||
time.sleep(1)
|
||||
scene.objects['System']['plot_draw']=False
|
||||
thread_cmd_stop()
|
||||
|
||||
# Fin naturelle
|
||||
@ -102,6 +117,7 @@ def end():
|
||||
if scene.objects['System']['twins']:
|
||||
serial_close(scene.objects['System']['board'])
|
||||
time.sleep(1)
|
||||
scene.objects['System']['plot_draw']=False
|
||||
thread_cmd_end()
|
||||
|
||||
def fin():
|
||||
@ -109,3 +125,4 @@ def fin():
|
||||
|
||||
def quit():
|
||||
end()
|
||||
|
||||
|
Binary file not shown.
@ -105,32 +105,32 @@ def get_pin_config():
|
||||
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 FIXME à enlever
|
||||
pas_engrenage = math.pi/7 # z = 14 FIXME à enlever
|
||||
|
||||
vitesse = 0.05 # valeur empirique
|
||||
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 valeur empirique
|
||||
pas_engrenage = math.pi/7 # z = 14 valeur empirique
|
||||
obj_engrenage = scene.objects['Engrenage']
|
||||
obj_portail = scene.objects['Portail']
|
||||
# obj_portail['x']= scene.objects['Portail'].localPosition.x # Affichage de la position du portail
|
||||
speed= obj['speed'] # 0,5 en tour / seconde -> course de 500 mm en 4s
|
||||
speed= 0.1
|
||||
scene.objects['System']['scale']=0.33
|
||||
# speed= obj['speed'] # 0,2 en tour / seconde -> course de 500 mm en 20s
|
||||
gear_radius = ((obj_engrenage['diameter'])/2) *(1/scene.objects['System']['scale']) # diametre : 40 mm et scale : 0,0033
|
||||
|
||||
# # obj_portail['x']= scene.objects['Portail'].localPosition.x # Affichage de la position du portail
|
||||
# speed= obj['speed'] # 0,5 en tour / seconde -> course de 500 mm en 4s
|
||||
# speed= 0.1
|
||||
# scene.objects['System']['scale']=0.33
|
||||
# # speed= obj['speed'] # 0,2 en tour / seconde -> course de 500 mm en 20s
|
||||
# gear_radius = ((obj_engrenage['diameter'])/2) *(1/scene.objects['System']['scale']) # diametre : 40 mm et scale : 0,0033
|
||||
|
||||
if obj['close']:
|
||||
print ("speed :", speed)
|
||||
print ("gear_radius :", gear_radius)
|
||||
print ("Vitesse engrenage : ", speed * 2 * math.pi*(1/60), pas_engrenage*vitesse)
|
||||
print ("Vitesse portail : ", speed * 2 * math.pi * gear_radius*(1/60), pas_portail*vitesse)
|
||||
print ("Ratio Vitesse portail/ Vitesse engrenage : ",( speed * 2 * math.pi * gear_radius*(1/60))/(speed * 2 * math.pi *(1/60)), pas_portail/pas_engrenage)
|
||||
# if obj['close']:
|
||||
# print ("speed :", speed)
|
||||
# print ("gear_radius :", gear_radius)
|
||||
# print ("Vitesse engrenage : ", speed * 2 * math.pi*(1/60), pas_engrenage*vitesse)
|
||||
# print ("Vitesse portail : ", speed * 2 * math.pi * gear_radius*(1/60), pas_portail*vitesse)
|
||||
# print ("Ratio Vitesse portail/ Vitesse engrenage : ",( speed * 2 * math.pi * gear_radius*(1/60))/(speed * 2 * math.pi *(1/60)), pas_portail/pas_engrenage)
|
||||
|
||||
# Ouvrir
|
||||
if obj['open']:
|
||||
obj_engrenage.applyRotation((0, 0, -speed * 2 * math.pi), True)
|
||||
obj_portail.applyMovement((-speed * math.pi * gear_diameter, 0, 0), True)
|
||||
# obj_engrenage.applyRotation((0, 0, -pas_engrenage*vitesse), True)
|
||||
# obj_portail.applyMovement((-pas_portail*vitesse, 0, 0), True)
|
||||
# obj_engrenage.applyRotation((0, 0, -speed * 2 * math.pi), True)
|
||||
# obj_portail.applyMovement((-speed * math.pi * gear_diameter, 0, 0), True)
|
||||
obj_engrenage.applyRotation((0, 0, -pas_engrenage*vitesse), True)
|
||||
obj_portail.applyMovement((-pas_portail*vitesse, 0, 0), True)
|
||||
|
||||
# Modele 3D -> Arduino
|
||||
if scene.objects['System']['twins']:
|
||||
@ -142,11 +142,10 @@ def mot (cont):
|
||||
# Fermer
|
||||
# else: # Pas de priorité
|
||||
if obj['close']:
|
||||
obj_engrenage.applyRotation((0, 0, speed * 2 * math.pi*(1/60)), True)
|
||||
obj_portail.applyMovement((speed * 2 * math.pi * gear_radius*(1/60), 0, 0), True)
|
||||
|
||||
# obj_engrenage.applyRotation((0, 0, pas_engrenage*vitesse), True)
|
||||
# obj_portail.applyMovement((pas_portail*vitesse, 0, 0), True)
|
||||
# obj_engrenage.applyRotation((0, 0, speed * 2 * math.pi*(1/60)), True)
|
||||
# obj_portail.applyMovement((speed * 2 * math.pi * gear_radius*(1/60), 0, 0), True)
|
||||
obj_engrenage.applyRotation((0, 0, pas_engrenage*vitesse), True)
|
||||
obj_portail.applyMovement((pas_portail*vitesse, 0, 0), True)
|
||||
|
||||
# Modele 3D -> Arduino
|
||||
if scene.objects['System']['twins']:
|
||||
|
@ -50,15 +50,38 @@ def commandes():
|
||||
# mot_f(True)
|
||||
# mot_f(False)
|
||||
# gyr(False)
|
||||
tdf= get_t()
|
||||
print ("Début fermeture : ", tdf)
|
||||
while fdc_f() ==False :
|
||||
gyr(True)
|
||||
mot_o(False)
|
||||
mot_f(True)
|
||||
mot_f(False)
|
||||
gyr(False)
|
||||
tff = get_t()
|
||||
print ("Fin fermeture : ", tff)
|
||||
print ("Temp fermeture : ", str(tff-tdf))
|
||||
tdo= get_t()
|
||||
print ("Début ouverture : ", tdo)
|
||||
while fdc_o() ==False :
|
||||
gyr(True)
|
||||
mot_f(False)
|
||||
mot_o(True)
|
||||
mot_o(False)
|
||||
gyr(False)
|
||||
tfo = get_t()
|
||||
print ("Fin ouverture : ", tfo)
|
||||
print ("Temp ouverture : ", str(tfo-tdo))
|
||||
|
||||
# plot(['gyr'])
|
||||
plot(['bp_ext'])
|
||||
# plot(['bp_ext'])
|
||||
# plot(['gyr', 'bp_ext', 'bp_int'])
|
||||
while True:
|
||||
gyr(True)
|
||||
tempo(0.25)
|
||||
gyr(False)
|
||||
tempo(0.25)
|
||||
# while True:
|
||||
# print (get_t())
|
||||
# gyr(True)
|
||||
# tempo(0.25)
|
||||
# gyr(False)
|
||||
# tempo(0.25)
|
||||
|
||||
fin() # A garder
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
# Documentation du système
|
||||
################################################################################
|
||||
|
||||
system_card=["twins-card", "pin-card", "firmata-card", "plot-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"]
|
||||
system_card=["twins-card", "pin-card", "data-card", "plot-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "firmata-card", "arduino-card"]
|
||||
system_card_description ={}
|
||||
|
||||
# Jumeau numérique
|
||||
@ -38,26 +38,28 @@ card_pin_text=""" Le brochage est un dictionnaire qui permet \n d'associer les o
|
||||
- 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
|
||||
Les objets numériques du jumeau sont : \n 'bp_ext', 'bp_int', 'fdc_o', 'fdc_f', 'mot_o',\n 'mot_f', 'gyr', 'ir_emet' et 'ir_recep'."""
|
||||
Les objets numériques du jumeau sont : \n 'bp_ext', 'bp_int', 'fdc_o', 'fdc_f', 'mot_o',\n 'mot_f', 'gyr', 'ir_emet' et 'ir_recep'."""
|
||||
card_pin_url=[]
|
||||
system_card_description.update({"pin-card" : [card_pin_title, card_pin_text, card_pin_url]})
|
||||
|
||||
# Firmata
|
||||
card_firmata_title="Protocole Firmata"
|
||||
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\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
|
||||
broche.read() \n -> Retourne la valeur de la broche.\n
|
||||
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
|
||||
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
|
||||
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})
|
||||
# Données
|
||||
card_data_title="Accès aux données"
|
||||
card_data_text=""" get(variable) \n -> Retourne la valeur de la variable à \n l'instant t. Par exemple : val = get('bp_ext').\n
|
||||
Entrées/sorties : 'bp_ext', 'bp_int', 'fdc_o', \n 'fdc_f', 'mot_o', 'mot_f', 'gyr', 'ir_emet', \n 'ir_recep'.\n
|
||||
Variables réels (si il y a jumelage) : 'bp_ext_r', \n 'bp_int_r', 'fdc_o_r', 'fdc_f_r', 'ir_recep_r'.\n
|
||||
Autres variables : 'mot_angle', \n 'mot_vitesse', 'portail_x'."""
|
||||
card_data_url=[]
|
||||
system_card_description.update({"data-card" : [card_data_title, card_data_text, card_data_url]})
|
||||
|
||||
# Monitoring
|
||||
card_plot_title="Chronogramme"
|
||||
card_plot_text=""" plot([valeurs]) \n -> Affiche le chronogramme des valeurs \n spécifiées. Blender étant cadencé à 60 fps, \n la fréquence d'acquisition est 16 ms.
|
||||
card_plot_title="Acquisition de données"
|
||||
card_plot_text=""" plot([variables]) \n -> Affiche le chronogramme des variables \n spécifiées.
|
||||
Par exemple : plot(['bp_ext', 'portail_x']).\n
|
||||
Les entrées/sorties peuvent être suivies : \n 'bp_ext', 'bp_int', 'fdc_o', 'fdc_f', 'mot_o',\n 'mot_f', 'gyr', 'ir_emet' et 'ir_recep'.\n
|
||||
Les autres valeurs pouvant être suivies : \n 'moteur_angle', 'moteur_vitesse', 'portail_x'."""
|
||||
card_plot_url=[["Bibliothèque Matplotlib","https://matplotlib.org/"]]
|
||||
csv([variables]) \n -> Déclenche l'acquisition de données afin \n de génèrer un fichier de données CSV à \n l'arrêt du cycle.\n
|
||||
Les variables pouvant être suivies sont les \n mêmes que celles de la page "Données"."""
|
||||
# Blender étant cadencé à 60 fps, la fréquence \n d'acquisition est 16 ms."""
|
||||
card_plot_url=[["Bibliothèque Matplotlib","https://matplotlib.org/"],
|
||||
["Wikipedia Français : fichier CSV","https://fr.wikipedia.org/wiki/Comma-separated_values"]]
|
||||
system_card_description.update({"plot-card" : [card_plot_title, card_plot_text, card_plot_url]})
|
||||
|
||||
# Ouvrir et fermer
|
||||
@ -98,6 +100,15 @@ card_model_url=[["A4 Technologie","https://www.a4.fr"],
|
||||
["Maquette A4 Technologie","https://www.a4.fr/wiki/index.php?title=Portail_coulissant_(BE-APORT-COUL)"]]
|
||||
system_card_description.update({"model-card" : [card_model_title, card_model_text, card_model_url]})
|
||||
|
||||
# Firmata
|
||||
card_firmata_title="Protocole Firmata"
|
||||
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\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
|
||||
broche.read() \n -> Retourne la valeur de la broche.\n
|
||||
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
|
||||
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
|
||||
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})
|
||||
|
||||
# Arduino
|
||||
card_arduino_title="Arduino"
|
||||
card_arduino_text=""" Arduino une plateforme open-source de \n développement électronique basée sur le \n microcontrôleur de la famille ATmega.
|
||||
|
@ -98,10 +98,27 @@ def bp_int ():
|
||||
# Cycle
|
||||
###############################################################################
|
||||
|
||||
def get (var):
|
||||
return truncate(scene.objects['System']['time'], 3)
|
||||
|
||||
# Temporisation
|
||||
def tempo (duree):
|
||||
time.sleep(duree)
|
||||
|
||||
# t (temps)
|
||||
def truncate(n, decimals=0):
|
||||
multiplier = 10**decimals
|
||||
return int(n* multiplier)/multiplier
|
||||
|
||||
def get_t ():
|
||||
return truncate(scene.objects['System']['time'], 3)
|
||||
|
||||
def set_t (date):
|
||||
scene.objects['System']['time']=date
|
||||
|
||||
def reset_t ():
|
||||
scene.objects['System']['time']=0
|
||||
|
||||
# Arrêt
|
||||
def stop():
|
||||
if scene.objects['System']['twins']:
|
||||
|
Binary file not shown.
1
twin.py
1
twin.py
@ -509,6 +509,7 @@ def cycle_run ():
|
||||
scene.objects['System']['thread_cmd']=True
|
||||
system.system_reset()
|
||||
time.sleep(0.125)
|
||||
scene.objects['System']['time']=0
|
||||
if python_validation(scene.objects['System']['script']+'.py'):
|
||||
runpy.run_module(scene.objects['System']['script'], run_name='start') # Execution du script utilisateur
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
<data>
|
||||
<screen>
|
||||
<width>1609</width>
|
||||
<height>905</height>
|
||||
<width>1325</width>
|
||||
<height>745</height>
|
||||
<quality>1</quality>
|
||||
</screen>
|
||||
</data>
|
@ -147,9 +147,11 @@ card_description.update({"console-card" : [card_console_title, card_console_text
|
||||
|
||||
# Temps
|
||||
card_sleep_title="Gestion du temps"
|
||||
card_sleep_text=" Vous pouvez créer des temporisations \n dans le déroulement du script.\n\n"
|
||||
card_sleep_text= card_sleep_text + " time.sleep(x) \n -> Marque d'un temps d'arrêt de \n x secondes.\n\n"
|
||||
card_sleep_text= card_sleep_text + " Il faudra préalablement importer la \n bibliothèque \"time\" avec \"import time\"."
|
||||
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
|
||||
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]})
|
||||
|
||||
|
25
twin_plot.py
25
twin_plot.py
@ -22,6 +22,13 @@ scene = bge.logic.getCurrentScene()
|
||||
system=importlib.import_module(scene.objects['Doc']['system']) # Système
|
||||
plot_config = system.get_pin_config()
|
||||
|
||||
###############################################################################
|
||||
# Variable
|
||||
###############################################################################
|
||||
|
||||
def get(data):
|
||||
return scene.objects[plot_config[obj][1][0]]['activated']
|
||||
|
||||
###############################################################################
|
||||
# Création du graphique
|
||||
###############################################################################
|
||||
@ -54,9 +61,9 @@ def plot(data):
|
||||
|
||||
# Démarrer le processus
|
||||
scene.objects['System']['plot_proc'] = subprocess.Popen([sys.executable, os.path.join(os.getcwd(), "twin_plot_qt.py")], stdin=subprocess.PIPE, encoding = 'utf8', universal_newlines=True)
|
||||
# scene.objects['System']['plot_proc'] = subprocess.Popen([sys.executable, os.path.join(os.getcwd(), "twin_plot_qt.py")], stdin=subprocess.PIPE, stdout=subprocess.PIPE, encoding = 'utf8')
|
||||
# stout = scene.objects['System']['plot_proc'].communicate() # FIXME : attente du message retour pour lancer l'acquisition
|
||||
# print("Blender stout : ", stout)
|
||||
# # scene.objects['System']['plot_proc'] = subprocess.Popen([sys.executable, os.path.join(os.getcwd(), "twin_plot_qt.py")], stdin=subprocess.PIPE, stdout=subprocess.PIPE, encoding = 'utf8')
|
||||
# # stout = scene.objects['System']['plot_proc'].communicate() # FIXME : attente du message retour pour lancer l'acquisition
|
||||
# # print("Blender stout : ", stout)
|
||||
scene.objects['System']['plot']=True
|
||||
|
||||
###############################################################################
|
||||
@ -72,14 +79,14 @@ def plot_maj(cont):
|
||||
|
||||
# Affichage du graphique
|
||||
if scene.objects['System']['plot_draw']:
|
||||
if scene.objects['System']['plot_ticktime'] != truncate(scene.objects['System']['plot_time'], 0) or True:
|
||||
if scene.objects['System']['plot_time'] != truncate(scene.objects['System']['time'], 0) or True:
|
||||
|
||||
# Préparation du message
|
||||
# FIXME : ajouter les valeurs réelles et valeurs numériques ('activated_real')
|
||||
scene.objects['System']['plot_ticktime'] = truncate(scene.objects['System']['plot_time'], 0)
|
||||
scene.objects['System']['plot_time'] = truncate(scene.objects['System']['time'], 0)
|
||||
# msg=str(round(scene.objects['System']['plot_time'], 1))
|
||||
# msg=format(scene.objects['System']['plot_time'],".2f")
|
||||
msg=format(scene.objects['System']['plot_ticktime'],".2f")
|
||||
msg=format(scene.objects['System']['plot_time'],".2f")
|
||||
for obj in scene.objects['System']['plot_data']:
|
||||
if scene.objects[obj]['activated']:
|
||||
msg = msg+",1"
|
||||
@ -89,9 +96,11 @@ def plot_maj(cont):
|
||||
|
||||
# Envoi (Pipe)
|
||||
if scene.objects['System']['plot_proc'].poll()==None:
|
||||
# scene.objects['System']['plot_proc'].communicate(input=time_send.encode())[0] # Communication bloquante
|
||||
# # scene.objects['System']['plot_proc'].communicate(input=time_send.encode())[0] # Communication bloquante
|
||||
# scene.objects['System']['plot_proc'].communicate(input=msg.encode())[0] # Communication bloquante
|
||||
scene.objects['System']['plot_proc'].communicate(input=msg.encode()) # Communication bloquante
|
||||
# scene.objects['System']['plot_proc'].stdin.write(msg)
|
||||
print ("twin : ", msg)
|
||||
scene.objects['System']['plot_proc'].stdin.write(msg)
|
||||
else:
|
||||
# Arrêt
|
||||
print ("Stop")
|
||||
|
@ -63,23 +63,28 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
plt = self.canvas.subplot
|
||||
|
||||
# Données
|
||||
msg=""
|
||||
for line in sys.stdin:
|
||||
msg = line.rstrip()
|
||||
break
|
||||
print("Qt : ", msg)
|
||||
|
||||
# Essai
|
||||
# new_x=self.xdata[len(self.xdata)-1]+1
|
||||
# self.xdata.append(new_x)
|
||||
# self.ydata.append(random.randint(0, 10))
|
||||
new_x=self.xdata[len(self.xdata)-1]+1
|
||||
self.xdata.append(new_x)
|
||||
self.ydata.append(random.randint(0, 10))
|
||||
|
||||
# Lecture du Pipe simple
|
||||
msg=""
|
||||
# msg=""
|
||||
# print (sys.stdin)
|
||||
# contents = sys.stdin.read(1)
|
||||
# # contents = sys.stdin.buffer
|
||||
# print ("contents :", contents)
|
||||
|
||||
for line in sys.stdin:
|
||||
msg = line.rstrip()
|
||||
break
|
||||
print(msg)
|
||||
# for line in sys.stdin:
|
||||
# msg = line.rstrip()
|
||||
# break
|
||||
# print(msg)
|
||||
|
||||
# X et Y
|
||||
# FIXME : temps et une valeur
|
||||
|
Binary file not shown.
@ -12,7 +12,7 @@
|
||||
# Documentation du système
|
||||
################################################################################
|
||||
|
||||
system_card=["twins-card", "pin-card", "firmata-card", "plot-card", "movement-card", "sensor-card", "board-card", "model-card", "arduino-card"]
|
||||
system_card=["twins-card", "pin-card", "data-card", "plot-card", "movement-card", "sensor-card", "board-card", "model-card", "firmata-card", "arduino-card"]
|
||||
system_card_description ={}
|
||||
|
||||
# Jumeau numérique
|
||||
@ -36,26 +36,28 @@ card_pin_text=""" Le brochage est un dictionnaire qui permet \n d'associer les o
|
||||
- broche : numéro de la broche de carte,
|
||||
- mode : i (entrée), o (sortie) ou p (pwm).
|
||||
Par exemple : brochage = { 'led':['d', 3, 'o'] }.\n
|
||||
Les objets numériques du jumeau sont : \n 'bp_m', 'bp_a', 'bp_d', 'mot_m', 'mot_d', \n 'fdc_h', 'fdc_b', 'bp_auto', 'voy_auto' et 'lum'."""
|
||||
Les objets numériques du jumeau sont : \n 'bp_m', 'bp_a', 'bp_d', 'mot_m', 'mot_d', \n 'fdc_h', 'fdc_b', 'bp_auto', 'voy_auto' et 'lum'."""
|
||||
card_pin_url=[]
|
||||
system_card_description.update({"pin-card" : [card_pin_title, card_pin_text, card_pin_url]})
|
||||
|
||||
# Firmata
|
||||
card_firmata_title="Protocole Firmata"
|
||||
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\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
|
||||
broche.read() \n -> Retourne la valeur de la broche.\n
|
||||
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
|
||||
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
|
||||
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})
|
||||
# Données
|
||||
card_data_title="Accès aux données"
|
||||
card_data_text=""" get(variable) \n -> Retourne la valeur de la variable à \n l'instant t. Par exemple : val = get('bp_m').\n
|
||||
Entrées/sorties : 'bp_m', 'bp_a', 'bp_d', \n 'mot_m', 'mot_d', 'fdc_h', 'fdc_b', 'bp_auto', \n 'voy_auto', 'lum'.\n
|
||||
Variables réels (si il y a jumelage) : 'bp_m_r', \n 'bp_a_r', 'bp_d_r', 'fdc_h_r', 'fdc_b_r', \n 'bp_auto_r', 'lum_r'.\n
|
||||
Autres variables : 'mot_angle', 'mot_vitesse'."""
|
||||
card_data_url=[]
|
||||
system_card_description.update({"data-card" : [card_data_title, card_data_text, card_data_url]})
|
||||
|
||||
# Monitoring
|
||||
card_plot_title="Chronogramme"
|
||||
card_plot_text=""" plot([valeurs]) \n -> Affiche le chronogramme des valeurs \n spécifiées. Blender étant cadencé à 60 fps, \n la fréquence d'acquisition est 16 ms.
|
||||
# Monitoring
|
||||
card_plot_title="Acquisition de données"
|
||||
card_plot_text=""" plot([variables]) \n -> Affiche le chronogramme des variables \n spécifiées.
|
||||
Par exemple : plot(['bp_m', 'moteur_angle']).\n
|
||||
Les entrées/sorties peuvent être suivies : \n 'bp_m', 'bp_a', 'bp_d', 'mot_m', 'mot_d', \n 'fdc_h', 'fdc_b', 'bp_auto', 'voy_auto' et 'lum'.\n
|
||||
Les autres valeurs pouvant être suivies : \n 'moteur_angle', 'moteur_vitesse'."""
|
||||
card_plot_url=[["Bibliothèque Matplotlib","https://matplotlib.org/"]]
|
||||
csv([variables]) \n -> Déclenche l'acquisition de données afin \n de génèrer un fichier de données CSV à \n l'arrêt du cycle.\n
|
||||
Les variables pouvant être suivies sont les \n mêmes que celles de la page "Données"."""
|
||||
# Blender étant cadencé à 60 fps, la fréquence \n d'acquisition est 16 ms."""
|
||||
card_plot_url=[["Bibliothèque Matplotlib","https://matplotlib.org/"],
|
||||
["Wikipedia Français : fichier CSV","https://fr.wikipedia.org/wiki/Comma-separated_values"]]
|
||||
system_card_description.update({"plot-card" : [card_plot_title, card_plot_text, card_plot_url]})
|
||||
|
||||
# Ouvrir et fermer
|
||||
@ -79,7 +81,7 @@ card_board_text= """ bp_m() \n -> Bouton poussoir monter le volet.\n Retourne Tr
|
||||
bp_a() -> Bouton arrêt du volet.\n
|
||||
bp_d() -> Bouton descendre le volet.\n
|
||||
bp_auto() -> Bouton mode automatique.\n
|
||||
voy_auto(True | False) \n -> Activer le voyant témoin du mode\n automatique."""
|
||||
voy_auto(True | False) \n -> Activer le voyant témoin du mode\n automatique."""
|
||||
card_board_url=[]
|
||||
system_card_description.update({"board-card" : [card_board_title, card_board_text, card_board_url]})
|
||||
|
||||
@ -92,6 +94,15 @@ card_model_url=[["A4 Technologie","https://www.a4.fr"],
|
||||
["Maquette A4 Technologie","https://www.a4.fr/wiki/index.php?title=Volet_roulant"]]
|
||||
system_card_description.update({"model-card" : [card_model_title, card_model_text, card_model_url]})
|
||||
|
||||
# Firmata
|
||||
card_firmata_title="Protocole Firmata"
|
||||
card_firmata_text=""" Firmata est le protocole de \n communication entre les deux jumeaux.\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
|
||||
broche.read() \n -> Retourne la valeur de la broche.\n
|
||||
broche.write(valeur) \n -> Écrire la valeur sur la broche."""
|
||||
card_firmata_url=[["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]]
|
||||
system_card_description.update({"firmata-card" : [card_firmata_title, card_firmata_text, card_firmata_url]})
|
||||
|
||||
# Arduino
|
||||
card_arduino_title="Arduino"
|
||||
card_arduino_text=""" Arduino une plateforme open-source de \n développement électronique basée sur le \n microcontrôleur de la famille ATmega.
|
||||
|
@ -102,11 +102,26 @@ def bp_auto ():
|
||||
def tempo (duree):
|
||||
time.sleep(duree)
|
||||
|
||||
# t (temps)
|
||||
def truncate(n, decimals=0):
|
||||
multiplier = 10**decimals
|
||||
return int(n* multiplier)/multiplier
|
||||
|
||||
def get_t ():
|
||||
return truncate(scene.objects['System']['time'], 3)
|
||||
|
||||
def set_t (date):
|
||||
scene.objects['System']['time']=date
|
||||
|
||||
def reset_t ():
|
||||
scene.objects['System']['time']=0
|
||||
|
||||
# Arrêt
|
||||
def stop():
|
||||
if scene.objects['System']['twins']:
|
||||
serial_close(scene.objects['System']['board'])
|
||||
time.sleep(1)
|
||||
scene.objects['System']['plot_draw']=False
|
||||
thread_cmd_stop()
|
||||
|
||||
# Fin naturelle
|
||||
@ -114,6 +129,7 @@ def end():
|
||||
if scene.objects['System']['twins']:
|
||||
serial_close(scene.objects['System']['board'])
|
||||
time.sleep(1)
|
||||
scene.objects['System']['plot_draw']=False
|
||||
thread_cmd_end()
|
||||
|
||||
def fin():
|
||||
@ -121,3 +137,4 @@ def fin():
|
||||
|
||||
def quit():
|
||||
end()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user