update
This commit is contained in:
parent
a4f6b73e45
commit
ce5fc4c445
13 changed files with 188 additions and 40 deletions
18
PWMDriver.py
18
PWMDriver.py
|
@ -12,6 +12,21 @@ class PWMDriver:
|
||||||
'rev': {'range': 270, 'min': 95, 'max': 600}, # 552
|
'rev': {'range': 270, 'min': 95, 'max': 600}, # 552
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#définir la fréquence du signal de sortie à 50hz
|
||||||
|
def ini_esc(slot):
|
||||||
|
slef.driver.set_pwm(slot,0,307) #307 est le signal neutre sous 50 Hz (1.5 / 20 x 4096 = 307)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
def initialiser_esc():
|
||||||
|
HZ = 50 #fréquence du signal vers les ESC
|
||||||
|
self.driver.set_pwm_freq(HZ)
|
||||||
|
LESC = (1, 13, 8, 9) #liste des ESC (avant gauche, avant droit, arrière gauche, arrière droit)
|
||||||
|
ini_esc(LESC[0])
|
||||||
|
ini_esc(LESC[1])
|
||||||
|
ini_esc(LESC[2])
|
||||||
|
ini_esc(LESC[3])
|
||||||
|
|
||||||
def setAngle(self, slot, angle, profileName = 'default'):
|
def setAngle(self, slot, angle, profileName = 'default'):
|
||||||
profile = None
|
profile = None
|
||||||
if type(profileName) is dict:
|
if type(profileName) is dict:
|
||||||
|
@ -32,7 +47,8 @@ class PWMDriver:
|
||||||
self.driver.set_pwm(slot, 0, pulse)
|
self.driver.set_pwm(slot, 0, pulse)
|
||||||
|
|
||||||
def setPwm(self, slot, off, on):
|
def setPwm(self, slot, off, on):
|
||||||
self.driver.set_pwm(slot, off, on)
|
#self.driver.set_pwm(slot, off, on)
|
||||||
|
self.driver.set_pwm(slot, off,on)
|
||||||
|
|
||||||
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
||||||
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
||||||
|
|
1
Robot-copy-of-eurobot-2020-main
Submodule
1
Robot-copy-of-eurobot-2020-main
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit f0dbb17e830c7d70283bebdbdc246b375ef9c863
|
15
Robot.py
15
Robot.py
|
@ -26,15 +26,26 @@ class Robot:
|
||||||
print('error')
|
print('error')
|
||||||
return 'error'
|
return 'error'
|
||||||
def rotation(self, direction, vitesse):
|
def rotation(self, direction, vitesse):
|
||||||
|
print(direction, vitesse)
|
||||||
if direction == 'CW':
|
if direction == 'CW':
|
||||||
|
print('vitesse')
|
||||||
Controls.clockwiseRotation(vitesse)
|
Controls.clockwiseRotation(vitesse)
|
||||||
elif direction == 'ACW':
|
elif direction == 'ACW':
|
||||||
|
print(vitesse)
|
||||||
Controls.antiClockwiseRotation(vitesse)
|
Controls.antiClockwiseRotation(vitesse)
|
||||||
else:
|
else:
|
||||||
print('error')
|
print('error')
|
||||||
return 'error'
|
return 'error'
|
||||||
def turbine(self, vitesse):
|
|
||||||
pass
|
def turbine_aspirer(self):
|
||||||
|
Controls.set_raw_esc('turbine', 230)
|
||||||
|
|
||||||
|
def turbine_stop(self):
|
||||||
|
Controls.set_raw_esc('turbine', 0)
|
||||||
|
|
||||||
|
def turbine_souffler(self):
|
||||||
|
Controls.set_raw_esc('turbine', 251)
|
||||||
|
|
||||||
def tuyau(self, axe, vitesse):
|
def tuyau(self, axe, vitesse):
|
||||||
#axe : vertical / horizontal
|
#axe : vertical / horizontal
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -11,11 +11,12 @@ class MotorizedPlatform:
|
||||||
'frontLeft': 50,
|
'frontLeft': 50,
|
||||||
'frontRight': 50,
|
'frontRight': 50,
|
||||||
'backLeft': 50,
|
'backLeft': 50,
|
||||||
'backRight': 50
|
'backRight': 50,
|
||||||
|
'turbine': 50
|
||||||
}
|
}
|
||||||
escMapping = {
|
escMapping = {
|
||||||
'frontLeft': {
|
'frontLeft': {
|
||||||
'slot': 12, # 7
|
'slot': 1, # 7
|
||||||
'range': [307, 410]
|
'range': [307, 410]
|
||||||
},
|
},
|
||||||
'frontRight': {
|
'frontRight': {
|
||||||
|
@ -29,16 +30,24 @@ class MotorizedPlatform:
|
||||||
'backRight': {
|
'backRight': {
|
||||||
'slot': 9,
|
'slot': 9,
|
||||||
'range': [307, 410]
|
'range': [307, 410]
|
||||||
|
},
|
||||||
|
'turbine': {
|
||||||
|
'slot': 7,
|
||||||
|
'range':[307,410],
|
||||||
|
'stop': 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
escSlotsList= [12,13,8,9]
|
escSlotsList= [12,13,8,9]
|
||||||
def set_range(self, name:str, mini:int, maxi:int):
|
def set_range(self, name:str, mini:int, maxi:int):
|
||||||
self.escMapping[name]['range'] = [mini,maxi]
|
self.escMapping[name]['range'] = [mini,maxi]
|
||||||
def init(self):
|
def init(self):
|
||||||
if drive != None:
|
print("drive init start")
|
||||||
for k,v in self.escMapping.items():
|
v = self.escMapping['turbine']
|
||||||
# 307 est le signal neutre sous 50 Hz (1.5 / 20 x 4096 = 307)
|
for i in range(240, 250, 1):
|
||||||
drive.setPwm(v['slot'], 0, 307)
|
drive.setPwm(v['slot'], 0, i)
|
||||||
|
sleep(0.02)
|
||||||
|
drive.setPwm(v['slot'], 0, 0)
|
||||||
|
print("drive init stop")
|
||||||
|
|
||||||
#escSlots = [7, 6, 8, 9]
|
#escSlots = [7, 6, 8, 9]
|
||||||
def setSpeed(self, values):
|
def setSpeed(self, values):
|
||||||
|
@ -59,6 +68,13 @@ class MotorizedPlatform:
|
||||||
self.convert_speed_to_esc(value, self.escMapping[esc_name]['range'])
|
self.convert_speed_to_esc(value, self.escMapping[esc_name]['range'])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def set_raw_esc(self, esc_name, value):
|
||||||
|
drive.setPwm(
|
||||||
|
self.escMapping[esc_name]['slot'],
|
||||||
|
0,
|
||||||
|
value
|
||||||
|
)
|
||||||
|
|
||||||
# équivalent de la fonction map() de arduino
|
# équivalent de la fonction map() de arduino
|
||||||
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
||||||
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
||||||
|
@ -88,21 +104,19 @@ class MotorizedPlatform:
|
||||||
self.eastTranslation(- speed)
|
self.eastTranslation(- speed)
|
||||||
|
|
||||||
def clockwiseRotation(self, speed):
|
def clockwiseRotation(self, speed):
|
||||||
a = self.convert_speed_to_esc(speed)
|
|
||||||
r = self.convert_speed_to_esc(-speed)
|
|
||||||
self.setSpeed({
|
self.setSpeed({
|
||||||
'frontLeft': a,
|
'frontLeft': speed,
|
||||||
'frontRight': a,
|
'frontRight':speed,
|
||||||
'backLeft': r,
|
'backLeft': speed,
|
||||||
'backRight': r
|
'backRight': speed
|
||||||
})
|
})
|
||||||
|
|
||||||
def antiClockwiseRotation(self, speed):
|
def antiClockwiseRotation(self, speed):
|
||||||
self.clockwiseRotation(-speed)
|
self.clockwiseRotation(-speed)
|
||||||
|
|
||||||
def northEastTranslation(self, speed):
|
def northEastTranslation(self, speed):
|
||||||
a = self.convert_speed_to_esc(speed)
|
a = speed
|
||||||
s = self.convert_speed_to_esc(0)
|
s = 0
|
||||||
self.setSpeed({
|
self.setSpeed({
|
||||||
'frontLeft': a,
|
'frontLeft': a,
|
||||||
'frontRight': s,
|
'frontRight': s,
|
||||||
|
@ -124,8 +138,17 @@ class MotorizedPlatform:
|
||||||
def southEastTranslation(self, speed):
|
def southEastTranslation(self, speed):
|
||||||
self.northWestTranslation(-speed)
|
self.northWestTranslation(-speed)
|
||||||
|
|
||||||
|
def setTurbine(self, speed):
|
||||||
|
self.setSpeed({
|
||||||
|
'turbine':0
|
||||||
|
})
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self.init()
|
if drive != None:
|
||||||
|
for k,v in self.escMapping.items():
|
||||||
|
if k == 'turbine':
|
||||||
|
continue
|
||||||
|
drive.setPwm(v['slot'], 0, v['range'][0])
|
||||||
"""
|
"""
|
||||||
realescMapping = {
|
realescMapping = {
|
||||||
'frontLeft': {
|
'frontLeft': {
|
||||||
|
|
40
ServoDriver.py
Normal file
40
ServoDriver.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
from Adafruit_PCA9685 import PCA9685
|
||||||
|
|
||||||
|
class ServoDriver:
|
||||||
|
def __init__(self):
|
||||||
|
self.driver = PCA9685()
|
||||||
|
self.driver.set_pwm_freq(50)
|
||||||
|
self.servoProfiles = {
|
||||||
|
'default': {'range': 180, 'min': 65, 'max': 530},
|
||||||
|
# telescope 2023-04-08
|
||||||
|
# deployé: 180 deg
|
||||||
|
# rangé: 40 deg
|
||||||
|
'scope': {'range': 180, 'min': 65, 'max': 530},
|
||||||
|
}
|
||||||
|
|
||||||
|
def setAngle(self, slot, angle, profileName = 'default'):
|
||||||
|
profile = None
|
||||||
|
if type(profileName) is dict:
|
||||||
|
profile = profileName
|
||||||
|
if profile == None:
|
||||||
|
if profileName not in self.servoProfiles:
|
||||||
|
profileName = 'default'
|
||||||
|
profile = self.servoProfiles[profileName]
|
||||||
|
if 'range' not in profile:
|
||||||
|
profile['range'] = 180
|
||||||
|
if angle < 0 or angle > profile['range']:
|
||||||
|
print('PWMDriver: Invalid range passed ' + angle + ' but range is ' + profile['range'])
|
||||||
|
if slot > 15 or slot < 0:
|
||||||
|
print('> ERR!!! Invalid slot passed to setAngle!')
|
||||||
|
return
|
||||||
|
pulse = int(self.mappyt(angle, 0, profile['range'], profile['min'], profile['max']))
|
||||||
|
#print('setting slot', slot, 'to angle', angle, 'with profile', profileName, profile, pulse)
|
||||||
|
self.driver.set_pwm(slot, 0, pulse)
|
||||||
|
|
||||||
|
def setPwm(self, slot, off, on):
|
||||||
|
self.driver.set_pwm(slot, off, on)
|
||||||
|
|
||||||
|
def mappyt(self, x, inMin, inMax, outMin, outMax):
|
||||||
|
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
__pycache__/ServoDriver.cpython-39.pyc
Normal file
BIN
__pycache__/ServoDriver.cpython-39.pyc
Normal file
Binary file not shown.
BIN
__pycache__/test_by_motor.cpython-39.pyc
Normal file
BIN
__pycache__/test_by_motor.cpython-39.pyc
Normal file
Binary file not shown.
4
robot_manual.py
Normal file
4
robot_manual.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import RobotCompleteCOde
|
||||||
|
r = RobotCompletCode.MotorizedPlatform()
|
||||||
|
s = r.setSpeed
|
||||||
|
|
42
server.py
42
server.py
|
@ -1,11 +1,15 @@
|
||||||
import Robot
|
import Robot
|
||||||
|
import traceback
|
||||||
import asyncio;
|
import asyncio;
|
||||||
import json
|
import json
|
||||||
import websockets;
|
import websockets;
|
||||||
import sys;
|
import sys;
|
||||||
import Container
|
import Container
|
||||||
from PWMDriver import PWMDriver
|
from PWMDriver import PWMDriver
|
||||||
|
from ServoDriver import ServoDriver
|
||||||
|
|
||||||
robot = Robot.Robot()
|
robot = Robot.Robot()
|
||||||
|
servo_driver = ServoDriver()
|
||||||
#robot = Robot.Robot()
|
#robot = Robot.Robot()
|
||||||
#t = robot.Translation
|
#t = robot.Translation
|
||||||
#r = robot.Rotation
|
#r = robot.Rotation
|
||||||
|
@ -48,6 +52,7 @@ class commandHandler:
|
||||||
return 'initialised'
|
return 'initialised'
|
||||||
def set_rotation(self, arg):
|
def set_rotation(self, arg):
|
||||||
try:
|
try:
|
||||||
|
print(arg, self.speed);
|
||||||
robot.rotation(arg,self.speed)
|
robot.rotation(arg,self.speed)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
@ -62,6 +67,27 @@ class commandHandler:
|
||||||
def set_range(self, name:str, mini:int, maxi:int):
|
def set_range(self, name:str, mini:int, maxi:int):
|
||||||
robot.set_range(name, mini, maxi)
|
robot.set_range(name, mini, maxi)
|
||||||
|
|
||||||
|
def turbine_souffler(self):
|
||||||
|
robot.turbine_souffler()
|
||||||
|
return 'Turbine souffler'
|
||||||
|
|
||||||
|
def turbine_stop(self):
|
||||||
|
robot.turbine_stop()
|
||||||
|
return 'Turbine stopped'
|
||||||
|
|
||||||
|
def turbine_aspirer(self):
|
||||||
|
robot.turbine_aspirer()
|
||||||
|
return 'Turbine aspirer'
|
||||||
|
|
||||||
|
def telescope_deploy(self):
|
||||||
|
# slot 4
|
||||||
|
servo_driver.setAngle(4, 180, profileName='scope')
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def telescope_zero(self):
|
||||||
|
servo_driver.setAngle(4, 40, profileName='scope')
|
||||||
|
# slot 4
|
||||||
|
return ''
|
||||||
|
|
||||||
cmd_handler = commandHandler()
|
cmd_handler = commandHandler()
|
||||||
def commands(data):
|
def commands(data):
|
||||||
|
@ -88,10 +114,21 @@ def commands(data):
|
||||||
res=cmd_handler.init()
|
res=cmd_handler.init()
|
||||||
elif(data['cmd']=='set_speed'):
|
elif(data['cmd']=='set_speed'):
|
||||||
res=cmd_handler.set_speed(data["args"]["speed"])
|
res=cmd_handler.set_speed(data["args"]["speed"])
|
||||||
|
elif(data['cmd']=='turbine_aspirer'):
|
||||||
|
res=cmd_handler.turbine_aspirer()
|
||||||
|
elif(data['cmd']=='turbine_stop'):
|
||||||
|
res=cmd_handler.turbine_stop()
|
||||||
|
elif(data['cmd']=='turbine_souffler'):
|
||||||
|
res=cmd_handler.turbine_souffler()
|
||||||
|
elif(data['cmd']=='telescope_deploy'):
|
||||||
|
res=cmd_handler.telescope_deploy()
|
||||||
|
elif(data['cmd']=='telescope_zero'):
|
||||||
|
res=cmd_handler.telescope_zero()
|
||||||
else:
|
else:
|
||||||
return 'NOPE!!!'
|
return 'NOPE!!!'
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return e
|
traceback.print_exc()
|
||||||
|
return str(e)
|
||||||
return res
|
return res
|
||||||
async def handler(websocket, path):
|
async def handler(websocket, path):
|
||||||
print('new handler created at path'+path)
|
print('new handler created at path'+path)
|
||||||
|
@ -110,6 +147,9 @@ print('server running at 0.0.0.0 with port 1567')
|
||||||
start_server = websockets.serve(handler, "0.0.0.0", 1567)
|
start_server = websockets.serve(handler, "0.0.0.0", 1567)
|
||||||
|
|
||||||
|
|
||||||
|
# init motors
|
||||||
|
robot.init()
|
||||||
|
|
||||||
asyncio.get_event_loop().run_until_complete(start_server)
|
asyncio.get_event_loop().run_until_complete(start_server)
|
||||||
|
|
||||||
asyncio.get_event_loop().run_forever()
|
asyncio.get_event_loop().run_forever()
|
||||||
|
|
13
test_by_motor.py
Normal file
13
test_by_motor.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from RobotCompletCode import MotorizedPlatform
|
||||||
|
m = MotorizedPlatform()
|
||||||
|
def frontLeft(speed):
|
||||||
|
m.setSpeed({"frontLeft":speed})
|
||||||
|
|
||||||
|
def frontRight(speed):
|
||||||
|
m.setSpeed({"frontRight":speed})
|
||||||
|
|
||||||
|
def backLeft(speed):
|
||||||
|
m.setSpeed({"backLeft":speed})
|
||||||
|
|
||||||
|
def backRight(speed):
|
||||||
|
m.setSpeed({"backRight":speed})
|
Loading…
Reference in a new issue