Arduino控制直流電機
認識直流電機
直流電機內部有磁鐵、轉子和碳刷等元件組成,將電機的+、-極和電池相連,即可正轉或逆轉。
電機在運轉時,碳刷和整流子之間會產生火花,進而引發干擾,影響到微處理器或無線遙控器的執行。為了消除噪聲,通常在碳刷電機的+、-極之間焊接一個0.01~0.1uF的電容。
步進電機 是一種易於控制旋轉角度和轉動圈數的電機,常見於需要精確定位的自動控制系統,比如:印表機、光碟機等,僅僅接上電源,步進電機是不會轉動的,步進電機有四條控制線和兩條電源線,微處理器從控制線輸入脈衝(即:高、低電位變化),步進電機的轉子就會配合脈衝數轉動到對應的角度。
脈衝產生器發出的訊號,輪流驅使電機轉動一個角度,轉動一圈所需要的次數以及每次轉動的角度,分別稱為“步數”和“步進角”。
缺點: 體積、重量以及消耗電力都比較大,因此許多需要控制旋轉角度的裝置,都改用 舵機
直流電機 又稱為“碳刷電機”,因為它通過碳刷將電力傳輸給轉子。碳刷需要清理也會損耗,因此許多電器逐步改用無刷電機,無刷電機的結構以及驅動方式,都和一般碳刷電機不同
直流電機的技術檔案
從電機的技術檔案所列舉的轉速和扭力引數,可得知該電機是否符合轉速和負重的需求;工作電壓和消耗電流引數,則關係到電源和控制器的配置。
表:RF-300電機
最大效率 | 堵轉(STALL) | |||||||
---|---|---|---|---|---|---|---|---|
工作電壓 | 轉速 | 電流 | 扭力 | 輸出 | 扭力 | 電流 | ||
1.6~6.5V | 1710轉/分鐘 | 0.0525A | 0.27mN·m | 2.8g·cm | 0.049W | 1.22mN·m | 12g·cm | 0.18A |
最大效率 | 堵轉(STALL) | |||||||
---|---|---|---|---|---|---|---|---|
工作電壓 | 轉速 | 電流 | 扭力 | 輸出 | 扭力 | 電流 | ||
1.5~3V | 6990轉/分鐘 | 0.66A | 0.59mN·m | 6.0g·cm | 0.43W | 2.55mN·m | 26g·cm | 2.20A |
認識電晶體元器件
電晶體是最基本的驅動介面,微處理器只需要送出微小的訊號,即可通過它控制外部裝置。它很像水管中的閥門,平時處於關閉狀態,但只要稍微施力,就能啟動閥門,讓大量水流通過。
電晶體有三隻引腳,分別叫做B(基極)、C(集電極)和E(發射極),集電極(Collector) 代表收集電流,發射極(Emitter) 代表射出電流,基極(Base) 相當於控制檯。
控制電機正反轉的H橋式電機控制電路
使用專用IC(L298)控制電機
L298內部包含兩組H橋式電路,可以驅動並控制電機的正反轉,
L298N內部原理圖
L298N引腳圖及功能
L298N 有兩組電源輸入腳,一個用於IC本身(晶片電源,5V),另一個用於電機;有兩個使能引腳,用於決定是否供電給電機。L298N 有檢測電機是否處於“堵轉”狀態,原理是:“當電機的負荷增加時,消耗的電流量也跟著增加,因此,從電流的消耗量,可得知電機是否執行平順。”如果要啟用這項功能,必須在“電流監測”腳位連線電阻;若不適用“電流監測”功能,請將電流監測的1和15腳位接地。
一組電機都有三個控制引腳,使能、輸入A和輸入B,這三個引腳和電機的運轉關係:
L298N邏輯功能表
使能A | 輸入1A | 輸入1B | 電機狀態 |
---|---|---|---|
高 | 高 | 低 | 正轉 |
高 | 低 | 高 | 反轉 |
高 | 輸入1B | 輸入1A | 快速停止(剎車) |
低 | × | × | 停止(自由滑行) |
×:代表任何狀態
在需要精確定位的場合,可以將兩個輸入訊號反轉,造成“剎車”效果
有些L298N電機控制器,使用另一個IC(型號:74HC14)來簡化電機正反轉控制,每個輸入端只有使能和正反轉兩個引腳
這種控制器的輸入輸出關係表
EA/EB(使能) | IA/IB(正反轉) | 電機狀態 |
---|---|---|
高 | 高 | 正轉 |
高 | 低 | 反轉 |
低 | × | × |
活動一:自動迴避障礙物的自走車
實驗說明: 採用一個L298N控制器以及超聲波感測器,製作一個遇到前方有障礙物時,能自動轉向的自走車。
實驗材料:
物品 | 數量 |
---|---|
超聲波感測器 | 1 |
L298N電機控制模組 | 1 |
電機(請在小電機的電源焊接一個0.1uF(104)電容,避免電機的噪聲干擾處理器 | 2 |
const byte TrigPin = 13;
const int EchoPin = 12;
const int dangerThresh =580;
cont byte speed = 100;
long distance ;
const byte ENA = 5;
const byte ENB = 6;
const byte IN1 = 10;
const byte IN2 = 9;
const byte IN3 = 8;
const byte IN4 = 7;
byte dir = 0;
void stop() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
void forward() {
analogWrite(ENA, speed);
digitalWrite(IN1, HIGH);
dititalWrite(IN2, LOW);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void backward() {
analogWrite(ENA, speed);
digitalWrite(IN2, HIGH);
dititalWrite(IN1, LOW);
analogWrite(ENB, speed);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
}
void turnLeft() {
analogWrite(ENA, speed);
digitalWrite(IN2, HIGH);
dititalWrite(IN1, LOW);
analogWrite(ENB, speed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
void turnRight() {
analogWrite(ENA, speed);
digitalWrite(IN1, HIGH);
dititalWrite(IN2, LOW);
analogWrite(ENB, speed);
digitalWrite(IN4, HIGH);
digitalWrite(IN3, LOW);
}
long ping() {
digitalWrite(TrigPin, HIGH);
delayMicroseconds(5);
digitalWrite(TrigPin, LOW);
return pulseIn(EchoPin, HIGH);
}
void loop() {
distance = ping();
if (distance > dangerThresh) {
if (dir != 0) {
dir = 0;
stop();
delay(500);
}
forward();
} else {
if (dir != 1) {
dir = 1;
stop();
delay(500);
}
turnRight();
}
delay(1000);
}
實驗結果: 編譯與下載程式之後,兩個電機將開始正轉,若超聲波感測器感知到遮擋,兩個電機首先暫停0.5秒,接著,A電機將持續正轉,B電機則會反轉;若前方無障礙物,兩個電機首先暫停0.5秒,再一起正轉。每次在切換電機狀態之前先暫停0.5秒,可以避免電機頻繁地正、反轉而導致壽命降低。