2016-12-03 20 views
0

ラズベリーパイでサーボを制御するためにPCA9685モジュールを使用する方法を学びます。私は、次のコードを提供しadafruitチュートリアル以下午前:PCA9685とラズベリーパイのサーボコントローラ

# 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) 

すべてがうまく動作、サーボが正常に動く - しかし、私はプログラムを終了すると、サーボはまだ一つの方向にそれを強制的に信号を受信して​​います。しかし、breakinterruptと組み合わせてkeyboardinterruptを追加しようとすると、サーボがひどく熱くなりました。今私は何かを壊すことを恐れている。だから私はプログラムを終了した後に信号を止めることができますか?

答えて

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のデューティ・サイクルは位置を決定する従来のサーボを使用していない可能性があります推測している - これがそうであったならば、それは所望の位置に達したら、サーボが動いて停止します。あなたは、サーボが作動している間にある程度の熱を発生させることに注意してください。

関連する問題