2016年5月10日 星期二

{ 2.8 吋 (400x240) 電阻式觸模液晶螢幕使用說明 } [ 2/4 ] - 如何校正電阻式液晶螢幕

網頁最後修改時間:2016/05/12

以前用液晶螢幕做選單,較常用的方式就是使用文字加上外部按鈕做輸入與選擇。現在在大一點的液晶螢幕上會依觸控原理不同,分成電阻式、電容式、波動(聲波、紅外線)式等。下面網頁將會針對電阻式觸模液晶螢幕說明如何校正以及其重要性。

繼續往下看之前,請一定要先移動一下滑鼠到這個網頁看一下,了解電阻式與電容觸模螢幕最大的差異之處,以及優缺點:三大觸控螢幕主流技術圖解
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*
這個液晶螢幕的使用需要使用賣場改寫的函式庫與範例程式碼,不然執行時圖型、字型方向與顯示都會出現問題,即便使用原廠所提供的函式庫也是一樣 !

如果有遇到這個問題的使用者,可以參考 ILI932# 的資料手冊。雖然晶片支援的解析度不一樣,但是可以作為修改的參考,因為絕大部分的暫存器設定是相同的,只要注意一下螢幕顯示方向的部分,就可以解決大部分的問題,但要花一些時間做測試,提供給手邊有此零件的使用者做參考。

有購買商品的使用者,網頁中所需相關資料已放置於雲端硬碟,請根據網頁中所提的資訊下載相關程式碼做測試。

其餘的使用者,網頁有提供範例程式碼可供下載。
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

*********************************************************************************
2.8吋(400x240)電阻式觸摸液晶螢幕可至露天賣場訂購:
*********************************************************************************

硬體環境:
  • 2.8 吋 (400x240) 電阻式觸模液晶螢幕
  • Arduino UNO
其他板子只要接腳夠與液晶螢幕接的的話,我認為都可以用 ! 但是要特別確認使用的板子接腳與 UNO 和液晶螢幕相接的號碼是否相同,不同就要改一下,這可不能懶惰不去做,可以省下很多時間的 !

軟體環境:
  • 安裝編輯環境:Arduino IDE 1.6.5-r5, Arduino IDE 1.6.8
  • 安裝液晶螢幕函式庫:
    Streaming
    程式碼預設開啟除錯功能。不使用就
    //define DEBUG
    
    --------------------------------------
    TFTLCD-mPm
    檔案位於 {雲端硬碟}/arduino/codes/libraries
    確認 {My Documents}/Arduino/libraries 沒有其他的 TFTLCD 函式庫,不然會造成編譯時候的衝突或是出現編譯錯誤 !
    上面注意事項沒問題後,下載 TFTLCD-mPm.zip 後直接解壓縮到 {My Documents}\Arduino\libraries 目錄下,會產生一個 TFTLCD-mPm 的資料夾,裡面會包含下面幾個檔案
TFTLCD-mPm 函式庫檔案列表
  • 程式碼:TFTLCDScreen_Calibrarion
    下載 {雲端硬碟}/arduino/codes/TFTLCDScreen_Calibration 整個目錄,並解壓縮到 {My Documents}/Arduino/ 目錄下
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//* 截至 2016/05/09 為止,Arduino IDE ( https://www.arduino.cc/en/Main/Software ) 最新版本為 1.6.8,但不是新版本就可以用。每個程式都會將測試成功的 Arduino IDE 版本列在其中,所以若是與網頁中使用的版本不一樣而出現問題,就改用網頁建議的版本來試。

因為到現在個人認為用的最穩定的 Arduino IDE 版本是 1.6.5-r5 ! 如果之前在 Arduino IDE 寫程式編譯上傳成功,但是出現奇怪執行現象時,可以先換版本編譯再上傳試試,或許就會意料中的結果,而不是意想不到的 ! 
/*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

操作說明:

液晶螢幕的觸摸功能校正分為三個畫面:
  1. 操作說明畫面
  2. 觸摸邊界設定畫面
  3. 校正結果畫面
有程式碼的可以先編譯後上傳到 Arduino 板子中,先看一遍下面的影片,再根據影片下方的說明進行操作,可以省下自己摸索的時間。
程式執行之後會出現第一個白底黑字的操作說明頁,直接按下進入第二個畫面。

進入第二個畫面後,第一次校正千萬不要像我一樣使用手指按畫面上的那 8 個位置做校正,那是我圖方便與快速做的錯誤示範。電阻式觸摸螢幕校正正確需要用到觸碰筆 (需要前方有小圓點的),筆尖的地方要越準確越好的在螢幕上的 8 點 + 號點交叉處點下去。成功點下去且 Arduino 有抓到訊號,就會出現 HOLD! 要使用者繼續保持按下的狀態,直到螢幕出現 RELEASE 再放掉,跟著影片中的順序完成 8 個點的位置輸入。

*********************************************************************************
[ NOTE ]
使用觸碰筆做校正,由於位置在比較邊緣的地方,有時不會一次點擊就會成功,有時需要嘗試多次才會成功。記得要對準 + 中間再點下去,點下去的時候要持續並且注意螢幕中間有無出現 HOLD!,如果維持的時間有一點又沒有出現 HOLD!,那就重新再嘗試一次讓 Arduino 重新抓取訊號。
*********************************************************************************

所有的位置都輸入之後,就會自動切換到最後一個校正結果畫面,這就是我們要的數據 !

校正的越好,觸摸功能會發揮得越好 !

下面就開始比較制式的說明。因為測試程式碼可以下載,所以只挑重點講,如果不想看的話,就跳到最後面看取得數據那部份就行了 !

座標轉換:

我覺得這一節取這個標題,應該會讓一些人直接轉動滑鼠到其他地方吧 !

其實我也不想呀 ! 但是如果這是每一本書的第一章,想必老師都會先教吧 ? 不然怎麼知道後面其他章內容大概是什麼 !

看起來有點深度,其實只是需要解釋的東西,不需要什麼數學運算,重點是在校正之後的數值。

電阻式觸摸液晶螢幕依照上面提供的連結來說明 (注意畫底線的部分) 可以了解:
電阻式螢幕在兩層導電層之間有電壓差異,形成一個電場;按壓時會讓上下層的電極接觸,造成短路和電阻改變,此時控制器測得面板電壓變化,而計算出接觸點位置、進而輸入對應指令。簡單來說,使用者觸摸螢幕表面時,上層受到手指或筆尖的壓力略微下凹、與下層接觸;電腦透過電阻變化,反推出接觸點在哪裡、代表什麼功能。
因為電阻式螢幕透過壓力操控,所以不一定要用手來控制,筆、信用卡等都可以操作,即使戴上手套也沒關係;不過如果「摸」得太輕,電阻式螢幕不會有反應,要用輕戳才行。

所以說,電阻式觸摸液晶螢幕就是在螢幕上方嵌入了可變電阻,只要能知道電阻的大小就能知道手指在螢幕上觸摸的位置。對於這片液晶螢幕來說 ( 跟影片上螢幕放置的方向一樣 ),USB 埠在右下方,觸摸座標的原點位於左下方是固定不變的,這一點非常重要 !
觸摸座標原點
但對於需要讓圖型或是字型轉換方向來符合不同螢幕擺設來說,圖型或是字型的座標原點都是不一樣的。

所以若是要在圖形中啟用觸摸功能,就需要將觸摸座標轉換到圖形座標,才能得知使用者要按下的圖形是哪一個 ? 關於這部分更詳細的說明,請參考部落格另一篇網頁 "{ 2.8 吋 (400x240) 電阻式觸模液晶螢幕使用說明 } [ 3/4 ] - 塗鴉板:圖形與觸摸功能的結合"。

量測阻抗提高觸摸力度的精確度:

電阻式的觸摸螢幕,觸摸時需要力度,所以在程式碼中可以看到這四條線與 Arduino UNO 連接腳位的定義。
TFTLCDScreen_Calibration.ino, line 55 - 63
#define YP A1   //[A1], A3 for ILI9320, A2 for ST7789V 
#define YM 7    //[ 7], 9             , 7
#define XM A2   //[A2], A2 for ILI9320, A1 for ST7789V
#define XP 6    //[ 6], 8             , 6

// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one (FT1509) we're using, its 740 ohms across the X plate
TouchScreen tscr = TouchScreen(XP, YP, XM, YM, 740);

拿出電表量測 (Arduino UNO) <A2><D6> 之間的電阻,盡量調整電阻擋位越小越好,重複量測且維持一段時間等數據穩定,然後將此值輸入到上面程式碼最後一行的最後一個參數中;我手邊這片量到的數值是 740 Ohm。

電阻式的觸摸取值是透過 TouchScreen.getpoint() 函式,有想要研究的再進入函式去看。

取得校正數值:

每一個點的校正必須跟影片中的順序一樣,才能讓取得的這些點可以用來計算正確的左、上、右和下邊界。
TouchScreen_Calibration.ino, line 371 - 381
    if ((TOUCH_ORIENTATION == PORTRAIT) ^ (swapxy != 0)) {
        clx = (rx[0] + rx[1] + rx[2]) / 3;
        crx = (rx[5] + rx[6] + rx[7]) / 3;
        cty = (ry[0] + ry[3] + ry[5]) / 3;
        cby = (ry[2] + ry[4] + ry[7]) / 3;
    } else {
        clx = (ry[0] + ry[1] + ry[2]) / 3;
        crx = (ry[5] + ry[6] + ry[7]) / 3;
        cty = (rx[0] + rx[3] + rx[5]) / 3;
        cby = (rx[2] + rx[4] + rx[7]) / 3;
    }

最後跳到 done() 函式完成所有數據的輸出。而在最後一個畫面裡,中間那一個才是我們所需要的數值 ( 也就是下面紅字的四個值 )。將位於 (LEFT - RT) 的數值映射到 0 - 400 (螢幕長邊),而將位於 (TOP - BOT) 的數值映射到 0 - 240;這些映射的結果將會與液晶螢幕顯示的方向有關,後面相關的部落格網頁會再提到。
Sketch is LANDSCAPE     400 x 240
LEFT        242        RT        970        -2.61
TOP          872        BOT     244        -1.81
觸摸螢幕校正結果
Serial Monitor 的輸出畫面
校正輸出 Log
結論:

雖然程式碼落落長 !但是絕大部分都是在螢幕上顯示線條與文字,這些我都已經重新調好,不需要再改維持現狀就好。但是重這個程式碼範例可以學到線條、文字顯示的函式使用方法,有需要用到可以深入看一下。

接下來我們利用這一篇所得到的數值,繼續下一篇結合液晶螢幕與觸摸功能的說明。

<<部落格相關網頁連結>>

沒有留言:

張貼留言