Modification de la vitesse du moteur numérique pour le monte-charge

This commit is contained in:
Philippe Roy 2023-01-19 15:35:57 +01:00
parent 1028e85f38
commit ddb3ffe0cc
12 changed files with 149 additions and 56 deletions

View File

@ -18,7 +18,7 @@ scene = bge.logic.getCurrentScene()
# Configuration des variables publiques
# 'nom_variable' :
# - Objet 3D : [nom de l'objet 3D, propriété du stockage de la valeur (activate ou activated_real)]
# - Objet 3D : [nom de l'objet 3D, propriété du stockage de la valeur (activate ou activated_real), échelle (1 si ommis)]
# - Configuration de la broche : [nom de la propriété stockant l'object broche (pyfirmata), type de broche par défaut('d','a' ou 'p'), 'mode de la broche par défaut ('i' ou 'o')]
# - Configuration du graphique : ['marque', 'type de ligne', 'couleur', linewidth]] (matplotlib)
#
@ -27,6 +27,7 @@ scene = bge.logic.getCurrentScene()
# Ce distinguo ne concerne que les entrées, les sorties réelles sont forcées par les sorties numériques et vice-versa.
public_vars = {
't' : [['System','time'], [], []],
'voy_0' : [['Led niveau 0','activated'], ['pin', 'd','o'], []],
'voy_1' : [['Led niveau 1','activated'], ['pin', 'd','o'], []],
'pc_0' : [['Microrupteur niveau 0','activated_real'], [], []],
@ -38,7 +39,13 @@ public_vars = {
'ba_1' : [['Bp niveau 1','activated'], ['pin', 'd','i'], []],
'ba_1_r' : [['Bp niveau 1','activated_real'], [], []],
'mot_m' : [['Moteur','up',], ['pin_up', 'd','o'], []],
'mot_d' : [['Moteur','down'], ['pin_down', 'd','o'], []]}
'mot_d' : [['Moteur','down'], ['pin_down', 'd','o'], []],
'mot_angle' : [['Moteur','alpha'], [], []],
'mot_vitesse' : [['Moteur','speed'], [], []],
'mot_pas' : [['Moteur','step'], [], []],
'cabine_z' : [['Cabine','z', 1/0.333], [], []],
'cabine_vitesse' : [['Cabine','speed', 1/0.333], [], []],
'cabine_pas' : [['Cabine','step', 1/0.333], [], []]}
# Couleurs
color_passive = (0.800, 0.005, 0.315,1) # bouton non activable : magenta
@ -120,24 +127,36 @@ def get_public_vars():
def mot (cont):
if scene.objects['System']['run']:
fps = 60 # frame per second
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
obj_cable = scene.objects['Cable'] # FIXME : animation du cable -> plus tard
# Roue et vis sans fin
z = 48 # nb dents pignon
diam_axe = 3 # diamètre de l'axe moteur
obj['step']= obj['speed_setting'] / fps # Vitesse du moteur numérique : 1,3 rad /s par défaut
obj_pignon['step'] = obj['step'] / z
obj_cabine['step'] = obj_pignon['step'] * (math.pi*diam_axe)
# Monter
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)
# Physique
obj_vissansfin.applyRotation((0, 0, obj['step']), True)
obj['alpha']= obj['alpha']+obj['step']
if scene.objects['System']['time'] != obj['last_time']:
obj['speed']= (obj['step'])/(scene.objects['System']['time']-obj['last_time'])
obj_pignon.applyRotation((obj_pignon['step'], 0, 0), True)
obj_cabine.applyMovement((0, 0, obj_cabine['step']), True)
obj_cabine['z']= obj_cabine['z']+obj_cabine['step'] # Echelle pas pris en compte
if scene.objects['System']['time'] != obj['last_time']:
obj_cabine['speed']= obj_cabine['step']/(scene.objects['System']['time']-obj['last_time'])
obj_contrepoids.applyMovement((0, 0, -obj_cabine['step']), True)
obj['last_time'] = scene.objects['System']['time']
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
@ -149,14 +168,35 @@ def mot (cont):
# Descendre
# 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)
# Physique
obj_vissansfin.applyRotation((0, 0, -obj['step']), True)
obj['alpha']= obj['alpha']-obj['step']
if scene.objects['System']['time'] != obj['last_time']:
obj['speed']= (-obj['step'])/(scene.objects['System']['time']-obj['last_time'])
obj_pignon.applyRotation((-obj_pignon['step'], 0, 0), True)
obj_cabine.applyMovement((0, 0, -obj_cabine['step']), True)
obj_cabine['z']= obj_cabine['z']-obj_cabine['step'] # Echelle pas pris en compte
if scene.objects['System']['time'] != obj['last_time']:
obj_cabine['speed']= -obj_cabine['step']/(scene.objects['System']['time']-obj['last_time'])
obj_contrepoids.applyMovement((0, 0, obj_cabine['step']), True)
obj['last_time'] = scene.objects['System']['time']
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
if scene.objects['Moteur']['pin_d'] is not None:
if scene.objects['Moteur']['pin_m'] is not None:
scene.objects['Moteur']['pin_m'].write(0)
scene.objects['Moteur']['pin_d'].write(1)
# Arrêter
if obj['up']== False and obj['down'] == False :
# Physique
obj['speed']= 0
obj_cabine['speed']= 0
obj['last_time'] = scene.objects['System']['time']
# Modele 3D -> Arduino
if scene.objects['System']['twins']:
if scene.objects['Moteur']['pin_d'] is not None:
@ -274,4 +314,10 @@ def system_reset ():
scene.objects['Microrupteur niveau 1']['activated_real']=False
scene.objects['Moteur']['up']=False
scene.objects['Moteur']['down']=False
scene.objects['Moteur']['alpha']=0
scene.objects['Moteur']['speed']=0
scene.objects['Moteur']['speed_setting']=31.4 # Vitesse du moteur numérique : 31,4 rad /s ( 5 tr / s )
scene.objects['Moteur']['step']=0
scene.objects['Cabine']['z']=0
scene.objects['Cabine']['speed']=0
scene.objects['Cabine']['step']=0

View File

@ -39,15 +39,52 @@ from montchg_lib import * # Bibliothèque utilisateur du monte-charge
def commandes():
# Ecrire votre code ici ...
while True:
# Init -> Descendre
while pc_0() ==False :
voy_0(True)
voy_1(False)
tempo(0.5)
voy_0(False)
mot_m(False)
mot_d(True)
mot_d(False)
voy_0(False)
print ("")
# Monter
mot_digitset (500)
t0,z0, a0= get('t'), get('cabine_z'), get('mot_angle')
print ("Début monter : cabine_z : "+str(round(z0,3)) + " - mot_angle : " + str(round(a0,3)))
while pc_1() ==False :
voy_1(True)
tempo(0.5)
mot_d(False)
mot_m(True)
mot_pas, mot_vitesse, cabine_pas, cabine_vitesse= get('mot_pas'), get('mot_vitesse'), get('cabine_pas'), get('cabine_vitesse')
mot_m(False)
voy_1(False)
t1,z1, a1= get('t'), get('cabine_z'), get('mot_angle')
print ("Fin monter : cabine_z : "+str(round(z1,3)) + " - mot_angle : " + str(round(a1,3)))
print ("")
print ("Monter : "+str(round(t1-t0,3)) +" s - distance : " +str(round(z1-z0,3))+" mm - angle : " +str(round(a1-a0,3))+
" rad - cabine_vitesse : " +str(round(cabine_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
" rad/s - cabine_pas : " +str(round(cabine_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
print ("")
# Descendre
mot_digitset () # 5 tr/s
t0,z0, a0= get('t'), get('cabine_z'), get('mot_angle')
print ("Début descendre : cabine_z : "+str(round(z0,3)) + " - mot_angle : " + str(round(a0,3)))
while pc_0() ==False :
voy_0(True)
mot_m(False)
mot_d(True)
mot_pas, mot_vitesse, cabine_pas, cabine_vitesse= get('mot_pas'), get('mot_vitesse'), get('cabine_pas'), get('cabine_vitesse')
mot_d(False)
voy_0(False)
t1,z1, a1= get('t'), get('cabine_z'), get('mot_angle')
print ("Fin descendre : cabine_z : "+str(round(z1,3)) + " - mot_angle : " + str(round(a1,3)))
print ("")
print ("Descendre : "+str(round(t1-t0,3)) +" s - distance : " +str(round(z1-z0,3))+" mm - angle : " +str(round(a1-a0,3))+
" rad - cabine_vitesse : " +str(round(cabine_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
" rad/s - cabine_pas : " +str(round(cabine_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
fin() # A garder

View File

@ -1,6 +1,7 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
from twin_plot import plot, get # Visualisation des données
import time
###############################################################################
@ -46,6 +47,13 @@ def mot_m (order):
def mot_d (order):
scene.objects['Moteur']['down']=order
# Réglage de la vitesse du moteur numérique
def mot_digitset (speed=None):
if speed==None:
scene.objects['Moteur']['speed_setting']=31.4 # Vitesse du moteur numérique : 31,4 rad /s ( 5 tr / s )
else:
scene.objects['Moteur']['speed_setting']=speed
###############################################################################
# Capteurs
###############################################################################
@ -96,7 +104,8 @@ def truncate(n, decimals=0):
return int(n* multiplier)/multiplier
def get_t ():
return truncate(scene.objects['System']['time'], 3)
# return truncate(scene.objects['System']['time'], 3)
return round(scene.objects['System']['time'], 3)
def set_t (date):
scene.objects['System']['time']=date

Binary file not shown.

View File

@ -122,22 +122,26 @@ def get_public_vars():
def mot (cont):
if scene.objects['System']['run']:
fps = 60 # frame per second
obj = cont.owner
obj_engrenage = scene.objects['Engrenage']
obj_portail = scene.objects['Portail']
# Réducteur
r = 1/100 # Rapport de réduction
# Crémaillaire
fps = 60 # frame per second
pas_dent = 7.85 # 7.85 mm soit 2.35 m (bender)
z = 14 # nb dents
obj['step']= scene.objects['Moteur']['speed_setting'] / fps # Vitesse du moteur numérique : 1,3 rad /s par défaut
obj_portail['step'] = (pas_dent * z)/(2*math.pi) * obj['step']
obj['step']= obj['speed_setting'] / fps # Vitesse du moteur numérique : 1,3 rad /s par défaut
obj_engrenage['step']= obj['step'] * r
obj_portail['step'] = obj_engrenage['step'] * (pas_dent * z)/(2*math.pi)
# Ouvrir
if obj['open']:
# Physique
obj_engrenage.applyRotation((0, 0, -obj['step']), True)
obj_engrenage.applyRotation((0, 0, -obj_engrenage['step']), True)
obj['alpha']= obj['alpha']-obj['step']
if scene.objects['System']['time'] != obj['last_time']:
obj['speed']= (-obj['step'])/(scene.objects['System']['time']-obj['last_time'])
@ -159,7 +163,7 @@ def mot (cont):
if obj['close']:
# Physique
obj_engrenage.applyRotation((0, 0, obj['step']), True)
obj_engrenage.applyRotation((0, 0, obj_engrenage['step']), True)
obj['alpha']= obj['alpha']+obj['step']
if scene.objects['System']['time'] != obj['last_time']:
obj['speed']= (obj['step'])/(scene.objects['System']['time']-obj['last_time'])
@ -396,7 +400,7 @@ def system_reset ():
scene.objects['Moteur']['close']=False
scene.objects['Moteur']['alpha']=0
scene.objects['Moteur']['speed']=0
scene.objects['Moteur']['speed_setting']=1.3 # Vitesse du moteur numérique : 1,3 rad /s
scene.objects['Moteur']['speed_setting']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s )
scene.objects['Moteur']['step']=0
scene.objects['Portail']['x']=0
scene.objects['Portail']['speed']=0

View File

@ -28,9 +28,6 @@ from porcou_lib import * # Bibliothèque utilisateur du portail coulissant
#
###############################################################################
# Brochage du portail coulissant
brochage={}
###############################################################################
# Fonctions
###############################################################################
@ -48,12 +45,12 @@ def commandes():
mot_o(True)
mot_o(False)
gyr(False)
print ("")
# Fermeture
mot_digitset (10) # 1,3 rad/s par défaut
tf_d,xf_d, af_d= get('t'), get('portail_x'), get('mot_angle')
print ("Début fermeture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
mot_digitset (1256) # Vitesse par défaut 125,6 rad /s ( 20 tr / s )
t0,x0, a0= get('t'), get('portail_x'), get('mot_angle')
print ("Début fermeture : portail_x : "+str(round(x0,3)) + " - mot_angle : " + str(round(a0,3)))
while fdc_f() ==False :
gyr(True)
mot_o(False)
@ -61,19 +58,18 @@ def commandes():
mot_pas, mot_vitesse, portail_pas, portail_vitesse= get('mot_pas'), get('mot_vitesse'), get('portail_pas'), get('portail_vitesse')
mot_f(False)
gyr(False)
mot_digitset () # 1,3 rad/s par défaut
print ("Fin fermeture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
tf_f,xf_f, af_f= get('t'), get('portail_x'), get('mot_angle')
t1,x1, a1= get('t'), get('portail_x'), get('mot_angle')
print ("Fin fermeture : portail_x : "+str(round(x1,3)) + " - mot_angle : " + str(round(a1,3)))
print ("")
print ("Fermeture : "+str(round(tf_f-tf_d,3)) +" s - distance : " +str(round(xf_f-xf_d,3))+" mm - angle : " +str(round(af_f-af_d,3))+
print ("Fermeture : "+str(round(t1-t0,3)) +" s - distance : " +str(round(x1-x0,3))+" mm - angle : " +str(round(a1-a0,3))+
" rad - portail_vitesse : " +str(round(portail_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
" rad/s - portail_pas : " +str(round(portail_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")
print ("")
# Ouverture
print ("")
to_d,xo_d, ao_d= get('t'), get('portail_x'), get('mot_angle')
print ("Début ouverture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
mot_digitset () # Vitesse par défaut 125,6 rad /s ( 20 tr / s )
t0,x0, a0= get('t'), get('portail_x'), get('mot_angle')
print ("Début ouverture : portail_x : "+str(round(x0,3)) + " - mot_angle : " + str(round(a0,3)))
while fdc_o() ==False :
gyr(True)
mot_f(False)
@ -81,10 +77,10 @@ def commandes():
mot_pas, mot_vitesse, portail_pas, portail_vitesse= get('mot_pas'), get('mot_vitesse'), get('portail_pas'), get('portail_vitesse')
mot_o(False)
gyr(False)
print ("Fin ouverture : portail_x : "+str(round(get('portail_x'),3)) + " - mot_angle : " + str(round(get('mot_angle'),3)))
to_f,xo_f, ao_f= get('t'), get('portail_x'), get('mot_angle')
t1,x1, a1= get('t'), get('portail_x'), get('mot_angle')
print ("Fin ouverture : portail_x : "+str(round(x1,3)) + " - mot_angle : " + str(round(a1,3)))
print ("")
print ("Ouverture : "+str(round(to_f-to_d,3)) +" s - distance : " +str(round(xo_f-xo_d,3))+" mm - angle : " +str(round(ao_f-ao_d,3))+
print ("Ouverture : "+str(round(t1-t0,3)) +" s - distance : " +str(round(x1-x0,3))+" mm - angle : " +str(round(a1-a0,3))+
" rad - portail_vitesse : " +str(round(portail_vitesse,3))+" mm/s - moteur_vitesse : " +str(round(mot_vitesse,3))+
" rad/s - portail_pas : " +str(round(portail_pas,3))+" mm/impulsion - moteur_pas : " +str(round(mot_pas,3))+" rad/impulsion")

View File

@ -1,10 +1,7 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
import subprocess # Multiprocessus
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading (multitâches)
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
from twin_plot import plot, get # Visualisation des données
import os
import sys
import time
###############################################################################
@ -49,7 +46,7 @@ def mot_f (order):
# Réglage de la vitesse du moteur numérique
def mot_digitset (speed=None):
if speed==None:
scene.objects['Moteur']['speed_setting']=1.3 # 1,3 rad/s par défaut
scene.objects['Moteur']['speed_setting']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s )
else:
scene.objects['Moteur']['speed_setting']=speed

View File

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

View File

@ -28,7 +28,10 @@ plot_config = system.get_public_vars()
def get(data):
if data in plot_config:
return(scene.objects[plot_config[data][0][0]][plot_config[data][0][1]])
if len (plot_config[data][0])>2: # Echelle à prendre en compte
return(scene.objects[plot_config[data][0][0]][plot_config[data][0][1]]*plot_config[data][0][2])
else:
return(scene.objects[plot_config[data][0][0]][plot_config[data][0][1]])
else:
print ("Erreur sur l'accès aux variables par get("+data+"), la variable '"+data+"' absente du système.")
return None

Binary file not shown.

View File

@ -1,6 +1,7 @@
import bge # Bibliothèque Blender Game Engine (UPBGE)
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
from twin_plot import plot, get # Visualisation des données
import time
###############################################################################