rotate-servo.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #!/usr/bin/env python3
  2. import paho.mqtt.client as mqtt
  3. import threading
  4. import json
  5. from time import sleep
  6. from os import path
  7. # The callback for when the client receives a CONNACK response from the server.
  8. def on_connect(client, userdata, flags, rc):
  9. print("Connected with result code "+str(rc))
  10. # Subscribing in on_connect() means that if we lose the connection and
  11. # reconnect then subscriptions will be renewed.
  12. client.subscribe("video/servo1/#")
  13. # The callback for when a PUBLISH message is received from the server.
  14. def on_message(client, userdata, msg):
  15. print(msg.topic+" "+str(msg.payload))
  16. if msg.topic == "video/servo1/restart":
  17. restart_servos()
  18. if msg.topic == "video/servo1/rotate":
  19. try:
  20. payload = json.loads(msg.payload.decode("utf-8", errors="ignore"))
  21. servo_arg = payload.split()[0]
  22. offset = int(payload.split()[1])
  23. except Exception as e:
  24. print("Exception", e)
  25. return
  26. print(servo_arg, offset)
  27. servo = -1
  28. if servo_arg.lower() == "x":
  29. servo = 1
  30. if servo_arg.lower() == "y":
  31. servo = 0
  32. if servo == -1:
  33. print("Servo invalido")
  34. return
  35. update_servo(servo, offset)
  36. client = mqtt.Client()
  37. client.on_connect = on_connect
  38. client.on_message = on_message
  39. client.connect("192.168.2.123", 1883, 60)
  40. def update_servo(servo, offset):
  41. print("rotating", servo, offset)
  42. filename = "/tmp/servo_%s" % servo
  43. old_val = ""
  44. if path.isfile(filename):
  45. valfile = open(filename, "r+")
  46. old_val = valfile.read()
  47. else:
  48. valfile = open(filename, "w")
  49. try:
  50. old_val = int(old_val)
  51. except:
  52. print("Can't convert. Defaulting")
  53. old_val = 1500
  54. print(old_val)
  55. valfile.seek(0)
  56. new_val = old_val+offset
  57. new_val = min(max(new_val, 900), 1750)
  58. print(new_val, file=valfile)
  59. print(new_val)
  60. steps = int(abs(new_val-old_val)/10)
  61. if steps == 0:
  62. exit(0)
  63. delta = int(offset/steps)
  64. if delta > 0:
  65. delta = "+%d" % delta
  66. servoblaster = open("/dev/servoblaster", "w")
  67. for _ in range(0, steps):
  68. print("%d=%sus" % ( servo, delta ))
  69. print("%d=%sus" % (servo, delta), file=servoblaster)
  70. servoblaster.flush()
  71. sleep(0.12)
  72. servoblaster.close()
  73. def restart_servos():
  74. servoblaster = open("/dev/servoblaster", "w")
  75. minv = 900
  76. maxv = 1750
  77. servo = 0
  78. percentage = 66
  79. filename = "/tmp/servo_%d" % servo
  80. print("%d=%d%%" % (servo, percentage), file=servoblaster)
  81. print(int((maxv-minv) * (percentage/100))+minv, file=open(filename, "w"))
  82. servo = 1
  83. percentage = 61
  84. filename = "/tmp/servo_%d" % servo
  85. s = "%d=%d%%" % (servo, percentage)
  86. print(s)
  87. print(s, file=servoblaster)
  88. print(int((maxv-minv) * (percentage/100))+minv, file=open(filename, "w"))
  89. servoblaster.flush()
  90. servoblaster.close()
  91. t = threading.Thread(target=client.loop_forever)
  92. t.start()
  93. t.join()