controlServer.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import threading
  2. import time
  3. import json
  4. import math
  5. class ControlServer(threading.Thread):
  6. def __init__(self, client, USERLIST, MSLIST, PI):
  7. threading.Thread.__init__(self)
  8. self.setDaemon(True)
  9. self.client = client
  10. self.userList = USERLIST
  11. self.mslist = MSLIST
  12. self.pi = PI
  13. def Calibration(self):
  14. # 手动动校准
  15. speed = 0
  16. while True:
  17. speed += 1
  18. for s in self.mslist:
  19. for d in s['pinList']:
  20. if s['name'] == 'MOTOR':
  21. # Set ESC speed via PWM
  22. self.pi.set_servo_pulsewidth(
  23. d, speed * 1000 / 7 + 1000)
  24. else:
  25. self.pi.set_servo_pulsewidth(d, 1500)
  26. time.sleep(2)
  27. print(speed)
  28. if speed > 3:
  29. break
  30. def changePWM(self, params):
  31. # 改变占空比
  32. try:
  33. # 传来的数据格式同配置
  34. data = json.loads(params)
  35. num = data['data']
  36. for j, s in enumerate(self.mslist):
  37. for i, d in enumerate(s['pinList']):
  38. if s['name'] == 'MOTOR':
  39. # Set ESC speed via PWM
  40. dd = math.floor(self.ratioPwm(num[j]['value'][i]))
  41. self.pi.set_servo_pulsewidth(
  42. d, round(dd * 1000 / 7 + 1000))
  43. print(dd)
  44. else:
  45. dds = math.floor(self.ratioSPwm(num[j]['value'][i]))
  46. self.pi.set_servo_pulsewidth(d, dds)
  47. print(dds)
  48. except:
  49. print('参数错误')
  50. pass
  51. def ratioPwm(self, v):
  52. # 换算比例:摇杆范围0-256
  53. num = 2
  54. if v >= 133 and v <= 256:
  55. num = math.floor(((2 / 61) * v - (144 / 61)) * 10) / 10
  56. elif v >= 0 and v < 123:
  57. num = math.floor(((4 / 132 * v) - 2) * 10) / 10
  58. else:
  59. num = 2
  60. return num
  61. def ratioSPwm(self, v):
  62. # 换算比例:摇杆范围0-256
  63. num = math.floor((256 / 2000) * 1000) / 1000
  64. a = (v / num) + 500
  65. if a > 2500:
  66. a = 2500
  67. return a
  68. def __del__(self):
  69. if self.client in self.userList:
  70. self.userList.remove(self.client)
  71. self.client.close()
  72. if self.pi is not None:
  73. self.pi.stop()
  74. def run(self):
  75. while True:
  76. try:
  77. msg = self.client.recv(1024)
  78. if not msg:
  79. self.userList.remove(self.client)
  80. self.client.close()
  81. print('clinet exit1:', len(self.userList))
  82. break
  83. self.changePWM(msg)
  84. # print('客户信息', msg, time.ctime())
  85. except:
  86. self.userList.remove(self.client)
  87. self.client.close()
  88. print('client exit2:', len(self.userList))
  89. break
  90. # 校准 ESC
  91. # ESC_GPIO = 13
  92. # pi.set_servo_pulsewidth(ESC_GPIO, 2000 ) # 最大油门。
  93. # sleep( 2 )
  94. # pi.set_servo_pulsewidth(ESC_GPIO, 1000 ) # 最小油门。
  95. # 睡觉( 2 )