[模組] 實現小尺寸 TFT LCD 的控制 (以 ST7735 模組為例)

       一個系統是由多數個大大小小模組所構成,學習各類模組的開發有助於設計一個系統,其中 TFT LCD 模組是常見的人機溝通介面,接下來針對小尺寸模組(1.8吋)的硬體接線方式與程式調用進行說明。

模組硬體

       以 ST7735 晶片驅動的 TFT LCD 模組的控制介面是 SPI,再加上 DC 與 Reset 兩根控制接腳。模組與 Arduino UNO 相連的方式如下:

                CLK    -- pin 13 (SPI clock)
                MISO  -- pin 12 (因為 LCD 是輸出顯示,可以不接)
                MOSI  -- pin 11 (SPI MOSI)
                CS       -- pin 10 (SPI chip select)
                DC      -- pin 9   (Data/Command 這個接腳可換,與程式碼的調用有關)
                Reset   -- pin 8   (這個接腳可換,與程式碼的調用有關)

驅動程式封裝

        在 Arduino IDE 環境下,Adafruit 已經將 TFT LCD 控制的函數封裝起來了,並提供繪圖的 API 讓使用者調用。首先,我們要先下載 Adafruit TFT library,安裝成功後,可以在 \Arduino\libraries 路徑下找到 TFT 目錄夾,這底下就是 Adafruit 提供的函數庫。整個函數庫被封裝成圖一的架構,我們從最上層的 API 開始研究,先到 Arduino 網站上查詢https://www.arduino.cc/en/Reference/TFTLibrary 有哪些函數,發現 API 就是畫點、畫線、畫矩形、 畫圓、設定長與寬...等。
        Adafruit 將 Arduino 最上層的 API 實現在 GFX 這一層裡面,只要打開原始碼 Adafruit_GFX.cpp 可以查看所有繪圖功能的實現,無論是哪種尺寸的 LCD,GFX 這一層都能做到點線面的繪圖功能。承接 GFX 的底層就是 TFT LCD 的驅動程式,以 ST7735 面板為例,上面的控制晶片是 ST7735,所以 Adafruit 根據晶片資料寫了一套控制的驅動程式,組成一套完整的封裝架構。在這個架構下,把底層的驅動程式換掉,就能支援其他廠商的面板。
圖一:系統函數的封裝結構

著色

        background(R, G, B):這函數是根據 R, G, B 的數值配比填入背景顏色。
        stroke(R, G, B):根據 R, G, B 的數值配比設定點、線條或文字的顏色。
        fill(R, G, B):根據 R, G, B 配比,在矩形或圓形內填入顏色。

繪圖

        text(text, x, y):在座標 (x, y) 顯示一串文字,座標系統如下圖所示,(0, 0)在左上角。
        point(x, y):在座標 (x, y) 畫上一個點。
        line(x1, y1, x2, x2):從座標 (x1, y1) 到 (x2, y2) 畫一條直線。
        rect(x, y, w, h):從座標 (x, y) 繪製一個寬 w 和高 h 的矩形。
        circle(x, y, r):從座標 (x, y) 繪製一個半徑 r 的圓。
圖二:座標系統的定義

移植到樹莓派

       從 Arduino 環境下複製底下圖示的檔案到 Raspberry Pi 方案,在 Adafruit 程式結構下,我們移植時需要調整的部分有下列幾點:

        (1) Raspberry Pi 的 SPI 控制:原本的 Arduino SPI 驅動程式要換成樹莓派的 SPI 驅動,同時要先透過 raspi-config 工具開啟樹莓派的 SPI 介面。源代碼的驅動設定 SPI 速度,約 4 MHz

        (2) Raspberry Pi 的 GPIO:TFT LCD 有兩根額外控制的 pin (DC 和 RST),必須先透過 " gpio export pin out " 指令在樹莓派開啟 GPIO 配置。這兩根 GPIO 可以隨意選定,一旦訂好之後,程式調用時要正確地配對。

        (3) 在 #include 要將 Arduino 相關的標頭檔換成 <wiringPi.h> 和 <wiringPiSPI.h>

        (4) 在 Print.h 裡面,有些函數要調整,否則編譯時會出錯。Print 函數要實現內容,這樣顯示文字時才不會出錯。

圖三:TFT LCD 相關的源代碼

      將程式碼移植到樹莓派之後,我們調用上面著色的函數,開始畫直線、畫矩形、畫圓,再顯示文字,結果呈現如下圖,這代表我們已經移植成功了。
圖四:移植代碼到樹莓派

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

[應用] 藍芽 BLE client/server 架構:BLE remote controller