2014年3月30日 星期日

Android : Bluetooth Serial Controller 控制 Arduino

2014年3月30日 星期日
有了藍芽當橋樑,Android 可以說是 Arduino 的最佳伙伴,無線控制,小孩子們覺得「超炫」的!上回自己用 MIT App Inventor 寫的 App 原本的計畫是想設計一個可以由使用者自訂每個按鈕要控制 Arduino 哪個腳位,送出什麼資料。因為自己買的 HC-05 似乎水土不服,玩沒幾下程式就當掉。找了好幾個 Android Apps ,目前只有台中教網中心那個最順暢,寫了一個 Arduino 靭體追蹤它送出的資料有何不同,分析完,好像一樣啊!真好奇台中教網 App 中到底有啥「眉角」?

為了找答案,今天以「bluetooth serial」的關鍵字搜尋,結果找到了「Bluetooth Serial Controller N7」和「Bluetooth Serial Controller」兩個 Apps,玩著玩著,居然玩了二個多小時,滿有趣的程式,它和我當初想設計的東西類似,可以拿來控制 Arduino 吔!順便用 JavaScript 寫了個編碼工具,方便計算 S4A 的Arduino 指令。

為了抓畫面方便,我在 VMWare 中的 Android-x86 安裝了「Bluetooth Serial Controller N7」。 Android-x86 實在太厲害了,電腦的藍芽可以在虛擬機中的 Android-4.4 使用。

啟動 Bluetooth Serial Controller N7 後,我們先來設定一下按鈕的名稱及按下去以後要送出哪些資料給 Arduino。

點選右上角的「PREFERENCE」


先來設定按鈕上的文字,按一下「Name」


點選要設定的按鈕,底下以 Button 2 和 Button 5 為例

準備設定 Button 2 的文字
將 Button 2 的文字設為「Forward」
將 Button 5 的文字設為「STOP」

再來設定按鈕按下去後的功能



先設定要以一般文字還是十六進制(HEX)來顯示(設定)資料

將顯示/設定格式改為十六進制(HEX)

設定按鈕按完以後要送出的資料,底下以 Button 2 和 Button 5 為例:

準備設定按鈕的功能
先點要設定的按鈕啟用它,再點設定值修改
將 Button 2 設為送出「E801」
將 Button 5 設為送出「E800」
上面將 Button 2 設為按完後送出「E801」,在 S4A 中會讓 Arduino 的 pin 13 變成 ON,Arduino 上的 LED 會發亮。而 Button 5 設為按完後送出「E800」,在 S4A 中會讓 Arduino 的 pin 13 變成 OFF,Arduino 上的 LED 會熄滅。

按鈕都設定完,可以按「上一頁」回到「PREFERENCE」的最上層,在右上角有個「BACKUP」,按下去即可選擇儲存或載入設定檔。

按鈕都設定好了,就可以準備藍芽連線測試囉!

按上方選單中的「CONNECT」進入連線選單
點選 Arduino 的藍芽裝置
連線成功,應該會看到 S4A 傳來了一些資料


按一下之前設定好的按鈕,測試一下有沒有送出指令給 Arduino 。


S4A 指令產生器

如果想送資料給安裝 S4A firmware 的 Arduino ,我用 JavaScript 寫了個小工具,只要填入Arduino「腳位編號」及想送出的值,按完「計算」即可以輕鬆的產生該送什麼十六進位的資料。在設定 Bluetooth Serial Controller 按鈕指令時,照著打即可。

Arduino腳位:   設定值:
輸出結果:



例如:我想在按下按鈕 2 (Forward) 時,控制

  • pin 10 = 0 (OFF)
  • pin 11 = 1 (ON)
  • pin 12 = 0 (OFF)
  • pin 13 = 1 (ON)
  • pin 5 = 255
  • pin 6 = 255

依序輸入後,即可產生 Button 2 的「command」應該是:「D000D801E000E801A97FB17F」。

我用這個來控制載有 S4A firmware 的 Arduino ,讓它控制 L293D 上的馬達,科學魔法車會前進。滿有趣的!

測試的結果,「Bluetooth Serial Controller N7」和「Bluetooth Serial Controller」兩個 Apps 使用相同的設定檔,而前者會顯示由藍芽傳來的資料,後者則純粹送出資料而已。按鈕的功能部份,如果設定的不是按完後執行的「STOP COMMAND」,就可以使用「REPEAT」的功能,讓按鈕變成按著「連發」的功能。


相關文章






23 則留言:

  1. 我想請問一下, 如果說我是要Arduino 傳資料給Android 的話,可以怎麼做呢?

    回覆刪除
    回覆
    1. 因為我看很多的資料都是Android傳資料 Arduino去做控制處裡的, 沒有甚麼資料是傳給Android的@@

      刪除
    2. 資料傳輸原本就雙向均可,合用的 Apps 應該不好找,建議您可以用 App Inventor 自己寫。用「app inventor bluetooth」google 一下,應該可以找到範例

      刪除
  2. 目前我是使用Eclipse 去編寫APP程式(剩下藍芽部分了),如果現在我去使用App Inventor 處理Bluetooth 兩方面可以去做結合嗎?我比較想要知道這點,請求指教。
    (目前在做Arduino傳資料給手機去做顯示處理事件的相關APP)

    回覆刪除
    回覆
    1. 現在學寫程式要善用 google, 給您兩組 keywords

      android bluetooth example
      android bluetooth site:github.com

      如果用 app inventor , 您勢必要重新來過,用它寫簡單程式 OK,很適合初學者,會用 Eclipse ,就直接用 JAVA 來寫就好。您要只是不知使用哪些 lib, 上網查一下就有很多範例了。

      刪除
    2. 感謝,一下子找到很多的範例,原來是Keyword打錯!

      刪除
  3. 請問一下 我連線 出現 UNABLE TO CONNECT DEVICE 該如何解決?

    回覆刪除
    回覆
    1. 您好:
      基本上, 您未提供您進行過的操作程序, 很難猜到底卡在哪裡的。
      建議您要先到 Android 藍芽設定的中確認一下藍芽是否已配對, 如果不曾配對過, 是無法連線的。

      刪除
  4. 您好,可以請教您Arduino的程式怎麼寫嗎? 我有連接成功但無法做控制!

    回覆刪除
    回覆
    1. 您好:
      建議您在 google 中用「arduino android bluetooth」三個 key words 試試, 已有很多教學文件了。

      刪除
  5. 您好,感謝您的建議,我有瀏覽過許多網站的教學,但一樣還是沒有試成功,也找不出是哪裡出問題。
    我目前使用Bluetooth Serial Controller N7 ,已經有跟藍芽模組連線,但連線之後卻沒有看到 S4A 傳來資料,所以不確定到底是我藍芽模組問題還是連線設定的問題!
    程式部分我使用http://tw.leaderg.com/article/index?sn=9489 裡面的程式
    直接送Ascii碼 給serial.read做判斷 我在serial monitor裡做測試是可以的 但是用app控制都沒有反應 可否給我一些建議呢? 感謝!!

    回覆刪除
    回覆
    1. 您好:
      照您的說法,以「網址」中的程式測試可以,所以,您的藍芽連線速度設為 9600 ? 假設您的 Arduino 裝的是 S4A 的 firmware, 那藍芽得設為 38400 才可以,不然,和 firmware 裡的設定不同,肯定無法正常通訊。另外,因為 S4A 會不斷的送出資料,依我的使用經驗,「Bluetooth Serial Controller N7」用一段時間後,很可能會當掉,在猜想,應該是它的 buffer 灌爆了。簡單的說:使用 Bluetooth Serial Controller N7 ,目前僅能玩一玩。

      刪除
    2. 是的,我程式有改成為鮑率38400,連接Bluetooth Serial Controller N7的情況比較像是沒有成功傳送資料的感覺,因為有顯示連線成功,也沒有當掉的現象,但都沒有跳出很多的數據。
      想請問您使用那個網址的程式,確定是可以動作的嗎? 會不會是我的手機app有問題,還是藍芽模組沒有設定好呢?

      刪除
  6. 作者已經移除這則留言。

    回覆刪除
  7. 您好!
    我是拜讀你的文章才瞭解S4A這款軟件。
    請教一下:例如S4A裏 ‘當按下空格鍵’,S4A通過串口發送了哪個字節給arduino?
    我想通過串口發送單字節控制arduino pin13開關。請問在S4A應添加哪個控件,類似于 serial.read實現上面效果 ? 望不吝賜教 :)

    回覆刪除
    回覆
    1. 您好:
      建議您先看一下什麼是 S4A ( http://s4a.cat/ )
      基本上, Arduino 裝了 S4A 的 firmware 後, 我主要會搭配改過的舊版 Scratch ( S4A ) 給初學者練習以「積木」的方式寫程式控制 Arduino。以 S4A 的運作來說,它和 Arduino 之間只傳輸各個 I/O 的值(腳位+內容, 編碼過),您說的按下 "空格鍵" 要觸發送出什麼,是由寫程式的人自訂,因此,我無從知道您要送出什麼。
      本篇文章純屬以 Android App 來和 S4A 玩耍的記錄,其實它不具「生產力」的。

      刪除
  8. 哈囉:
    板主可以請教你一些問題嘛?
    我可以拿你這個手機藍芽控制的APP去控制arduino上的馬達停止或啟動嗎?
    還是我還要自己製作一個APP程式去控制?

    回覆刪除
    回覆
    1. 您好:
      可不可以? 試了便知道啊! 玩電子的東西,坐而言,不如起而行。有實驗的精神,動手去試才有樂趣!
      文章中提到的是以 Arduino 當 MCU,搭配 S4A 的 firmware,來控制 L293D 的動作,再利用本文中的 Android Apps 來遙控。您如果想自己寫 Apps 來控制,當然會最符合自己的需求。

      刪除
  9. Hello.
    Thank you for using my app.
    Unfortunately, "Bluetooth Serial Controller" was deleted.
    So, I released "BlueTooth Serial Controller" as a new app.
    If you're still using this app, try to check it.

    回覆刪除
  10. 請問版主,雖然App已經連到HC-06了,但為甚麼中間沒有顯示S4A傳來的資料呢??

    回覆刪除
    回覆
    1. 您好:
      S4A內定的連線速率為 38400 , 如果您速率沒設定對, 即使藍牙已經匹配成功了,可能還是無法正確的解譯資料。

      刪除

 
雄::gsyan © 2009. Design by Pocket