一、概述
电机驱动器分两个不同的版本:
注:以下有些是老版图片,新版布局有所调整。
示例代码下载:点击下载
这是基于Arduino开发运动机器人非常完美的解决方案,这款电机驱动器足够强大,可以驱动4个直流电机或2个步进电机,并且额外提供4路全速PWM控制,可以控制4路舵机。支持PS2无线手柄,充分发挥PS2手柄的强大功能。
最大限度的减少Arduino引脚的占用,所以使用基于I2C通讯的专用PWM驱动芯片(PCA9685)控制电机的速度和方向。只用2根GPIO引脚(SDA&SCL)就可以驱动多个电机,也可以多个驱动器叠加使用(可级联),并且不干扰其他I2C设备的使用。
支持蓝牙,实现蓝牙通信
支持超声波传感器,可以轻松对接智能小车或者其他电机控制的应用。
新版电机驱动器:
参数说明:
使用东芝高性能驱动芯片,提供每路2.2A(3.6A峰值)输出,可运行4.5-13.5V直流电机;
可以驱动4个直流电机或2个步进电机;
额外提供8路PWM输出,可以控制8路舵机;
支持PS2无线手柄;
支持蓝牙模块和超声波传感器;
可自定义I2C地址,支持多个驱动器叠加级联;
提供完整的代码库和丰富示例程序,支持图形编程,简单易用。
大功率电机驱动器:
参数说明:
左侧使用TB6612芯片组,提供每路1.2A(3A峰值)输出,可运行4.5-13.5V直流电机;
右侧使用汽车大电流电机驱动芯片,提供每路14A(30A峰值)输出,可运行5.5-24V直流电机;
可以驱动4个直流电机,前进和后退,提供PWM调速;
额外提供4路PWM输出,可以控制4路舵机;
支持PS2无线手柄;
支持蓝牙模块和超声波传感器;
可自定义I2C地址,支持多个驱动器叠加级联;
提供完整的代码库和丰富示例程序,支持图形编程,简单易用。
二、PS2无线手柄连接
PS2手柄为非热插拔,在实际项目用,需要编写重连检测,如无法找到设备,请重启Arduino控制器。
*手柄一段时间不操作会自动休眠,按start或analog唤醒。
三、电源说明
驱动器设计了不同颜色的跳线,通过跳线帽可以提供多种供电方案。
四、软件代码讲解
我们提供Arduino类库和相关示例代码。含两组类库文件:PS2X_Lib和Motor_Shield_Library examples目录下的示例。
*如果提示没有找到类库,请配置相关的库文件,或者直接拷贝列库文件到当前项目目录下。
1、控制直流电机(DC motor)
a)连接电机
驱动器有4组电机接线柱分别为M1,M2,M3, 和M4。
注意:请仔细查看电机参数,电机尺寸过大(功率太大)会使驱动器超负荷,导致驱动器损坏。(实测370电机可用)
b)直流电机(DC motor) 示例详解
#include
#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,BACKWARDorRELEASE.
*注:电机旋转方向跟接线有关,如果转向不正确,请对调电机正负极接线柱。
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
#include
#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, INTERLEAVEorMICROSTEP
*关于步进电机工作特性请参考网上资料。
3、舵机控制(Servo)
驱动板的舵机控制通过PWM专用芯片PCA9685实现,对应的编号分别为0,1,14,15。由于市面上普通舵机通常只支持50Hz的信号。
驱动器内嵌稳压电路,可以输出5V,3A的电流给舵机供电。尽量比较舵机堵转或超负荷,以免影响系统稳定性或损坏舵机。
注意:对于大功率的舵机(电源要求超过5V3A),请拔掉红色跳线帽,再使用跟舵机匹配的电源通过“舵机辅助电源”接口独立供电。
在驱动板右上角有2个传感器接口,可以插三线传感器,也可以插舵机。此接口对应Arduino D5,D6引脚。
舵机代码解析(非完整代码,请勿直接拷贝)
//获取舵机 1、2、3、4分别对应机械臂底部、左边、右边、爪子
Adafruit_Servo *Servo1 = AFMS.getServo(1);
Adafruit_Servo *Servo2 = AFMS.getServo(2);
Adafruit_Servo *Servo3 = AFMS.getServo(3);
Adafruit_Servo *Servo4 = AFMS.getServo(4);
Servo1->writeServo(90);//1#舵机旋转到90度位置
Servo2->writeServo(90);
Servo3->writeServo(90);
Servo4->writeServo(60);
int deg=Servo1->readDegrees()//读取1#舵机当前角度
4、无线手柄控制
无线手柄代码解析(非完整代码,请勿直接拷贝)
//导入库文件
#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
}
五、叠加级联
每个驱动器需要设置唯一的I2C地址,默认地址是0x60。地址范围从0x60~0x63总共4个地址。
驱动板上有A0,A1总共2个跳线,焊接不同的跳线可以设置不同的地址。规则如下
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)
六、原理图
七、演示作品
驱动器示例代码下载:点击下载
如果觉得《arduino步進電機_Arduino电机驱动器说明》对你有帮助,请点赞、收藏,并留下你的观点哦!