FC2ブログ

タイトル画像

【 Arduino Memo:キャリブレーション 】

閲覧数:
2022.01.01(19:19) 75


【 Arduino Memo:キャリブレーション 】

Arduino の TFT でのキャリブレーションについて、備忘録として記録しました。

《 1.実行環境 》

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

画像 ① Arduino MEGA2560   画像 ② TFT LCDスクリーンモジュール 画像 ③ MEGA+TFT シールド

◇ ソフトウェア環境
・キャリブレーション実行ソフト
  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値の増加方向
が異なります。

従ってキャリブレーションとは、
画面のタッチ位置と、ソフトウェア座標との
相違を埋めるための作業という意味合いがある訳なのです。

これにより、画面をタッチした時の位置を
ソフトウェアが、その管理する座標として
認識できるようになる訳なのです。

















工事中
以下は工事中なのだワン!


ウータンのブログ

コーギー・ワンワン_Small_001 NoOneKnows
Arduino メモ トラックバック(-) | コメント(0) | [EDIT]
2022年01月01日
  1. 【 Arduino Memo:キャリブレーション 】(01/01)