
學習目標 : 利用faya電子積塊製作一超音波避障車
學習時間 : 180min
使用模組 : (1) faya brickNano
(2) faya 減速馬達模組 x 2
(3) faya 超音波距離感應模組
(4) faya 萬向輪模組
工具 : 樂高積木
行動電源 (自備)
====================相關知識====================
這篇文章中所用到的模組使用方式及相關知識整理如下,需進一步了解時可點進去參考:
功能介紹 : faya電子積塊與LEGO積木的結合
模組介紹 : faya brickNano
模組介紹 : faya 減速馬達模組
模組介紹 : faya 超音波距離感應模組
模組介紹 : faya 萬向輪模組
======================開箱======================
faya二合一自走車(型號NTG-503)是fayalab的第三款創意組合系列產品,裡面所包含的模組和積木,能夠組出一台超音波壁障車或藍芽遙控車,這篇教學將示範超音波避障車的組裝、接線與程式,藍芽遙控車的部分在另一篇文章示範。
包裝盒內包含了製作超音波避障車與藍芽遙控車所需的全部模組及附件:
1.faya brickNano主板 2.萬向輪模組 3.減速馬達模組x2
4.超音波測距模組 5.藍芽模組 6.micro USB傳輸線
7. 積木包 8. 積木柱子 9.額外積木
10. 電源線(B) 11. 跳線盒
註 : 本範例不會用到[5.藍芽模組]
===================組裝====================
首先把[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薄板積木)把整個上層壓住穩定,如下所示。
最後在中間的(8x6薄板積木)上方,放上 [1.faya brickNano主板],主要的車體和模組就完成了,如下圖所示,前方可以放各種感測模組,後方也有區域可以擺放行動電源,我們在接下來的步驟示範。

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


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

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

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

完成圖如下

最後,由於我們要組的是超音波避障車,因此我們把[4.超音波測距模組]的後兩腳,組在前方的延伸區,如下圖所示,車子的組裝在此算完成了。
未接線前的車體外觀如下
===================範例實作=====================
目標:
(1) 電源開啟後,自走車向前行走
(2) 遇到障礙物前30cm,自走車後退隨機轉向
(3) 確認前方無障礙物時繼續前進
接線:
(1) 電源線連接
如下面幾張圖所示,連接的說明請看這篇文章 或簡易版,我們這邊要用3條電源線將四個模組串起來。
首先用[電源線(B)] 把brickNano的電源引到[faya超音波測距模組]
再把電源從[faya超音波測距模組]引到左邊的[faya減速馬達]
最後用[faya brickNano]的另一個電源接,把電源引到右邊的[faya減速馬達]
完成後,可以稍微整理一下電源線,例如將電源線繞到模組下方,看起來比較不凌亂!

(2) 訊號線連接
Arduino_D11 ===> 減速馬達_SIG (右輪)
Arduino_D12 ===> 減速馬達_DIR (右輪)
Arduino_D6 ===> 減速馬達_SIG (左輪)
Arduino_D7 ===> 減速馬達_DIR (左輪)
Arduino_D2 ===> 超音波測距 (Trig)
Arduino_D3 ===> 超音波測距 (Echo)
範例程式:
重要:下載程式時請用手握著車子,以免下載成功後車子立刻走動掉到地上
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
// 2017/9/12 | |
// Faya-Nugget 範例程式 (ObstacleAvoiding_1.ino) | |
// 單元: 創意組合 - 避障自走車 | |
// 網址: https://fayalab.blogspot.com/2017/09/ObstacleAvoidingBot.html | |
// 目標: (1) 電源開啟後,自走車向前行走 | |
// (2) 遇到障礙物前30cm,自走車後退隨機轉向 | |
// (3) 確認前方無障礙物時繼續前進 | |
// 接線: Arduino ==> faya模組 | |
// D11 ==> SIG (減速馬達-右輪) | |
// D12 ==> DIR (減速馬達-右輪) | |
// D6 ==> SIG (減速馬達-左輪) | |
// D7 ==> DIR (減速馬達-左輪) | |
// D2 ==> Trig (超音波距離感應模組) | |
// D3 ==> Echo (超音波距離感應模組) | |
#define Wheel_R_DIR 12 // 右輪方向腳位 | |
#define Wheel_R_SIG 11 // 右輪速度腳位 | |
#define Wheel_L_DIR 7 // 左輪方向腳位 | |
#define Wheel_L_SIG 6 // 左輪速度腳位 | |
#define Trig 2 //超音波 Trig 腳位 = 2 | |
#define Echo 3 //超音波 Echo 腳位n = 3 | |
unsigned long distance = 30; //宣告distance變數 | |
void setup() { | |
// Serial.begin(9600); | |
pinMode(Wheel_R_DIR,OUTPUT); //右輪方向腳位 | |
pinMode(Wheel_R_SIG,OUTPUT); //右輪速度腳位 | |
pinMode(Wheel_L_DIR, OUTPUT); //左輪方向腳位 | |
pinMode(Wheel_L_SIG, OUTPUT); //右輪速度腳位 | |
pinMode(Trig, OUTPUT); //設定Trig為輸出埠 | |
pinMode(Echo, INPUT); //設定Echo為輸入埠 | |
StopMove(); //停止前進 | |
} | |
void loop() | |
{ | |
delay(100); | |
digitalWrite(Trig, HIGH); // 輸出Trigh為HIGH | |
delayMicroseconds(10); // 維持10uS | |
digitalWrite(Trig, LOW); // 再轉LOW | |
distance=(pulseIn(Echo, HIGH)/58); // 利用pulseIn計算Echo的寬度(時間),再除以58uS的單位時間,算出感測距離 | |
//Serial.println(distance); | |
if(distance <= 30) // 量測距離<30cm時後退並轉向 | |
{ | |
delay(200); | |
StopMove(); //暫停 | |
Backward(); //後退 | |
if((random(10)%2)==1) | |
turnLeft(); | |
else | |
turnRight(); | |
} | |
else // 量測距離在>30cm時前進 | |
{ | |
Forward(); | |
} | |
} | |
void Forward() //前進 | |
{ | |
digitalWrite(Wheel_R_DIR,LOW); | |
analogWrite(Wheel_R_SIG,150); // 修改數值讓前進速度一致 | |
digitalWrite(Wheel_L_DIR,HIGH); | |
analogWrite(Wheel_L_SIG,180); // 修改數值讓前進速度一致 | |
} | |
void Backward() //後退 | |
{ | |
digitalWrite(Wheel_R_DIR,HIGH); | |
analogWrite(Wheel_R_SIG,150); // 修改數值讓前進速度一致 | |
digitalWrite(Wheel_L_DIR,LOW); | |
analogWrite(Wheel_L_SIG,180); // 修改數值讓前進速度一致 | |
delay(750); | |
} | |
void turnRight() //右轉 | |
{ | |
digitalWrite(Wheel_R_DIR,HIGH); | |
analogWrite(Wheel_R_SIG,120); | |
digitalWrite(Wheel_L_DIR,HIGH); | |
analogWrite(Wheel_L_SIG,150); | |
delay(250); | |
StopMove(); | |
} | |
void turnLeft() //左轉 | |
{ | |
digitalWrite(Wheel_R_DIR,LOW); | |
analogWrite(Wheel_R_SIG,150); | |
digitalWrite(Wheel_L_DIR,LOW); | |
analogWrite(Wheel_L_SIG,120); | |
delay(250); | |
StopMove(); | |
} | |
void StopMove() //副程式 - 停止走動 | |
{ | |
analogWrite(Wheel_R_SIG,0); | |
analogWrite(Wheel_L_SIG,0); | |
delay(100); | |
} |
備註:
- L38~42 : 利用超音波測距模組取得障礙物距離,詳細原理請參考[模組介紹 : faya 超音波距離感應模組]
- L47~L48 : 重要,當輪子(馬達)要改變旋轉方向時,一定要先暫停,再反轉,避免直接轉向(逆向)電流傷到IC
- L50~53 : 利用亂數函數來決定車子向左或向右轉
- L63/L65 : 由於兩顆馬達方翻了180度,當右輪順時針轉,左輪逆時針轉,也就是給的訊號分別為LOW和HIGH時,車子才會前進。
- L64/L66 : 由於每顆馬達吃的電流和轉速關係會有些許差異,因此當執行此指令時,車子如果會往左右偏,我們可以透過修改馬達的電壓,讓左右輪前進的速度一致。
- L69後退副程式 : 控制方式和車子前進的道理一樣,只要把馬達全部反向即可。
- L78右轉副程式 : 兩輪的自走車需靠兩個輪子間的差速才能轉彎,當要右轉時,左輪的移動路徑會比右輪多出很多,因此在程式中,我們左輪的速度比右輪快上許多。
- L88左轉副程式 : 原理和右轉副程式相同,只要把左右輪的速度對調即可。
結果演示:
ˋ
討論:
- 右轉和左轉副程式中使用了delay()函數,此延遲時間會影響到左右轉程度,由於程式中都固定在250ms,因此轉向的程度是差不多的,大家可以把此延遲時間改成亂數,讓轉向程度無法預測,增加行走時的趣味性。
- 大家可以在減速馬達上疊上四個積木柱子,讓車體結構更堅固

希望大家能夠順利地製作出自己的避障自走車,並且更改其外型,也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言