2017年5月16日 星期二

模組介紹 : fayaBCD開關模組


學習目標 : 認識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)===================
    了解模組功能(原理)後,我們用以下範例來展示模組的功能:

    目標:
    (1) 將BCD開關選定的數字顯示在Arduino Serial Monitor

    接線:
    (1) 電源線連接
         如下圖所示,連接的說明請看這篇文章 簡易版


    (2) 訊號線連接
          Arduino_8    ===>  BCD開關_1
          Arduino_9    ===>  BCD開關_2
          Arduino_10  ===>  BCD開關_4
          Arduino_11  ===>  BCD開關_8


    範例程式:
    // 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);
    }
    view raw BCDSwitch_1.ino hosted with ❤ by GitHub

    備註:
    - 我們利用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本篇留言版 


    沒有留言:

    張貼留言