diff --git a/ropy-31.blend b/ropy-31.blend index dbfee23..9333896 100644 Binary files a/ropy-31.blend and b/ropy-31.blend differ diff --git a/rp_cmd.py b/rp_cmd.py index 4b4adb2..ea1d418 100644 --- a/rp_cmd.py +++ b/rp_cmd.py @@ -29,7 +29,7 @@ from rp_lib import * # Bibliothèque Ropy def commandes(): # Ecrire votre code ici ... - + rp_fin() # A garder ############################################################################### diff --git a/rp_config.xml b/rp_config.xml index f13a7df..aae8bf8 100644 --- a/rp_config.xml +++ b/rp_config.xml @@ -8,8 +8,8 @@ 20.22315788269043 - 960 - 540 + 1280 + 720 diff --git a/rp_doc.py b/rp_doc.py index 61f31cc..d97a4fb 100644 --- a/rp_doc.py +++ b/rp_doc.py @@ -77,7 +77,7 @@ card_description.update({"radar-card" : [rp_radar_title, rp_radar_text, rp_radar # Jumeau numérique rp_twins_title="Jumeau numérique" rp_twins_text=""" Via une liaison série, Ropy peut être \n le jumeau numérique d'un robot réel. \n - rp_jumeau(port, vitesse) \n -> Active le jumeau réel par la liaison \n série (port et vitesse en baud) \n + rp_jumeau(port, vitesse=115200) \n -> Active le jumeau réel par la liaison \n série. Si le port n'est pas spécifié, il \n est recherché automatiquement. \n rp_serie_msg(texte) \n -> Envoi un message \n \n texte=rp_serie_rcpt() \n -> Reçoit un message""" # Message envoyé (asynchrone) : \n avancer : a, reculer : r, droite : d, \n gauche g, marquer : m et forer : f \n\n\n """ diff --git a/rp_lib.py b/rp_lib.py index 440d1c1..db437c6 100644 --- a/rp_lib.py +++ b/rp_lib.py @@ -9,6 +9,9 @@ import math import mathutils import random import serial # Liaison série (jumeau numérique) +from serial.tools.list_ports import comports + +# import serial.tools.list_ports.comports as list_com_ports import rp_map1 as rp_map # Map definition @@ -42,6 +45,10 @@ debug_thread = scene.objects['Terrain']['debug_thread'] # Jumeau numérique twins_serial = None +# CH340 : arduino Uno +# MICROBITPID = 516 +# MICROBITVID = 3368 + # UPBGE constants JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED @@ -1110,42 +1117,96 @@ def rp_tempo (duration): # Jumeau numérique ############################################################################### -# Paramétrage de la communication avec la carte de communication (Arduino, Micro:bit) +## +# Activation de la communication avec la carte de communication (Arduino, Micro:bit) +# Vitesse : 115200 -> 7 fps, 38400 -> 6 fps, 9600 -> 2 fps +## -def rp_jumeau(port, speed): +def rp_jumeau(port="auto", speed=115200): global twins_serial scene.objects['Points-Twins'].setVisible(True,True) scene.objects['Points-Twins-text'].setVisible(True,False) - twins_serial = getSerialOrNone(port,speed) + + # Recherche automatique du port + if port=="auto" or port=="microbit" or port=="uno" or port=="mega": + [device,board] =serial_autoget_port(port) + else: + device = port + board="" + + # Mise en place de la communication + twins_serial = serial_getSerialOrNone(device,speed) if twins_serial is not None: # twins_serial.set_buffer_size(rx_size = 12800, tx_size = 12800) scene.objects['Commands']['twins'] = True scene.objects['Commands']['twins_close'] = False - scene.objects['Commands']['twins_port'] = port + scene.objects['Commands']['twins_port'] = device scene.objects['Commands']['twins_speed'] = speed scene.objects['Commands']['twins_readline'] = "" - scene.objects['Points-Twins-text']['Text'] = "Connection ouverte :\n"+port+" - "+str(speed)+" baud" + if board =="": + scene.objects['Points-Twins-text']['Text'] = "Connection ouverte :\n"+device+" - "+str(speed)+" baud" + else: + scene.objects['Points-Twins-text']['Text'] = "Connection ouverte :\n"+board+"\n"+device+" - "+str(speed)+" baud" rp_tempo (0.1) print (twins_serial) else: scene.objects['Commands']['twins'] = False - scene.objects['Points-Twins-text']['Text'] = "Port "+port+" pas prêt" + scene.objects['Points-Twins-text']['Text'] = "Port "+device+" pas prêt" - # # ser = serial.Serial('/dev/ttyACM0',38400) # 6 fps - # # ser = serial.Serial('/dev/ttyACM0',9600) # 2 fps - # #serial_port='COM5' # Windows - # # serial_port='/dev/ttyACM0' # GNU/Linux - # # 115200 -> 7 fps - # # 38400 -> 6 fps - # # 9600 -> 2 fps +## +# Recherche automatique du port +## -def getSerialOrNone(port,speed): +def serial_autoget_port(port): + # USB Vendor ID, USB Product ID + board={'microbit' :[3368, 516], + 'uno' :[9025, 67], + 'mega' :[9025, 66]} + if port=="auto" or port=="microbit": + for com in comports(): + if com.vid == board["microbit"][0] and com.pid == board["microbit"][1]: + return [com.device,"Micro:bit"] + if port=="auto" or port=="uno": + for com in comports(): + if com.vid == board["uno"][0] and com.pid == board["uno"][1]: + return [com.device,"Arduino Uno"] + if port=="auto" or port=="mega": + for com in comports(): + if com.vid == board["mega"][0] and com.pid == board["mega"][1]: + return [com.device,"Arduino Mega"] + return None + +## +# Affiche la liste des ports (communication série) +## + +def rp_serie_ports(): + for com in comports(): + print ("Name : "+str(com.name)+"\n" + +" Device : "+str(com.device)+"\n" + +" Hardware ID : "+str(com.hwid)+"\n" + +" USB Vendor ID : "+str(com.vid)+"\n" + +" USB Product ID : "+str(com.pid)+"\n" + +" USB device location : "+str(com.location)+"\n" + +" USB manufacturer : "+str(com.manufacturer)+"\n" + +" USB product : "+str(com.product)+"\n" + +" Interface-specific : "+str(com.interface)) + +## +# Création de l'objet serial (communication série) +## + +def serial_getSerialOrNone(port,speed): try: # return serial.Serial(port,speed, bytesize=100) return serial.Serial(port,speed) except: return None +## +# Fermeture de la communication série +## + def rp_jumeau_close(): global twins_serial twins_serial.close() # Fermer proprement le port série @@ -1172,18 +1233,27 @@ def rp_jumeau_config(speed, temps_avancer, temps_tourner): serial_msg5 = "FC\n" twins_serial.write(serial_msg5.encode()) +## +# Envoi d'un message vers la communication série +## + def rp_serie_msg(text): global twins_serial text2= text+"\n" + scene.objects['Points-Twins-text']['Text'] = "Communication ...\nEnvoi message : "+text twins_serial.write(text2.encode()) +## +# Mise en écoute de jumeau numérique (figeage de la scène) +## + def twins_listen(cont): global twins_serial if scene.objects['Commands']['twins']: if scene.objects['Commands']['twins_readline'] != "": - scene.objects['Points-Twins-text']['Text'] = "Écoute de la connection\nfigeage de la scène\nMessage reçu : "+scene.objects['Commands']['twins_readline'] + scene.objects['Points-Twins-text']['Text'] = "Écoute de la connection\nfigeage de la scène...\nMessage reçu : "+scene.objects['Commands']['twins_readline'] else: - scene.objects['Points-Twins-text']['Text'] = "Écoute de la connection\nfigeage de la scène" + scene.objects['Points-Twins-text']['Text'] = "Écoute de la connection\nfigeage de la scène..." if cont.sensors['Property'].positive: if scene.objects['Commands']['twins_listen'] : serial_msg = twins_serial.readline() @@ -1192,6 +1262,10 @@ def twins_listen(cont): # scene.objects['Points-Twins-text']['Text'] = "Message reçu : "+str(serial_msg) scene.objects['Commands']['twins_listen'] = False +## +# Réception d'un message de la communication série +## + def rp_serie_rcpt(): # scene.objects['Points-Twins-text']['Text'] = "Écoute de la \nconnection\n figeage de \n la scène" scene.objects['Commands']['twins_readline'] = "" diff --git a/rp_store.py b/rp_store.py index 50a2930..f563c45 100644 --- a/rp_store.py +++ b/rp_store.py @@ -38,8 +38,6 @@ ACTIVATE = bge.logic.KX_INPUT_ACTIVE def init(): - print ("init") - # Mémorisation de la position de la tablette du store scene.objects["Store"]['init_lx']=scene.objects["Store"].worldPosition.x scene.objects["Store"]['init_ly']=scene.objects["Store"].worldPosition.y diff --git a/twins/arduino_serialreader/arduino_serialreader.ino b/twins/arduino_serialreader/arduino_serialreader.ino index 19f8f62..390db43 100644 --- a/twins/arduino_serialreader/arduino_serialreader.ino +++ b/twins/arduino_serialreader/arduino_serialreader.ino @@ -59,9 +59,10 @@ void loop() { // digitalWrite(v, HIGH); if (serial_msg_complet) { - - if (serial_msg =="S\n") bt_num=true; // S pour Set - if (serial_msg =="R\n") bt_num=false; // R pour Reset + Serial.println(serial_msg); // Echo + if (serial_msg =="S\n") bt_num=true; // S pour Set + if (serial_msg =="R\n") bt_num=false; // R pour Reset + // Serial.println("Echo : "+serial_msg); serial_msg = ""; diff --git a/twins/rp_cmd-arduino.py b/twins/rp_cmd-arduino.py index 347bc4f..149141f 100644 --- a/twins/rp_cmd-arduino.py +++ b/twins/rp_cmd-arduino.py @@ -28,7 +28,8 @@ from rp_lib import * # Bibliothèque Ropy def commandes(): - rp_jumeau('/dev/ttyACM0', 115200) + # rp_serie_ports() # Affichage de la liste des ports série + rp_jumeau() # Vitesse 115200 baud rp_serie_msg("S") # Allumer led rp_tempo(2) diff --git a/twins/rp_cmd-microbit.py b/twins/rp_cmd-microbit.py index b4bdaaa..f6916fe 100644 --- a/twins/rp_cmd-microbit.py +++ b/twins/rp_cmd-microbit.py @@ -28,7 +28,8 @@ from rp_lib import * # Bibliothèque Ropy def commandes(): - rp_jumeau('/dev/ttyACM1', 115200) + # rp_serie_ports() # Affichage de la liste des ports série + rp_jumeau() # Vitesse 115200 baud rp_serie_msg("Press a button !") # Envoyer un message