rotate-servo.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. servo_arg = msg.payload.split()[0]
  19. try:
  20. offset = int(msg.payload.split()[1])
  21. except:
  22. return
  23. servo = -1
  24. if servo_arg.lower() == "x":
  25. servo = 1
  26. if servo_arg.lower() == "y":
  27. servo = 0
  28. if servo == -1:
  29. print("Servo invalido")
  30. return
  31. update_servo(servo, offset)
  32. client = mqtt.Client()
  33. client.on_connect = on_connect
  34. client.on_message = on_message
  35. client.connect("iot.eclipse.org", 1883, 60)
  36. def update_servo(servo, offset):
  37. filename = "/tmp/servo_%s" % servo
  38. old_val = ""
  39. if path.isfile(filename):
  40. valfile = open(filename, "r+")
  41. old_val = valfile.read()
  42. else:
  43. valfile = open(filename, "w")
  44. try:
  45. old_val = int(old_val)
  46. except:
  47. print("Can't convert. Defaulting")
  48. old_val = 1500
  49. print(old_val)
  50. valfile.seek(0)
  51. new_val = old_val+offset
  52. new_val = min(max(new_val, 900), 1750)
  53. print(new_val, file=valfile)
  54. print(new_val)
  55. steps = int(abs(new_val-old_val)/10)
  56. if steps == 0:
  57. exit(0)
  58. delta = int(offset/steps)
  59. if delta > 0:
  60. delta = "+%d" % delta
  61. servoblaster = open("/dev/servoblaster", "w")
  62. for _ in range(0, steps):
  63. # print("%d=%sus" % ( servo, delta ))
  64. print("%d=%sus" % (servo, delta), file=servoblaster)
  65. servoblaster.flush()
  66. sleep(0.12)
  67. def restart_servos():
  68. servoblaster = open("/dev/servoblaster", "w")
  69. minv = 900
  70. maxv = 1750
  71. servo = 0
  72. percentage = 66
  73. filename = "/tmp/servo_%d" % servo
  74. print("%d=%d%%" % (servo, percentage), file=servoblaster)
  75. print(int((maxv-minv) * (percentage/100))+minv, file=open(filename, "w"))
  76. servo = 1
  77. percentage = 61
  78. filename = "/tmp/servo_%d" % servo
  79. print("%d=%d%%" % (servo, percentage), file=servoblaster)
  80. print(int((maxv-minv) * (percentage/100))+minv, file=open(filename, "w"))
  81. servoblaster.flush()
  82. servoblaster.close()
  83. t = threading.Thread(target=client.loop_forever)
  84. t.start()
  85. t.join()