Documentation sur la lecture et acquisition de données

This commit is contained in:
Philippe Roy 2023-01-18 06:06:15 +01:00
parent 70125297bf
commit 9fec0d0c86
19 changed files with 225 additions and 99 deletions

View 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

View 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

View 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

View File

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

View File

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

View File

@ -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']:

View File

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

View File

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

View File

@ -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']:

View File

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

View File

@ -1,7 +1,7 @@
<data>
<screen>
<width>1609</width>
<height>905</height>
<width>1325</width>
<height>745</height>
<quality>1</quality>
</screen>
</data>

View File

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

View File

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

View File

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

View File

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

View File

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