树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码

树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码


内容参考微雪课堂

一、 Servo Driver HAT拓展板介绍

Servo Driver HAT是基于树莓派而设计的PWM/舵机扩展板,通过PCA9685芯片扩展16路舵机控制或者PWM输出,每个通道12位分辨率。通过I2C接口控制,无需占用额外的引脚。板载5V稳压芯片,可接电池供电,最大输出3A电流。适用于控制机械手臂,以及各种舵机机器人。

输入电压VIN:6V~12V
舵机电压:5V
逻辑电压:3.3Vpwm
板子可以从树莓派上取电不需要额外供电。
也可以通过右边绿色端子VIN接电池供电,输入电压范围6V~12V。经过板载的5V稳压芯片输出5V电源给舵机和树莓派供电,最大输出电流3A。
A0~A4可以设置PCA9685芯片的I2C设备地址,可以同时接多个Servo Driver HAT
最上面的排针是舵机接口,黑色排针是GND(大部分舵机对应的是褐色线),
红色排针是5V电源,黄色排针是PWM信号线,有0~15个通道,可以同时接16个舵机。注意舵机线不要接反,否则舵机不会转动。
注意:
如果接大功率的舵机可能会出现供电不足,因为整个板子是5V的供电,这个5V连接着树莓派和舵机供电,功率太大会拉低树莓派5V电源,导致欠压树莓派重启,把板载上的0R电阻去除,右侧绿色VIN端子接外部电源(6-12V)

我操作的是两个机械臂一共十个舵机所以我外接了一个12V电源

二、2开启I2C

在终端执行

sudo raspi-config
Interfacing Options-->I2C-->YES-->Finish 

保险起见 重启树莓派 终端输入

sudo reboot

三、安装相关驱动

安装相关库文件

sudo apt-get updata
sudo apt-get install python-pip 
sudo pip install RPi.GPIO
sudo apt-get install python-smbus

2021.11.20更正 第一句命令应该为

sudo apt-get update

下载示例程序,并解压到指定目录

sudo apt-get install p7zip-full
wget http://www.waveshare.net/w/upload/6/6c/Servo_Driver_HAT.7z
7zr x Servo_Driver_HAT.7z -r -o./Servo_Driver_HAT
sudo chmod 777 -R Servo_Driver_HAT
cd Servo_Driver_HAT/Raspberry\ Pi/

解压后可以看见有一个名为PCA9685.py的文件 我们可以在 home/pi 上新建个文件夹 并把PCA9685.py这个文件放进这个文件夹 只有代码和库文件在同一个目录下才能正确调用

四、通过代码驱动舵机(机械臂)

4.1舵机的初始位置校准

在这里插入图片描述
这里用到函数 pwm.setServoPulse(5,500)
这个函数需要两个参数 第一个是通道号 第二个是脉冲 舵机根据脉冲调整角度 默认500为最小值 2500为最大值 所以当第二个参数为1500时为竖直状态
调整过程:在上电状态 将每个舵机参数设置为1500pwm.setServoPulse(5,1500)将每个舵机都拆下并重新组装即可 (按实际情况而定如此机械臂底盘舵机就可不用另外调试)

4.2完整代码

from PCA9685 import PCA9685#调用PCA9685库文件
import time


pwm=PCA9685(0x40)#对地址初始化
pwm.setPWMFreq(50)#对频率初始化

def smooth(road,before,after):#对动作的优化函数通过传递上一次参数而一脉冲一脉冲改变 显得更加流畅
    if before <=after:
        for i in range(before,after+1,1):
            pwm.setServoPulse(road,i)
    else:
        for i in range(before,after+1,-1):
            pwm.setServoPulse(road,i)
           

def action1():#开爪 直立
    pwm.setServoPulse(0,500)
    pwm.setServoPulse(1,1500)
    pwm.setServoPulse(2,1500)
    pwm.setServoPulse(3,1500)
    pwm.setServoPulse(4,500)
    
    
def action2():#低头抓取
    smooth(1,1500,2200)
    smooth(3,1500,1000)
    smooth(2,1500,2300)
    #smooth(3,1000,1000)
    #pwm.setServoPulse(4,500)
    smooth(4,500,1500)
    
def action3():#转向传递东西 
    smooth(1,2200,1500)
    smooth(2,2300,1900)
    smooth(3,1000,2000)
    smooth(4,1500,2000)
    smooth(0,500,2500)
    
def action3h():#开爪低头呈递东西
    smooth(4,2000,600)
    smooth(2,1900,1500)
    smooth(3,2000,1500)
    smooth(4,500,1500)
    
#函数1233h操控一号机械臂
#函数4567操控二号机械臂

def action4():#2号机械臂开爪直立
    pwm.setServoPulse(5,500)
    pwm.setServoPulse(6,1500)
    pwm.setServoPulse(7,1500)
    pwm.setServoPulse(8,1500)
    pwm.setServoPulse(9,500)
    
def action5():#低头接过1号机械臂呈递的东西
    smooth(7,1500,1850)
    smooth(8,1500,1970)
    smooth(9,500,1650)
    
def action6():#转向开爪将东西放下
    smooth(5,500,1400)
    smooth(8,1970,1200)
    smooth(6,1500,2200)
    smooth(7,1850,2200)
    smooth(9,1650,500)
    
def action7():#恢复直立回到初始位置闭爪
    smooth(6,2200,1500)
    smooth(7,2200,1500)
    smooth(8,1200,1500)
    smooth(9,500,1650)
    smooth(5,1400,500)
   

action1()
action4()
action2()
action3()
time.sleep(1)
action5()
action3h()
action6()
action7()
 smooth(0,2500,500)#一号机械臂回到初始位置

创作不易,如果文章对你有帮助请点个赞吧。
欢迎各位提问或者对内容进行补充。

  • 33
    点赞
  • 231
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
首先,需要通过pip安装Adafruit_PCA9685库,可以使用以下命令: ``` sudo pip install Adafruit_PCA9685 ``` 然后,连接PCA9685模块到树莓派的I2C总线上,你可以参考PCA9685模块的引脚定义来连接。 接下来,可以使用以下代码来初始化PCA9685模块: ```python import Adafruit_PCA9685 pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(50) # 设置PWM频率为50Hz ``` 这里的50Hz是舵机的工作频率,可以根据具体的舵机型号进行调整。 然后,就可以使用`set_pwm`方法来控制舵机的角度。例如,控制舵机0的角度为90度: ```python pwm.set_pwm(0, 0, 375) # 375是90度时的PWM值 ``` 其中,第一个参数是舵机的通道号,第二个参数是起始的PWM脉冲宽度,第三个参数是终止的PWM脉冲宽度,可以根据具体的舵机型号和需要的角度进行计算。 完整的代码示例: ```python import Adafruit_PCA9685 import time pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(50) def set_servo_angle(channel, angle): # 计算PWM值 pulse_len = 1000000.0 / 50 / 4096 pulse_width = angle / 180.0 * 1000 / pulse_len pwm.set_pwm(channel, 0, int(pulse_width)) while True: # 控制舵机0转动 set_servo_angle(0, 0) # 舵机0转到0度 time.sleep(1) set_servo_angle(0, 90) # 舵机0转到90度 time.sleep(1) set_servo_angle(0, 180) # 舵机0转到180度 time.sleep(1) ``` 这个例子中,通过`set_servo_angle`方法来计算PWM值,并控制舵机转动。每次转动间隔1秒。你可以根据需要修改舵机的通道号和角度值。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁六加.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值