舵机

发布时间 2023-07-07 16:07:34作者: 椹涧

舵机

  1. 硬件介绍

舵机、16路PWM Servo(PCA9685)舵机驱动模块、杜邦线、树莓派4B、外接电源

(此处我没有采用模块,直接连接的)

  1. 硬件连接

  1. 代码编写
  2. 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()
  3. 连接图

  1. 连接有驱动模块的舵机

这里因为外接电源与模块的接口无法紧密结合,我用手使他们相连。

前提要求:

安装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接口