使用樹莓派控制16路舵機驅動板(pca9685)
在樹莓派上,可以通過RPI.GPIO方便地輸出PWM進行舵機控制。
使用RPI.GPIO
創建一個 PWM 實例:
1
p =GPIO.PWM(channel, frequency)
啟用 PWM:
1
p.start(dc)
更改頻率:
1
p.ChangeFrequency(freq)
更改佔空比:
1
p.ChangeDutyCycle(dc)
停止 PWM:
1
p.stop()
但當你同時使用多個舵機時,PWM輸出就變得困難了。這時可以藉助舵機控制板來進行多路PWM控制。
這是某寶常見的舵機控制板,這個板子也比較便宜,十幾塊錢一個。使用晶片PCA9685,I2C通信,只需要幾根i2c線就可以控制16路pwm,周期和佔空比都可控。
驅動板與樹莓派連接
GND -> RPi GND(9腳)SCL -> RPi SCL1(5腳)SDA -> RPi SDA1(3腳)VCC -> RPi 3.3V (1腳)V+ -> RPi 5V(或通過電源接線柱外接電源供電)
需要注意的是,vcc引腳僅為晶片供電,為舵機供電可以選擇通過樹莓派5v引腳為v+引腳供電或另接電源到驅動板的電源接線柱上。
樹莓派開啟I2C
樹莓派默認關閉I2C,開啟I2C步驟:
輸入
sudo raspi-config
便可以看到配置界面,
找到第5項:Interfacing Options中有I2C等,點擊進入,點擊Yes即可
安裝adafruit_python_pca9685
sudo pip install adafruit-pca9685在GitHub上可以查看其例程。
adafruit_pca9685
引入adafruit_pca9685模塊:
1
import Adafruit_PCA968
創建一個 PWM 實例:
1
pwm = Adafruit_PCA9685.PCA9685()
設置頻率:
1
pwm.set_pwm_freq(50)
更改佔空比:
1
pwm.set_pwm(channel,on,off)
示例代碼
# 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)