|
@@ -0,0 +1,104 @@
|
|
|
|
|
+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 )
|