访问基于Mixly的图形化编程,请访问以上链接
一、概述
这是基于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地址,支持多个驱动器叠加级联;
- 提供完整的代码库和丰富示例程序,支持图形编程,简单易用。
大功率电机驱动版V4.0

- 左侧使用TB6612芯片组,提供每路1.2A(3A峰值)输出,可运行4.5-13.5V直流电机;
- 右侧使用汽车大电流电机驱动芯片,提供每路14A(30A峰值)输出,可运行5.5-24V直流电机;
- 可以驱动4个直流电机,前进和后退,提供PWM调速;
- 额外提供4路PWM输出,可以控制4路舵机;
- 支持PS2无线手柄;
- 支持蓝牙模块和超声波传感器;
- 可自定义I2C地址,支持多个驱动器叠加级联;
- 提供完整的代码库和丰富示例程序,支持图形编程,简单易用。
大功率驱动器代码下载:点击下载
二、接口与接线

1、PS2无线手柄连接
驱动器内置PS2接收器插座,将接收器直接插入使用。

PS2手柄为非热插拔,在实际项目用,需要编写重连检测,如无法找到设备,请重启Arduino控制器。
*手柄一段时间不操作会自动休眠,按start或analog唤醒。
三、电源说明
电源供电方案选择

单电源供电特性:
- 单电源可同时为驱动器和开发板供电
- 板载内嵌5V稳压器,可为舵机端口提供5V3A电源。
- 电源输出功率(放电电流)要够大,否则会影响稳定性

舵机独立供电
当需要接入多个舵机或大功率舵机的时候,请选择此方案供电
- 先拔掉左上角跳线帽,断开板载电源
- 接上跟舵机匹配电压匹配的电源,注意匹配参数,大多数舵机耐压是5-6V,电压太高会使舵机烧毁

开发板独立供电
- 首先需要拔掉黄色跳线帽,断开主电源与开发板的供电线路
- 分别给主电源和底下开发板电源端口供电
- 此方案将逻辑部分和动力部分电压分离,可增加系统稳定性和安全性
- 主电源功率不够,推荐此方案
电源选择
电机驱动器主电源适用电压6-12V,需要跟接的电机匹配。电源的选择很重要,供电不足会使系统工作不稳定。推荐使用动力型电池。动力电池具有更大的放电电流,瞬间输出功率更强。
18650电池 动力电池电池组(2S)
四、软件程序库详解
我们提供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、编码器电机
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
#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)连接电机

上图中左为双极驱动Bipolar stepper motors(4线),右为单极驱动Unipolar Stepper Motor(6线)
- 单极驱动Unipolar Stepper Motor(6线): 首先需要知道哪根线是中心线,然后将中心线都接到接线柱的GND(右图白色和黄色),剩下的两组端线(黑和绿,红和蓝)分别接到M1、M2或M3、M4。
- 双极驱动Bipolar stepper motors(4线): 跟单极驱动类似,GND留空不接就可以。
C)步进电机(Stepper motor)控制示例详解
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、无刷电机控制(待完善)
五、原理图

六、演示作品和示例代码
1、4WD小车
V2版4轮机械臂小车 经典版4轮小车
2、麦克纳姆轮小车
麦克纳姆轮V2版机械小车 麦克纳姆轮大机械臂搬运车
原创文章,作者:奇果派工坊,如若转载,请注明出处:https://www.7gp.cn/archives/308