Protocole Firmata accessible dans le script utilisateur

This commit is contained in:
Philippe Roy 2023-01-09 05:54:31 +01:00
parent a8036081f4
commit 4ad5c99ddb
18 changed files with 150 additions and 211 deletions

View File

@ -79,6 +79,9 @@ def init(cont):
system_init() # Initialisation du système system_init() # Initialisation du système
def get_pin_config():
return pin_config
############################################################################### ###############################################################################
# Actionneurs # Actionneurs
############################################################################### ###############################################################################

View File

@ -29,12 +29,13 @@ from montchg_lib import * # Bibliothèque portail coulissant
# #
############################################################################### ###############################################################################
# Brochage du monte-charge # Brochage du monte-charge (Grove)
brochage={ brochage={
'pc_0' : 2,'pc_1' : 3, 'pc_0' : ['d',7,'i'],'pc_1' : ['d',8,'i'],
'ba_0' : 4,'ba_1' : 5, 'ba_0' : ['a',0,'i'],'ba_1' : ['a',1,'i'],
'mot_m' : 6,'mot_d' : 7, 'voy_0' : ['d',5,'o'],'voy_1' : ['d',6,'o']}
'voy_0' : 8, 'voy_1' : 9} # 'mot_m' : ['d',5,'o'],'mot_d' : ['d',6,'o'],
# 'voy_0' : ['d',3,'o'], 'voy_1' : ['d',4,'o']}
############################################################################### ###############################################################################
# Fonctions # Fonctions

View File

@ -13,26 +13,29 @@
################################################################################ ################################################################################
# system_card=["twins-card", "serial-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"] # system_card=["twins-card", "serial-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"]
system_card=["twins-card", "movement-card", "board-card", "model-card", "arduino-card"] system_card=["twins-card", "firmata-card", "movement-card", "board-card", "model-card", "arduino-card"]
system_card_description ={} system_card_description ={}
# Jumeau numérique # Jumeau numérique
# Message envoyé (asynchrone) : \n avancer : a, reculer : r, droite : d, \n gauche g, marquer : m et forer : f \n\n\n """
card_twins_title="Jumeau numérique" card_twins_title="Jumeau numérique"
card_twins_text=""" jumeau() \n -> Active le jumeau réel.\n card_twins_text=""" jumeau(brochage) \n -> Active le jumeau réel.\n
jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n jumeau_stop() \n -> Désactive le jumeau réel.\n
Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n Le brochage est un dictionnaire, par \n exemple : brochage={ "bouton": ['d',2,'i'], \n "led": ['d',3,'o'] }.\n
La vitesse par défaut est 115200 baud.""" Avec "carte=jumeau(brochage)", on peut \n utiliser l'objet "carte" pour communiquer \n directement avec le protocole Firmata."""
# jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n
# Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n
# La vitesse par défaut est 115200 baud."""
card_twins_url=[] card_twins_url=[]
system_card_description.update({"twins-card" : [card_twins_title, card_twins_text, card_twins_url]}) system_card_description.update({"twins-card" : [card_twins_title, card_twins_text, card_twins_url]})
# Liaison série # Firmata
# card_serial_title="Liaison série" card_firmata_title="Protocole Firmata"
# card_serial_text=""" serie_msg(texte) \n -> Envoi un message \n card_firmata_text=""" La communication entre les jumeaux \n est basée sur le protocole Firmata.\n
# texte=serie_rcpt() \n -> Reçoit un message""" broche = carte.get_pin('type:broche: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
# card_serial_url=[["Liaison série : pySerial","https://pythonhosted.org/pyserial/"], broche.read() \n -> Retourne la valeur de la broche.\n
# ["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]] broche.write(valeur) \n -> Écrire la valeur sur la broche."""
# card_description.update({"serial-card" : [card_serial_title, card_serial_text, card_serial_url]}) 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]})
# Ouvrir et fermer # Ouvrir et fermer
card_movement_title="Monter et descendre" card_movement_title="Monter et descendre"

View File

@ -1,6 +1,6 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Bibliothèque Blender Game Engine (UPBGE)
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
import twin_serial # Liaison série from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
import time import time
############################################################################### ###############################################################################
@ -16,9 +16,6 @@ import time
# Récupérer la scène UPBGE # Récupérer la scène UPBGE
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Récupérer le brochage du jumeau réel
from montchg import pin_config
# UPBGE constants # UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED
@ -85,35 +82,6 @@ def ba_1 ():
else: else:
return False return False
###############################################################################
# Jumeau
###############################################################################
# Créer une broche
def jumeau_get_pin(board, name, brochage):
for pin in brochage :
if pin ==name:
# print (pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return board.get_pin(pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return None
# Activer le jumelage
def jumeau (brochage=None):
# Carte
board =twin_serial.open()
scene.objects['System']['board']=board
# print ("jumeau : ", scene.objects['System']['board'])
# Brochage
if brochage is not None:
for pin in pin_config :
scene.objects[pin_config[pin][1][0]][pin_config[pin][1][1]] = jumeau_get_pin(board, pin, brochage)
# Désactiver le jumelage
def jumeau_stop ():
twin_serial.close(scene.objects['System']['board'])
############################################################################### ###############################################################################
# Cycle # Cycle
############################################################################### ###############################################################################
@ -125,14 +93,14 @@ def tempo (duree):
# Arrêt # Arrêt
def stop(): def stop():
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
twin_serial.close(scene.objects['System']['board']) serial_close(scene.objects['System']['board'])
time.sleep(1) time.sleep(1)
thread_cmd_stop() thread_cmd_stop()
# Fin naturelle # Fin naturelle
def end(): def end():
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
twin_serial.close(scene.objects['System']['board']) serial_close(scene.objects['System']['board'])
time.sleep(1) time.sleep(1)
thread_cmd_end() thread_cmd_end()

Binary file not shown.

View File

@ -77,6 +77,9 @@ def init(cont):
system_init() # Initialisation du système system_init() # Initialisation du système
def get_pin_config():
return pin_config
############################################################################### ###############################################################################
# Actionneurs # Actionneurs
############################################################################### ###############################################################################
@ -238,6 +241,7 @@ def ir_emet (cont):
scene.objects['Recepteur IR']['activated'] = True scene.objects['Recepteur IR']['activated'] = True
# Couleurs # Couleurs
# FIXME : à faire
if obj['activated'] == True and obj.color !=color_activated: if obj['activated'] == True and obj.color !=color_activated:
obj.color =color_activated obj.color =color_activated
if obj['activated'] == False : if obj['activated'] == False :
@ -248,6 +252,7 @@ def ir_emet (cont):
## ##
# Récepteur IR # Récepteur IR
# FIXME : Modele 3D -> Arduino à faire
## ##
def ir_recep (cont): def ir_recep (cont):
@ -261,12 +266,13 @@ def ir_recep (cont):
# Active # Active
if obj['active']: if obj['active']:
# Forçage (click) # Forçage par clic
if obj['click'] == True: if obj['click'] == True:
obj['activated'] = True obj['activated'] = True
scene.objects['Emetteur IR']['activated'] = True scene.objects['Emetteur IR']['activated'] = True
# Couleurs # Couleurs
# FIXME : à faire
if obj['activated'] == True and obj.color !=color_activated: if obj['activated'] == True and obj.color !=color_activated:
obj.color =color_activated obj.color =color_activated
if obj['activated'] == False : if obj['activated'] == False :
@ -332,4 +338,4 @@ def system_reset ():
scene.objects['Emetteur IR']['active'] =False scene.objects['Emetteur IR']['active'] =False
scene.objects['Recepteur IR']['activated'] =False scene.objects['Recepteur IR']['activated'] =False
scene.objects['Recepteur IR']['active'] =False scene.objects['Recepteur IR']['active'] =False
scene.objects['Recepteur IR']['activated_real'] =False scene.objects['Recepteur IR']['activated_real'] =True # Absence d'obstacle -> True, présence d'obstacle -> False

View File

@ -28,13 +28,13 @@ from porcou_lib import * # Bibliothèque portail coulissant
# #
############################################################################### ###############################################################################
# Brochage du portail coulissant # Brochage du portail coulissant (Grove)
brochage={ brochage={
'bp_ext' : 2,'bp_int' : 3, 'bp_ext' : ['a',0,'i'],'bp_int' : ['a',1,'i'],
'fdc_o' : 4,'fdc_f' : 5, 'fdc_o' : ['d',7,'i'],'fdc_f' : ['d',8,'i'],
'mot_o' : 6,'mot_f' : 7, 'mot_o' : ['d',5,'o'],'mot_f' : ['d',6,'o'],
'gyr' : 4, 'gyr' : ['d',4,'o'],
'ir_emet' : 9,'ir_recep' : 10} 'ir_emet' : ['d',2,'o'],'ir_recep' : ['a',3,'i']}
############################################################################### ###############################################################################
# Fonctions # Fonctions
@ -48,45 +48,14 @@ def commandes():
jumeau(brochage) jumeau(brochage)
# Mise en place : Fermeture # Ecrire votre code ici ...
print ("Version sans sécurité : sans réouverture") gyr(True) # Activer le gyrophare
print ("Mise en place : Fermeture")
while fdc_f() ==False :
gyr(True)
mot_o(False)
mot_f(True)
mot_f(False)
gyr(False)
# Fonctionnement normal
print ("Attente")
while True: while True:
pass
# Ouverture
if bp_int() or bp_ext() :
print ("Ouverture")
while fdc_o() ==False:
gyr(True)
mot_f(False)
mot_o(True)
gyr(False)
mot_o(False)
print ("Temporisation")
tempo(2) # Temporisation
# Fermeture
print ("Fermeture")
while fdc_f() ==False:
gyr(True)
mot_o(False)
mot_f(True)
gyr(False)
mot_f(False)
print ("Attente")
fin() # A garder fin() # A garder
############################################################################### ###############################################################################
# En: External call << DONT CHANGE THIS SECTION >> # En: External call << DONT CHANGE THIS SECTION >>
# Fr: Appel externe << NE PAS MODIFIER CETTE SECTION >> # Fr: Appel externe << NE PAS MODIFIER CETTE SECTION >>

View File

@ -13,27 +13,29 @@
################################################################################ ################################################################################
# system_card=["twins-card", "serial-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"] # system_card=["twins-card", "serial-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"]
system_card=["twins-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"] system_card=["twins-card", "firmata-card", "movement-card", "sensor-card", "gyro-card", "board-card", "model-card", "arduino-card"]
# system_card=["twins-card"]
system_card_description ={} system_card_description ={}
# Jumeau numérique # Jumeau numérique
# Message envoyé (asynchrone) : \n avancer : a, reculer : r, droite : d, \n gauche g, marquer : m et forer : f \n\n\n """
card_twins_title="Jumeau numérique" card_twins_title="Jumeau numérique"
card_twins_text=""" jumeau() \n -> Active le jumeau réel.\n card_twins_text=""" jumeau(brochage) \n -> Active le jumeau réel.\n
jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n jumeau_stop() \n -> Désactive le jumeau réel.\n
Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n Le brochage est un dictionnaire, par \n exemple : brochage={ "bouton": ['d',2,'i'], \n "led": ['d',3,'o'] }.\n
La vitesse par défaut est 115200 baud.""" Avec "carte=jumeau(brochage)", on peut \n utiliser l'objet "carte" pour communiquer \n directement avec le protocole Firmata."""
# jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n
# Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n
# La vitesse par défaut est 115200 baud."""
card_twins_url=[] card_twins_url=[]
system_card_description.update({"twins-card" : [card_twins_title, card_twins_text, card_twins_url]}) system_card_description.update({"twins-card" : [card_twins_title, card_twins_text, card_twins_url]})
# Liaison série # Firmata
# card_serial_title="Liaison série" card_firmata_title="Protocole Firmata"
# card_serial_text=""" serie_msg(texte) \n -> Envoi un message \n card_firmata_text=""" La communication entre les jumeaux \n est basée sur le protocole Firmata.\n
# texte=serie_rcpt() \n -> Reçoit un message""" broche = carte.get_pin('type:broche: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
# card_serial_url=[["Liaison série : pySerial","https://pythonhosted.org/pyserial/"], broche.read() \n -> Retourne la valeur de la broche.\n
# ["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]] broche.write(valeur) \n -> Écrire la valeur sur la broche."""
# card_description.update({"serial-card" : [card_serial_title, card_serial_text, card_serial_url]}) 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]})
# Ouvrir et fermer # Ouvrir et fermer
card_movement_title="Ouvrir et fermer" card_movement_title="Ouvrir et fermer"

View File

@ -1,6 +1,7 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Bibliothèque Blender Game Engine (UPBGE)
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
import twin_serial # Liaison série from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
# import twin_serial # Liaison série
import time import time
############################################################################### ###############################################################################
@ -16,9 +17,6 @@ import time
# Récupérer la scène UPBGE # Récupérer la scène UPBGE
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Récupérer le brochage du jumeau réel
from porcou import pin_config
# UPBGE constants # UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED
@ -68,6 +66,7 @@ def fdc_f ():
return False return False
# Compte-rendu du capteur barrage IR # Compte-rendu du capteur barrage IR
# Absence d'obstacle -> True, présence d'obstacle -> False
def ir_recep (): def ir_recep ():
if scene.objects['Recepteur IR']['activated'] or scene.objects['Recepteur IR']['activated_real']==False: if scene.objects['Recepteur IR']['activated'] or scene.objects['Recepteur IR']['activated_real']==False:
return False return False
@ -92,35 +91,6 @@ def bp_int ():
else: else:
return False return False
###############################################################################
# Jumeau
###############################################################################
# Créer une broche
def jumeau_get_pin(board, name, brochage):
for pin in brochage :
if pin ==name:
# print (pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return board.get_pin(pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return None
# Activer le jumelage
def jumeau (brochage=None):
# Carte
board =twin_serial.open()
scene.objects['System']['board']=board
# print ("jumeau : ", scene.objects['System']['board'])
# Brochage
if brochage is not None:
for pin in pin_config :
scene.objects[pin_config[pin][1][0]][pin_config[pin][1][1]] = jumeau_get_pin(board, pin, brochage)
# Désactiver le jumelage
def jumeau_stop ():
twin_serial.close(scene.objects['System']['board'])
############################################################################### ###############################################################################
# Cycle # Cycle
############################################################################### ###############################################################################
@ -132,14 +102,14 @@ def tempo (duree):
# Arrêt # Arrêt
def stop(): def stop():
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
twin_serial.close(scene.objects['System']['board']) serial_close(scene.objects['System']['board'])
time.sleep(1) time.sleep(1)
thread_cmd_stop() thread_cmd_stop()
# Fin naturelle # Fin naturelle
def end(): def end():
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
twin_serial.close(scene.objects['System']['board']) serial_close(scene.objects['System']['board'])
time.sleep(1) time.sleep(1)
thread_cmd_end() thread_cmd_end()

View File

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

View File

@ -79,9 +79,9 @@ card_description.update({"loop-card" : [card_loop_title, card_loop_text, card_lo
# Flux # Flux
card_flow_title="Contrôle du flux" card_flow_title="Contrôle du flux"
card_flow_text=""" Les structures (if, while, for) peuvent \n être gérées plus finement par les \n fonctions "break", "continue" et "pass". \n card_flow_text=""" Les structures (if, while, for) peuvent \n être gérées plus finement par les \n fonctions "break", "continue" et "pass". \n
- "break" : termine l'itération en cours et \n arrête la boucle. - break : termine l'itération en cours et \n arrête la boucle.
- "continue" : termine l'itération en cours \n et reprend la boucle. - continue : termine l'itération en cours \n et reprend la boucle.
- "pass" : instruction vide.""" - pass : instruction vide."""
card_flow_url=[["w3schools.com : break","https://www.w3schools.com/python/ref_keyword_break.asp"], card_flow_url=[["w3schools.com : break","https://www.w3schools.com/python/ref_keyword_break.asp"],
["w3schools.com : continue","https://www.w3schools.com/python/ref_keyword_break.asp"], ["w3schools.com : continue","https://www.w3schools.com/python/ref_keyword_break.asp"],
["w3schools.com : pass","https://www.w3schools.com/python/ref_keyword_pass.asp"]] ["w3schools.com : pass","https://www.w3schools.com/python/ref_keyword_pass.asp"]]

View File

@ -1,5 +1,6 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Bibliothèque Blender Game Engine (UPBGE)
import numpy as np import numpy as np
import importlib
import time import time
import serial # Liaison série import serial # Liaison série
@ -19,6 +20,14 @@ from serial.tools.list_ports import comports # Détection du port automatique
# UPBGE scene # UPBGE scene
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Récupérer le brochage du jumeau réel
system=importlib.import_module(scene.objects['Doc']['system']) # Système
pin_config = system.get_pin_config()
###############################################################################
# Liaison série
###############################################################################
## ##
# Recherche automatique du port # Recherche automatique du port
## ##
@ -79,7 +88,7 @@ def devices():
# pyfirmata : baudrate=57600 # pyfirmata : baudrate=57600
## ##
def open(): def serial_open():
# UI : étape 1 # UI : étape 1
scene.objects['Twins-text']['Text'] = "Connection en cours ..." scene.objects['Twins-text']['Text'] = "Connection en cours ..."
@ -116,7 +125,7 @@ def open():
# Fermeture de la communication série # Fermeture de la communication série
## ##
def close(board): def serial_close(board):
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
scene.objects['Twins-text']['Text'] = "Connection fermée." scene.objects['Twins-text']['Text'] = "Connection fermée."
board.exit() # Fermer proprement la communication avec la carte board.exit() # Fermer proprement la communication avec la carte
@ -145,6 +154,43 @@ def config(port, speed):
# serial_msg5 = "FC\n" # serial_msg5 = "FC\n"
# twins_serial.write(serial_msg5.encode()) # twins_serial.write(serial_msg5.encode())
###############################################################################
# Jumeau
###############################################################################
# Créer une broche
def jumeau_get_pin(board, name, brochage):
for pin in brochage :
if pin ==name:
# print (pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
# return board.get_pin(pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return board.get_pin(brochage[pin][0]+':'+str(brochage[pin][1])+':'+brochage[pin][2])
return None
# Activer le jumelage
def jumeau (brochage=None):
# Carte
board =serial_open()
scene.objects['System']['board']=board
# print ("jumeau : ", scene.objects['System']['board'])
# Brochage
if brochage is not None:
for pin in pin_config :
scene.objects[pin_config[pin][1][0]][pin_config[pin][1][1]] = jumeau_get_pin(board, pin, brochage)
return board
else:
return None
# Désactiver le jumelage
def jumeau_stop ():
serial_close(scene.objects['System']['board'])
###############################################################################
# Message
###############################################################################
## ##
# Envoi d'un message vers la communication série # Envoi d'un message vers la communication série
# FIXME : plus tard # FIXME : plus tard

Binary file not shown.

View File

@ -70,6 +70,9 @@ def init(cont):
system_init() # Initialisation du système system_init() # Initialisation du système
def get_pin_config():
return pin_config
############################################################################### ###############################################################################
# Actionneurs # Actionneurs
############################################################################### ###############################################################################
@ -346,7 +349,6 @@ def system_init ():
scene.objects['Led moteur-on'].setVisible(False,False) scene.objects['Led moteur-on'].setVisible(False,False)
scene.objects['Led alimentation'].setVisible(True,False) scene.objects['Led alimentation'].setVisible(True,False)
scene.objects['Led alimentation-on'].setVisible(False,False) scene.objects['Led alimentation-on'].setVisible(False,False)
system_reset() system_reset()
## ##

View File

@ -31,14 +31,12 @@ from volrou_lib import * # Bibliothèque volet roulant
# #
############################################################################### ###############################################################################
# Brochage du volet roulant # Brochage du volet roulant (Grove)
# brochage={ brochage={
# 'fdc_h' : 2,'fdc_b' : 3, 'fdc_h' : ['d',7,'i'],'fdc_b' : ['d',8,'i'],
# 'bp_m' : 4,'bp_d' : 5, 'bp_a' : 6, 'bp_m' : ['a',0,'i'],'bp_d' : ['a',1,'i'], 'bp_a' : ['d',2,'i'],
# 'mot_m' : 7,'mot_d' : 8, 'mot_m' : ['d',5,'o'],'mot_d' : ['d',6,'o'],
# 'bp_auto' : 9, 'voy_auto' : 10, 'lum' : 11} 'bp_auto' : ['a',3,'i'], 'voy_auto' : ['d',4,'o'], 'lum' : ['a',2,'i']}
brochage={'voy_auto' : 4}
############################################################################### ###############################################################################
# Fonctions # Fonctions

View File

@ -13,26 +13,29 @@
################################################################################ ################################################################################
# system_card=["twins-card", "serial-card", "movement-card", "sensor-card", "board-card", "model-card", "arduino-card"] # system_card=["twins-card", "serial-card", "movement-card", "sensor-card", "board-card", "model-card", "arduino-card"]
system_card=["twins-card", "movement-card", "sensor-card", "board-card", "model-card", "arduino-card"] system_card=["twins-card", "firmata-card", "movement-card", "sensor-card", "board-card", "model-card", "arduino-card"]
system_card_description ={} system_card_description ={}
# Jumeau numérique # Jumeau numérique
# Message envoyé (asynchrone) : \n avancer : a, reculer : r, droite : d, \n gauche g, marquer : m et forer : f \n\n\n """
card_twins_title="Jumeau numérique" card_twins_title="Jumeau numérique"
card_twins_text=""" jumeau() \n -> Active le jumeau réel.\n card_twins_text=""" jumeau(brochage) \n -> Active le jumeau réel.\n
jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n jumeau_stop() \n -> Désactive le jumeau réel.\n
Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n Le brochage est un dictionnaire, par \n exemple : brochage={ "bouton": ['d',2,'i'], \n "led": ['d',3,'o'] }.\n
La vitesse par défaut est 115200 baud.""" Avec "carte=jumeau(brochage)", on peut \n utiliser l'objet "carte" pour communiquer \n directement avec le protocole Firmata."""
# jumeau_config(port, vitesse) \n -> Définit la configuration de la liaison \n série.\n
# Si le port n'est pas spécifié, il sera \n recherché automatiquement (carte \n Arduino Uno ou Mega). \n
# La vitesse par défaut est 115200 baud."""
card_twins_url=[] card_twins_url=[]
system_card_description.update({"twins-card" : [card_twins_title, card_twins_text, card_twins_url]}) system_card_description.update({"twins-card" : [card_twins_title, card_twins_text, card_twins_url]})
# Liaison série # Firmata
# card_serial_title="Liaison série" card_firmata_title="Protocole Firmata"
# card_serial_text=""" serie_msg(texte) \n -> Envoi un message \n card_firmata_text=""" La communication entre les jumeaux \n est basée sur le protocole Firmata.\n
# texte=serie_rcpt() \n -> Reçoit un message""" broche = carte.get_pin('type:broche: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
# card_serial_url=[["Liaison série : pySerial","https://pythonhosted.org/pyserial/"], broche.read() \n -> Retourne la valeur de la broche.\n
# ["Protocole Firmata : pyFirmata","https://github.com/tino/pyFirmata"]] broche.write(valeur) \n -> Écrire la valeur sur la broche."""
# card_description.update({"serial-card" : [card_serial_title, card_serial_text, card_serial_url]}) 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]})
# Ouvrir et fermer # Ouvrir et fermer
card_movement_title="Monter et descendre" card_movement_title="Monter et descendre"

View File

@ -1,6 +1,6 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Bibliothèque Blender Game Engine (UPBGE)
from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading from twin_threading import thread_cmd_start, thread_cmd_stop, thread_cmd_end # Multithreading
import twin_serial # Liaison série from twin_serial import jumeau, jumeau_stop, serial_close # Liaison série
import time import time
############################################################################### ###############################################################################
@ -16,9 +16,6 @@ import time
# Récupérer la scène UPBGE # Récupérer la scène UPBGE
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Récupérer le brochage du jumeau réel
from volrou import pin_config
# UPBGE constants # UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED
@ -97,35 +94,6 @@ def bp_d ():
def bp_auto (): def bp_auto ():
return scene.objects['Bp auto']['activated'] return scene.objects['Bp auto']['activated']
###############################################################################
# Jumeau
###############################################################################
# Créer une broche
def jumeau_get_pin(board, name, brochage):
for pin in brochage :
if pin ==name:
# print (pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return board.get_pin(pin_config[pin][0][0]+':'+str(brochage[pin])+':'+pin_config[pin][0][1])
return None
# Activer le jumelage
def jumeau (brochage=None):
# Carte
board =twin_serial.open()
scene.objects['System']['board']=board
# print ("jumeau : ", scene.objects['System']['board'])
# Brochage
if brochage is not None:
for pin in pin_config :
scene.objects[pin_config[pin][1][0]][pin_config[pin][1][1]] = jumeau_get_pin(board, pin, brochage)
# Désactiver le jumelage
def jumeau_stop ():
twin_serial.close(scene.objects['System']['board'])
############################################################################### ###############################################################################
# Cycle # Cycle
############################################################################### ###############################################################################
@ -137,14 +105,14 @@ def tempo (duree):
# Arrêt # Arrêt
def stop(): def stop():
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
twin_serial.close(scene.objects['System']['board']) serial_close(scene.objects['System']['board'])
time.sleep(1) time.sleep(1)
thread_cmd_stop() thread_cmd_stop()
# Fin naturelle # Fin naturelle
def end(): def end():
if scene.objects['System']['twins']: if scene.objects['System']['twins']:
twin_serial.close(scene.objects['System']['board']) serial_close(scene.objects['System']['board'])
time.sleep(1) time.sleep(1)
thread_cmd_end() thread_cmd_end()