Arduino电机驱动器说明

一、概述

注:以下有些是老版图片,新版布局有所调整。

有关图形化编程资料,请访问《Arduino PS2-Motor-Shield驱动器图形化编程

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

 

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

支持蓝牙,实现蓝牙通信


支持超声波传感器,可以轻松对接智能小车应用。


参数说明:

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

二、PS2无线手柄连接


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

三、电源说明

  • 因为驱动器需要同时为电机和Arduino供电,建议使用动力电池作为电源。供电电压为5-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 "Adafruit_MotorShield.h"
#include "utility/Adafruit_MS_PWMServoDriver.h"

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

// Select which 'port' M1, M2, M3 or M4. In this case, M1
Adafruit_DCMotor *myMotor = AFMS.getMotor(3);

void setup() {
  AFMS.begin();  // create with the default frequency 1.6KHz
  
  // Set the speed to start, from 0 (off) to 255 (max speed)
  myMotor->setSpeed(150);
  myMotor->run(FORWARD);
  // turn on motor
  myMotor->run(RELEASE);
}

void loop() {
  myMotor->run(FORWARD);
  myMotor->setSpeed(150); 
  delay(3000);
  myMotor->run(RELEASE);
 
  myMotor->run(BACKWARD);
  myMotor->setSpeed(180); 
  delay(2000);

  myMotor->run(RELEASE);
  delay(1000);
}

创建一个MotorShield对象:

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

从MotorShield创建DCMotor对象,对应M3端口的电机:

Adafruit_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 or RELEASE.

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

2、使用步进电机(Stepper Motors)

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)控制示例详解

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); ; 

// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #2 (M3 and M4)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  AFMS.begin();  // create with the default frequency 1.6KHz
  myMotor->setSpeed(10);  // 10 rpm   
}

void loop() {
  //Single coil steps
  myMotor->step(100, FORWARD, SINGLE); 
  myMotor->step(100, BACKWARD, SINGLE); 

  //Double coil steps
  myMotor->step(100, FORWARD, DOUBLE); 
  myMotor->step(100, BACKWARD, DOUBLE);
  
  //Interleave coil steps
  myMotor->step(100, FORWARD, INTERLEAVE); 
  myMotor->step(100, BACKWARD, INTERLEAVE); 
  
  //Microstep steps
  myMotor->step(50, FORWARD, MICROSTEP); 
  myMotor->step(50, BACKWARD, MICROSTEP);
}

创建一个MotorShield对象:

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

从MotorShield创建StepperMotor对象:

Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

 getStepper(steps, stepper#)

steps: 每转步数,建议35~200之间

stepper#: 1~2, M1、M2为1,M3、M4 为2

设置旋转速度:

setSpeed(rpm): 每分钟旋转速度

运转电机:

 step(#steps, direction, steptype)

#steps:步数

direction:FORWARD or BACKWARD

steptype:SINGLE, DOUBLE, INTERLEAVE or MICROSTEP

*关于步进电机工作特性请参考网上资料。

3、舵机控制(Servo)


驱动板的舵机控制通过PWM专用芯片PCA9685实现,对应的编号分别为0,1,14,15。由于市面上普通舵机通常只支持50Hz的信号,所以pwm.setPWMFreq(50)频率控制在50左右。具体应用请参考示例代码。

注意:板载稳压芯片功率很小,多个舵机请拔掉红色跳线帽,再使用5V电源通过“舵机辅助电源”接口独立供电


在驱动板右上角有2个传感器接口,可以插三线传感器,也可以插舵机。此接口直连Arduino D5,D6引脚。

五、叠加级联

当觉得电机接口不够用时,可以多个驱动板级联使用。我们最多支持 32个驱动器叠加使用,总共可以支持64个步进电机(steppers)或者128个直流电机(DC motors)

多个驱动器级联需要为每个驱动器设置唯一的I2C地址,默认地址是0x60。地址范围从0x60~0x80总共32个地址。


驱动板上有A0~A4总共5个跳线,焊接不同的跳线可以设置不同的地址。规则如下

Board 0: Address = 0x60 Offset = binary 0000 (默认全部为空)
Board 1: Address = 0x61 Offset = binary 0001 (只焊接A0)
Board 2: Address = 0x62 Offset = binary 0010 (只焊接A1)
Board 3: Address = 0x63 Offset = binary 0011 (同时焊接A0 & A1)
Board 4: Address = 0x64 Offset = binary 0100 (只焊接A2)
依次类推。。。

0x70 是广播地址,建议保留不用.

六、原理图

* 高清原理图下载

七、演示作品

   

 


驱动器示例代码下载:点击下载