舵机
舵机有模块的使用和无模块使用
- 硬件介绍
舵机、16路PWM Servo(PCA9685)舵机驱动模块、杜邦线、树莓派4B、外接电源
- 硬件连接
PCA9685模块中左侧边的 VCC、GND、SDA、SCL四点接入到树莓派中的对应的引脚即可,中间绿色部分的V+、GND是给舵机供电的,可以单独接入5V的电压,下面的一排三色的插针,分别连接伺服电机,上面的数字对应控制的通道
- 代码编写
(此处我没有采用模块,直接连接的,下面会用模块做一个)
- import RPi.GPIO as GPIO
import time
def setServoAngle(angle): #定义控制角度函数
GPIO.setmode(GPIO.BOARD) # GPIO引脚编号的两种方式之一,另一种是BCM。所用编号方式不同,pin也不同。
GPIO.setwarnings(False) # 禁用警告。
GPIO.setup(32, GPIO.OUT) # pin为你所接的数据输出GPIO引脚,这里的引脚为32
p = GPIO.PWM(32, 50) # 在pin脚上产生频率为50HZ的PWM信号。
p.start(0) # 在引脚上设置一个初始PWM信号
DutyCycle = angle/18 + 2 #占空比和角度的关系表达式
p.ChangeDutyCycle(DutyCycle) # 通过输入不同的“占空比值”来观察舵机的位置变化
time.sleep(1)
p.stop()
c = input("If you want to continue, type 'y' please. Type 'e' to end.")
while c == 'y':
angle = input('Please type an angle:') # input输入的是字符串,需要用int()函数转化成数字。
angle = int(angle) #
setServoAngle(angle) #控制舵机旋转到指定角度 setServoAngle(id,angle,times) id; 要控制的ID号,范围0~18 angle: 控制舵机旋转角度,范围-118~118 times: 舵机运行时间,单位ms,范围20~5000
c = input("'y' or 'e'?")
GPIO.cleanup()
exit() - 连接图
- 连接有驱动模块的舵机
这里因为外接电源与模块的接口无法紧密结合,我用手使他们相连。
前提要求:
安装Adafruit_Python_PCA9685库
安装Adafruit:sudo pip install adafruit-pca9685
github下载地址:<u>https://github.com/adafruit/Adafruit_Python_PCA9685</u>
模块的使用:
导入Adafruit_PCA9685模块
import Adafruit_PCA9685
4.3、树莓派 开启IIC功能:
sudo raspi-config -> 5.Interfacing Options -> P5 I2C,设置enable使能,然后重启树莓派。
接着在/boot/config.txt中进行配置,添加如下:
dtparam=i2c_arm=on
device_tree=bcm2710-rpi-3-b.dtb
配置完成后同样重启一下;
然后我们在树莓派中执行命令安装i2c-tools(sudo apt-get install i2c-tools);
执行指令查看舵机驱动板是否已接入树莓派4B+中:
sudo i2cdetect -y 1
6、代码编写
# 导入 __future__ 文件的 division 是为了精确除法。
from __future__ import division
import time #导入时间
# 导入Adafruit_PCA9685模块
import Adafruit_PCA9685
# 使用默认地址(0x40)初始化PCA9685。
# 把Adafruit_PCA9685.PCA9685()引用地址赋给PWM标签
pwm = Adafruit_PCA9685.PCA9685()
# 或者指定不同的地址和/或总线:
# pwm = Adafruit_PCA9685.PCA9685(address=0x41, busnum=2)
def set_servo_angle(channel, angle): # 输入角度转换成12^精度的数值
# + 0.5是进行四舍五入运算。
date = int(4096 * ((angle * 11) + 500) / 20000 + 0.5)
pwm.set_pwm(channel, 0, date)
# 将频率设置为50赫兹,适合伺服系统。
pwm.set_pwm_freq(50)
print('Moving servo on channel x, press Ctrl-C to quit...')
while True:
# 选择需要移动的伺服电机的通道与角度
channel = int(input('pleas input channel:'))
angle = int(input('pleas input angle:'))
set_servo_angle(channel, angle) #通道是看与模块相连的序号,我练的是0号
time.sleep(1) #休息一秒
GPIO.cleanup() #清理GPIO接口