Mise en place du pilotage moteur par le shield moteur

This commit is contained in:
Philippe Roy 2024-01-18 04:08:18 +01:00
parent 7265897730
commit a17496d7d4
12 changed files with 192 additions and 52 deletions

View File

@ -26,6 +26,8 @@ scene = bge.logic.getCurrentScene()
# 'nom_variable_r' est la valeur réelle de la variable (valeur numérique) 'nom_variable' issue du jumelage numérique.
# Dans ce cas, il n'y a pas configuration de broche car elle est présente sur la variable 'nom_variable'.
# Ce distinguo ne concerne que les entrées, car les sorties sont pilotées par le numérique.
#
# 'mot_s' et 'mot_v' ne concernent que la maquette Grove (variante 1)
public_vars = {
't' : [['System','time','a'], [], []],
@ -41,6 +43,8 @@ public_vars = {
'ba_1_r' : [['Bp niveau 1','activated_real','d'], [], []],
'mot_m' : [['Moteur','up','d'], ['pin_up', 'd','o'], []],
'mot_d' : [['Moteur','down','d'], ['pin_down', 'd','o'], []],
'mot_s' : [['Moteur','direction','d'],['pin_direction','d','o'], []],
'mot_v' : [['Moteur','speed_real','a'],['pin_speed','p','o'], []],
'mot_angle' : [['Moteur','alpha','a'], [], []],
'mot_vitesse' : [['Moteur','speed','a'], [], []],
'mot_pas' : [['Moteur','step','a'], [], []],
@ -122,6 +126,16 @@ def get_public_vars():
# Actionneurs
###############################################################################
##
# Pour la commande du moteur de la variante 1 version Grove , le brochage du shield moteur CC 4 x 1,2 A DRI0039 (DFROBOT) est fixe,
# il doit respecter le tableau suivant :
# Motor Direction(Forward/Backward) Speed Speed range
# M1 4 LOW HIGH 3 0-255
# M2 12 HIGH LOW 11 0-255
# M3 8 LOW HIGH 5 0-255
# M4 7 HIGH LOW 6 0-255
##
##
# Moteur et cabine
##
@ -162,10 +176,20 @@ def mot (cont):
# Modele 3D -> Arduino
if scene.objects['System']['twins'] and obj['prior_real']:
if scene.objects['Moteur']['pin_up'] is not None:
if scene.objects['Moteur']['pin_down'] is not None:
scene.objects['Moteur']['pin_down'].write(0)
scene.objects['Moteur']['pin_up'].write(1)
# Version Grove
if scene.objects['System']['variant'] == 1:
if scene.objects['Moteur']['pin_direction'] is not None:
if scene.objects['Moteur']['pin_speed'] is not None:
scene.objects['Moteur']['pin_direction'].write(1)
scene.objects['Moteur']['pin_speed'].write(scene.objects['Moteur']['speed_real_setting']/255)
# Version AutoProg
if scene.objects['System']['variant'] == 2:
if scene.objects['Moteur']['pin_up'] is not None:
if scene.objects['Moteur']['pin_down'] is not None:
scene.objects['Moteur']['pin_down'].write(0)
scene.objects['Moteur']['pin_up'].write(1)
# Descendre
# else: # Pas de priorité
@ -187,10 +211,20 @@ def mot (cont):
# Modele 3D -> Arduino
if scene.objects['System']['twins'] and obj['prior_real']:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(1)
# Version Grove
if scene.objects['System']['variant'] == 1:
if scene.objects['Moteur']['pin_direction'] is not None:
if scene.objects['Moteur']['pin_speed'] is not None:
scene.objects['Moteur']['pin_direction'].write(0)
scene.objects['Moteur']['pin_speed'].write(scene.objects['Moteur']['speed_real_setting']/255)
# Version AutoProg
if scene.objects['System']['variant'] == 2:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(1)
# Arrêter
if obj['up']== False and obj['down'] == False :
@ -203,11 +237,20 @@ def mot (cont):
# Modele 3D -> Arduino
if scene.objects['System']['twins'] and obj['prior_real']:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(0)
# Version Grove
if scene.objects['System']['variant'] == 1:
if scene.objects['Moteur']['pin_direction'] is not None:
if scene.objects['Moteur']['pin_speed'] is not None:
scene.objects['Moteur']['pin_direction'].write(0)
scene.objects['Moteur']['pin_speed'].write(0)
# Version AutoProg
if scene.objects['System']['variant'] == 2:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(0)
###############################################################################
# Capteurs
@ -320,6 +363,7 @@ def system_reset ():
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']['speed_real_setting']=255 # Vitesse du moteur réel sur maquette Grove
scene.objects['Moteur']['step']=0
# Priorités activées

View File

@ -101,6 +101,13 @@ def commandes():
# Fr: Appel externe << NE PAS MODIFIER CETTE SECTION >>
###############################################################################
###
# Variante 1 : Maquette Grove
# - Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# Variante 2 : Maquette AutoProg
# - Maquette AutoProg (A4 Technologie) : la carte moteur est le module AutoProg K-AP-MMOT-KIT
###
def cycle():
commandes()
fin()
@ -109,3 +116,5 @@ if __name__=='start':
start(cycle)
if __name__=='stop':
stop()
if __name__=='init':
variant(1) # Variante maquette Grove

View File

@ -131,6 +131,26 @@ def reset_t ():
def start(fct):
twin_threading.start(threads_cmd, "commands", fct)
##
# Variante
#
# La variante 1 appelée 'version Grove' : correspond à la maquette auto-construite basée sur des modules Grove
# La variante 2 appelée 'version AutoProg' : correspond à la maquette de 4A technologie basée sur des modules AutoProg
#
# Au niveau de la commande, la différence sur entre les deux variantes est uniquement sur la commande moteur :
# - variante 1 : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# - variante 2 : la carte moteur est le module AutoProg K-AP-MMOT-KIT
#
# Configuration des variantes du modèle 3D -> variant_dict :
# 'nom de l'objet 3D' : liste des variantes où l'objet est présent.
# Les objets hors dictionnaire sont présent quelque soit la variante sélectionnée.
##
def variant(variant_num):
if variant_num != scene.objects['System']['variant']:
print ("Variante de la maquette numérique :", variant_num)
scene.objects['System']['variant']=variant_num
##
# Arrêt
##

Binary file not shown.

View File

@ -28,8 +28,7 @@ scene = bge.logic.getCurrentScene()
# Dans ce cas, il n'y a pas configuration de broche car elle est présente sur la variable 'nom_variable'.
# Ce distinguo ne concerne que les entrées, car les sorties sont pilotées par le numérique.
#
# 'mot_s' et 'mot_v' ne concernent que la maquette Grove (variante 1, par défaut)
# 'mot_o' et 'mot_f' ne concernent que la maquette AutoProg (variante 2)
# 'mot_s' et 'mot_v' ne concernent que la maquette Grove (variante 1)
public_vars = {
't' : [['System','time','a'],[],[]],
@ -122,6 +121,7 @@ def get_public_vars():
# Actionneurs
###############################################################################
##
# Pour la commande du moteur de la variante 1 version Grove , le brochage du shield moteur CC 4 x 1,2 A DRI0039 (DFROBOT) est fixe,
# il doit respecter le tableau suivant :
# Motor Direction(Forward/Backward) Speed Speed range
@ -129,6 +129,7 @@ def get_public_vars():
# M2 12 HIGH LOW 11 0-255
# M3 8 LOW HIGH 5 0-255
# M4 7 HIGH LOW 6 0-255
##
##
# Moteur et portail

View File

@ -140,12 +140,15 @@ def commandes():
###############################################################################
# En: External call << DONT CHANGE THIS SECTION >>
# Fr: Appel externe << NE PAS MODIFIER CETTE SECTION >>
#
# Variante 1 (par défaut) : Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# Variante 2 : Maquette AutoProg (A4 Technologie) : la carte moteur est le module AutoProg K-AP-MMOT-KIT
#
###############################################################################
###
# Variante 1 : Maquette Grove
# - Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# Variante 2 : Maquette AutoProg
# - Maquette AutoProg (A4 Technologie) : la carte moteur est le module AutoProg K-AP-MMOT-KIT
###
def cycle():
commandes()
fin()

View File

@ -148,7 +148,7 @@ def start(fct):
##
# Variante
#
# La variante 1 (par défaut) appelée 'version Grove' : correspond à la maquette auto-construite basée sur des modules Grove
# La variante 1 appelée 'version Grove' : correspond à la maquette auto-construite basée sur des modules Grove
# La variante 2 appelée 'version AutoProg' : correspond à la maquette de 4A technologie basée sur des modules AutoProg
#
# Au niveau de la commande, la différence sur entre les deux variantes est uniquement sur la commande moteur :
@ -165,17 +165,6 @@ def variant(variant_num):
print ("Variante de la maquette numérique :", variant_num)
scene.objects['System']['variant']=variant_num
# FIXME : Affichage de la maquette Grove -> plus tards
# variant_dict = {'Bp auto':[1], 'Bg auto':[2], 'Bg auto-on':[2]}
# variant_list = list(variant_dict)
# for name in variant_list:
# if variant_num in variant_dict[name]:
# scene.objects[name].setVisible(True,True)
# scene.objects[name].restorePhysics()
# else:
# scene.objects[name].setVisible(False,True)
# scene.objects[name].suspendPhysics()
##
# Arrêt
##

Binary file not shown.

View File

@ -27,6 +27,8 @@ scene = bge.logic.getCurrentScene()
# 'nom_variable_r' est la valeur réelle de la variable (valeur numérique) 'nom_variable' issue du jumelage numérique.
# Dans ce cas, il n'y a pas configuration de broche car elle est présente sur la variable 'nom_variable'.
# Ce distinguo ne concerne que les entrées, car les sorties sont pilotées par le numérique.
#
# 'mot_s' et 'mot_v' ne concernent que la maquette Grove (variante 1 et 2)
public_vars = {
't' : [['System','time','a'], [], []],
@ -42,6 +44,8 @@ public_vars = {
'bp_a_r' : [['Bp arret','activated_real','d'], [], []],
'mot_m' : [['Moteur','up','d'], ['pin_up', 'd','o'], []],
'mot_d' : [['Moteur','down','d'], ['pin_down', 'd','o'], []],
'mot_s' : [['Moteur','direction','d'],['pin_direction','d','o'], []],
'mot_v' : [['Moteur','speed_real','a'],['pin_speed','p','o'], []],
'mot_angle' : [['Moteur','alpha','a'], [], []],
'mot_vitesse' : [['Moteur','speed','a'], [], []],
'mot_pas' : [['Moteur','step','a'], [], []],
@ -116,6 +120,16 @@ def get_public_vars():
# Actionneurs
###############################################################################
##
# Pour la commande du moteur des variantes 1 et 2 version Grove , le brochage du shield moteur CC 4 x 1,2 A DRI0039 (DFROBOT) est fixe,
# il doit respecter le tableau suivant :
# Motor Direction(Forward/Backward) Speed Speed range
# M1 4 LOW HIGH 3 0-255
# M2 12 HIGH LOW 11 0-255
# M3 8 LOW HIGH 5 0-255
# M4 7 HIGH LOW 6 0-255
##
##
# Moteur et volet
##
@ -210,10 +224,20 @@ def mot (cont):
# Modele 3D -> Arduino
if scene.objects['System']['twins'] and obj['prior_real']:
if scene.objects['Moteur']['pin_up'] is not None:
if scene.objects['Moteur']['pin_down'] is not None:
scene.objects['Moteur']['pin_down'].write(0)
scene.objects['Moteur']['pin_up'].write(1)
# Version Grove
if scene.objects['System']['variant'] == 1 or scene.objects['System']['variant'] == 2:
if scene.objects['Moteur']['pin_direction'] is not None:
if scene.objects['Moteur']['pin_speed'] is not None:
scene.objects['Moteur']['pin_direction'].write(1)
scene.objects['Moteur']['pin_speed'].write(scene.objects['Moteur']['speed_real_setting']/255)
# Version AutoProg
if scene.objects['System']['variant'] == 3:
if scene.objects['Moteur']['pin_up'] is not None :
if scene.objects['Moteur']['pin_down'] is not None:
scene.objects['Moteur']['pin_down'].write(0)
scene.objects['Moteur']['pin_up'].write(1)
# Descendre
if obj['down']:
@ -305,10 +329,20 @@ def mot (cont):
# Modele 3D -> Arduino
if scene.objects['System']['twins'] and obj['prior_real']:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(1)
# Version Grove
if scene.objects['System']['variant'] == 1 or scene.objects['System']['variant'] == 2:
if scene.objects['Moteur']['pin_direction'] is not None:
if scene.objects['Moteur']['pin_speed'] is not None:
scene.objects['Moteur']['pin_direction'].write(0)
scene.objects['Moteur']['pin_speed'].write(scene.objects['Moteur']['speed_real_setting']/255)
# Version AutoProg
if scene.objects['System']['variant'] == 3:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(1)
# Arrêt
if obj['up'] == False and obj['down'] == False:
@ -340,10 +374,20 @@ def mot (cont):
# Modele 3D -> Arduino
if scene.objects['System']['twins'] and obj['prior_real']:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(0)
# Version Grove
if scene.objects['System']['variant'] == 1 or scene.objects['System']['variant'] == 2:
if scene.objects['Moteur']['pin_direction'] is not None:
if scene.objects['Moteur']['pin_speed'] is not None:
scene.objects['Moteur']['pin_direction'].write(0)
scene.objects['Moteur']['pin_speed'].write(0)
# Version AutoProg
if scene.objects['System']['variant'] == 3:
if scene.objects['Moteur']['pin_down'] is not None:
if scene.objects['Moteur']['pin_up'] is not None:
scene.objects['Moteur']['pin_up'].write(0)
scene.objects['Moteur']['pin_down'].write(0)
###############################################################################
# Capteurs fin de course
@ -457,6 +501,7 @@ def system_reset ():
scene.objects['Moteur']['last_alpha']=0
scene.objects['Moteur']['speed']=0
scene.objects['Moteur']['speed_setting']=125.6 # Vitesse du moteur numérique : 125.6 rad /s ( 20 tr / s )
scene.objects['Moteur']['speed_real_setting']=255 # Vitesse du moteur réel sur maquette Grove
scene.objects['Moteur']['step']=0
scene.objects['Axe enrouleur']['last_alpha']=scene.objects['Axe enrouleur'].worldOrientation.to_euler().x
obj = scene.objects['Moteur']

View File

@ -11,6 +11,8 @@ from volrou_lib import * # Bibliothèque volet roulant
# Actions (ordre = True ou False) :
# - Monter le volet (moteur sens trigo) : mot_m(True | False)
# - Descendre le volet (moteur sens horaire) : mot_d(True | False)
# - Définir la vitesse du moteur jumeau numérique : mot_vitesse (vitesse) , vitesse en rad / s, si vitesse est omis la valeur par défaut est 125.6 rad /s ( 20 tr / s ))
# - Définir la vitesse du moteur jumeau réel : mot_vitesse_r (vitesse) , vitesse de 0 à 255, la valeur par défaut est 255 (uniquement sur la maquette Grove)
#
# Capteurs :
# - Capteur fin de course volet en haut : fdc_h() : valeur retournée = True ou False
@ -28,6 +30,17 @@ from volrou_lib import * # Bibliothèque volet roulant
#
# Gestion du temps :
# - Temporisation en seconde : tempo(duree)
# - Réinitialisation de la valeur du temp (t) : reset_t()
#
# Acquisition de données :
# - Retourne la valeur de la variable à l'instant : get(variable)
# - Lancer l'enregistrement : daq([variable1, variable2, ... ])
# - Afficher les graphiques : plot([variable1, variable2, ... ])
# Jumelage :
# - Démarrer le jumelage : jumeau({brochage})
# - Arrêter le jumelage : jumeau_stop({brochage})
# - Définir les règles d'activation : jumeau_mode({brochage})
#
###############################################################################
@ -136,16 +149,23 @@ def commandes():
mot_d(False)
presence_lum_tempo=0
###############################################################################
# En: External call << DONT CHANGE THIS SECTION >>
# Fr: Appel externe << NE PAS MODIFIER CETTE SECTION >>
#
# Variante 1 : Le mode automatique s'active avec le bouton poussoir bp_auto et se désactive avec l'appui sur bp_m, bp_a ou bp_d.
# Variante 2 : Le mode automatique s'active et se désactive avec le bouton à glissière bg_auto.
#
###############################################################################
###
# Variante 1 : Maquette Grove + bouton auto à glissière :
# - Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# - Le mode automatique s'active et se désactive avec le bouton à glissière bg_auto
# Variante 2 : Maquette Grove + bouton auto poussoir :
# - Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# - Le mode automatique s'active avec le bouton poussoir bp_auto et se désactive avec l'appui sur bp_m, bp_a ou bp_d.
# Variante 3 : Maquette AutoProg + bouton auto poussoir :
# - Maquette AutoProg (A4 Technologie) : la carte moteur est le module AutoProg K-AP-MMOT-KIT
# - Le mode automatique s'active avec le bouton poussoir bp_auto et se désactive avec l'appui sur bp_m, bp_a ou bp_d.
###
def cycle():
commandes()
fin()
@ -155,4 +175,4 @@ if __name__=='start':
if __name__=='stop':
stop()
if __name__=='init':
variant(1) # Variante 1 de la maquette 3D du volet roulant
variant(1) # Variante maquette Grove avec bouton à glissière

View File

@ -156,10 +156,17 @@ def start(fct):
# Variante
#
# Variante 0 : valeur par défaut : boutons 'bp_auto' et 'bg_auto' absents -> il faut donc définir obligatoirement la variante.
# Variante 1 : Le mode automatique s'active avec le bouton poussoir 'bp_auto' et se désactive avec l'appui sur 'bp_m', 'bp_a' ou 'bp_d'.
# Variante 2 : Le mode automatique s'active et se désactive avec le bouton à glissière 'bg_auto'.
# Variante 1 : Maquette Grove + bouton auto à glissière :
# - Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# - Le mode automatique s'active et se désactive avec le bouton à glissière bg_auto
# Variante 2 : Maquette Grove + bouton auto poussoir :
# - Maquette Grove : la carte moteur est le shield moteur Arduino CC 4 x 1,2 A DRI0039 (DFROBOT)
# - Le mode automatique s'active avec le bouton poussoir bp_auto et se désactive avec l'appui sur bp_m, bp_a ou bp_d.
# Variante 3 : Maquette AutoProg + bouton auto poussoir :
# - Maquette AutoProg (A4 Technologie) : la carte moteur est le module AutoProg K-AP-MMOT-KIT
# - Le mode automatique s'active avec le bouton poussoir bp_auto et se désactive avec l'appui sur bp_m, bp_a ou bp_d.
#
# La variante 1 correspond à la maquette de 4A technologie.
# La variante 3 correspond à la maquette de 4A technologie.
#
# Configuration des variantes du modèle 3D -> variant_dict :
# 'nom de l'objet 3D' : liste des variantes où l'objet est présent.
@ -170,7 +177,9 @@ def variant(variant_num):
if variant_num != scene.objects['System']['variant']:
print ("Variante de la maquette numérique:", variant_num)
scene.objects['System']['variant']=variant_num
variant_dict = {'Bp auto':[1], 'Bg auto':[2], 'Bg auto-on':[2]}
# Affichage des éléments spécifiques de la variante
variant_dict = {'Bg auto':[1], 'Bg auto-on':[1], 'Bg auto':[2], 'Bg auto-on':[2], 'Bp auto':[3]}
variant_list = list(variant_dict)
for name in variant_list:
if variant_num in variant_dict[name]: