|
3 | 3 | from pubsub import pub
|
4 | 4 |
|
5 | 5 | class JetsonServo:
|
6 |
| - def __init__(self, pin, range, **kwargs): |
7 |
| - self.pin = pin |
8 |
| - self.range = range |
| 6 | + def __init__(self, left_pin, right_pin, **kwargs): |
| 7 | + self.left_pin = left_pin |
| 8 | + self.right_pin = right_pin |
9 | 9 | self.start = kwargs.get('start_pos', 0)
|
10 | 10 | self.setup_gpio()
|
11 |
| - self.servo = GPIO.PWM(pin, 50) # GPIO pin 18, 50Hz |
12 |
| - self.servo.start(self.start) |
13 |
| - pub.subscribe(self.move, 'jetservo:move') |
| 11 | + self.left_servo = GPIO.PWM(left_pin, 50) # Left servo pin, 50Hz |
| 12 | + self.right_servo = GPIO.PWM(right_pin, 50) # Right servo pin, 50Hz |
| 13 | + self.left_servo.start(self.start) |
| 14 | + self.right_servo.start(self.start) |
| 15 | + |
| 16 | + pub.subscribe(self.move, 'jetservo:move') # All jetservo movement |
| 17 | + pub.subscribe(self.invert_move, 'jetservo:inversermove') # Inverse jetservo movement |
| 18 | + pub.subscribe(self.move_left, 'jetservo:left_move') # Left jetservo |
| 19 | + pub.subscribe(self.move_right, 'jetservo:right_move') # Right jetservo |
14 | 20 |
|
15 | 21 | def setup_gpio(self):
|
16 | 22 | GPIO.setmode(GPIO.BCM) # Set GPIO numbering mode to BCM
|
17 |
| - GPIO.setup(self.pin, GPIO.OUT) # Set pin as output |
| 23 | + GPIO.setup(self.left_pin, GPIO.OUT) # Set left pin as output |
| 24 | + GPIO.setup(self.right_pin, GPIO.OUT) # Set right pin as output |
18 | 25 |
|
19 | 26 | def move(self, angle):
|
20 |
| - duty = self.angle_to_duty(angle) |
21 |
| - self.servo.ChangeDutyCycle(duty) |
| 27 | + left_duty = self.angle_to_duty(angle) |
| 28 | + right_duty = self.angle_to_duty(angle) |
| 29 | + self.left_servo.ChangeDutyCycle(left_duty) |
| 30 | + self.right_servo.ChangeDutyCycle(right_duty) |
| 31 | + sleep(1) # @TODO: Remove this sleep |
| 32 | + |
| 33 | + def invert_move(self, angle): |
| 34 | + left_duty = self.angle_to_duty(angle) |
| 35 | + right_duty = self.angle_to_duty(180 - angle) # Inverse movement for right servo |
| 36 | + self.left_servo.ChangeDutyCycle(left_duty) |
| 37 | + self.right_servo.ChangeDutyCycle(right_duty) |
22 | 38 | sleep(1) # @TODO: Remove this sleep
|
23 | 39 |
|
| 40 | + def move_left(self, angle): |
| 41 | + duty = self.angle_to_duty(angle) |
| 42 | + GPIO.output(self.left_pin, GPIO.HIGH) # Set left servo pin to HIGH |
| 43 | + self.left_servo.ChangeDutyCycle(duty) |
| 44 | + sleep(1) # Wait for the servo to complete movement |
| 45 | + GPIO.output(self.left_pin, GPIO.LOW) # Set left servo pin to LOW |
| 46 | + |
| 47 | + def move_right(self, angle): |
| 48 | + duty = self.angle_to_duty(angle) |
| 49 | + GPIO.output(self.right_pin, GPIO.HIGH) # Set right servo pin to HIGH |
| 50 | + self.right_servo.ChangeDutyCycle(duty) |
| 51 | + sleep(1) # Wait for the servo to complete movement |
| 52 | + GPIO.output(self.right_pin, GPIO.LOW) # Set right servo pin to LOW |
| 53 | + |
24 | 54 | def angle_to_duty(self, angle):
|
25 | 55 | duty = angle / 18 + 2 # Map angle (0 to 180) to duty cycle (2 to 12)
|
26 | 56 | return duty
|
27 | 57 |
|
| 58 | + def cleanup(self): |
| 59 | + self.left_servo.stop() |
| 60 | + self.right_servo.stop() |
| 61 | + GPIO.cleanup() # Clean up GPIO pins |
0 commit comments