# 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的哪裡,或是用文字說明,讓大家比較清楚走線的接法。