diff --git a/Telecommande/lib_robot_maqueen.py b/Telecommande/lib_robot_maqueen.py
new file mode 100644
index 0000000000000000000000000000000000000000..96bc7d98b2be76281cb8f53737fa34a6154ada50
--- /dev/null
+++ b/Telecommande/lib_robot_maqueen.py
@@ -0,0 +1,152 @@
+import microbit as mb
+import machine
+import struct
+import time
+adr=0x10
+
+class MaqueenPlus:
+  def __init__(self):
+    mb.i2c.init(freq=100000,sda=mb.pin20,scl=mb.pin19)
+    # Motors
+    self.MT_L=0
+    self.MT_R=1
+
+    # ServoMotors
+    self.S1=1
+    self.S2=2
+    self.S3=3
+
+    # RGB LED
+    self.RGB_L=1
+    self.RGB_R=2
+    self.RGB_ALL=3
+    self.RED=1
+    self.GREEN=2
+    self.BLUE=4
+    self.YELLOW=3
+    self.PINK=5
+    self.CYAN=6
+    self.WHITE=7
+    self.OFF=8
+
+    # Linetrack sensors
+    self.patrol={
+     "L1":0x04,
+     "L2":0x02,
+     "L3":0x01,
+     "R1":0x08,
+     "R2":0x10,
+     "R3":0x20
+    }
+
+  def motorControl(self,mot,dir,spd):
+    buf=bytearray(3)
+    if mot==self.MT_L:
+      buf[0]=0x00
+    else:
+      buf[0]=0x02
+    buf[1]=dir
+    buf[2]=spd
+    mb.i2c.write(adr,buf)
+
+  def go(self,dL,sL,dR,sR):
+    self.motorControl(self.MT_L,dL,sL)
+    self.motorControl(self.MT_R,dR,sR)
+
+  def servo(self,num,angle):
+    buf=bytearray(3)
+    if num==self.S1:
+      buf[0]=0x14
+    elif num==self.S2:
+      buf[0]=0x15
+    else:
+      buf[0]=0x16
+    buf[1]=angle
+    mb.i2c.write(adr,buf)
+
+  def RGBLight(self,rgbshow,color):
+    buf=bytearray(3)
+    buf[0]=0x0B
+    buf[1]=color
+    if rgbshow==self.RGB_R:
+      buf[0]=0x0C
+    elif rgbshow==self.RGB_ALL:
+      buf[2]=color
+    mb.i2c.write(adr,buf)
+
+  def stop(self):
+    self.go(1,0,1,0)
+
+  def move(self,dir,spd):
+    if dir=="F":
+      self.go(1,spd,1,spd)
+    elif dir=="L":
+      self.go(1,0,1,spd)
+    elif dir=="R":
+      self.go(1,spd,1,0)
+    elif dir=="B":
+      self.go(2,spd,2,spd)
+
+  def goto(self,dir,spd,dst):
+    en=self.getEncoders()
+    goal=dst
+    if dir=="F":
+      goal+=en[0]
+      while en[0]<goal:
+        self.go(1,spd,1,spd)
+        en=self.getEncoders()
+    if dir=="L":
+      goal+=en[1]
+      while en[1]<goal:
+        self.go(1,0,1,spd)
+        en=self.getEncoders()
+    elif dir=="R":
+      goal+=en[0]
+      while en[0]<goal:
+        self.go(1,spd,1,0)
+        en=self.getEncoders()
+    self.stop()
+
+  def ultrasonic(self, maxDist=0.4):
+  # pins: trig=2, echo=8
+    mb.pin2.write_digital(1)
+    time.sleep_us(10)
+    mb.pin2.write_digital(0)
+    mb.pin8.read_digital()
+    timeOut=int(maxDist*2*1000000/340.29)
+    t2 = machine.time_pulse_us(mb.pin8, 1, timeOut)
+    if t2>0:
+      dst=340.29*(t2/(2*1000000))
+    else:
+      dst=maxDist
+    return dst
+
+  def getLine(self):
+    mb.i2c.write(adr,b'\x1D')
+    patrol_y=mb.i2c.read(adr,1)
+    sens={
+     "L1":-1,
+     "L2":-1,
+     "L3":-1,
+     "R1":-1,
+     "R2":-1,
+     "R3":-1
+    }
+    for x in self.patrol:
+      if((patrol_y[0] & self.patrol[x])==self.patrol[x]):
+        sens[x]=1
+      else:
+        sens[x]=0
+    return sens
+
+  def getEncoders(self):
+    buf=bytearray(1)
+    buf[0]=0x04
+    mb.i2c.write(adr,buf)
+    return struct.unpack('>HH',mb.i2c.read(adr,4))
+
+  def clearEncoders(self):
+    buf=bytearray(5)
+    buf[0]=0x04
+    buf[1]=buf[2]=buf[3]=buf[4]=0x00
+    mb.i2c.write(adr,buf)
diff --git a/Telecommande/main.py b/Telecommande/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..af3be78420c26740c8f6abc827b6aa6eba1cd414
--- /dev/null
+++ b/Telecommande/main.py
@@ -0,0 +1,66 @@
+'''
+Gestion télécommande Pour Micro:bit OC Robotique 2025
+Auteur·ice : Vincent Namy
+Version : 1.0
+Date : 3.2.25
+
+'''
+from math import *
+from microbit import *
+from protocole import *
+import lib_robot_maqueen as mqn
+display.off()
+
+# # CONSTANTES
+MOTOR_FORWARD = 0
+MOTOR_BACKWARD = 1
+SPEED = 70
+
+def run(x,y):
+    threshold = 0.2
+    motor = MOTOR_FORWARD
+    if abs(x) <= threshold and  abs(y) <= threshold: # neutral
+        g = 0
+        d = 0
+    elif abs(x) <= threshold: # forward
+        g= int(SPEED)
+        d= int(SPEED)
+        motor =  y < 0
+    elif abs(y) <= threshold: # right/left
+        g= int((x>0)*SPEED)
+        d= int((x<0)*SPEED)
+    else:                     # diag
+        g= int((0.1 + (x>0)*0.9) * SPEED)
+        d= int((0.1 + (x<0)*0.9) * SPEED)
+        motor =  y < 0
+        
+    
+    print("Motors :", g*(-2*motor+1),d*(-2*motor+1))
+    robot.motorControl(robot.MT_L,motor, g)
+    robot.motorControl(robot.MT_R,motor,  d)
+
+if __name__ == '__main__':
+    
+    userId = 1
+    destId = 0
+    robot =  mqn.MaqueenPlus()
+    lastMsgTime = running_time()
+    run(0,0)
+    
+    # Main
+    while True:
+        sleep(10)
+    
+        
+        m = receive_msg(userId)
+        if m and m.msgId==73 :#and len(m.payload) == 3:
+            x = m.payload[0]*2 /255 - 1 # [0;255] --> [-1;1]
+            y = m.payload[1]*2 /255 - 1 # [0;255] --> [-1;1]
+            z = m.payload[2]
+            print("Joystick :", x,y,z)
+            run(x,y)
+        elif (lastMsgTime - running_time()) > 200:
+            run(0,0)
+            
+
+
diff --git a/Telecommande/main_robot.py b/Telecommande/main_robot.py
deleted file mode 100644
index bf496a114b459de7b08287e17921098cef184490..0000000000000000000000000000000000000000
--- a/Telecommande/main_robot.py
+++ /dev/null
@@ -1,25 +0,0 @@
-'''
-Gestion télécommande Pour Micro:bit OC Robotique 2025
-Auteur·ice : Vincent Namy
-Version : 1.0
-Date : 3.2.25
-
-'''
-from microbit import *
-from protocole import *
-display.off()
-
-if __name__ == '__main__':
-    
-    userId = 1
-    destId = 0
-    
-    # Main
-    while True:
-        sleep(10)
-        m = receive_msg(userId)
-        if m and m.msgId==73:
-            print("x", m.payload[0]*4, "y", m.payload[1]*4, "z", m.payload[2])
-            
-
-