昉·星光系列课程16:昉·星光开发板机器人舵机控制

昉·星光系列课程16:昉·星光开发板机器人舵机控制

本次课程为昉·星光开发板IoT开发系列课程的第十六讲,将带领同学们在昉·星光开发板上,通舵机控制板,实现机器人舵机控制。

本次课程,在昉·星光开发板V1和V2上,操作步骤相同。

一、学习目标

  • 学习昉·星光开发板通过 PCA9685 舵机控制板,实现两个自由度方向的机器人舵机控制。

二、准备工作

在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:

  • 开发板:昉·星光开发板
  • 舵机控制板:PCA9685 16路舵机控制板
  • 机器人平台:底座、支架、及两个DS3120 20KG舵机
  • 数字电源:5V数字电源
  • 杜邦线:若干

三、舵机控制原理

在本次课程中,使用PCA9685控制机器人舵机。
舵机的核心是直流电机,通过电位器和齿轮,当输入不同的PWM(脉冲宽度调制)信号时,就能实现不同的转动角度。通常标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到 2ms之间,但是,实际上脉宽预期0.5ms到2.5ms之间,脉宽和舵机的转角0°〜180°相对应。由于舵机生产厂家不同,对于同一信号 ,不同牌子的舵机旋转的角度也会有所不同。本次课程中,使用的为DS3120 20KG舵机,可以用60Hz的WPM信号进行控制。

一个舵机,通常会有三个引脚,分别为电源+、接地GND、控制信号PWM:

由于控制舵机本质上是控制其内部直流电机的运转,而直流电机需要的电流通常会超过开发板的GPIO口输出电流,所以使用的舵机的时候,一般都需要专门的外接电源来给舵机进行供电,以免烧坏开发板。

在进行机器人设计的时候,往往需要相当多的舵机,来实现不同部位的动作,如果都连接到开发板,可能会引脚不够,所以在控制舵机的时候,一般都会使用舵机控制板。
本次课程中,使用的是PCA9685 16路舵机控制板,具体如下:

这个舵机控制板,与开发板连接使用I2C接口,使用4个GPIO即可进行通讯,而通过它能够控制16个舵机。在实际使用中,还可以通过将多个控制板串联起来,实现更多的舵机控制。

四、实物连线

首先,参考下图,将温度传感器和LED到昉·星光开发板:

实物连接如下:

本次课程中使用的机器人平台,一共有两个舵机,将其分别连接到舵机控制板的0、1接口即可。

连接完成后,需要使用如下的指令,检查确保舵机控制板连接无误:

上图中输出结果的 40,表示 PCA9685 的默认I2C地址0x40,说明连接无误。

注意:

  • 应根据实际使用的传感器,确定供电电压。本次课程中使用的模块使用5V供电电压。
  • 另外还需要使用数字电源,给舵机控制板进行供电。
  • 舵机控制板上,VCC用于连接星光派开发板的5V输出引脚,V+用于连接数字电源的5V输出,不能弄错。
  • 如果控制的舵机需要更高的电压,可以使用绿色供电端子供电,电压根据实际需要,可为6~12V。

五、代码编写

在Python程序中,我们可以通过第三方库 PCA9685-driver ,来与PCA9685舵机控制板通信,实现对舵机的控制。

首先,我们编写如下的程序 robot_test.py:

# -*- coding: utf-8 -*-
# file: ~/projects/robot/robot_test.py

from pca9685_driver import Device
import time

SERVOMIN = 150
SERVOMAX = 650

# 0x40 from i2cdetect -y -r 0
dev = Device(0x40, bus_number=0)

# set the pwm frequency (Hz)
dev.set_pwm_frequency(60)

dev.set_pwm(0, SERVOMIN)
dev.set_pwm(1, SERVOMIN)

while True:
    for i in range(SERVOMIN,SERVOMAX,1):
        print(i)
        duty = i
        dev.set_pwm(0, duty)
        dev.set_pwm(1, duty)
        time.sleep(0.01)

    for i in range(SERVOMAX,SERVOMIN,-1):
        print(i)
        duty = i
        dev.set_pwm(0, duty)
        dev.set_pwm(1, duty)
        time.sleep(0.01)

在上述代码中,首先定义了舵机控制的PWM上下限范围150~650,对应0~180°。
然后使用 pca9685_driver 初始化舵机控制板,设置PWM频率为60Hz,并设置0路和1路都为最小值。
而在最后的循环中,先将舵机的角度从小到大变化,再从大到小变化,并持续循环。

六、运行效果

要运行以上的程序,还需要安装相应的支持库,具体如下:

# 安装扩展库
sudo pip install PCA9685-driver

编写完成后,运行 robot_test.py,就可以看到舵机的动作了。

python3 robot_test.py

实际动作情况,可查看B站视频:https://www.bilibili.com/video/BV1es4y1v7qL/

在上面程序的基础上,我们可以设计一个更实用的程序。
下面的实例,是在上层舵机上,贴上了一个小人。我们的程序,让小人分别前方、左则、右则的"观众"鞠躬感谢,最后面向前方。
具体的代码如下:

# -*- coding: utf-8 -*-
# file: ~/projects/robot/robot_test.py

from pca9685_driver import Device
import time

SERVOMIN = 150
SERVOMAX = 650

SERVOMID = int((SERVOMIN+SERVOMAX)/2)

# 0x40 from i2cdetect -y -r 0
dev = Device(0x40, bus_number=0)

# set the pwm frequency (Hz)
dev.set_pwm_frequency(60)

dev.set_pwm(0, SERVOMID)
dev.set_pwm(1, SERVOMID)
time.sleep(1)

if __name__ == '__main__':
    for i in [SERVOMID, SERVOMIN, SERVOMAX]:
        dev.set_pwm(0, i)
        time.sleep(0.5)

        for j in range(SERVOMID,SERVOMAX):
            dev.set_pwm(1, j)
            time.sleep(0.01)

        for j in range(SERVOMAX,SERVOMID,-1):
            dev.set_pwm(1, j)
            time.sleep(0.01)

        time.sleep(2)

    dev.set_pwm(0, SERVOMID)

编写完成后,运行 robot_test2.py,就可以看到舵机上小人的实际动作了。

python3 robot_test2.py

实际动作情况,可查看B站视频:https://www.bilibili.com/video/BV1wN411k7Rp/

七、总结

在本次课程中,我们学习了通舵机控制板,实现机器人舵机控制,来实现特定的动作。
因为PCA9685舵机控制板可以控制多达16路舵机,多个级联还能控制更多,所以在涉及到机器人舵机应用的场合中应用广泛。
如果我们有4个舵机,配合适当的辅助器材,就可以实现简单的机器人前进和后退。当然,要实现稳定的控制,需要使用专门的算法进行控制。

八、课后作业

  • 了解舵机和舵机控制板的知识
  • 结合其他传感器和模块,进行传感器信息的发布,以及控制风扇电机的运转。
  • 编写程序,控制舵机,控制舵机上固定的笔,画出不同长度的圆弧。
  • 编写程序,控制舵机,控制舵机上固定的棉签,从左侧的瓶中沾染墨水,然后将沾染的墨水转运到右则的清水中

九、参考资料

2 Likes