1
votes

So I am doing a little project with a Raspberry Pi that involves moving a servo motor. In the following code in Python 3, I begin by starting the servo at approximately 45 degrees. Later in the code, a different angle is determined based on the previous angle, and the the Duty Cycle is changed.

def main():   
    #Import functions
    import measure, move
    import time
    import RPi.GPIO as GPIO
    #Declare Variables
    Servo_pin = 35
    angle = 45
    freq = 50
    #Setup board
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(Servo_pin, GPIO.OUT)
    servo = GPIO.PWM(Servo_pin,freq)
    #Determine Duty Cycle
    dc = 1/18 * (angle) + 2
    print("Starting Duty Cycle: ",dc)
    #Start servo
    servo.start(dc)

    i = 1
    #Determine angle based on previous angle
    while True:
        if (i == 0):
            angle = 45
        elif (i == 1):
            angle = 90
        elif (i == 2):
            angle = 180
        elif (i > 2):
            angle = 45
            i = 0
        i = i+1
        #Change servo's position
        #Convert angle to Duty Cycle
        dc = 1/18 * (angle) + 2
        print("Setting Duty Cycle: ",dc)
        #Change position
        servo.ChangeDutyCycle(dc)
        #Give servo time to finish moving
        time.sleep(0.3)    
main()

I have the servo connected to a battery pack (4 AA batteries), yet the servo won't move with this code. Now, I'll admit that I'm a beginner, and it's probably something really easy and I apologize in advance if it that is the case.

Any help is appreciated!

2
I've got no experience with rasp-pi, but just following the code, do you ever see the output Starting Duty Cycle:?chickity china chinese chicken
@downshift Yes, only once the initial program is started. The startServo function is there only to be called one time to start the servo.Chris
This video may help or suggest somethings to check Servo control using Raspberry Pi.chickity china chinese chicken

2 Answers

3
votes

There needed to be a common ground. I was using two separate breadboards, and did not connect a common ground. As soon as I connected a common ground, the servo began to operate as I wanted.

Thank you for the coding help!

0
votes

According to the docs on https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/sourceforge, the PWM will stop when the the instance variable representing the PWM goes out of scope. Both of your functions contain this line: servo = GPIO.PWM(pin,freq), creating a local variable servo that will go out of scope as soon as the end of the function is reached. One fix is to move these lines:

import time
import RPi.GPIO as GPIO
# HERE you need to define which pin you are using
# I can't tell you how to do that
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
freq = 10.0   # or some other value to get started
servo = GPIO.PWM(pin,freq)

to the top of the script, and then remove those lines from the individual functions. Now servo will be a global variable that will not go out of scope at any point during the program.

There may also be other problems. Do you have a voltmeter or an oscilloscope to verify that the pin is doing what you intend? I deal with this kind of application all the time, and it helps a lot to know if the small pieces of the puzzle are actually working before you connect all the hardware. Nothing ever works right the first time :-).