diff --git a/ropy-29.blend b/ropy-29.blend index a3b4318..f16d74a 100644 Binary files a/ropy-29.blend and b/ropy-29.blend differ diff --git a/rp.py b/rp.py index 4b28485..ff3a872 100644 --- a/rp.py +++ b/rp.py @@ -11,9 +11,9 @@ import webbrowser # Lien internet import threading # Multithreading import xml.etree.ElementTree as ET # Creating/parsing XML file import runpy # Execution de script Python légère (sans import) -# import serial # Liaison série (jumeau numérique) +import serial # Liaison série (jumeau numérique) -import rp_map1 as rp_map # Map definition +import rp_map1 as rp_map # Map definition import rp_doc # Documentation import rp_store # Store import rp_about # About @@ -126,15 +126,6 @@ def points_maj (cont): obj=scene.objects['Rover'] obj['w_position']=str(round(obj.worldPosition.x,3))+","+str(round(obj.worldPosition.y,3))+","+str(round(obj.worldPosition.z,3)) - # Jumeau numérique - # if scene.objects['Commands']['twins'] and scene.objects['Points-Twins'].visible == False: - # scene.objects['Points-Twins'].setVisible(True,True) - # scene.objects['Points-Twins-text'].setVisible(True,False) - - # scene.objects['Commands']['twins_port'] = port - # scene.objects['Commands']['twins_speed'] = speed - # scene.objects['Commands']['twins'] = True - ############################################################################### # Terrain ############################################################################### @@ -347,6 +338,16 @@ def terrain_grid_anim (): if scene.objects['Grid-u']['timer']>= 1: scene.objects['Grid-u']['anim'] = False +############################################################################### +# Jumeau +############################################################################### + +def twins_listen(): + print ("a") + serial_tmp= serial.Serial(scene.objects['Commands']['twins_port'],scene.objects['Commands']['twins_speed']) + serial_msg = str(serial_tmp.readline()) + print (serial_msg) + ############################################################################### # Sons ############################################################################### @@ -1029,9 +1030,9 @@ def tablet_close (): # Overlay scene.objects['Points'].setVisible(True,True) - if scene.objects['Commands']['twins'] ==False: - scene.objects['Points-Twins'].setVisible(False,True) - scene.objects['Points-Twins-text'].setVisible(False,False) + if scene.objects['Commands']['twins']: + scene.objects['Points-Twins'].setVisible(True,True) + scene.objects['Points-Twins-text'].setVisible(True,False) scene.objects['Commands'].setVisible(True,True) scene.objects['Camera'].setVisible(True,True) scene.active_camera = scene.objects["Camera"] @@ -1273,9 +1274,9 @@ def store_close(): # Overlay scene.objects['Points'].setVisible(True,True) - if scene.objects['Commands']['twins'] ==False: - scene.objects['Points-Twins'].setVisible(False,True) - scene.objects['Points-Twins-text'].setVisible(False,False) + if scene.objects['Commands']['twins']: + scene.objects['Points-Twins'].setVisible(True,True) + scene.objects['Points-Twins-text'].setVisible(True,False) scene.objects['Commands'].setVisible(True,True) scene.objects['Camera'].setVisible(True,True) scene.active_camera = scene.objects["Camera"] diff --git a/rp_cmd.py b/rp_cmd.py index 729bfd5..b33e254 100644 --- a/rp_cmd.py +++ b/rp_cmd.py @@ -22,6 +22,10 @@ from rp_lib import * # Bibliothèque Ropy # Fonctions ############################################################################### +def mrp_avancer(): + rp_avancer() + rp_marquer() + ############################################################################### # Commandes ############################################################################### @@ -29,17 +33,43 @@ from rp_lib import * # Bibliothèque Ropy def commandes(): # Ecrire votre code ici ... - rp_jumeau('/dev/ttyACM0', 115200) - rp_jumeau_config(50, 20, 90) # (vitesse, temps_avancer, temps_rotation) + rp_jumeau('/dev/ttyACM1', 115200) rp_tempo(1) + print (1) + rp_tempo(1) + print (2) + rp_tempo(1) + print (3) + rp_tempo(1) + print (4) - rp_gauche() - # rp_marquer() - rp_avancer() - # rp_marquer() - # rp_avancer() - # rp_marquer() - + + # rp_serie_msg("Go !") + # txt ="" + # while True: + # rp_tempo(0.1) + # pass + # txt=rp_serie_rcpt() + # print (txt) + # if txt !="": + # print (txt) + # break + + # rp_jumeau_config(50, 20, 90) # (vitesse, temps_avancer, temps_rotation) + # rp_tempo(1) + + # rp_gauche() + # mrp_avancer() + # rp_droite() + # mrp_avancer() + # mrp_avancer() + # mrp_avancer() + # mrp_avancer() + # rp_droite() + # mrp_avancer() + # mrp_avancer() + + rp_jumeau_close() rp_fin() # A garder ############################################################################### diff --git a/rp_config.xml b/rp_config.xml index aae8bf8..2555e14 100644 --- a/rp_config.xml +++ b/rp_config.xml @@ -3,9 +3,9 @@ 1.0 False - 0.0057830810546875 - -26.440298080444336 - 20.22315788269043 + -10.94022274017334 + -40.040931701660156 + 30.490596771240234 1280 @@ -14,12 +14,12 @@ 1 - 1 + 2 False False False - False + True \ No newline at end of file diff --git a/rp_lib.py b/rp_lib.py index 7c4c890..d396d48 100644 --- a/rp_lib.py +++ b/rp_lib.py @@ -219,6 +219,7 @@ def rp_avancer (): # Animation rapide if scene.objects['Commands']['speed'] >= 10 and scene.objects['Points']['step']> 2: # A tendance à planter sur les premiers mouvements en rapide + balisage + rp_tempo (0.1) x0 = obj.worldPosition.x y0 = obj.worldPosition.y z0 = obj.worldPosition.z @@ -250,7 +251,7 @@ def rp_avancer (): # rp_tempo (0.1*step) # Animation - if scene.objects['Commands']['speed'] < 10: + if scene.objects['Commands']['speed'] < 10 or scene.objects['Points']['step']<=2: start = 1 end = 100 layer = 0 @@ -340,6 +341,7 @@ def rp_reculer (): # Animation rapide if scene.objects['Commands']['speed'] >= 10 and scene.objects['Points']['step']> 2: # A tendance à planter sur les premiers mouvements en rapide + balisage + rp_tempo (0.1) x0 = obj.worldPosition.x y0 = obj.worldPosition.y z0 = obj.worldPosition.z @@ -409,6 +411,7 @@ def rp_gauche (): # Animation rapide if scene.objects['Commands']['speed'] >= 10: + rp_tempo (0.1) obj.applyRotation((0, 0, step), True) rp_tempo (0.1) return True @@ -458,6 +461,7 @@ def rp_droite (): # Rapide if scene.objects['Commands']['speed'] >= 10: + rp_tempo (0.1) obj.applyRotation((0, 0, -step), True) rp_tempo (0.1) return True @@ -896,6 +900,11 @@ def rover_goal (): print ("Goal !!") obj['stop'] = True + # Jumeau numérique + if scene.objects['Commands']['twins']: + serial_msg = "OB\n" + twins_serial.write(serial_msg.encode()) # Communication série : modele 3d -> carte communication ( arduino | micro:bit ) + # Animation start = 1 end = 160 @@ -1165,10 +1174,17 @@ def rp_serie_msg(text): global twins_serial twins_serial.write(text.encode()) -def rp_serie_rcpt(): +def twins_listen(): global twins_serial - print ("Not yet implemented") # FIXME - return ("Not yet implemented") + print ("a") + serial_msg = str(twins_serial.readline()) + print (serial_msg) + +def rp_serie_rcpt(): + pass + # global twins_serial + # print (twins_serial.readline()) + # return str(twins_serial.readline()) # Communication série : arduino|micro:bit -> modele 3d ############################################################################### # Fonction bas niveau diff --git a/twins/arduino-serialreader/arduino-serialreader.ino b/twins/arduino-serialreader/arduino-serialreader.ino new file mode 100755 index 0000000..f6bcc86 --- /dev/null +++ b/twins/arduino-serialreader/arduino-serialreader.ino @@ -0,0 +1,103 @@ +/****************************************************************************** + * arduino-serialreader.ino + * @title: Lecteur du port serie d'une carte arduino + * @project: Ropy (Blender-EduTech) + * @lang: fr + * @authors: Philippe Roy + * @copyright: Copyright (C) 2022 Philippe Roy + * @license: GNU GPL + ******************************************************************************/ + +/****************************************************************************** + * Pupitre + ******************************************************************************/ + +// Adressage Led Arduino +/* const int led = 13; // Led de mouvement (onboard) */ +/* const int led_com = 10; // Led de communication modele 3d-> arduino */ +const int bt = 2; // Bouton +const int v = 3; // Voyant + +/****************************************************************************** + * Communication serie + ******************************************************************************/ + +String serial_msg = ""; // Message +bool serial_msg_complet = false; // Flag de message complet + +/****************************************************************************** + * Initialisation + ******************************************************************************/ + +void setup() { + + pinMode(bt, INPUT); // Bouton + pinMode(v, OUTPUT); // Voyant + /* pinMode(led, OUTPUT); // Led de mouvement */ + /* pinMode(led_com, OUTPUT); // Led de communication modele 3d-> arduino */ + digitalWrite(v, LOW); + /* digitalWrite(led, LOW); */ + /* digitalWrite(led_com, LOW); */ + + Serial.begin(115200); // Moniteur serie + } + +/****************************************************************************** + * Boucle principale + ******************************************************************************/ + +void loop() { + + /***** + * Communication : modele 3d -> arduino + *****/ + + 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("Echo : "+serial_msg); + serial_msg = ""; + serial_msg_complet = false; + } + + /***** + * Bouton (arduino -> modele 3d) + * + * Bouton physique : LOW = actif et HIGH = pas actif + *****/ + + if digitalRead(bt) == LOW { + Serial.println("B"); + } + + /***** + * Yoyant modele 3d-> arduino + * + * Bouton numérique (modele 3d) : true = actif et false = pas actif + *****/ + + if bt_num == true { + digitalWrite(v, HIGH); + } + if bt_num == false { + digitalWrite(v, LOW); + } + + /* delay(300); */ +} + +/****************************************************************************** + * Evenements provoques par la communication serie + ******************************************************************************/ + +void serialEvent() { + while (Serial.available()) { + char inChar = (char)Serial.read(); + serial_msg += inChar; + if (inChar == '\n') { + serial_msg_complet = true; + } + } +} diff --git a/twins/microbit-lecteur_portserie.py b/twins/microbit-serialreader.py similarity index 65% rename from twins/microbit-lecteur_portserie.py rename to twins/microbit-serialreader.py index 43784f0..88863e3 100644 --- a/twins/microbit-lecteur_portserie.py +++ b/twins/microbit-serialreader.py @@ -2,7 +2,7 @@ from microbit import uart, sleep from microbit import * ############################################################################### -# microbit-lecteur_portserie.py +# microbit-serialreader.py # @title: Lecteur du port serie d'une carte micro:bit # @project: Ropy (Blender-EduTech) ############################################################################### @@ -12,9 +12,18 @@ uart.init(baudrate= 115200) # Initialisation du port série while True: while not uart.any(): # Attente d'un message - pass - - display.scroll('ok : ') # Réception d'un message + + # Envoi d'un message + if button_a.is_pressed() : + display.scroll("-> A") + uart.write("A") + if button_b.is_pressed() : + display.scroll("-> B") + uart.write("B") + # pass + + # Réception d'un message + display.scroll('<- ') msg = uart.readline() display.scroll(msg[:-1]) # Affichage du message sans le '/n' display.scroll(str(msg[0])+" "+str(msg[1])) # Affichage du message en code ASCII diff --git a/twins/rp_maqueen-relay.py b/twins/rp_maqueen-relay.py index 8db853b..8a78540 100644 --- a/twins/rp_maqueen-relay.py +++ b/twins/rp_maqueen-relay.py @@ -4,7 +4,7 @@ import radio ############################################################################### # rp_twins_maqueen-relay.py -# @title: Jumeau Maqueen : Programme de la carte microbit du relai +# @title: Jumeau Maqueen : Programme de la carte microbit du relais # @project: Ropy (Blender-EduTech) # @lang: fr # @authors: Philippe Roy @@ -18,7 +18,7 @@ import radio attente_image = Image("00000:00000:00300:00000:00000") display.show(attente_image) # Témoin de fonctionnement -balise_image = Image("00300:03630:36963:03630:00300") +balise_image = Image("33333:36663:36963:36663:33333") radio.config(group=1, queue=4, length=8) radio.on() @@ -28,61 +28,72 @@ uart.init(baudrate= 115200) # Initialisation du port série # Écoute du port série en relayage vers la radio ############################################################################### -temps_avancer=20 -temps_tourner=20 -temps_marquer=20 -temps_forer=40 -temps_colision=40 +temps_avancer=10 +temps_tourner=10 +temps_marquer=100 +temps_objectif=100 +temps_forer=100 +temps_colision=100 while True: - + while not uart.any(): # Attente d'un message - pass + + if button_a.is_pressed() or button_b.is_pressed(): # A propos + display.scroll ("Ropy : Relais") + display.show(attente_image) # Témoin de fonctionnement + # pass display.show(' ') # Sinon bug ? msg = uart.readline() - + # Avancer : AV if msg[0] ==65 and msg[1] ==86 : # Code ASCII : 65 (A) puis 86 (V) display.show(Image.ARROW_N) radio.send("AV") sleep(temps_avancer) - radio.send("ST") # Reculer : RE if msg[0] ==82 and msg[1] ==69 : # Code ASCII : 82 (R) puis 69 (E) display.show(Image.ARROW_S) radio.send("RE") sleep(temps_avancer) - radio.send("ST") # Gauche : GA if msg[0] ==71 and msg[1] ==65 : # Code ASCII : 71 (G) puis 65 (A) display.show(Image.ARROW_W) radio.send("GA") sleep(temps_tourner) - radio.send("ST") # Droite : DR - if msg[0] ==68 and msg[1] ==69 : # Code ASCII : 82 (D) puis 82 (R) + if msg[0] ==68 and msg[1] ==82 : # Code ASCII : 68 (D) puis 82 (R) display.show(Image.ARROW_E) radio.send("DR") sleep(temps_tourner) - radio.send("ST") # Marquer : MA if msg[0] ==77 and msg[1] ==65 : # Code ASCII : 77 (M) puis 65 (A) display.show(balise_image) + radio.send("MA") sleep(temps_marquer) + # Objectif atteint : OB + if msg[0] ==79 and msg[1] ==66 : # Code ASCII : 79 (O) puis 66 (B) + display.show(Image.HAPPY) + radio.send("OB") + sleep(temps_objectif) + display.show(attente_image) # Témoin de fonctionnement + # Forer : FO if msg[0] ==70 and msg[1] ==79 : # Code ASCII : 70 (F) puis 79 (O) display.show(Image.DIAMOND) + radio.send("FO") sleep(temps_forer) # Colision : CO if msg[0] ==67 and msg[1] ==79 : # Code ASCII : 67 (C) puis 79 (O) display.show(Image.SKULL) + radio.send("CO") sleep(temps_colision) # Configuration : CF @@ -96,7 +107,7 @@ while True: pass display.show(' ') msg = uart.readline() - if msg[0] ==70 and msg[1] ==67 : # Code ASCII : 70 (F) puis 67 (C) -> sortie de la configuration + if msg[0] ==70 and msg[1] ==67 : # Code ASCII : 70 (F) puis 67 (C) -> fin de la configuration break # display.scroll (msg[:-1]) radio.send(str(msg[:-1])) @@ -105,6 +116,7 @@ while True: # Fin : FI if msg[0] ==70 and msg[1] ==73 : # Code ASCII : 70 (F) puis 73 (I) + radio.send("FI") display.show(attente_image) # Témoin de fonctionnement sleep(400) diff --git a/twins/rp_maqueen-robot.py b/twins/rp_maqueen-robot.py index 6798506..0d48716 100755 --- a/twins/rp_maqueen-robot.py +++ b/twins/rp_maqueen-robot.py @@ -19,14 +19,19 @@ import time # Initialisation # ############################################################################### +# Image attente_image = Image("00000:00000:00900:00000:00000") display.show(attente_image) # Témoin de fonctionnement +balise_image = Image("33333:36663:36963:36663:33333") + +# Radio radio.config(group=1, queue=4, length=8) radio.on() -vitesse = 50 -distance = 50 -angle = 90 +# Paramétrage +vitesse = 50 # Vitesse +distance = 50 # Distance d'un pas +angle = 90 # Angle lors des rotations vmax_roue = 85.5 # Vitesse maxi des roues en tr/min diam_roue = 43 # Diamètre des roues en mm @@ -38,6 +43,11 @@ dist_essieu = 70 # Distance entre les roues en mm while True: + # A propos + if button_a.is_pressed() or button_b.is_pressed(): + display.scroll ("Ropy : Robot") + display.show(attente_image) # Témoin de fonctionnement + # Lecture de l'ordre ordre=radio.receive() @@ -81,12 +91,6 @@ while True: pin12.write_digital(0) # Led avant gauche display.clear() # Effacer matrice de leds - # display.show(Image.ARROW_N) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(1) # Led avant gauche - # i2c.write(0x10, bytearray([0x00, 0x0, v_avancer])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x0, v_avancer])) # Moteur droit - # Reculer if ordre=="RE": @@ -106,12 +110,6 @@ while True: pin12.write_digital(0) # Led avant gauche display.clear() # Effacer matrice de leds - # display.show(Image.ARROW_S) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(1) # Led avant gauche - # i2c.write(0x10, bytearray([0x00, 0x1, v_avancer])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x1, v_avancer])) # Moteur droit - # Gauche if ordre=="GA": display.show(Image.ARROW_E) @@ -129,38 +127,15 @@ while True: pin8.write_digital(0) # Led avant gauche display.clear() # Effacer matrice de leds - # display.show(Image.ARROW_W) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(0) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x0, 0])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x0, v_tourner])) # Moteur droit - - # Avancer + gauche - # if ordre=="AG": - # display.show(Image.ARROW_W) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(0) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x0, v_tourner_faible])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x0, v_tourner])) # Moteur droit - - # Reculer + gauche - # if ordre=="RG": - # display.show(Image.ARROW_W) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(0) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x1, v_tourner_faible])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x1, v_tourner])) # Moteur droit - # Droite if ordre=="DR": - display.show(Image.ARROW_W) pin12.write_digital(1) # Led avant droit i2c.write(0x10, bytearray([0x00, 0x0, vitesse])) # Avance moteur gauche i2c.write(0x10, bytearray([0x02, 0x1, vitesse])) # Avance moteur droit v_roue=(vmax_roue/255)*vitesse - v_lin = ((v_roue/60)*2*math.pi)*(diam_roue/2) # Vitesse linéaire + v_lin = ((v_roue/60)*2*math.pi)*(diam_roue/2) # Vitesse linéaire angle2=(angle/4)*(2*math.pi/360) time.sleep((dist_essieu*angle2)/v_lin) @@ -169,35 +144,29 @@ while True: pin12.write_digital(0) # Led avant droit display.clear() # Effacer matrice de leds - # display.show(Image.ARROW_E) - # pin8.write_digital(0) # Led avant gauche - # pin12.write_digital(1) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x0, v_tourner])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x0, 0])) # Moteur droit + # Marquer + if ordre=="MA": + display.show(balise_image) + music.play("A7:0") - # Avancer + droite - # if ordre=="AD": - # display.show(Image.ARROW_W) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(0) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x0, v_tourner])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x0, v_tourner_faible])) # Moteur droit + # Objectif + if ordre=="OB": + display.show(Image.HAPPY) + music.play(music.ENTERTAINER) + display.show(attente_image) # Témoin de fonctionnement - # Reculer + droite - # if ordre=="RD": - # display.show(Image.ARROW_W) - # pin8.write_digital(1) # Led avant gauche - # pin12.write_digital(0) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x1, v_tourner])) # Moteur gauche - # i2c.write(0x10, bytearray([0x02, 0x1, v_tourner_faible])) # Moteur droit + # Forer + if ordre=="FO": + display.show(Image.DIAMOND) - # Stop - # if ordre=="ST": - # display.show(attente_image) # Témoin de fonctionnement - # pin8.write_digital(0) # Led avant gauche - # pin12.write_digital(0) # Led avant droit - # i2c.write(0x10, bytearray([0x00, 0x0, 0])) - # i2c.write(0x10, bytearray([0x02, 0x1, 0])) + # Colision : CO + if ordre=="CO": + display.show(Image.SKULL) + music.play(music.FUNERAL) + + # Fin + if ordre=="FI": + display.show(attente_image) # Témoin de fonctionnement # Cadencement # sleep(100)