Boss lady
Boss lady
DIIDevHeads IoT Integration Server
Created by Boss lady on 7/30/2024 in #pcb-and-analog
How to fix SG90 servo motor jitter on BeagleBone Black with PWM?
Hey guys, am developing a robotic arm control system using a BeagleBone Black running Embedded Linux using AM335x ARM Cortex-A8. The system needs to control the position of a servo motor(SG90) using PWM. I have ensured that the Adafruit_BBIO library is correctly installed and imported in my script, adjusted the duty cycle range if the servo motor does not reach the full range of motion (0-180 degrees). But am getting the error  warning: SG90 Servo motor jitter detected    
   import Adafruit_BBIO.PWM as PWM

   import time


   # Define PWM pin and servo parameters

   PWM_PIN = "P9_14"

   PWM_FREQUENCY = 50  # Servo motors typically use a 50Hz frequency


   # Initialize PWM

   PWM.start(PWM_PIN, 7.5, PWM_FREQUENCY# Start with 7.5% duty cycle (neutral position)


   def set_servo_angle(angle):

       # Convert angle to duty cycle

       duty_cycle = (0.05 * angle) / 18 + 2.5

       PWM.set_duty_cycle(PWM_PIN, duty_cycle)


   try:

       while True:

           for angle in range(0, 181, 10):  # Sweep from 0 to 180 degrees

               set_servo_angle(angle)

               print(f"Servo Angle: {angle} degrees")

               time.sleep(0.5)


           for angle in range(180, -1, -10):  # Sweep back from 180 to 0 degrees

               set_servo_angle(angle)

               print(f"Servo Angle: {angle} degrees")

               time.sleep(0.5)


   except KeyboardInterrupt:

       print("\nExiting...")


   finally:

       PWM.stop(PWM_PIN)

       PWM.cleanup()

   
   import Adafruit_BBIO.PWM as PWM

   import time


   # Define PWM pin and servo parameters

   PWM_PIN = "P9_14"

   PWM_FREQUENCY = 50  # Servo motors typically use a 50Hz frequency


   # Initialize PWM

   PWM.start(PWM_PIN, 7.5, PWM_FREQUENCY# Start with 7.5% duty cycle (neutral position)


   def set_servo_angle(angle):

       # Convert angle to duty cycle

       duty_cycle = (0.05 * angle) / 18 + 2.5

       PWM.set_duty_cycle(PWM_PIN, duty_cycle)


   try:

       while True:

           for angle in range(0, 181, 10):  # Sweep from 0 to 180 degrees

               set_servo_angle(angle)

               print(f"Servo Angle: {angle} degrees")

               time.sleep(0.5)


           for angle in range(180, -1, -10):  # Sweep back from 180 to 0 degrees

               set_servo_angle(angle)

               print(f"Servo Angle: {angle} degrees")

               time.sleep(0.5)


   except KeyboardInterrupt:

       print("\nExiting...")


   finally:

       PWM.stop(PWM_PIN)

       PWM.cleanup()

   
18 replies