【雕爷学编程】Arduino动手做(161)---16路PWM舵机驱动板2

发布时间 2023-07-14 19:49:15作者: 行者花雕

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百六十一:16路PWM Servo舵机驱动板 机器人控制器IIC接口驱动器模块 PCA9685

 

16路PWM舵机驱动板PCA9685模块引脚排列

两侧有两组控制输入引脚。引脚的两侧是相同的!使用您喜欢的任何一侧,您还可以通过并排连接两个轻松链接

1、电源引脚
GND - 这是电源和信号接地引脚,必须连接
VCC - 这是逻辑电源引脚,将其连接到要用于PCA9685输出的逻辑电平,最大应为3 - 5V!它也用于SCL / SDA上的10K上拉,因此除非您有自己的上拉,否则也要使其与微控制器的逻辑电平相匹配!
V+ - 这是一个可选的电源引脚,将为伺服系统提供分布式电源。如果不用于舵机,则可以保持断开连接。芯片根本不使用它。您还可以从电路板顶部的 2 针接线端子注入电源。如果您使用伺服系统,则应提供 5-6VDC。如果必须,您可以提高到 12VDC,但如果您搞砸并将 VCC 连接到 V+,您可能会损坏您的电路板!

2、控制引脚
SCL - I2C 时钟引脚,连接到微控制器 I2C 时钟线。可以使用3V或5V逻辑,并且对VCC具有弱上拉
SDA - I2C 数据引脚,连接到微控制器 I2C 数据线。可以使用3V或5V逻辑,并且对VCC具有弱上拉
OE - 输出使能。可用于快速禁用所有输出。当此引脚为低电平时,所有引脚均使能。当引脚为高电平时,输出被禁用。默认情况下拉低,因此它是可选引脚!

3、输出端口
有 16 个输出端口。每个端口有 3 个引脚:V+、GND 和 PWM 输出。每个PWM完全独立运行,但它们必须具有相同的PWM频率。也就是说,对于 LED,您可能需要 1.0 KHz,但伺服系统需要 60 Hz - 因此您不能将一半用于 LED @ 1.0 KHz,一半用于 @ 60 Hz。

它们是为伺服设置的,但您可以将它们用于 LED!每个引脚的最大电流为 25mA。有 220 欧姆电阻与所有 PWM 引脚串联,输出逻辑与 VCC 相同,因此如果使用 LED,请记住这一点。

16路PWM舵机驱动板PCA9685模块实验所需硬件

 

安装16路PWM舵机驱动板PCA9685模块实验所需库
下载SunFounder_PCA9685
需要添加 Adafruit PWM 伺服驱动程序库 –
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library/archive/master.zip

 

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百六十一:16路PWM Servo舵机驱动板 机器人控制器IIC接口驱动器模块 PCA9685
项目一:控制一颗LED灯
Arduino实验接线示意图

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百六十一:16路PWM Servo舵机驱动板 机器人控制器IIC接口驱动器模块 PCA9685

项目一:控制一颗LED呼吸灯效果

 Arduino实验开源代码

 

/*

 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百六十一:16路PWM Servo舵机驱动板 机器人控制器IIC接口驱动器模块 PCA9685

  项目一:控制一颗LED呼吸灯效果

*/

#include <Wire.h>

#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

void setup() {

  Serial.begin(9600);

  Serial.println("16 channel PWM test!");

  pwm.begin();

  pwm.setPWMFreq(1600);  // This is the maximum PWM frequency

  // save I2C bitrate

  uint8_t twbrbackup = TWBR;

  // must be changed after calling Wire.begin() (inside pwm.begin())

  TWBR = 12; // upgrade to 400KHz! 

}

void loop() {

  // Drive each PWM in a 'wave'

  for (uint16_t i=0; i<4096; i += 8) 

  {

    for (uint8_t pwmnum=0; pwmnum < 16; pwmnum++) 

    {

      pwm.setPWM(pwmnum, 0, (i + (4096/16)*pwmnum) % 4096 );

    }

  }

}

  实验串口返回情况

Arduino实验场景图