我尝试学习如何使用PCA9685模块来控制带有覆盆子pi的伺服器。我正在关注adafruit教程,该教程提供以下代码:
# 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)
一切运行良好,伺服正确运动 - 但是当我退出程序时,伺服仍然接收信号强制它进入一个方向。如果尝试添加一个键盘中断和一个break语句,但这会导致伺服加热严重。现在我害怕打破一些东西。所以我想知道如何在退出程序后停止信号?
答案 0 :(得分:0)
如果您的程序退出,您肯定想要设置默认状态。在你的情况下,KeyboardInterrupt
的处理程序将是你要走的路。确保在处理程序中将伺服输出设置为标称值。
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)
我猜你可能实际上并没有使用PWM占空比确定位置的传统伺服 - 如果是这种情况,伺服器一旦到达所需位置就会停止移动。你应该注意到伺服系统在运行时会产生一些热量。