多个PCA9685舵机驱动板一起执行实验(含地址修改)

    以前的实验我们实验过了单个pca9685驱动板,同时驱动多个舵机的实验;但是有些情况下,可能一个板子无法满足我们的驱动需求;我们知道一个板子最大可驱动16个舵机,但是如果我们想同时驱动 17个舵机,这个时候就遇到问题;本篇文章就实验一下如何解决这个问题。
    为了解决这个问题,先得解决地址冲突问题;因为板子默认地址都是0x40,那么我们无法辨别哪个是哪个板子,这个时候就需要修改板子的地址;如下图:
地址修改
 地址修改后,连接树莓派,执行如下命令:

i2cdetect -y 1
    可见下图,由于树莓派连接了两个pca9685驱动板,所以可见两个地址,分别为0x40和修改地址后的0x41;
地址修改后效果
#解决地址冲突后,接下来看一下树莓派如何同时接多块板子,见下图:
接线效果
    由上图可见,由于板子默认没有焊接尾部扩展针脚,因此需要我们先焊接针脚;然后用杜邦线连接第二个板子;电源部分两者共用即可。
 #实验代码:

#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import time
from board import SCL, SDA
import busio

from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#控制第一块板子
pca = PCA9685(i2c, address=0x40)  #地址可以修改  默认0x40
pca.frequency = 50

print("执行第一块板子")

for i in [0]:

    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo_o.angle = 0
    time.sleep(1)

    #再执行90度
    servo_o.angle = 90
    time.sleep(1)

    #再执行180度
    servo_o.angle = 180
    time.sleep(1)

    #再恢复90度
    servo_o.angle = 90
    time.sleep(1)

pca.deinit()

#控制第二块板子
pca = PCA9685(i2c, address=0x41)
pca.frequency = 50

print("执行第二块板子")

for i in [0, 1]:
    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo_o.angle = 0
    time.sleep(1)

    #再执行90度
    servo_o.angle = 90
    time.sleep(1)

    #再执行180度
    servo_o.angle = 180
    time.sleep(1)

    #再恢复90度
    servo_o.angle = 90
    time.sleep(1)

pca.deinit()
#实验效果,可见三个舵机依次转动,如下图:

舵机的新驱动方式

    去年曾经写过舵机的驱动方式,文件见链接:https://www.shumeijiang.com/2020/05/06/舵机(伺服电机)驱动实验/;在那篇文章内我们采用的是外置的驱动文件,其原理还是利用的led的驱动方式;今天我们将切换另一种驱动方式,无需再每次使用时额外引入驱动程序,而是直接调用即可。
    调用之前,我们先认识一下今天的主角CircuitPythonCircuitPython初学者友好的Python开源版本,适用于称为微控制器的小型廉价计算机。微控制器是许多电子产品的大脑,包括用于构建业余项目和原型的各种开发板。

    CircuitPython是正在快速发展一种兼容标准Python的嵌入式系统编程语言,目前已支持树莓派(Raspberry Pi)、ARM Cortex-M0/M0+、 ARM Cortex-M4/M4F等;它具有统一的 Python核心API和收纳了越来越多的150多个与之配合使用的设备库和驱动程序;因此我们在驱动硬件设备时,可以直接通过命令调用它的内置驱动,从而不用再每次引入其他驱动程序。

    CircuitPython是由著名开源软件硬件商--Adafruit发起,得到全球开源社区的支持与维护,作为支持嵌入式计算机系统Python解释器的后起之秀,CircuitPython具备很多适合小体积、低功耗、有限资源系统的特征,尤其是在开放性和安全性方面。

    CircuitPython的大部分内建库完全兼容标准的Python3,因此这次调用我们也使用的是Python3。
#实验准备,开始之前需要安装依赖包,命令如下(直接执行即可):

pip3 install --upgrade throttle  adafruit-circuitpython-motor adafruit-circuitpython-pca9685 inputs smbus RPi.GPIO pick board
#实验代码如下:

#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''

import time
from board import SCL, SDA
import busio

from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#实例化 此处是0x41 驱动板地址修改过导致
pca = PCA9685(i2c, address=0x41)  #地址可以修改  默认0x40
pca.frequency = 50

for i in [0,1,2]:

    servo = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo.angle = 0
    time.sleep(1)

    #再执行90度
    servo.angle = 90
    time.sleep(1)

    #再执行180度
    servo.angle = 180
    time.sleep(1)

    #再恢复90度
    servo.angle = 90
    time.sleep(1)

pca.deinit()
#注意:如果报错board模块的 SCL或者SDA找不到,可以将board文件替换一下,见下面的下载文件; 文件替换地址/home/pi/.local/lib/python3.7/site-packages;地址仅做参考,楼主是这个地址。
#其中关于脉冲宽度部分不同的舵机有不同的设置,具体可参考下图:
#实验效果:
执行效果
#参考文章:https://circuitpython.readthedocs.io/projects/motor/en/latest/index.html#

树莓派和手柄-控制舵机和电机

    上一篇文章我们已经介绍过了如果获取手柄的按钮、摇杆、方向键等信息;这一篇文章我们将继续上一次的主题,尝试一下如何在获取手柄数据后,控制舵机跟随摇杆方向转动以及如何触发电机转动。
#先看组装效果:
接线效果
    如上图,可见舵机和电机小风扇由同一块树莓派控制;外接同一块电源驱动;其中舵机由pca9685驱动板驱动;电机小风扇这次只是为了效果展示,所以直接由继电器控制电源开合(接通电源小风扇即可旋转)。

*舵机的接线示例可参考文章:舵机驱动实验;
*电机的接线以及更多的扩展,比如旋转方向控制,旋转速度控制等可参考文章:直流电机驱动实验;
*继电器的接线示例可参考文章:继电器实验
#实验过程:
1、编写代码,然后保存为jiujiang.py;
2、连接手柄,可以通过蓝牙或者直接电线连,按上图接线,然后接通电源;
3、打开vnc,选择要执行的代码然后执行,执行效果见下图:
4、摆动摇杆或者按动按键,查看vnc画面是否有数值出现(有数据为正常);
5、按动R2键,可见电机小风扇转动;
6、摆动右侧摇杆,向右摆动可见舵机顺时针转动,当摇杆复位时,舵机也复位90度;当向左摆动摇杆可见舵机逆时针转动;舵机最大最小转动度数代码设置为170度和10度;这个可以自行调整。
#效果如下:
#注:其中舵机驱动部分我们采用了新的驱动方式,去掉了繁琐的驱动文件,采用CircuitPython的舵机驱动程序;这部分下一篇文章我们会详细介绍和实验。