# 12周 Arduino控制直流馬達
## 課程進度
這禮拜上課討論了怎麼用控制直流馬達正轉與反轉。課堂所用的模組是L9110S,可以同時控制兩顆馬達,能應用在讓玩具車左轉、右轉、前進與後退。
![](https://i.imgur.com/QtaRpKk.png =40%x)
**基本接法**:
馬達A接上馬達的正極與負極
GND、VCC接上電池或Arduino的直流電源
A-1A 接上數位腳位,控制A馬達轉向(正轉或反轉)
A-1B 接上PWM腳位,控制A馬達轉速
## 課程作業
IR module使用方式:
![](https://i.imgur.com/fmwxC73.png =20%x)
接線圖
![](https://i.imgur.com/Nq5lWlZ.jpg)
程式
```
#define A_1A 8 // A_1A控制A馬達的前進(HIGH)、後退(LOW)
#define A_1B 9 // A_1B控制A馬達的速度 0~255 ,LOW表示停止
#define Idle 3
#define Forward 1
#define Backward 2
#define Speed 150 //設定前進速度
#include <IRremote.h>
int RECV_PIN = 13;
int state=3;
void setup() {
pinMode(A_1A,OUTPUT);
pinMode(A_1B,OUTPUT);
digitalWrite(A_1A,LOW);
digitalWrite(A_1B,LOW);
Serial.begin(9600);
IrReceiver.begin(RECV_PIN,ENABLE_LED_FEEDBACK);
}
//車子向前走
void forward(){
digitalWrite(A_1A,HIGH);
analogWrite(A_1B,Speed);
}
void Stop(){
digitalWrite(A_1A,LOW);
analogWrite(A_1B,0);
}
//車子向後走
void backward(){
digitalWrite(A_1A,LOW);
analogWrite(A_1B,Speed);
}
void loop() {
/*
forward();
delay(1000);
Stop();
delay(1000);
backward();
delay(1000);
Stop();
delay(1000);
*/
if (IrReceiver.decode())// Returns 0 if no data ready, 1 if data ready.
{
//int results.value = results;// Results of decoding are stored in result.value
Serial.println(" ");
Serial.print("Code: ");
Serial.println(IrReceiver.decodedIRData.command); //prints the value a a button press
if (IrReceiver.decodedIRData.command==0x0C){
state=Forward;
}
else if (IrReceiver.decodedIRData.command==0x18){
state=Backward;
}
else if (IrReceiver.decodedIRData.command==0x5E){
state=Idle;
}
IrReceiver.resume(); // Restart the ISR state machine and Receive the next value
}
Serial.print("State:");
Serial.println(state);
switch (state){
case(Forward):
forward();
delay(1000);
case(Backward):
backward();
delay(1000);
case(Idle):
Stop();
delay(1000);
}
}
```
實測影片:
(1) IR module 收發信號
{%youtube xJXWgt6nJiY%}
(2) 與馬達連接
{%youtube m3m10ydoEJU%}
實際製作時遇到兩個問題
1. 買水銀電池時需要確定電池的尺寸,不然去賣場買時可能有很多不同厚度、不同大小的電池,遙控器要用CR2025
2. 程式中我用一個有限狀態機來處理車子的狀態,但不知道為什麼,如果只使用IR的話,是能夠切換程式狀態的,可以按按鈕並從State 1 切換到 2、3;但是如果接上馬達後,只要切換到State 2,不知道為什麼IR sensor就會無法接收到正確的信號。(未解決)
## 專題討論結果
1. 老師建議
可以用步進馬達或上次課堂教的伺服馬達來驅動,也可以選擇拆解玩具上類似功能的部位,達到同樣旋轉的效果。老師也鼓勵我們不要做得太複雜,先以最小可行的產品為主。
2. 實作中心小老大建議
或許可以在摸頭的手上裝一個距離sensor,可以感測到頭的位置並利用一個連桿裝置移動手;如果想上網查資料的話,我們應用的場域太過特定了,或許可以多看一些其他人用Arduino做的類似project,說不定能找到類似的機械結構。
## 實作進度討論
本周主要討論實作的細節,目前有決定實作的方向:先做出最基礎的Prototype,利用Arduino驅動直流馬達,轉動摸頭機的手,觸發裝置的方法可以先用按鈕,可執行後再改用ir sensor遙控。直流馬達上只有一根凸出來的轉軸,無法傳輸轉動力矩,可能需要再找看看有沒有能傳動馬達動力的裝置。目前想到可能可以利用廢棄玩具的車子馬達試看看,能不能藉由它的齒輪組做到傳動動力的效果。
## 對於本周簡報的建議
可以附一下圖,說明每條電線要從模組接到Arduino的哪裡,或是用文字說明,讓大家比較清楚走線的接法。