## 馬達種類
| 馬達類型 | 控制方式 | 主要控制參數 | 額外硬體需求 |
| ---------------- | ---------------- | ------------ | ------------------------- |
| **DC 直流馬達** | PWM + H-Bridge | 速度、方向 | L298N / TB6612FNG |
| **伺服馬達 Servo** | PWM(脈寬控制) | 角度或連續旋轉速度 | 無(5V供電即可) |
| **步進馬達 Stepper** | 步進控制(Step + Dir) | 位置、速度、加速度 | A4988 / DRV8825 / ULN2003 |
| **無刷馬達 BLDC** | PWM → ESC 控制 | 油門(Throttle) | ESC 驅動器 |
## 直流馬達的原理
### 直流馬達的原理
直流馬達是靠電流產生磁力讓它轉動的。
當電流流過線圈,線圈會變成一個電磁鐵,
與旁邊的永久磁鐵互相吸引、排斥,於是線圈就被推著轉起來。
💡 比喻:
想像有人在推盪鞦韆——每推一下,就給它一次「電流的力氣」,
鞦韆(馬達)就會持續擺動(旋轉)。
這就是電能轉換成機械能的過程。

電流馬達關係

因此我們透過正負極互換方向可以決定馬達轉動的方向
### 反電動勢(Back EMF)
當馬達轉動起來後,線圈其實也在磁場中切割磁力線,
這會依照法拉第電磁感應定律,在導線中感應出一個電壓。
這個感應電壓的方向剛好和原本的供電電壓相反,
所以叫做「反電動勢」。
💡 比喻:
想像你在推鞦韆時,鞦韆越盪越高,
當你再推時,它反而會「反推」你的手一下。
那股反推的力量就像馬達裡的「反電動勢」。
### 反電動勢對晶片影響
降低流過馬達的電流(穩定轉速);
當馬達突然停下或改變方向時,產生瞬間高電壓脈衝;
如果沒保護電路,這高電壓會反衝回控制板,把晶片燒掉。

### 馬達擴充版
因為:
控制板的腳位輸出電流很小(只有幾十毫安),馬達需要好幾百毫安;
馬達在轉動時會產生反電動勢,可能瞬間衝回板子。
所以我們要用馬達驅動擴充版,
它就像是一個「中間防護員」,幫忙放大電流並擋下反衝的高壓。
💡 比喻:
Arduino 就像「指揮官」:只會下命令。
馬達驅動板是「肌肉」:幫忙出力。
同時還幫指揮官擋掉馬達反打回來的力(反電動勢)。
### 繼電器
繼電器是一種利用小電流控制大電流的裝置,利用磁吸通電後產生磁場,將大電流的開關連通,不通電後,磁場消失,開關自動斷開,讓Arduino電流不用直接控制馬達和電源。

可以通過繼電器進行直接驅動

通過腳位給予正負極訊號控制開關,通電產生磁場吸引隔壁的馬達開關
讓馬達與電池迴路接通,形成最原始的開關
繼電器原理示意圖


接線圖

與Arduino連接

接線完成後 可以撰寫程式控制馬達開與關,也不用擔心電流會回沖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

L289P

L9110S

個人覺得以直流馬達來說的話L9110S最便宜且小巧方便
不用複雜接線 可以使用!
不過使用L9110S 需要注意幾點
腳位有分為1-A 1-B 2-A 2-B
其中的B的位置必須要接在PWM腳位,使其使用PWM作為控制,控制速度
接線
VCC 連接外接電源的正極
GND 與Arduino和電源線共地
IA1 連接到Arduino腳位 範例是腳位8
IB1 連接到Arduino的PWM腳位 範例是腳位9
剩下連接至馬達1
完成接線後就可以開始寫程式控制馬達的速度了



### 定速控制
範例程式
```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