---
# System prepended metadata

title: 第四課 直流馬達與繼電器控制
tags: [Arduino]

---

## 馬達種類
| 馬達類型             | 控制方式             | 主要控制參數       | 額外硬體需求                    |
| ---------------- | ---------------- | ------------ | ------------------------- |
| **DC 直流馬達**      | PWM + H-Bridge   | 速度、方向        | L298N / TB6612FNG         |
| **伺服馬達 Servo**   | PWM（脈寬控制）        | 角度或連續旋轉速度    | 無（5V供電即可）                 |
| **步進馬達 Stepper** | 步進控制（Step + Dir） | 位置、速度、加速度    | A4988 / DRV8825 / ULN2003 |
| **無刷馬達 BLDC**    | PWM → ESC 控制     | 油門（Throttle） | ESC 驅動器                   |

## 直流馬達的原理

### 直流馬達的原理

直流馬達是靠電流產生磁力讓它轉動的。
當電流流過線圈，線圈會變成一個電磁鐵，
與旁邊的永久磁鐵互相吸引、排斥，於是線圈就被推著轉起來。

💡 比喻：
想像有人在推盪鞦韆——每推一下，就給它一次「電流的力氣」，
鞦韆（馬達）就會持續擺動（旋轉）。

這就是電能轉換成機械能的過程。
![image](https://hackmd.io/_uploads/H1L8LfggZg.png)
電流馬達關係
![image](https://hackmd.io/_uploads/rJQxsMlxZe.png)


因此我們透過正負極互換方向可以決定馬達轉動的方向

### 反電動勢（Back EMF）

當馬達轉動起來後，線圈其實也在磁場中切割磁力線，
這會依照法拉第電磁感應定律，在導線中感應出一個電壓。
這個感應電壓的方向剛好和原本的供電電壓相反，
所以叫做「反電動勢」。

💡 比喻：
想像你在推鞦韆時，鞦韆越盪越高，
當你再推時，它反而會「反推」你的手一下。
那股反推的力量就像馬達裡的「反電動勢」。

### 反電動勢對晶片影響

降低流過馬達的電流（穩定轉速）；
當馬達突然停下或改變方向時，產生瞬間高電壓脈衝；
如果沒保護電路，這高電壓會反衝回控制板，把晶片燒掉。
![image](https://hackmd.io/_uploads/HJ5RazexZx.png)

### 馬達擴充版
因為：
控制板的腳位輸出電流很小（只有幾十毫安），馬達需要好幾百毫安；
馬達在轉動時會產生反電動勢，可能瞬間衝回板子。
所以我們要用馬達驅動擴充版，
它就像是一個「中間防護員」，幫忙放大電流並擋下反衝的高壓。

💡 比喻：
Arduino 就像「指揮官」：只會下命令。
馬達驅動板是「肌肉」：幫忙出力。
同時還幫指揮官擋掉馬達反打回來的力（反電動勢）。

### 繼電器
繼電器是一種利用小電流控制大電流的裝置，利用磁吸通電後產生磁場，將大電流的開關連通，不通電後，磁場消失，開關自動斷開，讓Arduino電流不用直接控制馬達和電源。

![image](https://hackmd.io/_uploads/S1Za1GRAee.png)
可以通過繼電器進行直接驅動
![image](https://hackmd.io/_uploads/HyCAVMCRge.png)
通過腳位給予正負極訊號控制開關，通電產生磁場吸引隔壁的馬達開關
讓馬達與電池迴路接通，形成最原始的開關

繼電器原理示意圖
![image](https://hackmd.io/_uploads/rybDX0MZ-l.png)
![image](https://hackmd.io/_uploads/HJxRm0z-bl.png)



接線圖
![image](https://hackmd.io/_uploads/HkABsYelWx.png)
與Arduino連接
![image](https://hackmd.io/_uploads/H1w6oYxxbg.png)
接線完成後 可以撰寫程式控制馬達開與關，也不用擔心電流會回沖Arduino
```CpP=
void setup() {
  // put your setup code here, to run once:
pinMode(8,OUTPUT);
pinMode(7,INPUT_PULLUP);

}

void loop() {
  // put your main code here, to run repeatedly:
if(digitalRead(7)==0) #7號腳位按著按鈕 
{
digitalWrite(8,HIGH); #8號腳位給高電位 打開繼電器
delay(100);
}
digitalWrite(8,LOW);  #放開按鈕 關閉繼電器
}
```


### 馬達擴充版
市面上有許多的馬達擴充版

L289N 
![image](https://hackmd.io/_uploads/SyiHgmgg-l.png)

L289P
![image](https://hackmd.io/_uploads/rJxwHYbxbe.png)

L9110S
![image](https://hackmd.io/_uploads/BJC9e8FlWx.png)


個人覺得以直流馬達來說的話L9110S最便宜且小巧方便
不用複雜接線 可以使用!

不過使用L9110S 需要注意幾點
腳位有分為1-A 1-B 2-A 2-B 
其中的B的位置必須要接在PWM腳位，使其使用PWM作為控制，控制速度

接線
VCC 連接外接電源的正極
GND 與Arduino和電源線共地
IA1 連接到Arduino腳位 範例是腳位8
IB1 連接到Arduino的PWM腳位 範例是腳位9
剩下連接至馬達1 
完成接線後就可以開始寫程式控制馬達的速度了
![image](https://hackmd.io/_uploads/Hy57DLFlZx.png)
![image](https://hackmd.io/_uploads/Sy-cwIFgWx.png)
![image](https://hackmd.io/_uploads/SJkov8Yl-x.png)




### 定速控制
範例程式
```Cpp=
int IA = 8;   // 控制 A-IA
int IB = 9;   // 控制 A-IB

void setup()
{
  pinMode(IA, OUTPUT);
  pinMode(IB, OUTPUT);
}

void loop()
{
  // 馬達正轉
  digitalWrite(IA, HIGH);
  digitalWrite(IB, LOW);
  delay(2000);

  // 停止
  digitalWrite(IA, LOW);
  digitalWrite(IB, LOW);
  delay(1000);

  // 馬達反轉
  digitalWrite(IA, LOW);
  digitalWrite(IB, HIGH);
  delay(2000);

  // 停止
  digitalWrite(IA, LOW);
  digitalWrite(IB, LOW);
  delay(1000);
}

```
### PWM控制
接下來使用PWM控制
```Cpp=
int IA = 9;   // PWM：速度
int IB = 8;   // 方向

void setup()
{
  pinMode(IA, OUTPUT);
  pinMode(IB, OUTPUT);
}

void loop()
{
  // ======== 正轉 ========
  digitalWrite(IB, LOW);   // 正轉方向
  analogWrite(IA, 80);     // 慢速
  delay(1500);

  analogWrite(IA, 150);    // 中速
  delay(1500);

  analogWrite(IA, 255);    // 全速
  delay(1500);

  analogWrite(IA, 0);      // 停
  delay(1000);

  // ======== 反轉 ========
  digitalWrite(IB, HIGH);  // 反轉方向
  analogWrite(IA, 80);     // 慢速
  delay(1500);

  analogWrite(IA, 150);    // 中速
  delay(1500);

  analogWrite(IA, 255);    // 全速
  delay(1500);

  analogWrite(IA, 0);      // 停
  delay(1500);
}
```
### 自走車
有了左右馬達控制後，我們就可以做出自走車或船了

```Cpp=
// 左馬達
int L_dir = 8;    // 方向
int L_pwm = 9;    // 速度 (PWM)

// 右馬達
int R_dir = 10;   // 方向
int R_pwm = 11;   // 速度 (PWM)

void setup()
{
  pinMode(L_dir, OUTPUT);
  pinMode(L_pwm, OUTPUT);
  pinMode(R_dir, OUTPUT);
  pinMode(R_pwm, OUTPUT);
}

void loop()
{
  // ===== 前進 =====
  digitalWrite(L_dir, LOW);     // 正轉
  digitalWrite(R_dir, LOW);     // 正轉

  analogWrite(L_pwm, 200);      // 左輪速度
  analogWrite(R_pwm, 200);      // 右輪速度
  delay(2000);                  // 前進 2 秒

  // ===== 左轉 =====
  digitalWrite(L_dir, HIGH);    // 左馬達反轉
  digitalWrite(R_dir, LOW);     // 右馬達正轉

  analogWrite(L_pwm, 180);      // 左輪速度
  analogWrite(R_pwm, 180);      // 右輪速度
  delay(1000);                  // 左轉 1 秒

  // ===== 停止 =====
  analogWrite(L_pwm, 0);
  analogWrite(R_pwm, 0);
  delay(2000);
}

```

第一課 arduino認識數位信號與開關
https://hackmd.io/@godgods/SkaUwHi6xe
第二課 arduino認識類比信號與讀取與寫入
https://hackmd.io/@godgods/SJbpxvn0gg
第三課 arduino LCD函式控制
https://hackmd.io/@godgods/ryxXL7skWe
第四課 arduion 小電控制大電繼電器與馬達擴充版
https://hackmd.io/@godgods/HJllN2n0xg








