【问题标题】:Servo controller with PCA9685 and Raspberry Pi带有 PCA9685 和 Raspberry Pi 的伺服控制器
【发布时间】:2018-11-24 13:08:32
【问题描述】:

我尝试学习如何使用 PCA9685 模块通过树莓派控制伺服系统。我正在关注提供以下代码的 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)

一切正常,伺服器正确移动 - 但是当我退出程序时,伺服器仍然接收到一个信号,迫使它进入一个方向。如果尝试添加键盘中断和中断语句,但这会导致伺服器严重升温。现在我害怕打破一些东西。所以我想知道退出程序后如何停止信号?

【问题讨论】:

    标签: python raspberry-pi servo


    【解决方案1】:

    如果您的程序退出,您肯定希望有一种方法来设置默认状态。在您的情况下,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 占空比确定位置的传统伺服系统 - 如果是这种情况,伺服系统将在到达所需位置后停止移动。请注意,舵机在运行时会产生一些热量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多