[教學]arduino藍芽遙控車,改造履帶玩具車。

arduino藍芽遙控車

本篇文章會分享改造履帶玩具車,以及手機透過藍芽控制馬達,達到遙控車子的目的。

本篇著重在馬達控制手機app製作

藍芽連線的部分可以參考→Arduino 藍芽控制LED,App inventor簡易教學。

材料

材料名稱蝦皮連結
1.【傑森創工】透明電池盒 有蓋子 本賣場為4節 內建開關 電線已接好 外型搶眼 可放入3號電池 AA
2.【傑森創工】Arduino Uno R3 開發板 原廠晶片 *限時特惠 附USB線
3.【傑森創工】Arduino HC-06 藍牙模組 帶底板 Bluetooth RS232 Module
4.【傑森創工】杜邦線 公對母 20cm 10條 12股銅絲含膠殼 彩色線 (整排40條4單位) Arduino 專用
5.【傑森創工】9V 電池扣 帶DC公頭 孔徑5.5×2.1mm Arduino 可用
6. 木板
7. 履帶底盤車(田宮模型)
8.【傑森創工】L298N DC馬達驅動模組 直流馬達 Arduino 智慧小車

履帶玩具車

車體簡介

田宮履帶底盤車,由一片木板底座、輪子、履帶、2個齒輪箱、2個馬達組成。(上圖的3個木塊及L298N為後來加裝)

透過控制兩個馬達帶動輪子,在傳動到履帶上,使車體前進。

若兩個馬達有速差,就能產生轉彎,故我們要能夠個別控制兩個馬達的速度及方向。

這時我們會需要用到L298N這個模組來控制馬達。


L298N是什麼?

L298N可以透過IN1,IN2,IN3,IN4來控制輸出電流方向,進而達到控制馬達方向。

ENA,ENB則是使用PWM訊號控制馬達速度。

L298N提供12V的電源輸入,用來推動馬達。


控制馬達

狀態IN1IN2
馬達A正轉HIGHLOW
反轉LOWHIGH
停止LOWLOW
狀態IN3IN4
馬達B正轉HIGHLOW
反轉LOWHIGH
停止LOWLOW

電路連接

電路連接圖
初步測試(俯視)
初步測試(側面)

初步測試時,接1組電池盒作為馬達電源,行動電源來提供arduino電源。

接一組電池盒只會有6V的電源,除了馬達跑較慢之外,當電壓掉到6V以下,L298N就會無法正常運作,馬達就會無法轉動,所以之後還是改為串聯兩組電池盒(12V)。


黏上開關跟電池盒-1
黏上開關跟電池盒-2
最後完成版實際狀況

初步測試成功後,接著將2個電池盒串聯並焊接開關。

另外使用9V電池來當作Arduino電源。

電路完成後,就可以蓋上上蓋了。

蓋上車蓋(正面)
蓋上車蓋(背面)

延伸閱讀: 三用電錶使用教學,檢查電路必備工具!!

程式

這邊手機遙控app主要說明2個功能: 1.方向控制 2.速度控制

藍芽連線的部分請參考→ Arduino 藍芽控制LED,App inventor簡易教學。

手機遙控APP製作

手機介面

1.Button: 用來作為方向控制按鈕。

2.ListPicker: 藍芽連接選單。

3.Slider: 用於調整速度的滑桿,數值範圍設定0~255。

4.TextBox: 顯示速度數值。

5.記得建立藍芽功能。

6.建立方格佈置,可以將按鈕或其他元件放入。

7.設定方格的行跟列的數量,這裡是設定3×3。

程式積木

1.初始化按鈕,為了避免誤觸,所以一開始要先關閉按鈕。

2.藍芽選單。

3.藍芽連線,確認連線成功後啟用按鈕。

4. 關閉藍芽連線,並將按鈕禁用。

5. 當Forward按鈕被按下,會執行藍芽傳送字元F,其他方向按鈕以此類推。

6. 當滑桿被拉動時執行下列動作。

7.藍芽傳送v,用意是告訴arduino之後要傳送數度數值。

8.將滑桿的數值轉成整數,並顯示在TextBox1上。

9.傳送速度數值到arduino。

10.傳送e告訴arduino結束速度數值傳送。

arduino程式

#include <SoftwareSerial.h>
#include <Wire.h>

//輸出到L298N的腳位
#define MT_L 9  //ENA
#define IN1 8
#define IN2 7

#define IN3 5
#define IN4 4
#define MT_R 3  //ENB

char Car_status;
int Speed_value=150;

SoftwareSerial BT(10,11);
//定義Arduino PIN10及PIN11分別為RX及TX腳

void setup() {
  pinMode(MT_L,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  pinMode(MT_R,OUTPUT);

  BT.begin(9600); // 設定和 HC-06 通訊的速度 (預設 9600)
  Serial.begin(9600); 

}

void loop() {
//當Serial有資料傳輸時,會將讀取到的字元存到Car_status。
  if(Serial.available() == true){   
    Car_status = Serial.read();  
  }
  
//當藍芽有資料傳輸時,會將讀取到的字元存到Car_status。
  if (BT.available()){      
    Car_status =BT.read();  
    Serial.println(Car_status);  
  }
  
//依照Car_status的字元來選擇車子方向控制
 switch(Car_status){   
  case 'F':
    Forward();
    Serial.println("Forward");
    Car_status='N';
    break;
  case 'B':
    Backward();
    Serial.println("Backward");
    Car_status='N';
    break;
  case 'R':
    TurnRight();
    Serial.println("TurnRight");
    Car_status='N';
    break;
  case 'L':
    TurnLeft();
    Serial.println("TurnLeft");
    Car_status='N';
    break;
  case 'S':
    Stop();
    Serial.println("Stop");
    Car_status='N';
    break;
  case 'v':
    Speed_value=0; //先將速度歸0
    do{
      if (BT.available()){
        Car_status =BT.read();  //讀取藍芽傳送字元
        Serial.println(Car_status); 
        //當藍芽讀取到字元'e'時,就會跳出迴圈。
        if( Car_status=='e'){        
          Serial.println(Speed_value);
          break;
        }         
        else
        //將傳送來的速度數值字元轉成整數。
        Speed_value=10*Speed_value+(Car_status-48); 
      }
    }while(true);      
  }
}

//下面是停止、前進、後退、左轉、右轉的函式。
void Stop() 
{
  analogWrite(MT_L,0);
  analogWrite(MT_R,0);
}

void Forward()
{
   digitalWrite(IN1,HIGH);
   digitalWrite(IN2,LOW);
   digitalWrite(IN3,LOW);
   digitalWrite(IN4,HIGH);  
   analogWrite(MT_R,Speed_value);
   analogWrite(MT_L,Speed_value); 
}
void Backward()
{
   digitalWrite(IN1,LOW);
   digitalWrite(IN2,HIGH);
   digitalWrite(IN3,HIGH);
   digitalWrite(IN4,LOW);  
   analogWrite(MT_R,Speed_value);
   analogWrite(MT_L,Speed_value); 
}
void TurnRight()
{
   digitalWrite(IN1,HIGH);
   digitalWrite(IN2,LOW);
   digitalWrite(IN3,LOW);
   digitalWrite(IN4,HIGH);  
   analogWrite(MT_L,0);
   analogWrite(MT_R,Speed_value);   
}
void TurnLeft()
{
   digitalWrite(IN1,HIGH);
   digitalWrite(IN2,LOW);
   digitalWrite(IN3,LOW);
   digitalWrite(IN4,HIGH);  
   analogWrite(MT_L,Speed_value);
   analogWrite(MT_R,0);   
}

下面稍微解說速度傳送的流程:

速度控制: 手機與arduino之間傳送的流程

補充說明: char ‘1’ = int 49,是根據ASCII碼。

可參考→→維基百科 ASCII

小結論

實際上在控制速度時,速度快慢其實沒差很多。😂😂😂

高速下比較沒問題,但是將速度調低時,會發現左右馬達開始有速差,

應該是電壓不足導致。

操作影片

在〈[教學]arduino藍芽遙控車,改造履帶玩具車。〉中有 67 則留言

  1. 新手發問 回覆

    能否請教您:
    依照您的分享試做了一次,藍芽連線成功,但車子沒反應,可能問題出在哪裡?
    L298N是什麼在和arduino 的接線上需要特別注意哪些地方?
    感恩~

    • Derek Wu 文章作者回覆

      如果l298n上的紅燈沒亮,可以檢查看看l298n上的jumper是否有插上。

      • 新人 回覆

        l298n上的jumper有插上。有確認和你分享的接線位置。
        看了序列埠上的跳出了”反問號”
        不知道是代表什麼意思?

        • Derek Wu 文章作者回覆

          反問號有可能是鮑率設定不正確出現的亂碼,
          確認看看序列埠鮑率設定是否為9600。
          序列埠鮑率說明可參考下面連結:
          https://www.lazytomatolab.com/as-11/

          我覺得也可以先試做看看這篇
          https://crazymaker.com.tw/arduino-bluetooth-control-led/
          藍芽控制LED開關,因為藍芽傳輸的邏輯一樣,如果這個有成功,那控制遙控車的部分應該也不太會有問題。

          如果說做到監視序列埠可以看到正確的訊息,就可以排除藍芽訊號傳輸的問題,再來找控制馬達的部分哪裡出問題。

  2. 新手發問 回覆

    有,L298n的紅燈有亮。
    還是接線上有哪些要注意的。
    是否有其他方式可讓我學習的地方,感恩~

    感謝您的回覆!

    • Derek Wu 文章作者回覆

      如果是我的話,可能會試看看以下:
      1. 檢查杜邦現有無斷路,
      2. 量測進去l298n的電源是否有在6V以上,最好是7V~12V
      3. 將arduino 連接電腦,並開啟序列埠監控視窗,例如: 手機按前進時,因為有Serial.println(“Forward”); 視窗應該會顯示Forward,若沒顯示,可能程式有地方出現問題。
      4. 確認l298n所有對應ardunio的接腳
      5. 量測看看ENA,IN1, IN2, IN3, IN4, ENB電壓動作是否是正確的

      這邊我有再驗證過網頁上的程式,應該是沒有問題的。

  3. 肌肉毛毛 回覆

    好帥喔~~~~~我是初學者
    現在只做出一個按按鈕顯示Hello Word的APP(哭阿哈哈哈
    你讓我燃起鬥志了
    不過我用的是HM-10藍牙模組
    這個模組不能直接用手機藍牙配對
    要用APP去連
    不知道能不能用APP Iventor做出來的APP連上
    一開始光手機要連上HM-10就花了我半條命了
    有在考慮要不要再買一塊HC-05或HC-06來玩會比較輕鬆
    可惡~學生真的好窮阿阿阿阿
    如果有阿姨就好了
    阿姨好~阿姨妙~阿姨口袋都鈔票
    下面是小弟用HM-10做的小作品
    希望可以跟你蕉流蕉流
    https://www.youtube.com/watch?v=Fn2UsDw0tmY

    • Derek Wu 文章作者回覆

      其實我也算是初學者,算是邊玩邊學吧。
      我看了你的youtube,我對自動農場蠻有興趣的,
      之後我也會寫土壤濕度感測器的文章,
      然後做一個智慧盆栽來玩看看,有問題再來請教你啦~
      感謝你的支持~~~

  4. 彥彥 回覆

    您好
    想要詢問速度的部分,似乎無法像影片一樣可以遙控,是哪方面需要注意呢?

    • Derek Wu 文章作者回覆

      可以先確認APP部分是否有將拉桿數值轉成整數,
      然後透過arduino監控視窗來看數值是否有確實傳送到arduino,
      如果都沒問題的話,在檢查看看線路,l298n上的ENA電壓是否正常。
      arduino控制速度的腳位是要有PWM輸出功能的,在pin腳號碼旁有”~”這個符號的才能輸出PWM。

  5. JJ 回覆

    請問為什麼我的序列赴監控那裡當收到我的訊號後會顯示反問號?

    • Derek Wu 文章作者回覆

      可以不接ENA、ENB,但要用jump把ENA,ENB的pin跟上面的5V pin接起來,這樣就是固定馬達速度,無法調整速度。

  6. 回覆

    好的感謝, 另外還想問一個問題 我的HC05之前還連接的上 但不知道怎麼了 突然連不上了 想請問一下可能是什麼問題! 謝謝

  7. 初學者 回覆

    請問2個馬達中間的輪軸是不是要切一半,各裝在一個馬達上,都接在同一個輪軸上是不是兩邊輪子轉速都一樣??

  8. 123 回覆

    再裝履帶之前是可以正常動,但裝上履帶好像就帶不動,請問該如何處理。

    • Derek Wu 文章作者回覆

      裝上履帶後,馬達就不動,那之後再把履帶拆下來馬達就又可以繼續動了嗎?
      檢查看看是不是電池快沒電,你這個狀況我也是沒看過哈哈哈

  9. 7777 回覆

    我想問一下 L298N 連接電池扣 用的是什麼線材
    目前我是用裸銅線會有接觸不良的問題,

    • Derek Wu 文章作者回覆

      我其實就用很一般的線材,單芯線應該也可。
      用裸銅線我覺得比較危險的是其他部分接觸到銅線短路。

  10. 123 回覆

    你好 請問,我速度的那一條 如果拉成0,應該要不會轉 但她還是會轉ㄟ,是我的speed_value 值沒丟進去ㄇ
    程式都跟上面一樣.

    • Derek Wu 文章作者回覆

      你可以將arduino先連接電腦,打開序列埠監控視窗,用手機調整速度。按照上面程式,成功傳送的話應該會秀出速度的值,若沒秀出來,應該要檢查一下程式。

      其他要注意的就是arduino連接到L298N上ENA、ENB的腳位要用有’~’符號的,這個才有PWM功能,才可以輸出類比電壓來控制速度。
      PWM可以參考這篇 https://crazymaker.com.tw/arduino-fade-led/

  11. 666 回覆

    可以請問一下我手機遙控APP製作跟arduino的程式,都照上面操作的,arduino板跟藍芽接收器還有L298N的板子都有亮,可是為什麼車子不能運轉,手機的程式會顯示Error 516:Unable to Write:Broken pipe ,麻煩求解謝謝

    • Derek Wu 文章作者回覆

      Error 516:Unable to Write:Broken pipe
      這應該是藍芽通訊有斷開,所以無法寫入資料。

      你的狀況是手機打開app,選擇藍芽後,有連線到,但按前進或其他按鈕,就會跳出516?同時藍芽應該會是斷開的?

      如果是上述的狀況且手機APP跟Arduino的程式都確認過的話。
      我會先檢查電路,我看到有一篇留言是電路連接問題,導致藍芽模組的電被拉掉,然後藍芽連接就斷開了。

      你也可以先試看看用藍芽控制led
      https://crazymaker.com.tw/arduino-bluetooth-control-led/

  12. 666 回覆

    你的狀況是手機打開app,選擇藍芽後,有連線到,但按前進或其他按鈕,就會跳出516?同時藍芽應該會是斷開的?
    對 會顯示這個
    但是我看序列赴監控那裡也是完全空白的

    • Derek Wu 文章作者回覆

      顯示516就代表藍芽已經斷開了,資料傳不過去,序列埠當然也是空白的。
      看你要不要拍接線圖給我看一下?

      你試過藍芽控制led了嗎?
      如果試過藍芽控制led沒問題,那這應該會是線路的問題

  13. 毛毛 回覆

    您好
    想請問馬達和齒輪箱是另外購買的嗎?
    (田宮模型原本附的好像只有一個馬達)
    如果是的話可以請問是在哪裡購買的嗎?謝謝!

    • Derek Wu 文章作者回覆

      當時我是拿我老哥玩剩下的來用,我不確定她是在那裡買的。
      但要用左右獨立馬達才能控制方向,可能可以找看看這種的
      TAMIYA 69912 田宮工作樂 雙馬達左右獨立4速變速箱:
      https://shp.ee/iyeewpf

  14. Andybobo 回覆

    你好 請問你之前有遇過APP右轉鍵和左轉鍵按了車子卻沒反應的問題嗎? 直走跟後退都是正常的

    • Derek Wu 文章作者回覆

      你可以打開Arduino序列埠監控視窗,看看按右轉鍵跟左轉鍵時,是否有出現TurnRight或TurnLeft,這樣可以確認case是不是正確的。
      也可以檢查一下void TurnRight()跟void TurnLeft()裡面的程式是否正確。

      • Brian 回覆

        請問可以搭配play 商店上的一些arduino藍牙遙控車程式使用嗎?我發現指令好像蠻類似的,想請教一下,謝謝

  15. Brian 回覆

    請問可以搭配play 商店上的一些arduino藍牙遙控車程式使用嗎?我發現指令好像蠻類似的,想請教一下,謝謝

  16. Otis 回覆

    您好,不好意思,可以請問每個Case的最後都有 Car_status=’N’;
    是甚麼意思嗎? 好像都沒有看到字元為N 的Case

    • Derek Wu 文章作者回覆

      這是為了每次執行完一次case後,下次不要選擇任何case,才把Car_status=’N’。
      如果是’N’的話,就不會執行任何一個case,直到下次有新的字元傳進來,才會再次選擇。

  17. 桶桶 回覆

    不好意思!請問一下當車子通電時車子會自己左轉,但接上藍芽按停止鈕就會恢復正常,想問可能發生的原因!非常感謝!

    • Derek Wu 文章作者回覆

      車子通電時,可以先用電表量看看L298N上的IN1,2,3,4, ENA,B,看是否一開始就有電壓。
      如果有的話可以在setup中加入Stop(),讓程式一開始就先讓車子停止試看看。

  18. ben 回覆

    可以請問如果我的車體比較大的話 需要用到4個馬達嗎

  19. 林冠丞 回覆

    想請問一下藍芽要連到哪一個 每個都有試過但是沒辦法連線

  20. 林冠丞 回覆

    方便給一下聯繫方式嗎 我的作業期限快到ㄌ,急需救援QQ

  21. 林冠丞 回覆

    方便問一下藍芽要連到哪一個嗎 ? 我每個都連過ㄌ但是都顯示507沒有成功連線 ,方便給您的聯繫方式嗎 作業期限快到ㄌ QQ

    • Derek Wu 文章作者回覆

      想確認一下,你的藍芽模組有確實在運作(紅色led會閃爍)?
      另外可以截圖給我看一下你跳error的訊息以及bt list的畫面嗎?
      外聯繫方式你可以email你的fb到我的信箱derek@crazymaker.com.tw

  22. ABC123 回覆

    你好,我用的是esp32然後在上傳程式測試後L298N會叫請問是甚麼原因

    • Derek Wu 文章作者回覆

      L298N會叫,我是沒有遇過,但感覺應該跟ESP32可能沒關係,檢查看看你的電源是否正常,或者換一塊L298N試試吧

  23. jim 回覆

    請問一下,圖中的底座有兩個馬達但是我在網上找到的只有一個,另一個馬達和變數箱要怎麼用?

    • Derek Wu 文章作者回覆

      如果只有一個馬達跟變速箱,就只能前進跟後退。
      若是要能夠轉向,就一定要買有兩個馬達的。

  24. ahyeah 回覆

    想請問一下我的L298N輸入電壓用三顆3.7V的電池,但是量測輸出電壓只有不到2V,馬達雖然會轉但是慢到連車子都沒辦法動,這樣是L298N板子壞掉嗎

    • Derek Wu 文章作者回覆

      可以先讓ENA、ENB兩隻腳吃5V訊號,看要用ARDUINO給或是跳線到旁邊得5V都可,這兩隻腳是用來調整輸出電壓的,5V是100%輸出。
      不行的話就換另一個L298N試試吧。

  25. 銘銘 回覆

    不好意思,我可以請教一下為甚麼我的App Inventor沒有when~.beforepicking(準備選擇)亦沒有when~.afterpicking(選擇完成),但我有取得焦點跟失去焦點,想請教是否唯一樣的,感恩!

  26. 銘銘 回覆

    不好意思,我可以請教一下為甚麼我的App Inventor沒有準備選擇跟選擇完成,甘恩!

    • Derek Wu 文章作者回覆

      你前面建立的BT_List是按鈕(button),要改成清單選擇器(ListPicker)

  27. 回覆

    void loop() {
    if(Serial.available() == true){
    Car_status = Serial.read();
    }
    if (BT.available()){
    Car_status =BT.read();
    Serial.println(Car_status);
    }
    switch (Car_status) {
    case ‘1’: // 接收到’1′
    A(); //循跡區塊
    B(); //超音波區塊
    C1(); //RGB光感區塊
    break;
    case ‘2’: // 接收到’2′
    A();
    B();
    C2();
    break;
    case ‘3’: // 接收到’3′
    A();
    B();
    C3();
    break;
    }
    }
    這是我參考你的文章做的 這樣按1似乎只會有循跡功能。
    超音波、RGB光感功能跑不出來 請問有甚麼方法改善??

  28. 栩栩 回覆

    您好,抱歉打擾,我全部都照著做了連結藍芽也有成功arduino編譯跟上傳也都成功,APP INVENTOR到android手機也成功但馬達都不會動,也有八顆電池串連,可以請問一下是哪個步驟出錯了嗎?感激不盡(我打算拿來當作自主學習)

  29. 赤城 回覆

    您好,實際操控的影片中沒有看到車子正在前、後、左、右時調整車速,不知道能不能達到在移動時調整車速的效果?(例如按下前進按鈕後再調整控制車速的滑桿)

  30. 工貝 回覆

    你好 我照著你的方法做了,UNO板有亮 手機也有連到HC05 馬達控制器也有亮,但是馬達就是不會動

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *