Arduino筆記(100):使用TB6612FNG電機控制板驅動N20馬達

在製作四輪小車時,有想過要做兩輪平衡車,但因為白天要上班,下班時間有限,進度會比較慢。今天就先從我手邊有的機電控制板 TB6612FNG 瞭解開始,學習如何將控制馬達的前進、後退及轉速等功能。
TB6612FNG 電機控制模組可以在1.2A(3.2A峰值)的電流下控制兩個 DC 馬達或 1個雙極步進馬達,兩個輸入信號(IN1和IN2)可用控制馬達四種模式:正轉、反轉、短制動(Short Brake)和停止(Stop)。兩個馬達輸出可以單獨控制,且其速度可透過 PWM 輸入信號控制,頻率高達100kHz。其中 STBY 引腳高電位時以使馬達退出待機模式。
來源:SparkFun

TB6612FNG 電機控制模組商品規格如下:
  • 晶片型號:TB6612FNG
  • 晶片工作電壓:2.7V-5.5V
  • 馬達工作電壓:2.5V-13.5V
  • 輸出電流:1.2A-3.2A
  • H橋式電路:MOSFET
  • 運行模式:順時針、時針、剎車、停鈍

旋轉方向AIN1 或 BIN1AIN2 或 BIN2
正轉(順時針)高電位低電位
反轉(逆時針)低電位高電位
停止高電位高電位
停止低電位低電位

[SparkFun_TB6612FNG 程式庫]

SparkFun_TB6612FNG 程式庫對馬達物件的方法如下:
◾ Motor(int In1pin, int In2pin, int PWMpin, int offset, int STBYpin);
建立馬達物件,In1pin 及 In2pin為控制的
◾ drive(int speed, int duration)
驅動馬達。speed 是介於 -255 至 255 的整數值,數字越大,轉速越高,負值代表反轉。duration 設定轉動的時間,為選擇性參數,不輸入代表一直轉動。
◾ standby()
設定成待機模式。開始執行drive、forward、back、left 及 right 指令,待機模式會停止。
◾ forward(Motor motor1, Motor motor2, int speed)
驅動兩個馬達前進。speed 是介於 -255 至 255 的整數值,若為負值代表反轉,若不輸入 speed值,以預設的速度值 255 轉動。
◾ back(Motor motor1, Motor motor2, int speed)
驅動兩個馬達後退。
◾ left(Motor motor1, Motor motor2, int speed)
讓左、右馬達分別反轉和正轉,方向向左轉動。
◾ right(Motor motor1, Motor motor2, int speed)
讓左、右馬達分別正轉和反轉,方向向右轉動。
◾ brake(Motor motor1, Motor motor2)
煞車。將兩個馬達驅動設成高電位讓馬達停止。

[材料]

  • Arduino UNO
  • TB6612FNG
  • N20 差速馬達 x2
  • PCB板
  • 18650電池 x2 (含電池座)
  • 排線 n 條


[接線圖]

TB6612FNGArduino Uno其他
PWMAD5-
AIN2D4-
AIN1D2-
STBYD9-
BIN1D7-
BIN2D8-
PWMBD6-
GNDGND-
VM-接18650電池正極
VCC5V-
GND-接18650電池負極
A01-馬達A一端
A02-馬達A另一端
B01-馬達B一端
B02-馬達B另一端


這是電路板背面的照片:

[程式]

#include <SparkFun_TB6612.h>
// 設定所有腳位對應 Arduino 的Pins
#define AIN1 2   // 控制輸入A1
#define AIN2 4   // 控制輸入A2
#define BIN1 7   // 控制輸入B1
#define BIN2 8   // 控制輸入B2
#define PWMA 5
#define PWMB 6
#define STBY 9

// 設定Offset,可以是 1 或 -1,1表示正轉,-1表示反轉
const int offsetA = 1;
const int offsetB = 1;

// 初始化馬達,設定控制板引腳

Motor motor1 = Motor(AIN1, AIN2, PWMA, offsetA, STBY);
Motor motor2 = Motor(BIN1, BIN2, PWMB, offsetB, STBY);

void setup()
{
 // 沒有程式內容
}

void loop() {
   // 速度可設定 -255 到 255.
   motor1.drive(255,3000);   // 馬達1全速正轉3秒
   motor1.drive(-255,3000);  // 馬達1全速反轉3秒
   motor1.brake();           // 馬達1停止
   delay(1000);
   
   motor2.drive(255,3000);   // 馬達2全速正轉3秒
   motor2.drive(-255,3000);  // 馬達2全速反轉3秒
   motor2.brake();           // 馬達2停止
   delay(1000);
   
   forward(motor1, motor2, 150);  // 兩個馬達以150的速度前進
   delay(3000);                  // 持續3秒
   
   back(motor1, motor2, -150);  // 兩個馬達以150的速度後退
   delay(3000);                 // 持續3秒
   
   brake(motor1, motor2);     // 兩個馬達停止
   delay(1000);
   
   left(motor1, motor2, 100);   // 左轉
   delay(3000);
   right(motor1, motor2, 100);  // 右轉
   delay(3000);
   
   brake(motor1, motor2);     // 停止兩個馬達
   delay(3000);   
}

[實作結果]


[參考資料]

1 留言

  1. 請問左彎、右彎怎麼寫?
    如:motor1/150,motor2/200不等速左右彎?

    回覆刪除

張貼留言

較新的 較舊