2017年7月27日 星期四

模組介紹 : faya 串列LCD模組


學習目標 : 認識faya 串列七段顯示模組的功能及使用方式
學習時間 : 40min
示範模組 : (1) faya brickNano
                (2) faya串列LCD模組
                (3) 16x2 LCD模組 (20x2 或 20x4 LCD亦可)
工具 : (1) 樂高積木底板 (相容)

====================功能介紹====================
faya串列LCD模組透過I2C介面,利用Arduino內建的函式,很輕易的就能在螢幕上秀出想要顯式的文字訊息。本段僅解釋範例中用到的指令,更多的函示庫指令用法可參考官方說明

介紹指令前,先看一下faya串列LCD模組的外觀,它左邊的I2C串列埠SDA、SCL,用來連接Arduion的I2C腳位,進行I2C串列資料的傳輸,使用此模組前,需將Arduino的I2C腳位連到此這兩個埠 (UNO和NANO都是 A4 ==> SDA、A5 ==> SCL)。模組上有一可變電阻,用來調整文字的對比度。


因為使用者想要用的LCD顯示器可能規格不同,因此這個模組本身沒有附LCD顯示器,目前測試過16x2、20x2、20x4皆可使用,需特別注意的是選擇LCD模組時,16根排針需要焊在上方(不要買到左方的那種),如此才能和faya串列LCD模組結合!



 接下來介紹使用指令
  • #include<Wire.h>;
        使用I2C串列界面時,務必指示Wire.h函式

  • #include<LiquidCrystal_I2C.h>;
        使用串列LCD函式庫之前,記得先指示此函式標頭檔,此函式庫非內建,因此使用使函式前,請先將整個[LiquidCrystal_I2C]資料夾複製到Arduino底下的Libraries資料夾,本函式庫可從官方網站下載,也可從這邊下載。

  • LiquidCrystal_I2C lcd(address,m,n);  
       此指令宣告了串列LCD的I2C位址與顯示規格 

     類別名稱 : 可自行命名
     address : lcd位址,faya串列LCD模組的位址訂在0x20
     m : lcd行數
     n  :  lcd列數
 
     (例) 當我們把faya串列LCD模組上接16x2的LCD模組時,須呼叫以下程式

     LiquidCrystal_I2C lcd(0x20,16,2);

  • lcd.init();  
      此指令初始化LCD模組的設定,宣告後等同啟動了LCD顯示器

  • lcd.backlight();  
      此指令啟動LCD模組的背光功能


  • lcd.setCursor(m,n);  
     此指令設定游標的起始位置

     m : 第m+1行
     n  : 第n+1列

    (例) 當我們要把16x2LCD顯示器上的游標移到第5行第2列時,須下達以下指令

    lcd.setCursor(4,1); 

  • lcd.print("text");  
     此指令從游標位置開始列印文字字串

    (例) 當我們要印文字I love fayalab!,須下達以下指令

    lcd.print("i love fayalab!");

大家可以看到指令的方式非常簡潔,如果查看[LiquidCrystal_I2C.h]檔案(下圖),會發現有很多實用的指令可以呼叫,更多的指令請參考官方網站


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

LCD顯示器的原始控制方式,需透過14條訊號線(含電源),透過並列的方式控制LCD螢幕的顯示內容,這個方式不但佔用了控制器的資源,也拉了很多訊號線,全部連到Arduino時,會類似如下圖所示:


有鑑於此,我們可借助一顆IC來處理顯示的工作,除了降低控制器的負擔,還能將控制方式由並列轉成串列,減少拉線數量。

晶片 PCF8574 剛好能夠符合以上的需求,它將I2C串列訊號轉換成8位元的並列訊號,搭配Arduino的LCD函示庫後,控制器只要送出串列訊號,其它的工作就交給此晶片了。

在介紹模組的電路前,先看一下文字型LCD顯示器的腳位,它的腳位順序是固定的,無論16x2 / 20x2 / 20x4 的顯示器腳位順序皆相同,因此以上規格的文字型LCD顯示器,皆可連接到faya 串列LCD模組上。


LCD顯示器和晶片PCF8574的連接方式如下,接法是固定的,其中的可變電阻VR1用來調整文字的對比度。另外由於I2C的位址由埠A2/A1/A0決定,此電路將此3埠全接地,因此裝置的I2C位址為0x20,有興趣的人可以參考datasheet的第8.4節。


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

目標: 
(1) 在 16x2 LCD顯示器上第一列顯示 [HELLO]
(1) 在 16x2 LCD顯示器上第二列顯示 [WORLD]

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


(2) 訊號線連接
      Arduino_A4  ===>  串列LCD模組_SDA
      Arduino_A5  ===>  串列LCD模組_SCL


範例程式:

備註:
- 請記得將[LiquidCrystal_I2C]函示庫複製到Arduino的Libraries資料夾
- L27: 先把游標移到第1列第3行的位置,讓文字從此處開始列印出
- L29: 先把游標移到第2列第8行的位置,讓文字從此處開始列印出
- 文字顯示不明顯時,可調整可變電阻改變文字顯示的對比程度

範例結果:




討論:

由範例中可以發現串列式LCD顯示器的連線和控制方式非常的簡便,有助於我們更專注於資料面的處理。有興趣的朋友可以,可以參考.h檔或參考官方網站,多多利用內建的函式,讓畫面更活潑,例如文字跑馬燈如下所示,這個範例的程式可以在這邊下載!


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

1 則留言:

  1. 有朋友反應他們的LCD每行只顯示第一個字,遇到此問題時,請修改Libraries底下的 liquidCrystal_I2C.cpp檔案:

    首先找到
    LiquidCrystal_I2C::write(uint8_t value) {
    send(value, Rs);
    return 0;
    }
    將 return 0; 改成 return 1; 即可

    回覆刪除