Arduino MotorShiled电机驱动器说明

《Arduino MotorShiled图形化编程》

访问基于Mixly的图形化编程,请访问以上链接

一、概述

这是基于Arduino开发运动机器人非常完美的解决方案,这款电机驱动器足够强大,可以驱动4个直流电机或2个步进电机,并且额外提供8路全速PWM控制,可以控制8路舵机。支持PS2无线手柄,充分发挥PS2手柄的强大功能。

最大限度的减少Arduino引脚的占用,所以使用基于I2C通讯的专用PWM驱动芯片(PCA9685)控制电机的速度和方向。只用2根IO引脚(SDA&SCL)就可以驱动多个电机,也可以多个驱动器叠加使用(可级联),并且不干扰其他I2C设备的使用。

支持超声波传感器,可以轻松对接智能小车或者其他电机控制的应用。

Arduino MotorShiled电机驱动器说明
V5.0版电机驱动器

参数说明:

  • 使用东芝高性能驱动芯片,提供每路2.2A(3.6A峰值)输出,可运行4.5-13.5V直流电机;
  • 可以驱动4个直流电机或2个步进电机;
  • 额外提供8路PWM输出,可以控制8路舵机;
  • 支持PS2无线手柄;
  • 支持蓝牙模块和超声波传感器;
  • 可自定义I2C地址,支持多个驱动器叠加级联;
  • 提供完整的代码库和丰富示例程序,支持图形编程,简单易用。

大功率电机驱动版V4.0

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

二、接口与接线

Arduino MotorShiled电机驱动器说明
V5.0版接口示意图

1、PS2无线手柄连接

驱动器内置PS2接收器插座,将接收器直接插入使用。

Arduino MotorShiled电机驱动器说明

 PS2手柄为非热插拔,在实际项目用,需要编写重连检测,如无法找到设备,请重启Arduino控制器。

*手柄一段时间不操作会自动休眠,按start或analog唤醒。

三、电源说明

电源供电方案选择

Arduino MotorShiled电机驱动器说明

单电源供电特性:

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

舵机独立供电

当需要接入多个舵机或大功率舵机的时候,请选择此方案供电

  • 先拔掉左上角跳线帽,断开板载电源
  • 接上跟舵机匹配电压匹配的电源,注意匹配参数,大多数舵机耐压是5-6V,电压太高会使舵机烧毁
Arduino MotorShiled电机驱动器说明

备用电源接口

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(关闭电机).

*注:电机旋转方向跟接线有关,如果转向不正确,请对调电机正负极接线柱。

BRAKERELEASE的区别: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)编码器电机接线

Arduino MotorShiled电机驱动器说明

b)AB相正交编码器简单介绍

AB相编码器通过2个传感器检测90度的异相波形,用正交编码计算电机的移动变化。基本原理图下图所示:

Arduino MotorShiled电机驱动器说明

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、步进电机

建议使用步进电机专用的驱动器控制,此驱动器用于步进电机电流比较大,谨慎使用

Arduino MotorShiled电机驱动器说明

a)驱动板可以同时接2个步进电机,单极和双极都适用。

b)连接电机

Arduino MotorShiled电机驱动器说明
上图中左为双极驱动Bipolar stepper motors(4线),右为单极驱动Unipolar Stepper Motor(6线或5线)··

*步进电机型号很多,线序颜色跟上图可能一致,注意参考电机资料了解清楚

  • 单极驱动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、无线手柄控制

Arduino MotorShiled电机驱动器说明

非完整代码,请勿直接复制编译

//导入库文件 
#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引脚。

Arduino MotorShiled电机驱动器说明

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 MotorShiled电机驱动器说明
MotorShield V5.3版原理图

六、演示作品和示例代码

1、4WD小车

2、麦克纳姆轮小车


原创文章,作者:奇果派工坊,如若转载,请注明出处:https://www.7gp.cn/archives/308