rotate-servo.py 2.8 KB

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