0

PCA9685 モジュールを使用して、raspberry 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)

すべてがうまく機能し、サーボは正しく動きます。ただし、プログラムを終了しても、サーボはまだ一方向に強制する信号を受信して​​います。ブレークステートメントと組み合わせてキーボード割り込みを追加しようとした場合、これによりサーボがひどく熱くなりました。今、私は何かを壊すことを恐れています。プログラムを終了した後、どうすればシグナルを停止できるのだろうか?

4

1 に答える 1

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デューティサイクルが位置を決定する従来のサーボを実際に使用していない可能性があると思います。この場合、サーボは目的の位置に到達すると動きを停止します。サーボは動作中にある程度の熱を発生することに注意してください。

于 2016-12-04T02:31:59.470 に答える