[模組] 實現小尺寸 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 相關的源代碼 |
留言