## 馬達種類 | 馬達類型 | 控制方式 | 主要控制參數 | 額外硬體需求 | | ---------------- | ---------------- | ------------ | ------------------------- | | **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