學習目標 : 利用Android手機控制faya藍芽遙控車
學習時間 : 180min
使用模組 : (1) faya brickNano
(2) faya 減速馬達模組 x 2
(3) faya 藍芽模組
(4) faya 萬向輪模組
工具 : 樂高積木
Android手機
行動電源 (自備)
====================相關知識====================
這篇文章中所用到的模組使用方式及相關知識整理如下,需進一步了解時可點進去參考:
功能介紹 : faya電子積塊與LEGO積木的結合
模組介紹 : faya brickNano
模組介紹 : faya 減速馬達模組
模組介紹 : faya 藍芽模組
模組介紹 : faya 萬向輪模組
註: 本篇的範例需透過Android手機的藍芽介面來遙控faya藍芽遙控車,由於Apple手機的藍芽通訊規範較為嚴謹,一般市場上未經過認證的創客藍芽模組(例如:HC-05),無法和蘋果手機相互溝通。
======================開箱======================
faya二合一自走車(型號NTG-503)是fayalab的第三款創意組合系列產品,裡面所包含的模組和積木,能夠組出一台超音波壁障車或藍芽遙控車,這篇教學將示範藍芽遙控車的組裝、接線與程式,超音波壁障車的部分在另一篇文章示範。
包裝盒內包含了製作超音波避障車與藍芽遙控車所需的全部模組及附件:
1.faya brickNano主板 2.萬向輪模組 3.減速馬達模組x2
4.超音波測距模組 5.藍芽模組 6.micro USB傳輸線
7. 積木包 8. 積木柱子 9.額外積木
10. 電源線(B) 11. 跳線盒
註 : 本範例不會用到[4.超音波測距模組]
====================組裝======================
首先把[1.faya brickNano主板]、[2.萬向輪模組]、[3.減速馬達模組x2]、[4.超音波測距模組]、[5.藍芽模組]的四個角落裝上[8.積木柱子],詳細組裝過程可參考[功能介紹 : faya電子積塊與LEGO積木的結合],請特別注意萬向輪模組的柱子組裝方向,完成後如下圖所示:
接下來把[2.萬向輪模組]取出,在板子的另一面也裝上四個柱子,到時候才能使輪子朝下,利用上方的柱子連上積木。

接著開始組裝積木,組出完整結構的車體是非常重要的,這樣才不會在行走過程中,一不小心散得七零八落 。以下的組裝範例是faya團隊經過多次的嘗試,利用有限數量的一般的積木,組出結構還算堅固的車體,大家可以先參考以下組法,待組出心得後,可以創造自己的組裝方式。
我們從車子的主體開始組裝,首先從[7.積木包]中拿出(10x2薄板積木)當作底板,在底板上方組裝出如下圖的結構,此結構需要用到4個轉90度的單粒積木。
然後在上方組兩個(4x2一般積木),如下所示。
以上為車子的主體部分,完成後,可以拿出[3.減速馬達模]組測試一下,如果組裝無誤的話,減速馬達模組的四個樂高圓孔,能夠穩穩地組在剛剛完成車體的側邊,如下所示,測試完後,請把模組拔掉,繼續組裝未完成的部分
接下來我們要在車子前方延伸一些機構,增加空間已放置前輪和伸模組,首先加入一片(6x2薄板積木)在最左方處,如下所示。
然後在薄板上方,擺兩個(4x2一般積木)
接著用另一個(2x6薄板積木)壓住在最上方,使結構穩定。
拿出[2.faya萬向輪模組],輪子朝下,在上方的四個積木柱子裝兩片(6x2薄板積木)。
把以上的完成品扣在延伸出來的結構下方,此時萬向輪模組的上方會有三片同樣高度的6x2薄板,組完後算是完成車體前方的延伸區域了,如下所示。
我們再次拿出兩個[3.faya減速馬達模組],準備組在車體兩側的垂直結構上。
完成後如下所示
接著在最放方擺一塊(8x6薄板積木),位置請和下方一致,薄板後方要留下兩個轉90度的單粒積木,最為延伸後方車體用。
在薄板積木上方放置一個(4x2一般積木)。
然後在上方用另一片(6x2薄板積木)壓住。
接著用一片(6x2薄板積木)和(8x6薄板積木)放在最上層,如下圖所示。
然後用一片(6x2薄板積木)把整個上層壓住穩定,如下所示。

自走車需要行動電源才能自由的活動,由於每個人的行動電源大小長得不太一樣,底下將以手筆者手邊的行動電源(如下圖)示範,大家參考後可以根據自己的行動電源大小組出合適的結構。


接著用3顆積木組出第二層如下所示

再用另外3顆積木組出第三層如下所示

最後用1顆積木組出第四層如下所示,可以感覺出我們組了一個類似J的結構,屆時可以把行動電源卡在槽裡面

完成圖如下

最後,由於我們要組的是藍芽遙控車,因此我們把[ 5.藍芽模組 ]的上方兩腳,組在延伸區,如下圖所示,車子的組裝在此算完成了。

未接線前的車體外觀如下

確認藍芽模組baud rate:
本章範例會透過手機藍芽用無線的方式(藍芽)來控制遙控車,連線速度使用預設的9600 bps,如果之前曾經將連線速度手動改成38400bps和scratch連線,請將他手動改回9600 bps。 修改步驟請參考以下連結:
目標:
(1) Android藍芽介面控制藍芽遙控車
(2) App控制介面[Ghost Remote BT]
接線:
(1) 電源線連接
如下面幾張圖所示,連接的說明請看這篇文章 或簡易版,首先用[電源線(B)] 把brickNano的電源引到[faya藍芽模組]

再把電源從[faya藍芽模組]引到左邊的[faya減速馬達]

最後用[faya brickNano]的另一個電源接線,把電源引到右邊的[faya減速馬達],如下圖紅色圈圈處。
完成後,可以稍微整理一下電源線,例如將電源線繞到模組下方,看起來比較不凌亂!

(2) 訊號線連接
Arduino_D11 ===> 減速馬達_SIG (右輪)
Arduino_D12 ===> 減速馬達_DIR (右輪)
Arduino_D6 ===> 減速馬達_SIG (左輪)
Arduino_D7 ===> 減速馬達_DIR (左輪)
Arduino_Tx1 ===> 藍芽模組 (RxD)
Arduino_Rx0 ===> 藍芽模組 (TxD)

藍芽手機配對:
註: 本段文章可參考模組介紹 : faya藍芽模組
(1) 完成以上的電源和訊號接線後,用USB線將行動電源與brickNano連結,此時faya藍芽模組會通電,由於手機的藍芽和faya藍芽模組還未配對,因此藍芽模組下方的LED燈會快速閃爍。
(2) 接著開啟手機的藍芽通訊通能,並在清單中搜尋HC-05的裝置 (無此選項時,可以找顯示[不明]的那個試試看)。
(3) 要求輸入裝置密碼的畫面,輸入預設密碼[1234]
(4)完成後,模組下方的紅色LED每2秒會閃爍1次 -代表電腦藍芽(主)和模組藍芽(僕)配對成功,手機[paired devices]也會顯示HC-05裝置。
以上配對程序只需要做一次,電腦會記得此模組已經配對過,未來無須重新配對。
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2018/6/25 | |
// Faya-Nugget Sample Code (BluetoothRemote_1C.ino) | |
// 單元: 創意組合 - 藍芽遙控車 (使用藍芽手機控制) | |
// 網址: https://fayalab.blogspot.com/2018/06/BluetoothBotAndroid.html | |
// 目標: (1) Android藍芽介面控制藍芽遙控車 | |
// (2) App控制介面 [Ghost Remote BT] | |
// Wire : Arduino ==> faya Module | |
// D11 ==> SIG (減速馬達) | |
// D12 ==> DIR (減速馬達) | |
// D6 ==> SIG (減速馬達) | |
// D7 ==> DIR (減速馬達) | |
// D3 ==> TxD (藍芽模組) | |
// D2 ==> RxD (藍芽模組) | |
#include <SoftwareSerial.h> // 引入軟體模擬串列埠的函式庫,用來連接藍芽模組 | |
#define delayTime 250 // define delay time | |
// define module pins connect to Arduino | |
#define Wheel_R_DIR 12 // 右輪方向腳位 | |
#define Wheel_R_SIG 11 // 右輪速度腳位 | |
#define Wheel_L_DIR 7 // 左輪方向腳位 | |
#define Wheel_L_SIG 6 // 左輪速度腳位 | |
const int TX = 2; // 藍芽模組 RxD 埠連接到Arduino第2腳 | |
const int RX = 3; // 藍芽模組 TxD 埠連接到Arduino第3腳 | |
// 命名並且設定 SoftwareSerial 參數 | |
SoftwareSerial fayaBT(RX, TX); | |
String command; // 儲存藍芽控制字串 | |
void setup() { | |
Serial.begin(9600); // 串列埠通訊 baudrate (電腦 <=> Arduino) | |
fayaBT.begin(9600); // 軟體串列埠通訊 baudrate (Arduino <=> 藍芽模組) | |
pinMode(Wheel_R_DIR,OUTPUT); //右輪方向腳位 | |
pinMode(Wheel_R_SIG,OUTPUT); //右輪速度腳位 | |
pinMode(Wheel_L_DIR, OUTPUT); //左輪方向腳位 | |
pinMode(Wheel_L_SIG, OUTPUT); //右輪速度腳位 | |
StopMove(); //停止前進 | |
} | |
void loop() | |
{ | |
if(fayaBT.available()>0) // 有資料時 | |
{ | |
char command = fayaBT.read(); // 讀取指令 | |
Serial.println(command); // 列印指令 | |
if(command == 'S') // 指令 'S' = StopMove (停止前進) | |
{ | |
StopMove(); | |
delay(delayTime); | |
} | |
else if(command == 'F') // 指令 'F' = Move Foraward (向前進) | |
{ | |
Forward(); | |
delay(delayTime); | |
} | |
else if(command == 'B') // 指令 'B' = Move Backward (向後退) | |
{ | |
Backward(); | |
delay(delayTime); | |
} | |
else if(command == 'R') // 指令 'R' = Turn Right (右轉) | |
{ | |
turnRight(); | |
delay(delayTime); | |
} | |
else if(command =='L') // 指令 'L' = Turn Left (左轉) | |
{ | |
turnLeft(); | |
delay(delayTime); | |
} | |
} | |
} | |
void Forward() //向前進副程式 | |
{ | |
digitalWrite(Wheel_R_DIR,LOW); | |
analogWrite(Wheel_R_SIG,150); // 修改數值讓前進速度一致 | |
digitalWrite(Wheel_L_DIR,HIGH); | |
analogWrite(Wheel_L_SIG,150); // 修改數值讓前進速度一致 | |
Serial.println("Forward"); | |
} | |
void Backward() //向後退副程式 | |
{ | |
digitalWrite(Wheel_R_DIR,HIGH); | |
analogWrite(Wheel_R_SIG,150); // 修改數值讓後退速度一致 | |
digitalWrite(Wheel_L_DIR,LOW); | |
analogWrite(Wheel_L_SIG,150); // 修改數值讓後退速度一致 | |
Serial.println("Back"); | |
} | |
void turnRight() //向右轉副程式 | |
{ | |
digitalWrite(Wheel_R_DIR,HIGH); | |
analogWrite(Wheel_R_SIG,120); | |
digitalWrite(Wheel_L_DIR,HIGH); | |
analogWrite(Wheel_L_SIG,120); | |
Serial.println("Turnright"); | |
} | |
void turnLeft() //向左轉副程式 | |
{ | |
digitalWrite(Wheel_R_DIR,LOW); | |
analogWrite(Wheel_R_SIG,120); | |
digitalWrite(Wheel_L_DIR,LOW); | |
analogWrite(Wheel_L_SIG,120); | |
Serial.println("Turnleft"); | |
} | |
void StopMove() //停止副程式 | |
{ | |
analogWrite(Wheel_R_SIG,0); | |
analogWrite(Wheel_L_SIG,0); | |
Serial.println("Stopmove"); | |
} |
備註:
-L44~78 : 本範例會從手機利用藍芽送出控制字串(S/F/B/R/L)來控制車子的動作(停止/向前/後退/右轉/左轉),因此Arduino不須不斷地接收字串指令,比對後進讓車子進行相關動作。手機送出指令的部分會在後面介紹。
- L83/L85 : 由於兩顆馬達方翻了180度,當右輪順時針轉,左輪逆時針轉,也就是給的訊號分別為LOW和HIGH時,車子才會前進。
- L84/L86 : 由於每顆馬達吃的電流和轉速關係會有些許差異,因此當執行此指令時,車子如果會往左右偏,我們可以透過修改馬達的電壓,讓左右輪前進的速度一致。
- L90後退副程式 : 控制方式和車子前進的道理一樣,只要把馬達全部反向即可。
- L100右轉副程式 : 兩輪的自走車需靠兩個輪子間的差速才能轉彎,當要右轉時,左輪的移動路徑會比右輪多出很多,因此在程式中,我們左輪的速度比右輪快上許多。
- L109左轉副程式 : 原理和右轉副程式相同,只要把左右輪的速度對調即可。
手機藍芽要控器安裝與設定:
(1) 請利用Android 手機的 Google Play 下載 [Ghost Remote BT],注意到由於Apple手機的藍芽通訊規範較為嚴謹,一般市場上未經過認證的創客藍芽模組(例如:HC-05)是無法和Apple手機的藍芽溝通的,因此無法利用蘋果手機遙控此藍芽車。
(2) 開啟App,點選右下角的[...],再點選左方偏下的 [Connection]選項。
(3) 按下方的[Add Connection],再點選一個名為[HC-05]的裝置,如果成功連線的話,HC-05右方的小圓點會變成綠色。 (註: 如未發現HC-05裝置,請先確認藍芽模組和手機是否已經先配對成功,參照前一段文章的設定方式)
(4) 連線成功後,點選右上方HTPC按鈕
(5) 畫面中會出現如下方的控制面板,我們會利用到上下左右的箭頭,和中間的綠色按鈕當停止鍵。先按右下角的[...],再按下左邊偏下的[Set Command],軟體會進入指令編輯模式 (此時畫面上方會出現紅色Edit Mode字眼)
(4) 點選[上箭頭],軟體會要求輸入指令,我們輸入一個大寫的[F],代表未來我們按下要控器的上箭頭時,手機的藍芽會輸出F指令給已經連線成功的藍芽模組,藍芽模組將此F指令透過軟體串列埠傳送給Arduino,經過程式的比對後,轉動馬達,藍芽車向前走。
(5) 重複以上的動作,分別對[下箭頭]、[左箭頭]、[右箭頭]、[中間按鈕]編輯對應的指令 [B]、[L]、[R]、[S],完成後按下左下方的三角形回到上一頁,就可以開始控制藍芽車了。
範例結果:
討論:
- 本篇範例利用Android手機的軟體APP,透過藍芽送出串列指令給連線成功的faya藍芽模組,藍芽模組將指令傳送給brickNano後,經過程式的比對,馬達會執行相對應的運轉方向,使得藍芽遙控車產生前後左右和停止的動作。
- APP [Ghost Remote BT] 是一個非常好用的藍芽遙控器程式,只要輸入相對應的指令,就能夠控制協定好的裝置,程式的介面除了方向鍵,下方還有許多按鍵可以擴充控制功能,大家可以在藍芽遙控車上裝個喇叭,在Aruino程式中多增加一段鳴笛的副程式,並且設定好控制指令後,將此指令新增到[Ghost Remote BT]中,就能夠遙控鳴笛了。
- 如果無法下載APP的朋友,也可以利用fayaLAB提供的陽春APP,此程式的上下左右指令是固定的[F]、[B]、[L]、[R],安裝到手機後,可以用同樣的方式控制藍芽遙控車,APP可點選此處下載,軟體畫面如下所示。
希望大家能夠順利地製作出自己的藍芽遙控車,並且自行修改控制指令,也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言