HC-05藍牙模組補充說明(五):透過藍牙上傳Arduino程式碼

最近參考了Make雜誌的「自製Arduino藍牙程式編寫擴充板」文章,簡化電路之後,組裝一個藍牙無線上傳Arduino程式碼的電路板,並且用行動電源供電。假如你製作一個Arduino藍牙遙控車,需要經常修改、上傳程式碼,那麼,藍牙上傳程式碼很便利;但大多數情況,其實USB連線也很好用 :-P

採用行動電源供電,藍牙上傳Arduino程式的模組。

實驗材料:

  • HC-05序列模組,一個。
  • 1KΩ~4.7KΩ電阻,一個。
  • 1μF~10μF電容,一個。
  • (選擇性的)Arduino原型擴充板,一片。

實驗電路:

本單元電路將取代Arduino的USB有線序列埠,因此HC-05模組接在Arduino的數位0與1腳

藍牙上傳Arduino程式的電路圖

電路說明:

Arduino編輯器在上傳(燒寫)程式之前,會先重置(reset)Arduino板,接著以115200bps57600bps鮑率傳遞程式碼。只要序列埠的電路符合這兩個條件,就能上傳程式碼。

若把Arduino微控器的Reset腳接低電位,它將會重置。因此,Arduino控制板預設把Reset腳透過10KΩ電阻連接到高電位。

透過電容自動重置Arduino控制板

若在Reset腳銜接一個1μF電容再接地,Arduino一開始將會處於「重置」狀態,經過約10ms之後,Arduino才會開始運作(註:電容充滿約70%所需的時間為一個時間常數τ,也就是R×C,10KΩ×1μF=10ms)。

HC-05藍牙序列模組具有可程式化輸出∕輸入(Programmable I/O)介面,並可透過AT命令設置介面的工作模式。如果能在藍牙模組開始連線時,讓它的某個接腳輸出低電位,連接到1μF電容,即可重置Arduino控制板。

設定HC-05藍牙序列通訊模組的AT命令

HC-05模組正好有個AT+POLAR命令,它原本的作用是切換連接在模組PIO9與PIO8(實際對應到32和33腳)的LED狀態燈訊號。如果對HC-05下達此AT命令:

AT+POLAR=1,0

可令HC-05在藍牙連線成功時,於PIO9(模組的32腳)輸出低電位(註:這道命令的第一個參數1,代表「當PIO8輸出高電位時,點亮LED」,第二個參數0代表「連線成功時,PIO9腳輸出低電位」)。

HC-05藍牙模組的PIO9接腳

我購買的HC-05模組的PIO9腳,連接到標示為STATE的接腳,因此不需要額外焊接;否則,請自行焊一條連接PIO9(32腳)與電容負極的導線。接下來,只要將藍牙模組的傳輸速率改成底下的數值即可:

  • 115200bps:用於連接UNO板。
  • 57600bps:連接Duemilanove、自製的Arduino、Leonardo…等控制板。

若要查閱上傳程式碼的傳輸速率,可開啟Arduino軟體安裝資料夾, “hardware\arduino\avr”路徑裡的boards.txt檔。這個文字檔包含Arduino控制板的燒錄參數,查閱“speed”,即可找到上傳程式碼的速率:

從boards.txt檔查詢Arduino燒錄的傳輸速率

請依照「HC-05與HC-06藍牙模組補充說明(三):使用Arduino設定AT命令」或「執行AT命令(AT-command)修改藍牙模組的資料傳輸速率」說明,進入HC-05模組的AT命令模式,並依序輸入下列AT命令(井號以及後面的文字是註解,請勿輸入):

設定AT命令後,再將此HC-05藍牙模組依照上文的電路接好。

實際測試藍牙上傳Arduino程式碼

先讓電腦與藍牙模組配對,並確認其通訊埠號(COM編號)之後,再開啟Arduino(我用行動電源接電給Arduino)。接著就和往常一樣,選擇連接到電腦的藍牙序列埠(在我的電腦上是COM13),即可上傳程式碼。

選擇藍牙COM埠

藍牙上傳程式所需時間,跟使用USB連線差不多;若出現如下的錯誤訊息,請確認COM埠編號是否正確

avrdude: ser_open(): can’t open device “\\.\COM13”: 信號等待逾時。

若耗時過久,並且出現底下的錯誤訊息,請確認HC-05模組設置的傳輸速率是否正確

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x74

非正廠Arduino UNO控制板的問題

我在三個不同的Arduino控制板測試藍牙上傳程式碼的電路:

  • 義大利原裝Arduino UNO:成功
  • 非原廠(中國製)Arduino UNO:失敗!
  • 非原廠(中國製)Arduino Duemilanove:成功(傳輸率:57600bps)

在副廠UNO板子上未能成功,我反覆檢查接線、使用不同傳輸速率,就是無法順利上傳程式碼。所以,如果用本文的方法無法上傳程式碼…請更換Arduino板。

這是原廠和副廠UNO板的正面外觀(下方副廠),副廠的顏色比較深、Arduino商標字體比較模糊、腳位編號字體也不同,但它們都標示“Made in Italy” :-P 詳細的分辨方式,請參閱Arduino官網的“How to spot a counterfeit Arduino”。

原廠和盜版的Arduino板比較

使用「原型實驗擴充板」製作藍牙上傳程式模組

我買了一個「原型實驗擴充板」空板,它的數位0腳外側多了用於連接藍牙模組的6個接點,其TXD和RXD接點分別與數位0和1腳直接相連,正好符合本文的電路需求。

我用美工刀切斷原本連接藍牙RXD和數位1腳的接線

Arduino原型實驗擴充板

在它們之間焊接一個2.2KΩ(紅紅紅)電阻:

焊接電阻

然後在藍牙STATE(PIO9)腳與Arduino的RESET接腳之間,焊接一個電解電容:

焊接電容

我手邊的1μF電容耐壓50V,體積比較大;實際焊接的是10μF電容

測試藍牙開關LED程式碼

同樣以開、關數位13腳的LED為例,請上傳底下的程式碼:

上傳之後,使用Arduino的序列埠監控視窗,或者其他序列通訊程式(如:AccessPort),連線到藍牙模組的COM埠,傳入‘1’或‘0’,即可開或關LED。

37 thoughts on “HC-05藍牙模組補充說明(五):透過藍牙上傳Arduino程式碼

  1. 趙老師好久不見,最近在研究寫android APP,很興奮發覺了用adobe flash CS5以上版本都可開發,用flash做APP覺得自己比較上手,畢竟flash程式語言都是在老師書籍上學習而來,最近在研究Android結合Arduino做影像辨識玩具小車,網蒐發現openCV這強大的影像辨識庫,但是找遍網路資料找不到adobe AIR有支援openCV,特來求助老師哪裡能找到有關這方面的教學?

  2. 老師你好,想請問如果想用電腦上接受到的藍牙訊號去控制裝置的輸出電壓,用arduino來轉換是可行的嗎?再請教一個問題,arduino上的和電腦的usb連接槽是可以作為類比訊號的輸入端嗎?

    1. 1. 可行
      2. USB是數位訊號,類比訊號可以透過Arduino轉成數位之後,再透過USB傳給電腦。

      thanks,
      jeffrey

  3. 老師您好
    請問您在文中所說:hc-05若無焊接針腳則,請自行焊一條連接PIO9(32腳)與電容負極的導線。
    我手邊有一個hc-06的四腳藍芽模組,請問hc-06也是以相同方式焊接嗎?請問為什麼要與電容負極焊接呢?
    希望老師能回覆我的問題,謝謝

    1. hi hsinTing:

      本文的方法只適用於HC-05模組,與電容負極焊接,請參閱上文的「電路說明」,當HC-05輸出低電位,將讓電容開始充電。

      thanks,
      jeffrey

  4. 感謝您的回應 :) 在此想另外請教一件事,請問HC-06的藍芽有方法可以得知是否配對嗎?
    因為在arduino的程式中BTSerial.avaliable()似乎是得知是否接收到訊息,而非表示是否配對,所以想請問您HC-06是否有腳位以及functino可以得知有無配對的情況。
    希望您能回覆我的問題,謝謝。

    1. 沒有這種指令,不過,藍牙模組上面有個代表配對狀態的LED,你可以觀察它的閃爍情況。若快速閃爍,代表沒有連線。

      有些藍牙模組把連線狀態腳位接出來(叫做state),你可以嘗試用程式判讀與計數閃爍的頻率,得知該模組是否處於連線狀態。

      thanks,
      jeffrey

    1. hi jason:

      並不是讓程式靜止,而是讓它持續偵測是否有訊號輸入(如:藍牙序列資料),再決定下一個動作。詳細請參閱第十四章「手機藍牙遙控機器人製作」說明。

      thanks,
      jeffrey

  5. 老師您好:
    所以其他Arduino板子可以按照此方式試試看囉!剛剛試著使用HC-05藍芽模組用在(非原廠)UNO上面是無法使用!感謝老師提出藍芽無線上傳程式碼方案!
    謝謝!這在8051時候想過!怎麼沒有無線方式燒入到單晶片!!

  6. 你好,
    我的也是非原廠的UNO,
    當使用藍牙上傳時也遇到avrdude: stk500_recv(): programmer is not responding,看來也沒辦法了吧?
    不過網路找了很久,就是你的教程比較詳細,
    繼續學習

  7. 趙老師,你好,我按照你的教程,但是最後IDE都會出來錯誤訊息如下,但是我確認過可以上傳程式,而且Nano執行功能看起來沒問題,我Rx用1K歐姆跟10K歐姆,Reset用10μF電容(手頭上沒有1μF),可以請教這可能是什麼問題嗎? 這會有後遺症嗎?

    avrdude: stk500_paged_load(): (a) protocol error, expect=0x10, resp=0x94
    avrdude: stk500_cmd(): programmer is out of sync
    上傳到板子時發生問題。可行建議請見http://www.arduino.cc/en/Guide/Troubleshooting#upload。

  8. 你好!
    目前使用hc-05、原廠micro板和彎曲感測器來做滑鼠移動
    我目前遇到的問題在於使用usb連接電腦燒錄,滑鼠移動一切正常,
    但換成無線傳輸時卻無法動作;COM的位子也有調整到HC-05的COM位,打開序列埠視窗也無法動作,
    我的程式如下:
    #include
    const int flex_pin = A4;
    int responseDelay = 1000;
    void setup()
    {
    pinMode(flex_pin,INPUT);
    Mouse.begin();
    Mouse.move(512,512, 0);
    }
    void loop()
    {
    if (410 < analogRead(flex_pin)&&analogRead(flex_pin)<560)
    {
    Mouse.move(( 568- analogRead(flex_pin)) / 10,0 , 0);
    }
    else if(575<analogRead(flex_pin)&&analogRead(flex_pin)<600)
    {
    Mouse.move(( 568- analogRead(flex_pin)) / 10,0 , 0);
    }

    }
    請問是否為程式問題還是設定上有甚麼需要改進或增加的呢?

    1. hi daze:

      問題不在程式,而是在HC-05「序列通訊」藍牙模組身上。

      藍牙有不同的規範(profile),例如:序列通訊(SPP)、人機介面(HID)、立體音訊(A2DP)…等等。

      要製作藍牙滑鼠、鍵盤、搖桿等週邊,你需要採用支援HID規範的藍牙模組,其實有些SPP和HID規範的藍牙晶片是一樣的,只是廠商在出貨之前,事先替它們燒寫不同的韌體。總之,你需要更換藍牙模組。

      have fun!
      jeffrey

  9. 老師你好,我直接燒寫了您的測試藍牙開關LED程式碼,HC-05 TX-ArduinoRX, RX-Arduino TX 在串口監視器輸入0和1並沒有反應 但是拔掉了HC-05的TX RX 再輸入0 1又有反應了,这是藍牙的问题吗?还是Arduino板的问题

    1. 呃…這在邏輯上有點說不通…你電腦上的通訊軟件,有選擇成藍牙串口的埠號嗎?

      thanks,
      jeffrey

  10. 老師您好!請問leonardo的板子可以燒寫嗎?因爲leonardo是USB(CDC)通信;對于引腳0和1上的TTL串口,使用Serial1類。然後我用USB轉串口進行燒寫代碼也遇到錯誤。特求老師指點。

    1. 可以,但我沒試過,主要是序列通訊速率不一樣。採用ATmega32U4的控制板在接收程式檔案時的速率是57600,因此藍牙序列埠的鮑率須設置成57600, 也就是執行 AT+UART=57600,0,0。

      詳細步驟可參考這個老外的說明,他把控制板的Bootloader換成比較精簡的Optiboot,以便透過序列埠而非預設的USB接收程式檔。

      thanks,
      jeffrey

  11. 老師你好
    想請問我是用HC-05藍芽模組+加上ARDUINO UNO面板 要在LabVIEW上透過藍芽的方式做COM的連接
    在程式上有看到COM可是執行錯誤卻說沒連接到(一個簡單的LED ON/OFF開關程式),想問老師 是否還需要在Arduino上編譯程式嗎?如果需要大概要怎麼編寫

    1. 我沒用過LabView,建議先用電腦或智慧型手機的序列通訊程式,直接和Arduino藍牙連接測試,看看是否能收發訊息。

      thanks,
      jeffrey

  12. 想請問一下是否HC-08也可以這麼做,因為目前是使用低功耗藍芽為主,所以想使用HC-08來當作藍芽模組
    不知道可程式化I/O跟命令回應模式的pin角該如何知道是哪個

    1. 可以,有一款結合Bluetooth 4.0和Arduino Uno的產品,叫做Bluno,支援低功耗藍牙上傳程式檔的功能,但我沒試過。或許你可以參考這個Bluno簡介網頁裡的電路圖,嘗試接線看看。

      thanks,
      jeffrey

    1. 不同廠商的藍牙晶片韌體版本和指令語法可能不一樣,所以實際要以廠商提供的技術文件為主。

      thanks,
      jeffrey

    1. 抱歉,我跟VS2012 C++完全不熟。你可以找尋C++與序列埠通訊的相關程式,搞懂流程,跟Arduino通訊就簡單了。

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *