简体   繁体   中英

Servo controller with PCA9685 and Raspberry Pi

I try to learn how to use a PCA9685 module to control servos with a raspberry pi. I am following the adafruit tutorial which supplies the following code:

# Simple demo of of the PCA9685 PWM servo/LED controller library.
# This will move channel 0 from min to max position repeatedly.
# Author: Tony DiCola
# License: Public Domain
from __future__ import division
import time

# Import the PCA9685 module.
import Adafruit_PCA9685


# Uncomment to enable debug output.
#import logging
#logging.basicConfig(level=logging.DEBUG)

# Initialise the PCA9685 using the default address (0x40).
pwm = Adafruit_PCA9685.PCA9685()

# Alternatively specify a different address and/or bus:
#pwm = Adafruit_PCA9685.PCA9685(address=0x41, busnum=2)

# Configure min and max servo pulse lengths
servo_min = 150  # Min pulse length out of 4096
servo_max = 600  # Max pulse length out of 4096

# Helper function to make setting a servo pulse width simpler.
def set_servo_pulse(channel, pulse):
    pulse_length = 1000000    # 1,000,000 us per second
    pulse_length //= 60       # 60 Hz
    print('{0}us per period'.format(pulse_length))
    pulse_length //= 4096     # 12 bits of resolution
    print('{0}us per bit'.format(pulse_length))
    pulse *= 1000
    pulse //= pulse_length
    pwm.set_pwm(channel, 0, pulse)

# Set frequency to 60hz, good for servos.
pwm.set_pwm_freq(60)

print('Moving servo on channel 0, press Ctrl-C to quit...')
while True:
    # Move servo on channel O between extremes.
    pwm.set_pwm(0, 0, servo_min)
    time.sleep(1)
    pwm.set_pwm(0, 0, servo_max)
time.sleep(1)

Everything works nicely, the servo moves correctly - however as I quit the program, the servo is still receiving a signal forcing it into one direction. If have tried adding a keyboardinterrupt combined with a break statement however this caused the servo to heat up badly. Now I am afraid to break something. So I wonder how I can stop the signal after exiting the program?

You definitely want to have a way to set a default state if your program quits. In your case a handler for KeyboardInterrupt would be the way to go. Make sure you set servo output to a nominal value in the handler.

servo_middle_position = (servo_max - servo_min) / 2

try:
    while True:
        pwm.set_pwm(0, 0, servo_min)
        time.sleep(1)
        pwm.set_pwm(0, 0, servo_max)
        time.sleep(1)

except KeyboardInterrupt:
    print "User quit! Moving servo to middle position.'
    pwm.set_pwm(0, 0, servo_middle_position)

I'm guessing you might not actually be using a conventional servo where the PWM duty cycle determines a position - if this was the case, the servo would stop moving once it had reached the desired position. You should note that servos will generate some amount of heat while operating.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM