Here’s the final solution I came up with to finally get a servo motor to behave on a Pi. It may not seem like much but it took a lot of doing to gather all the right bits. This was tested with an SG90 and an SG92R on a Pi Zero.
Scroll straight to the end for the solution.
The most common way for controlling a servo motor on a Pi with is through RPi.GPIO as such:
#!/usr/bin/python3 import RPi.GPIO as GPIO import time servo = 23 GPIO.setmode( GPIO.BCM ) GPIO.setup( servo, GPIO.OUT ) # info on frequency and PWM formula at https://rpi.science.uoit.ca/lab/servo/ pwm = GPIO.PWM( servo, 50 ) pwm.start( 2.5 ) print( "0 deg" ) pwm.ChangeDutyCycle( 2.5 ) # turn towards 0 degree time.sleep( 3 ) print( "90 deg" ) pwm.ChangeDutyCycle( 7.5 ) # turn towards 90 degree time.sleep( 3 ) print( "180 deg" ) pwm.ChangeDutyCycle( 12.5 ) # turn towards 180 degree time.sleep( 3 ) pwm.stop() GPIO.cleanup()
Stuff you might need for this to run:
sudo apt-get update && sudo apt-get install python3-rpi.gpio
It results in super jitter which is unacceptable for the holy mission of pen plotting.
As far as I understand, the jitter comes from the wave form RPi.GPIO produces for Pulse Width Modulation, which is made in software and so it’s not super stable (no dedicated resources to build it). From what I gather, pigpio is programmed to tap into the one hardware PWM that Pis have.
The solution thus is as such:
#!/usr/bin/python3 import RPi.GPIO as GPIO import pigpio import time servo = 23 # more info at http://abyz.me.uk/rpi/pigpio/python.html#set_servo_pulsewidth pwm = pigpio.pi() pwm.set_mode(servo, pigpio.OUTPUT) pwm.set_PWM_frequency( servo, 50 ) print( "0 deg" ) pwm.set_servo_pulsewidth( servo, 500 ) ; time.sleep( 3 ) print( "90 deg" ) pwm.set_servo_pulsewidth( servo, 1500 ) ; time.sleep( 3 ) print( "180 deg" ) pwm.set_servo_pulsewidth( servo, 2500 ) ; time.sleep( 3 ) # turning off servo pwm.set_PWM_dutycycle(servo, 0) pwm.set_PWM_frequency( servo, 0 )
Stuff you might need for this to run:
sudo apt-get update && sudo apt-get install python3-pigpio sudo pigpiod
brillant!
This is just brilliant!! Thank you so much for sharing!! I spent so many hours thinking of all sorts of reasons, that could have resulted in this super jitter. Now everything is so smooth thanks to you!!
protip!
hi, i tried using PIGPIO on MG995 servo but it doesn’t go the angle like in the coding. it moves more than 360 degree angle even if i decrease the time in sleep. Can you help me?
It’s not the time you want to change, it’s the frequency set on this line: “pwm = GPIO.PWM( servo, 50 )” and the duty cycle set on this line: “pwm = GPIO.PWM( servo, 50 )”
They’ll be specific to your model, and I’m sure it’s documented in the manual or specs.
much apreciated.thats the solution
Thanks. I tested on my RPi3B+ and SG90 servos. PIGPIO is a much better solution than just turning the servo off after each positioning.
Thanks a lot ^^
mad my life so much easier.
thanks!
it works!!
thank you very much!
Thank you for dropping a note 🙂 it’s always nice to know these posts help others. Take care.