學習目標 : 認識fayaBCD開關模組的功能及使用方式
學習時間 : 40min
示範模組 : (1) fayaduino UNO
(2) faya 電源底板
(3) fayaBCD開關模組
工具 : (1) 樂高積木底板 (相容)
====================功能介紹====================
faya BCD開關模組擁有4個數位輸出埠,輸出的狀態隨著輸入的旋鈕(0~9)改變,它的好處是用4個腳位就能顯示10種變化 (2^4=16 > 10),輸入與輸出的關係如下所示 (H = Logic High, L = Logic Low):
- 當轉到0時,埠1 2 4 8 的數位輸出分別為 L L L L
- 當轉到1時,埠1 2 4 8 的數位輸出分別為 H L L L
- 當轉到2時,埠1 2 4 8 的數位輸出分別為 L H L L
- 當轉到3時,埠1 2 4 8 的數位輸出分別為 H H L L
- 當轉到4時,埠1 2 4 8 的數位輸出分別為 L L H L
- 當轉到5時,埠1 2 4 8 的數位輸出分別為 H L H L
- 當轉到6時,埠1 2 4 8 的數位輸出分別為 L H H L
- 當轉到7時,埠1 2 4 8 的數位輸出分別為 H H H L
- 當轉到8時,埠1 2 4 8 的數位輸出分別為 L L L H
- 當轉到9時,埠1 2 4 8 的數位輸出分別為 H L L H

====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
BCD (Binary-Coded-Decimal),二進碼十進制,利用了4個位元來儲存一個十進位的數字,最常用的BCD編碼,就是0到9這十個數值用二進碼(1,2,4,8)來表示,關係如下:
用例子解釋,要顯示數字7時,7 = 1x1+2x1+4x1+8x0,因此BCD(1248)碼 = 1110。1代表導通的意思,BCD開關透過內部PCB,當轉到某數字時,相關的輸出點(1,2,4,8)和COM點會導通,我們透過分壓定理,把COM點串1K電阻到VCC,輸出10K電阻對地,讓導通的輸出拉到High。因此當我們轉到數字7時,輸出在埠(1, 2, 4, 8)得到 (High, High, High ,Low)的結果。
BCD的內部結構類似這樣:
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1) 將BCD開關選定的數字顯示在Arduino Serial Monitor
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_8 ===> BCD開關_1
Arduino_9 ===> BCD開關_2
Arduino_10 ===> BCD開關_4
Arduino_11 ===> BCD開關_8
範例程式:
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/5/12 | |
// Faya-Nugget 範例程式 (BCDSwitch_1.ino) | |
// 單元: 模組介紹-fayaBCD開關模組 | |
// 網址: http://fayalab.blogspot.com/2017/05/fayabcd.html | |
// 目標 (1) 將BCD開關選定的數字顯示在Arduino Serial Monitor | |
// 接線: Arduino ==> faya模組 | |
/// 8 ==> 1 (BCD開關模組) | |
// 9 ==> 2 (BCD開關模組) | |
// 10 ==> 4 (BCD開關模組) | |
// 11 ==> 8 (BCD開關模組) | |
// BCD開關腳位設定 | |
int BCD_Pin_1 = 8; | |
int BCD_Pin_2 = 9; | |
int BCD_Pin_4 = 10; | |
int BCD_Pin_8 = 11; | |
// 用變數n暫存輸出埠的狀態 | |
int n1=0, n2=0, n4=0, n8=0, nAll_old=0, nAll_new=0; | |
void setup() { | |
Serial.begin(9600); // 初始化串列傳輸,鮑率為9600bps。 | |
} | |
void loop() { | |
if(digitalRead(BCD_Pin_1) == HIGH) //紀錄輸出埠1的狀態 | |
n1 = 1; | |
else | |
n1 = 0; | |
if(digitalRead(BCD_Pin_2) == HIGH) //紀錄輸出埠2的狀態 | |
n2 = 2; | |
else | |
n2 = 0; | |
if(digitalRead(BCD_Pin_4) == HIGH) //紀錄輸出埠4的狀態 | |
n4 = 4; | |
else | |
n4 = 0; | |
if(digitalRead(BCD_Pin_8) == HIGH) //紀錄輸出埠8的狀態 | |
n8 = 8; | |
else | |
n8 = 0; | |
nAll_new = n1+n2+n4+n8; //加總得知目前所旋轉的數字 | |
if(nAll_old != nAll_new) //當改變數字時 | |
{ | |
Serial.print("number = "); //將資料輸出至序列埠監控視窗 | |
Serial.println(nAll_new); | |
} | |
nAll_old = nAll_new; //把新的值記錄起來 | |
delay(200); | |
} |
備註:
- 我們利用4個變數n1, n2, n4, n8分別記錄輸出埠1,2,4,8的狀態,然後把結果加總,就會和目前BCD開關所轉到的數字相同
範例結果:
討論:
執行的時候,筆者發現有時候從某個數字轉到下一個數字時,過程中會出現 number = 1, 或 number = 2等等怪怪數字,這是因為當我們轉旋鈕轉到一半的時候,Arduino剛好到偵測當時的狀態,就直接把轉到一半狀態的結果顯示在Serial Monitor上,大家可以把最後一行的時間延長一些,解決此問題。
另外我們的程式讓Arduino判斷當指撥數字改變時才顯示數值,如果一開始指撥數字停在0的地方 (0 = 0),因此Serial Monitor開啟後不會顯示出任何資訊,但如果一開始指撥數字停在3的地方 (3 != 0),Serial Monitor開啟後就會馬上顯示出來 number=3 (因為3不等於0),這樣顯示結果不一致,大家可以動動腦,看看怎麼靠程式修正這個問題!
也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言