| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- import threading
- import time
- import json
- import math
- class ControlServer(threading.Thread):
- def __init__(self, client, USERLIST, MSLIST, PI):
- threading.Thread.__init__(self)
- self.setDaemon(True)
- self.client = client
- self.userList = USERLIST
- self.mslist = MSLIST
- self.pi = PI
- def Calibration(self):
- # 手动动校准
- speed = 0
- while True:
- speed += 1
- for s in self.mslist:
- for d in s['pinList']:
- if s['name'] == 'MOTOR':
- # Set ESC speed via PWM
- self.pi.set_servo_pulsewidth(
- d, speed * 1000 / 7 + 1000)
- else:
- self.pi.set_servo_pulsewidth(d, 1500)
- time.sleep(2)
- print(speed)
- if speed > 3:
- break
- def changePWM(self, params):
- # 改变占空比
- try:
- # 传来的数据格式同配置
- data = json.loads(params)
- num = data['data']
- for j, s in enumerate(self.mslist):
- for i, d in enumerate(s['pinList']):
- if s['name'] == 'MOTOR':
- # Set ESC speed via PWM
- dd = math.floor(self.ratioPwm(num[j]['value'][i]))
- self.pi.set_servo_pulsewidth(
- d, round(dd * 1000 / 7 + 1000))
- print(dd)
- else:
- dds = math.floor(self.ratioSPwm(num[j]['value'][i]))
- self.pi.set_servo_pulsewidth(d, dds)
- print(dds)
- except:
- print('参数错误')
- pass
- def ratioPwm(self, v):
- # 换算比例:摇杆范围0-256
- num = 2
- if v >= 133 and v <= 256:
- num = math.floor(((2 / 61) * v - (144 / 61)) * 10) / 10
- elif v >= 0 and v < 123:
- num = math.floor(((4 / 132 * v) - 2) * 10) / 10
- else:
- num = 2
- return num
- def ratioSPwm(self, v):
- # 换算比例:摇杆范围0-256
- num = math.floor((256 / 2000) * 1000) / 1000
- a = (v / num) + 500
- if a > 2500:
- a = 2500
- return a
- def __del__(self):
- if self.client in self.userList:
- self.userList.remove(self.client)
- self.client.close()
- if self.pi is not None:
- self.pi.stop()
- def run(self):
- while True:
- try:
- msg = self.client.recv(1024)
- if not msg:
- self.userList.remove(self.client)
- self.client.close()
- print('clinet exit1:', len(self.userList))
- break
- self.changePWM(msg)
- # print('客户信息', msg, time.ctime())
- except:
- self.userList.remove(self.client)
- self.client.close()
- print('client exit2:', len(self.userList))
- break
- # 校准 ESC
- # ESC_GPIO = 13
- # pi.set_servo_pulsewidth(ESC_GPIO, 2000 ) # 最大油门。
- # sleep( 2 )
- # pi.set_servo_pulsewidth(ESC_GPIO, 1000 ) # 最小油门。
- # 睡觉( 2 )
|