Skip to content
This repository was archived by the owner on Sep 4, 2025. It is now read-only.

Commit d3df8cc

Browse files
Update jetservo.py
Added second jetservo and added new pub subscriptions to servos
1 parent 0762b6f commit d3df8cc

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

modules/actuators/jetservo.py

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,59 @@
33
from pubsub import pub
44

55
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
99
self.start = kwargs.get('start_pos', 0)
1010
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
1420

1521
def setup_gpio(self):
1622
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
1825

1926
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)
2238
sleep(1) # @TODO: Remove this sleep
2339

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+
2454
def angle_to_duty(self, angle):
2555
duty = angle / 18 + 2 # Map angle (0 to 180) to duty cycle (2 to 12)
2656
return duty
2757

58+
def cleanup(self):
59+
self.left_servo.stop()
60+
self.right_servo.stop()
61+
GPIO.cleanup() # Clean up GPIO pins

0 commit comments

Comments
 (0)