【雕爷学编程】Arduino动手做(161)---16路PWM舵机驱动板2
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呼吸灯效果 */ #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实验场景图