除了使用感測器對各種外部物理量進行感知之外,能夠對實際物體的運動進行相應的控制也是互動設計中不可或缺的一部分。
在所有這類動力裝置中,馬達是最常見便宜的解決方案,常用的電機的種類有很多種,如直流馬達,步進馬達,伺服馬達,減速馬達等,並且每一種馬達的控制方法都有所不同。
如果你是一個電子高手,控制普通的直流電機用幾個三極管就行了,否則話像L298N這樣的芯片將是一個更好的選擇。
L298N 電機驅動器使用說明書 L298N 是 ST 公司生產的一種高電壓、大電流電機驅動芯片。該芯片採用 15 腳 封裝。主要特點是:工作電壓高,最高工作電壓可達 46V;輸出電流大,瞬間峰
值電流可達 3A,持續工作電流為 2A;額定功率 25W。內含兩個 H 橋的高電壓 大電流全橋式驅動器, 可以用來驅動直流電動機和步進電動機、繼電器線圈等感
性負載;採用標準邏輯電平信號控制;具有兩個使能控制端,在不受輸入信號影 響的情況下允許或禁止器件工作有一個邏輯電源輸入端, 使內部邏輯電路部分在 低電壓下工作;可以外接檢測電阻,將變化量反饋給控制電路。使用 L298N 芯 片驅動電機,該芯片可以驅動一台兩相步進電機或四相步進電機,也可以驅動 兩台直流電機。
參考上圖或是下表連接電源、馬達以及 Arduino。
端子台 (Terminal Block)
|
||
No
|
名稱
|
說明
|
1
|
A+
|
Motor A+
|
2
|
A-
|
Motor A-
|
3
|
VMS
|
供電 (+5V ~ 35V)
|
4
|
GND
|
Ground
|
5
|
5V
|
5V output
|
6
|
B+
|
Motor B+
|
7
|
B-
|
Motor B-
|
排針 (Male Header)
|
||
No
|
名稱
|
說明
|
1
|
ENA
|
Enable Bridge A
|
2
|
IN1
|
Input 1
|
3
|
IN2
|
Input 2
|
4
|
IN3
|
Input 3
|
5
|
IN4
|
Input 4
|
6
|
ENB
|
Enable Bridge B
|
下表說明使用 ENA 與 ENB 控制 Motor A 的方法,Motor B 的控制邏輯也是一樣的,只是要改用 IN3 和 IN4 來控制。
ENA
|
IN1
|
IN2
|
功能
|
HIGH
|
HIGH
|
LOW
|
馬達正轉
|
HIGH
|
LOW
|
HIGH
|
馬達反轉
|
HIGH
|
IN1=IN2
|
IN1=IN2
|
馬達快速停止
|
LOW
|
ingored
|
ignored
|
馬達慢速停止
|
ENB
|
IN3
|
IN4
|
功能
|
HIGH
|
HIGH
|
LOW
|
馬達正轉
|
HIGH
|
LOW
|
HIGH
|
馬達反轉
|
HIGH
|
IN1=IN2
|
IN1=IN2
|
馬達快速停止
|
LOW
|
ingored
|
ignored
|
馬達慢速停止
|
測試程式如下
/* Input for motorA:
ENA = 5V enable
IN1 IN2 Action
LOW LOW Motor Stop
HIGH LOW Motor moves forward
LOW HIGH Motor moves backward
HIGH HIGH Motor Stop
*/
const int motorIn1 = 5;
const int motorIn2 = 6;
const int motorIn3 = 9;
const int motorIn4 = 10;
const int DELAY = 1000;
void setup()
{
pinMode(motorIn1, OUTPUT);
pinMode(motorIn2, OUTPUT);
pinMode(motorIn3, OUTPUT);
pinMode(motorIn4, OUTPUT);
}
void loop()
{
selfTest();
}
void selfTest()
{
forward();
delay(DELAY);
motorstop();
delay(500);
backward();
delay(DELAY);
motorstop(); delay(500);
right();
delay(DELAY);
motorstop(); delay(500);
left();
delay(DELAY);
motorstop(); delay(500);
}
void motorstop()
{
digitalWrite(motorIn1, LOW);
digitalWrite(motorIn2, LOW);
digitalWrite(motorIn3, LOW);
digitalWrite(motorIn4, LOW);
}
void forward()
{
digitalWrite(motorIn1, HIGH);
digitalWrite(motorIn2, LOW);
digitalWrite(motorIn3, HIGH);
digitalWrite(motorIn4, LOW);
}
void backward()
{
digitalWrite(motorIn1, LOW);
digitalWrite(motorIn2, HIGH);
digitalWrite(motorIn3, LOW);
digitalWrite(motorIn4, HIGH);
}
// Let right motor keep running, but stop left motor
void right()
{
digitalWrite(motorIn1, HIGH);
digitalWrite(motorIn2, LOW);
digitalWrite(motorIn3, LOW);
digitalWrite(motorIn4, LOW);
}
// Let left motor keep running, but stop right motor
void left()
{
digitalWrite(motorIn1, LOW);
digitalWrite(motorIn2, LOW);
digitalWrite(motorIn3, HIGH);
digitalWrite(motorIn4, LOW);
}
沒有留言:
張貼留言