树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码
文章目录
树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码 一、 Servo Driver HAT拓展板介绍 二、2开启I2C 三、安装相关驱动 四、通过代码驱动舵机(机械臂) 4.1舵机的初始位置校准 4.2完整代码
内容参考微雪课堂
一、 Servo Driver HAT拓展板介绍
Servo Driver HAT是基于树莓派而设计的PWM/舵机扩展板,通过PCA9685芯片扩展16路舵机控制或者PWM输出,每个通道12位分辨率。通过I2C接口控制,无需占用额外的引脚。板载5V稳压芯片,可接电池供电,最大输出3A电流。适用于控制机械手臂,以及各种舵机机器人。
输入电压VIN:6V~12V 舵机电压:5V 逻辑电压:3.3V
板子可以从树莓派上取电不需要额外供电。 也可以通过右边绿色端子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
下载示例程序,并解压到指定目录
sudo?apt-get?install?p7zip-full wget?http://HdhCmsTestwaveshare.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时为竖直状态 调整过程:在上电状态 将每个舵机参数设置为1500 pwm.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)#一号机械臂回到初始位置
创作不易,如果文章对你有帮助请点个赞吧。 欢迎各位提问或者对内容进行补充。
查看更多关于树莓派4B通过16路PWM输出的PCA9685模块控制舵机(机械臂)附完整代码的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did125893