查看: 9028|回复: 0

[经验] PCA9685舵机控制板与MicroPython-ESP32

[复制链接]
  • TA的每日心情
    无聊
    2019-1-9 09:43
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2019-2-15 13:50:29 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 qiaoweiyiyi 于 2019-2-15 13:58 编辑

    概要
    阿凯在本文中讲解了如何使用MicroPython-ESP32通过PCA9685模块控制舵机旋转角度。同时也涉及到了MicroPython-ESP32的I2C资源与API讲解。

    PCA9685模块简介
    1.jpg

    问题1:为什么我们要用到舵机驱动模块?
    • 工作电压 首先ESP32的工作电压是3.3v,不能直接驱动额定电压在5v-7.4v的数字舵机,需要外接电源。
    • 工作电流 舵机工作电流在100MA~1.5A,运动越快电流越大,可能会损伤USB口.
    • IO资源 一般的开发板IO资源有限,例如控制一个6DOF的机械臂,需要占用六个IO口,如果是蛛形机器人的话需要用的也就更多,所以使用舵机驱动板是一种节省IO资源的方式。

    问题2:什么是PCA9685?
    PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,该芯片最初由NXP推出时主要面向LED开关调光,但就目前国内的形式来看,好像在被Arduino在舵机控制领域使用的更广泛。
    问题3:单片机与PCA9685如何通信?
    2.jpg
    PCA9685模块与单片机通过I2C总线的方式进行通信。

    I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
    每个PCA9685都可以分配一个地址位,通过I2C接口,一个单片机可以控制最多64个PCA9685舵机控制板。每个舵机控制板上可以搭载16个舵机。

    详细的使用说明见奇果派工坊的这篇文章,写的很详细。
    16路PWM舵机驱动板(PCA9685)的使用说明-奇果派工坊

    MicroPython驱动PCA9685
    Adafruit公司开源了MicroPython控制PCA9685模块的工程:
    micropython-adafruit-pca9685

    这里我们需要用到这个工程里面的两个文件:

    同时还有对应的开发文档:
    micropython-adafruit-pca9685开发文档

    其中关于舵机驱动的API看这里:Servo Driver

    MicroPython-ESP32驱动PCA9685
    上传库文件
    接下来讲MicroPython-ESP32与PCA9685。
    首先将micropython-adafruit-pca9685中的pca9685.py与servo.py保存到本地,并通过ampy上传到ESP32的文件系统中。

    创建一个I2C对象
    在ESP32里面可以自定义引脚为I2C接口,支持I2C的管脚编号为:
    1. 0, 2, 4, 5, 9, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27
    复制代码
    0号管脚还有2号管脚比较特殊,不推荐使用。
    这里我们使用25号引脚作为SCL引脚(串行时钟线),26号引脚为SDA(串行数据线)引脚。

    连接方式
    1. GND -> ESP32的GND (外接电源与ESP32共地)
    2. SCL -> ESP32 D25
    3. SDA -> ESP32 D26
    4. VCC -> ESP32 3.3V
    5. V+ -> 5v外接电源
    复制代码
    代码片段
    1. from machine import I2C,Pin
    2. gpio_scl = 25
    3. gpio_sda = 26

    4. # 初始化I2C
    5. scl_pin = Pin(gpio_scl)
    6. sda_pin = Pin(gpio_sda)
    7. i2c = I2C(scl=scl_pin, sda = sda_pin, freq=10000) # 创建I2C实例
    复制代码
    其中SCL时钟频率支持范围 0 < freq ≤ 500000(Hz)

    创建Servos对象
    从之前的servo.py引入Servos对象,注意不是MicroPython自带的Servo.
    实例化的时候,传入我们上面创建的I2C对象,同时指定当前PCA9685模块的地址,默认是0x40, 你也可以通过焊接PCA9685模块上面的焊点修改地址编号。
    1. from servo import Servos
    2. servos = Servos(i2c, address=0x40)
    复制代码

    控制舵机的角度
    设定舵机控制板上的舵机编号servo_idx, 有效范围为1-16
    另外设置舵机舵机的角度degree
    TODO 查看源码 确认degree的范围

    1. servos.position(servo_idx, degrees=degree)
    复制代码

    项目实战


    作者:1Z实验室阿凯
    來源:简书



    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 18:55 , Processed in 0.116721 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.