程序下载:Arduino电机驱动板库文件 V5.5版资源包
一、概述
这是基于Arduino开发运动机器人非常完美的解决方案,这款电机驱动器足够强大,可以驱动4个直流电机或2个步进电机,并且额外提供8路全速PWM控制,可以控制8路舵机。支持PS2无线手柄,充分发挥PS2手柄的强大功能。
最大限度的减少Arduino引脚的占用,所以使用基于I2C通讯的专用PWM驱动芯片(PCA9685)控制电机的速度和方向。只用2根IO引脚(SDA&SCL)就可以驱动多个电机,也可以多个驱动器叠加使用(可级联),并且不干扰其他I2C设备的使用。
支持超声波传感器,可以轻松对接智能小车或者其他电机控制的应用。
二、接口与接线
参数说明:
- 使用高性能驱动芯片,提供每路2.2A(3.6A峰值)输出,可运行4.5-13.5V直流电机;
- 可以驱动4个直流电机或2个步进电机;
- 额外提供8路PWM输出,可以控制8路舵机;
- 支持PS2无线手柄;
- 支持蓝牙模块和超声波传感器;
- 可自定义I2C地址,支持多个驱动器叠加级联;
- 提供完整的代码库和丰富示例程序,支持图形编程,简单易用。
大功率电机驱动版Max V5.0
PS2无线手柄连接
驱动器内置PS2接收器插座,将接收器直接插入使用。
PS2手柄为非热插拔,在实际项目用,需要编写重连检测,如无法找到设备,请重启Arduino控制器。
*手柄一段时间不操作会自动休眠,按start或analog唤醒。
三、电源说明
电源供电方案选择
单电源供电特性:
- 单电源可同时为驱动器和开发板供电
- 板载内嵌5V稳压器,可为舵机端口提供5V3A电源。
- 电源输出功率(放电电流)要够大,否则会影响稳定性
舵机独立供电
当需要接入多个舵机或大功率舵机的时候,请选择此方案供电
- 先拔掉左上角跳线帽,断开板载电源
- 接上跟舵机匹配电压匹配的电源,注意匹配参数,大多数舵机耐压是5-6V,电压太高会使舵机烧毁
备用电源接口
V5.3版将原来版本的黄色跳线修改为电源备用接口,此接口与DC电源接口直连。可以用于电源取电,或者不同接口的供电扩展。
注意不要插跳线或者短路!
电源选择
电机驱动器主电源适用电压6-12V,需要跟接的电机匹配。电源的选择很重要,供电不足会使系统工作不稳定。推荐使用动力型电池。动力电池具有更大的放电电流,瞬间输出功率更强。
四、软件程序库详解
我们提供Arduino类库和相关示例代码。含两组类库文件:PS2X_Lib和Motor_Shield_Library examples目录下的示例。
*如果提示没有找到类库,请配置相关的库文件,或者直接拷贝列库文件到当前项目目录下。
1、控制直流电机(DC motor)
a)连接电机
驱动器有4组电机接线柱分别为M1, M2, M3, 和 M4。
注意:请仔细查看电机参数,电机尺寸过大(功率太大)会使驱动器超负荷,导致驱动器损坏。(实测370电机可用)
b)直流电机(DC motor) 示例详解
#include <Wire.h> #include "QGPMaker_MotorShield.h" // Create the motor shield object with the default I2C address QGPMaker_MotorShield AFMS = QGPMaker_MotorShield(); // Select which 'port' M1, M2, M3 or M4. In this case, M3 QGPMaker_DCMotor *DCMotor_3 = AFMS.getMotor(3); void setup(){ AFMS.begin(50); // create with the default frequency 50Hz } void loop(){ DCMotor_3->setSpeed(200); DCMotor_3->run(FORWARD); delay(3000); DCMotor_3->setSpeed(0); DCMotor_3->run(RELEASE); delay(2000); DCMotor_3->setSpeed(200); DCMotor_3->run(BACKWARD); delay(3000); DCMotor_3->setSpeed(0); DCMotor_3->run(RELEASE); delay(2000); }
创建一个MotorShield对象:
QGPMaker_MotorShield AFMS = QGPMaker_MotorShield();
从MotorShield创建DCMotor对象,对应M3端口的电机:
QGPMaker_DCMotor *myMotor = AFMS.getMotor(3);
getMotor(port#)
port# :1~4,对应M1~M4接线柱
在setup() 函数里加入初始化代码:
AFMS.begin();
设置电机速度:
myMotor->setSpeed(100);
setSpeed(speed)
speed :0 (stopped) ~255 (full speed).
*速度是个相对值,反应在输出上是控制电压的大小,做大电压等于供电电压。供电电压也高,相同的速度值速度越快。
启动电机(正转、反转、停止)
myMotor->run(FORWARD);
run(direction)
direction : FORWARD(正转), BACKWARD(反转) ,BRAKE (刹车急停)or RELEASE(关闭电机).
*注:电机旋转方向跟接线有关,如果转向不正确,请对调电机正负极接线柱。
BRAKE 和RELEASE的区别:V5.0版本新增了BRAKE选项,原理上是通过短接电机的正负极,实现有限的电机急停功能,对于大功率电机,慎用此选项,可能会损坏电机驱动芯片。RELEASE是断开电机电源,实现电机的自然停止(带惯性停止)。
2、舵机控制(Servo)
驱动板的舵机控制通过PWM专用芯片PCA9685实现,对应的编号分别为0-7接口。
驱动器内嵌稳压电路,可以输出5V,3A的电流给舵机供电。尽量避免舵机堵转或超负荷,以免影响系统稳定性或损坏舵机。
注意:对于大功率的舵机(电源要求超过5V3A),请拔掉红色跳线帽,再使用跟舵机匹配的电源通过“舵机辅助电源”接口独立供电。
在驱动板右上角有2个传感器接口,可以插三线传感器,也可以插舵机。此接口对应Arduino D5,D6引脚。
舵机代码解析(代码需要导入库文件)
#include <Wire.h> #include "QGPMaker_MotorShield.h" QGPMaker_MotorShield AFMS = QGPMaker_MotorShield(); //创建驱动器对象 QGPMaker_Servo *Servo3 = AFMS.getServo(3); //获取3号舵机 void setup(){ AFMS.begin(50); } void loop(){ Servo3->writeServo(10); //3#舵机转到10度位置 delay(1000); Servo3->writeServo(120); //3#舵机转到120度位置 delay(1000); int deg=Servo3->readDegrees();//读取3#舵机当前角度 }
3、编码器电机
*此功能仅支持Arduino UNO开发板,Mega2560和其他型号开发板不支持此编码器功能
编码器才有PCINT计数,相关芯片引脚对应如下:
Arduino Uno/Nano/Mini: All pins are usable Arduino Mega: 10, 11, 12, 13, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69) Arduino Leonardo/Micro: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI) HoodLoader2: All (broken out 1-7) pins are usable Attiny 24/44/84: All pins are usable Attiny 25/45/85: All pins are usable Attiny 13: All pins are usable Attiny 441/841: All pins are usable ATmega644/ATmega644P/ATmega1284P: All pins are usable ATmega 162: PORTA and PORTC usable
| PCINT | Uno/Nano/Mini | Mega/2560 | Leonardo/Micro | HL2 (8/16/32u2) | | ----- | --------------- | -------------- | -------------- | --------------- | | 0 | 8 (PB0) | 53 SS (PB0) | SS (PB0)* | 0 SS (PB0)* | | 1 | 9 (PB1) | 52 SCK (PB1) | SCK (PB1) | 1 SCK (PB1) | | 2 | 10 SS (PB2) | 51 MOSI (PB2) | MOSI (PB2) | 2 MOSI (PB2) | | 3 | 11 MISO (PB3) | 50 MISO (PB3) | MISO (PB3) | 3 MISO (PB3) | | 4 | 12 MOSI (PB4) | 10 (PB4) | 8/A8 (PB4) | 4 (PB4) | | 5 | 13 SCK (PB5) | 11 (PB5) | 9/A9 (PB5) | 5 (PB5) | | 6 | XTAL1 (PB6)* | 12 (PB6) | 10/A10 (PB6) | 6 (PB6) | | 7 | XTAL2 (PB7)* | 13 (PB7) | 11 (PB7) | 7 (PB7) | | ----- | --------------- | -------------- | -------------- | --------------- | | 8 | A0 (PC0) | 0 RX (PE0)* | | (PC6)* | | 9 | A1 (PC1) | 15 RX3 (PJ0)* | | (PC5)* | | 10 | A2 (PC2) | 14 TX3 (PJ1)* | | (PC4)* | | 11 | A3 (PC3) | NC (PJ2)* | | (PC2)* | | 12 | A4 SDA (PC4) | NC (PJ3)* | | (PD5)* | | 13 | A5 SDC (PC5) | NC (PJ4)* | | | | 14 | RST (PC6)* | NC (PJ5)* | | | | 15 | | NC (PJ6)* | | | | ----- | --------------- | -------------- | -------------- | --------------- | | 16 | 0 RX (PD0) | A8 (PK0) | | | | 17 | 1 TX (PD1) | A9 (PK1) | | | | 18 | 2 INT0 (PD2) | A10 (PK2) | | | | 19 | 3 INT1 (PD3) | A11 (PK3) | | | | 20 | 4 (PD4) | A12 (PK4) | | | | 21 | 5 (PD5) | A13 (PK5) | | | | 22 | 6 (PD6) | A14 (PK6) | | | | 23 | 7 (PD7) | A15 (PK7) | | | | ----- | --------------- | -------------- | -------------- | --------------- |
a)编码器电机接线
b)AB相正交编码器简单介绍
AB相编码器通过2个传感器检测90度的异相波形,用正交编码计算电机的移动变化。基本原理图下图所示:
c)编码器库文件和示例说明
编码器库采用AB相4倍频算法:比如编码器磁环基础脉冲数是12(PPR),则连接磁环的电机转动一圈得到的脉冲数是12*4=48。如果减速电机齿数比是1:90,则轮子旋转一周的脉冲数(CPR)=12(PPR)*4*90(齿数比)=4320。
编码器库的基本用法
导入编码器库文件
#include "QGPMaker_Encoder.h"
创建3号编码器
QGPMaker_Encoder encoder3(3); //对应M3电机口
获取编码器数值
int32_t position3= encoder3.read(); //读取3号编码器的数值
写入编码器数值(初始值),一般用于校准或者清零复位
encoder3.write(0); //编码器设置为0
读取电机转速
int rpm=encoder3.getRPM();//获取3号编码器电机对应的每分钟转速(RPM)
#include <Wire.h> #include "QGPMaker_MotorShield.h" #include "QGPMaker_Encoder.h" QGPMaker_MotorShield AFMS = QGPMaker_MotorShield(); QGPMaker_DCMotor *DCMotor_3 = AFMS.getMotor(3); QGPMaker_Encoder Encoder3(3); //创建3号编码器(对于M3电机) void setup(){ AFMS.begin(50); Serial.begin(9600); DCMotor_3->setSpeed(200); DCMotor_3->run(FORWARD); //启动电机 } void loop(){ Serial.println(Encoder3.read()); //输出编码器数值 }
4、步进电机
*不推荐使用,建议使用步进电机专用的驱动器控制,谨慎使用
a)驱动板可以同时接2个步进电机,单极和双极都适用。
b)连接电机
*步进电机型号很多,线序颜色跟上图可能一致,注意参考电机资料了解清楚
- 单极驱动Unipolar Stepper Motor(6线或5线): 首先需要知道哪根线是中心线,然后将中心线都接到板子上任意标识的GND(右图白色和黄色)端口,剩下的两组端线(黑和绿,红和蓝)分别接到M1、M2或M3、M4。
- 双极驱动Bipolar stepper motors(4线): 跟单极驱动类似,将4根线依次接到M1、M2或M3、M4端口。
C)步进电机(Stepper motor)控制示例详解
#include <Arduino.h> #include "QGPMaker_MotorShield.h" QGPMaker_MotorShield JFMS = QGPMaker_MotorShield(); //初始化驱动器 const int stepsPerRevolution = 200; // 步进电机转一周的步数,一般42电机的步数是200步 QGPMaker_StepperMotor *stepper1 = JFMS.getStepper(stepsPerRevolution, 1); //获取1号步进电机(对应M1,M2接口) QGPMaker_StepperMotor *stepper2 = JFMS.getStepper(stepsPerRevolution, 2); //获取2号步进电机(对应M3,M4接口) void setup() { Serial.begin(9600); JFMS.begin(); stepper1->setSpeed(60); //RPM速度 stepper2->setSpeed(6); //RPM速度 } void loop() { stepper1->step(200, FORWARD,DOUBLE); //电机正转200步(一周) stepper2->step(200, FORWARD, MICROSTEP);//电机向前转200步(一周) delay(1000); stepper1->step(200, BACKWARD,DOUBLE); //电机反转200步(一周) stepper2->step(200, BACKWARD, MICROSTEP); delay(1000); }
程序接口说明:
QGPMaker_StepperMotor *stepper1 = JFMS.getStepper(stepsPerRevolution, 1); //获取1号步进电机(对应M1,M2接口)
获取一个步进电机对象
- stepsPerRevolution:每周的步数。比如42步进电机的单步角度是1.8度,每周步数=360/1.8=200步
stepper1->setSpeed(60); //RPM速度
void setSpeed(uint16_t);
设置电机转速,数值是每分钟的转速(rpm)
stepper1->step(200, FORWARD,DOUBLE); //电机正转200步(一周)
void step(uint16_t steps, uint8_t dir, uint8_t style = SINGLE);
控制电机:
- steps:旋转的步数
- dir:旋转方向 FORWARD or BACKWARD,电机旋转方向也跟端口接线有关
- style:电机驱动方式 SINGLE(单拍), DOUBLE(双拍), INTERLEAVED (混合)or MICROSTEP(微步)
驱动方式区别简介:
- SINGLE:单组线圈工作,电机功耗小,扭矩也相对小
- DOUBLE:双组线圈工作,功耗比SINGLE大,扭矩也增大
- INTERLEAVED:单双线圈交替工作
- MICROSTEP:微步模式,电机精度高,速度慢(默认是16分)
void release(void);
断开电机电源,释放电机。默认情况,步进电机驱动后,会处于锁住状态。如果要关闭电机,请调用release()方法,比如:stepper1->release();
5、无线手柄控制
非完整代码,请勿直接复制编译
//导入库文件 #include "PS2X_lib.h" //定义ps2手柄 PS2X ps2x; int error; void setup() { //配对接收器 do { error = ps2x.config_gamepad(13, 11, 10, 12, true, true); if (error == 0) { break; } else { delay(100); } } while (1); } void loop(){ ps2x.read_gamepad(false, 0);//读入手柄状态信息 //键位码请看上面对应图 if (ps2x.Button(PSB_PAD_UP)) {}//如果“上”按钮按下 if (ps2x.Analog(PSS_RY) > 240) {}//如果摇杆RY返回值大于240 delay(10);//延迟10ms }
6、电子开关/继电器控制
a)接线
将电子开关、继电器或者相关模块控制端接到舵机接口对应的PWM引脚。
b)程序示例说明
#include <Wire.h> #include "QGPMaker_MotorShield.h" QGPMaker_MotorShield AFMS = QGPMaker_MotorShield(); void setup(){ AFMS.begin(50); } void loop(){ AFMS.setPin(2,HIGH); //2#舵机口输出高电平(电子开关打开) AFMS.setPWM(3,4000); //3#舵机口输出PWM值4000(可作为PWM控制,电机调速,LED亮度调节等) }
- PWM输出,可作为PWM控制,电机调速,LED亮度调节等:
AFMS.setPWM(n,pwm);
n:0~7 对应舵机端口的0~7号端口
pwm:取值范围(0~4096)
- 开关量输出,可以用于控制电子开关或者继电器等
AFMS.setPin(n,HIGH/LOW);
n:0~7 对应舵机端口的0~7号端口
HIGH/LOW:HIGH或LOW 输出高低电平
7、无刷电机控制(待完善)
五、原理图
Arduino UNO R3开发板官方原理图:点击下载
六、演示作品和示例代码
1、4WD小车
2、麦克纳姆轮小车
原创文章,作者:奇果派工坊,如若转载,请注明出处:https://www.7gp.cn/archives/308