This commit is contained in:
GZod01 2023-05-27 11:30:02 +02:00
parent a4f6b73e45
commit ce5fc4c445
13 changed files with 188 additions and 40 deletions

View file

@ -1,38 +1,54 @@
from Adafruit_PCA9685 import PCA9685
class PWMDriver:
def __init__(self):
self.driver = PCA9685()
def __init__(self):
self.driver = PCA9685()
self.driver.set_pwm_freq(50)
self.servoProfiles = {
'default': {'range': 180, 'min': 65, 'max': 530},
'lidar': {'range': 180, 'min': 75, 'max': 510},
'china': {'range': 180, 'min': 75, 'max': 510},
'flag': {'range': 180, 'min': 100, 'max': 480},
'rev': {'range': 270, 'min': 95, 'max': 600}, # 552
}
'default': {'range': 180, 'min': 65, 'max': 530},
'lidar': {'range': 180, 'min': 75, 'max': 510},
'china': {'range': 180, 'min': 75, 'max': 510},
'flag': {'range': 180, 'min': 100, 'max': 480},
'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'):
profile = None
profile = None
if type(profileName) is dict:
profile = profileName
profile = profileName
if profile == None:
if profileName not in self.servoProfiles:
profileName = 'default'
if profileName not in self.servoProfiles:
profileName = 'default'
profile = self.servoProfiles[profileName]
if 'range' not in profile:
profile['range'] = 180
profile['range'] = 180
if angle < 0 or angle > profile['range']:
print('PWMDriver: Invalid range passed ' + angle + ' but range is ' + 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!')
print('> ERR!!! Invalid slot passed to setAngle!')
return
pulse = int(self.mappyt(angle, 0, profile['range'], profile['min'], profile['max']))
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)
#self.driver.set_pwm(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
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin

@ -0,0 +1 @@
Subproject commit f0dbb17e830c7d70283bebdbdc246b375ef9c863

View file

@ -2,7 +2,7 @@ import RobotCompletCode
Controls = RobotCompletCode.MotorizedPlatform()
class Robot:
def init(self):
Controls.init()
Controls.init()
def set_range(self, name:str, mini:int, maxi:int):
Controls.set_range(name,mini,maxi)
def translation(self, direction, vitesse):
@ -26,15 +26,26 @@ class Robot:
print('error')
return 'error'
def rotation(self, direction, vitesse):
print(direction, vitesse)
if direction == 'CW':
print('vitesse')
Controls.clockwiseRotation(vitesse)
elif direction == 'ACW':
print(vitesse)
Controls.antiClockwiseRotation(vitesse)
else:
print('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):
#axe : vertical / horizontal
pass

View file

@ -11,11 +11,12 @@ class MotorizedPlatform:
'frontLeft': 50,
'frontRight': 50,
'backLeft': 50,
'backRight': 50
'backRight': 50,
'turbine': 50
}
escMapping = {
'frontLeft': {
'slot': 12, # 7
'slot': 1, # 7
'range': [307, 410]
},
'frontRight': {
@ -29,16 +30,24 @@ class MotorizedPlatform:
'backRight': {
'slot': 9,
'range': [307, 410]
}
},
'turbine': {
'slot': 7,
'range':[307,410],
'stop': 0
}
}
escSlotsList= [12,13,8,9]
def set_range(self, name:str, mini:int, maxi:int):
self.escMapping[name]['range'] = [mini,maxi]
def init(self):
if drive != None:
for k,v in self.escMapping.items():
# 307 est le signal neutre sous 50 Hz (1.5 / 20 x 4096 = 307)
drive.setPwm(v['slot'], 0, 307)
print("drive init start")
v = self.escMapping['turbine']
for i in range(240, 250, 1):
drive.setPwm(v['slot'], 0, i)
sleep(0.02)
drive.setPwm(v['slot'], 0, 0)
print("drive init stop")
#escSlots = [7, 6, 8, 9]
def setSpeed(self, values):
@ -59,7 +68,14 @@ class MotorizedPlatform:
self.convert_speed_to_esc(value, self.escMapping[esc_name]['range'])
)
# équivalent de la fonction map() de arduino
def set_raw_esc(self, esc_name, value):
drive.setPwm(
self.escMapping[esc_name]['slot'],
0,
value
)
# équivalent de la fonction map() de arduino
def mappyt(self, x, inMin, inMax, outMin, outMax):
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
@ -88,21 +104,19 @@ class MotorizedPlatform:
self.eastTranslation(- speed)
def clockwiseRotation(self, speed):
a = self.convert_speed_to_esc(speed)
r = self.convert_speed_to_esc(-speed)
self.setSpeed({
'frontLeft': a,
'frontRight': a,
'backLeft': r,
'backRight': r
'frontLeft': speed,
'frontRight':speed,
'backLeft': speed,
'backRight': speed
})
def antiClockwiseRotation(self, speed):
self.clockwiseRotation(-speed)
def northEastTranslation(self, speed):
a = self.convert_speed_to_esc(speed)
s = self.convert_speed_to_esc(0)
a = speed
s = 0
self.setSpeed({
'frontLeft': a,
'frontRight': s,
@ -123,9 +137,18 @@ class MotorizedPlatform:
def southEastTranslation(self, speed):
self.northWestTranslation(-speed)
def setTurbine(self, speed):
self.setSpeed({
'turbine':0
})
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 = {
'frontLeft': {

40
ServoDriver.py Normal file
View 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.

Binary file not shown.

4
robot_manual.py Normal file
View file

@ -0,0 +1,4 @@
import RobotCompleteCOde
r = RobotCompletCode.MotorizedPlatform()
s = r.setSpeed

View file

@ -1,11 +1,15 @@
import Robot
import traceback
import asyncio;
import json
import websockets;
import sys;
import Container
from PWMDriver import PWMDriver
from ServoDriver import ServoDriver
robot = Robot.Robot()
servo_driver = ServoDriver()
#robot = Robot.Robot()
#t = robot.Translation
#r = robot.Rotation
@ -48,6 +52,7 @@ class commandHandler:
return 'initialised'
def set_rotation(self, arg):
try:
print(arg, self.speed);
robot.rotation(arg,self.speed)
except Exception as e:
print(e)
@ -62,6 +67,27 @@ class commandHandler:
def set_range(self, name:str, mini:int, maxi:int):
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()
def commands(data):
@ -88,10 +114,21 @@ def commands(data):
res=cmd_handler.init()
elif(data['cmd']=='set_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:
return 'NOPE!!!'
except Exception as e:
return e
traceback.print_exc()
return str(e)
return res
async def handler(websocket, 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)
# init motors
robot.init()
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

13
test_by_motor.py Normal file
View 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})