學習目標 : 認識faya直流馬達模組的功能及使用方式
學習時間 : 40min
示範模組 : (1) fayaduino UNO
(2) faya 電源底板
(3) faya 觸控開關模組
(4) faya 直流馬達模組
工具 : (1) 樂高積木底板 (相容)
====================功能介紹====================
控制faya直流馬達模組的方式是非常容易的,在他的面板上可以看到兩個輸入埠,SIG和DIR:
- 當SIG埠收到HIGH訊號時,馬達旋轉,旋轉方向由DIR埠決定
- 當DIR埠收到HIGH訊號時,馬達逆時針轉
- 當DIR收到LOW訊號時,馬達順時針轉
因此控制此模組的順序是(1)透過DIR埠告知馬達旋轉方向 (2)透過SIG埠告知馬達可以啟動了

====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
直流馬達的控制是很單純的,只有兩條控制線,一接正一接負,在足夠的電流下,就能運轉,反接的話就會逆轉。為了讓使用者能夠透過軟體控制正逆轉,而不需要手動改變接線,faya直流馬達模組加入了一點小電路來完成此功能,其中兩顆IC功能如下:
L293D : 驅動IC,用來提供足夠的電流驅動此馬達
74HC00 : NAND邏輯閘,透過邏輯閘運算,讓SIG和DIR的邏輯狀態能夠個產生需要的訊號
(SIG決定馬達是否運轉 ; DIG控制運轉方向)
模組的電路圖如下,有興趣的人可以把 00, 01, 10, 11帶入SIG和DIR看輸出結果!
===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)當手指頭按著faya觸控開關時,直流馬達風扇開始吹風
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_A0 ===> 觸控開關_OUT
Arduino_12 ===> 直流馬達_DIR
Arduino_13 ===> 直流馬達_SIG
備註:- 觸控開關使用範例請參考模組介紹:faya觸控開關模組
- 第16行的 [digitalWrite(12, HIGH); // 設定馬達旋轉方向為逆時針方向]
為了讓葉片向前吹出風來,馬達旋轉的方向(正/逆轉)須配合葉片的結構:
黃色葉片 : 左低右高 - 逆時針轉動時,葉片才會壓出向前吹出的風
紅色葉片 : 左高右低 - 順時針轉動時,葉片才會壓出向前吹出的風
範例結果:
===================範例實作(2)===================
這邊特別加一個小練習,讓剛進入程式控制領域的使用者,學習一點程式技巧
由於這個範例所使用的開關非自鎖式的,因此當手一離開按鈕,風扇就關閉了,我們可以透過一些程式技巧解決這個問題!
目標:
(1)當手指第一次按faya觸控開關時,風扇啟動,手指離開時,維持啟動狀態
(2)當手指再一次按faya觸控開關匙,風扇停止
接線:
同範例實作(1)
範例程式:
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/4/18 | |
// Faya-Nugget 範例程式 (DCMotor_2.ino) | |
// 單元: 模組介紹-faya直流馬達模組 | |
// 網址: http://fayalab.blogspot.com/2017/04/faya_14.html | |
// 目標: (1)當手指第一次按faya觸控開關時,風扇啟動,手指離開時,維持啟動狀態 | |
// (2)當手指再一次按faya觸控開關匙,風扇停止 | |
// 接線: Arduino ==> faya模組 | |
// A0 ==> OUT (觸控開關) | |
// 12 ==> DIR (直流馬達) | |
// 13 ==> SIG (直流馬達) | |
boolean touch_flag = false; | |
void setup() { | |
// put your setup code here, to run once: | |
pinMode(12, OUTPUT); // 設定D12為輸出腳位,控制馬達旋轉方向 | |
pinMode(13, OUTPUT); // 設定D13為輸出腳位,控制馬達旋轉與否 | |
pinMode(A0, INPUT); // 設定A0為輸入腳位,接收觸控開關的狀態 | |
digitalWrite(12, HIGH); // 設定馬達旋轉方向為逆時針方向 | |
} | |
void loop() { | |
if (digitalRead(A0) == HIGH) //當偵測到觸控開關為HIGH時 | |
{ | |
delay(300); //300毫秒的時間讓手指離開按鈕 | |
touch_flag = !touch_flag; //改變按鈕旗標狀態 | |
} | |
else | |
{ | |
touch_flag = touch_flag; | |
} | |
if (touch_flag == true) //當touch_flag為true時 | |
{ | |
digitalWrite(13,HIGH); //開始旋轉 | |
} | |
else | |
{ | |
digitalWrite(13, LOW); //否則停止旋轉 | |
} | |
} |
備註:- 我們在L12行新增了一個布林(boolean)資料型態的旗標: touch_flag,用來記錄最後一次按鈕狀態,touch_flag初始值為false,表示還沒有被按過。
- L23~L31中判斷當按到觸控開關時,touch_flag改變上一次的狀態,因此第1次按觸控該關,touch_flag 有由false->true,第2次按開關,touch_flag由true->false,依次類推,手離開觸控該關時,touch_flag不會有變化。
- L25的300毫秒延遲,讓手指頭在這段時間移開觸控開關,如果沒有這行程式碼的話,風扇會在手指按觸控開關時,瞬間又開又關,大家可以把這行刪掉看看結果。
- L33~L40程式和範例實作(1)相同,但判斷的依據改成touch_flag
範例結果:
討論:這個程式還有些小地方需要修改,當手指頭一直放在觸控按鈕上時,會有什麼結果? 大家不妨動動腦,我們往後的文章在繼續討論如何精進這個小範例!
也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言