rotate-servo.py 2.1 KB

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