訪問基于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地址,支持多個驅動器疊加級聯;
- 提供完整的代碼庫和豐富示例程序,支持圖形編程,簡單易用。
大功率電機驅動版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、麥克納姆輪小車


原創文章,作者:奇果派工坊,如若轉載,請注明出處:http://www.yourwine.cn/archives/308
