2017年7月20日 星期四

模組介紹 : faya 串列七段顯示模組



學習目標 : 認識faya 串列七段顯示模組的功能及使用方式
學習時間 : 40min
示範模組 : (1) fayaduino UNO
                 (2) faya 電源底板
                 (3) faya觸控開關模組x 2
                 (4) faya 串列七段顯示模組
工具 : (1) 樂高積木底板 (相容)

====================功能介紹====================
faya串列七段顯示模組透過簡單的接線,再對Arduino的函式下指令,就能立刻秀出想要顯示的數字,本段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明

介紹指令前,先看一下faya串列七段顯示模組的外觀,它的左邊有三個埠,分別是DIN、CLK、LOAD,用來和Arduion進行串列資料的傳輸,使用此模組前,需先宣告Arduino連到此三個埠的腳位。模組中間就是主角-四位數七段顯示器,每個位數外帶小數點,注意中間上方的小數點沒有作用。


    接下來介紹使用指令

    • #include<LedControl.h>;
         使用串列七字節函示庫之前,記得先指示此函示標頭檔
     
    • LedControl 物件名稱 = LedControl(DIN,CLK,LOAD,n);
         此指令建構了串列七字節的物件並定義接線與數量 

         物件名稱 : 可自行命名
         DIN、CLK、LOAD : 連接Arduino的數位腳號碼
         n  :  連接串列裝置的數量,最多可連接8個,因此n介於1~8之間
     
         (例) 當我們建構一物件名稱為"faya7seg",把DIN連到第12隻腳,CLK連到11隻 
                腳,LOAD連到第10隻腳,並且只連了1個串列七字節,我們在程式中需宣告:


         LedControl faya7seg = LedControl(12,11,10,1);

    •   物件名稱 .shutdown(n-1, power_saving_mode); 
         設定裝置是否進入省電模式

         n-1 : 選擇第n個串聯裝置
         power_saving_mode :  true代表進入省電模式,false代表進入一般電源模式

         (例) 當我們要將第一個裝置(物件名稱為faya7seg)進入一般電源模式,程式如下

          faya7seg.shutdown(0,false);

    •   物件名稱 .setIntensity(n-1,intensity);
         設定顯示器的亮度

          n-1 : 選擇第n個串聯裝置
          intensity : 亮度參數設定0~15,0最暗、15最亮

         (例) 當我們要將第一個裝置(物件名稱為faya7seg)設定中間亮度時,程式如下

          faya7seg.setIntensity(0,8);

    •   物件名稱 .clearDisplay(n-1);
         清除顯示器內容

         n-1 : 選擇第n個串聯裝置

         (例) 當我們要清除第一個裝置(物件名稱為faya7seg)的顯示設定內容時,程式如下:

         faya7seg.setIntensity(0,8);

    •   物件名稱 .setDigit(n-1,m,number,dp)
         顯示七字節第m位數字

         n-1 : 選擇第n個串聯裝置
         m : 控制的位數(3=千位、2=百位、1=十位、0=個位)
         number : 要顯示的數字 (0~9)
         dp :  true代表顯示小數點、false代表不顯示

        (例) 當我們要顯示第一個裝置(物件名稱為faya7seg)的4個位數為587.2時,程式如下

        faya7seg.setDigit(0,3,5,false);
        faya7seg.setDigit(0,2,8,false);
        faya7seg.setDigit(0,1,7,true);
        faya7seg.setDigit(0,0,2,false);

    ====================原理知識====================
    以下解釋提供給有需要知道背後原理的人:

    原本四字七段顯示器的控制方式,需透過8條訊號線控制一個數字(7條訊號線控制組成數字的節+1條訊號線控制小數點),再加上4條訊號線,輪流掃描點亮四個位數,利用視覺暫留的關係,讓四個數字看起來同時亮。

    這個方式的缺點是需要拉很多訊號線,掃描的時候也會占用控制器的資源,有鑑於此,我們可借助一顆IC來處理顯示的工作,降低控制器的負擔。

    晶片 Max7219 就是針對所需要的功能設計出來的,他具配了BCD解碼電路、掃描電路和串列埠電路,能夠輕易地將控制器送來的串列訊號解碼送至顯示器,內建的掃描功能也能夠讓顯示器一次顯示所有的數字。本模組的電路如下 (Dig0~3為掃描線、SegA~G為訊號線),接法是固定的,有興趣深入研究的人可以參考datasheet。


    ===================範例實作(1)===================
    了解模組功能(原理)後,我們用以下範例來展示模組的功能:

    目標: 
    (1)按下左邊觸控按鈕時,七段顯示器加1,最多顯示到9999
    (2)按下邊觸控按鈕時,七端顯示器規歸0

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

     

    (2) 訊號線連接
          Arduino_12  ===>  串列七段顯示模組_DIN
          Arduino_11  ===>  串列七段顯示模組_CLK
          Arduino_10  ===> 串列七段顯示模組_LOAD


          Arduino_2  ===>  觸控開關模組(左)_OUT
          Arduino_3  ===>  觸控開關模組(右)_OUT


    範例程式:


    備註:
    - 本程式需要用到[LedControl]函式庫,請下載並解壓縮至Arduino Libraries 資料夾
    - 觸控開關的使用方式,請參考[模組介紹 : faya觸控開關模組]
    - L53 : 數字每次加1,就呼叫副程式,更新顯示
    - L59 : show4digits 副程式,會把傳送的4位數字拆成千/百/十/個4個數字
    - L62 : 把數字除以1000所得的商就是千位數字
    - L63 : 把數字除以1000所得的餘數再除以100所得的商就是百位數字
    - L64 : 把數字除以100所得的餘數再除以10所得的商就是十位數字
    - L65 : 把數字除以10所得的餘數就是個位數字
    - L67~70 : 利用剛剛取得的千/百/十/個位數字點亮各個LED燈

    範例結果:


    討論:
    • 從範例結果可以看到每按一次計數鈕,數字會+1累計,但是如果一直按著技術鈕不放開時,由於程式在void loop()裡面跑,因此會不斷的重複+1,要解決此問題,可以在L56和L57中間插入底下兩行程式碼
                    while(digitalRead(countButton==HIGH);
                    delay(30);
         
            如此一來,只要手指頭還留在按鍵上,程式就會卡在第一行,第二行作用為除彈跳,雖然觸控開關沒有機械彈跳的問題,但是離開的瞬間,我們發現還是有電壓上下變化的現象產生,因此還是加個延遲將此現象忽略。
      • 範例中可以發現數字跳得有點慢,大家可以試著寫一個加速程式,當按愈久的時候,數字跳得愈快。

      也歡迎大家在底下留言或到我們的粉絲團留言喔!
      ====================================
      fayalab 粉絲團
      FB本篇留言版


      沒有留言:

      張貼留言