Arduino の TFT でのキャリブレーションについて、備忘録として記録しました。
◇ ハードウェア環境
・Arduino MEGA2560 (ATmega2560 ATMEGA16U2)R3互換ボード ( 画像 ① )
・TFT LCDスクリーンモジュール、3.5インチ 320 X 480( 画像 ② )
このTFTを、MEGA へのシールドとして使用しました。( 画像 ③ )



◇ ソフトウェア環境
・キャリブレーション実行ソフト
MCUFRIEND_kbv ライブラリの[examples]フォルダにある
[ TouchScreen_Calibr_native.ino ] を使用する。
このMCUFRIEND_kbv ライブラリは、
ヘッダファイル [ MCUFRIEND_kbv.h ] の宣言部で
class MCUFRIEND_kbv : public Adafruit_GFX
となっているように、
Adafruit_GFX Class を継承している。
[ デフォルトのポートレートの向きでキャリブレーションを実行 ]

そのまま TouchScreen_Calibr_native.ino を実行すると、
ポートレートの向きで起動する( 画像 ④ 右の図 )

1回、画面をタッチすると、
キャリブレーションの画面( 画像 ⑤ 右の図)になるので指示通りに、
左上 → 左中 → 左下 →
中上 → 中下 →
右上 → 右中 → 右下
にある  +  を、順にタッチしていく。
(タッチすべきポイントは、 +  が白色になる )
《 以下は、シリアルモニタ での出力 》
TouchScreen.h GFX Calibration
Making all control and bus pins INPUT_PULLUP
Typical 30k Analog pullup with corresponding pin
would read low when digital is written LOW
e.g. reads ~25 for 300R X direction
e.g. reads ~30 for 500R Y direction
Testing : (A1, D7) = 33
Testing : (A2, D6) = 21
ID = 0x9486
左上 cx=895 cy=941 cz=391 X, Y, Pressure
左中 cx=886 cy=553 cz=547 X, Y, Pressure
左下 cx=893 cy=166 cz=638 X, Y, Pressure
中上 cx=516 cy=933 cz=314 X, Y, Pressure
中下 cx=507 cy=174 cz=606 X, Y, Pressure
右上 cx=152 cy=929 cz=202 X, Y, Pressure
右中 cx=149 cy=553 cz=414 X, Y, Pressure
右下 cx=143 cy=169 cz=564 X, Y, Pressure
*** COPY-PASTE from Serial Terminal:
const int XP=6,XM=A2,YP=A1,YM=7; //320x480 ID=0x9486
const int TS_LEFT=915,TS_RT=123,TS_TOP=950,TS_BOT=152;
後で詳しく説明しますが、この最後の1行
const int TS_LEFT=915,TS_RT=123,TS_TOP=950,TS_BOT=152;
が大事なのです。

まず、このキャリブレーション実行ソフトでは、
その実行結果のシリアルモニタの出力から分かるように、
x軸、y軸の原点と軸方向は右図( 画像 ⑥ )のようになっています。
それは、単純に、円を描き、円の中を塗りつぶすという
下記の様なプログラムを実行させると、
いわゆる「実際の座標系」が明確になります。
《 四隅に円を描いて塗りつぶすプログラム 》
MCUFRIEND_kbv tft;
uint16_t ID = tft.readID();
tft.begin(ID);
tft.setRotation( ORI_PORTRAIT ); // 縦長
tft.fillScreen(BLACK);
// 半径
int radius = 64;
// Left Top(青)
tft.drawCircle(0, 0, radius, TFT_BLUE);
tft.fillCircle(0, 0, radius, TFT_BLUE);
// Left Bottom(黄)
tft.drawCircle(0, 479, radius, TFT_YELLOW);
tft.fillCircle(0, 479, radius, TFT_YELLOW);
// Right Top(白)
tft.drawCircle(319, 0, radius, TFT_WHITE);
tft.fillCircle(319, 0, radius, TFT_WHITE);
// Right Bottom(赤)
tft.drawCircle(319, 479, radius, TFT_RED);
tft.fillCircle(319, 479, radius, TFT_RED);

このプログラムの実行結果は、右図( 画像 ⑦ )のようになります。
「画像 ⑥」と比べると分かるように
・座標原点
・座標の x,y値の増加方向
が異なります。
従ってキャリブレーションとは、
画面のタッチ位置と、ソフトウェア座標との
相違を埋めるための作業という意味合いがある訳なのです。
これにより、画面をタッチした時の位置を
ソフトウェアが、その管理する座標として
認識できるようになる訳なのです。

ウータンのブログ


ウータン(03/18)
zom(03/18)
ウータン(03/17)
ウータン(03/17)
ウータン(03/15)