ILI9341用タッチパネルコントローラーチップ、XPT2046をArduinoで使う
ピン接続 (SPI)
ILI9341とSPI用のピンは共有する
つまりT_DOピンはMISO(D12)、T_CLKピンはSCK(D13)、T_DINピンはMOSI(D11)
一度液晶側のMISO,SCK,MOSI用ピンとどこかで合流(接続)した後、上記のArduino側接続部に繋ぐ
T_CSピン、T_IRQピン任意のロジックピンに繋いで以下のように初期化
code:main.c
XPT2046_Touchscreen ts(CS_PIN, TIRQ_PIN); //
ライブラリ
タッチスクリーン用チップ、XPT2046の仕様
取得できるタッチ座標の最小/最大値は以下の通り
環境によって違うことがあるので要調整
code:main.c
#define TOUCH_SCREEN_TOP_X 280.0 // 左上 #define TOUCH_SCREEN_TOP_Y 300.0 // 左上 #define TOUCH_SCREEN_BOTTOM_X 3780.0 // 右下 #define TOUCH_SCREEN_BOTTOM_Y 3680.0 // 右下 次の関数で座標をILI9341のピクセル240*320に変換できる (convertTouchScreenToPx)
画面の左上().... todo
240*320に合わせないと、自分で表示したUIの上にタッチされたどうかの判定が困難
convertTouchScreenToPx を呼ぶ前に、10回程タッチ座標を取得して平均を出すと精度が上がるのでオススメ (getTouchPoint)
code:main.c
typedef struct PointPx PointPx;
struct PointPx
{
int x;
int y;
};
/**
* タッチされた座標を、240*320に変換して取得する
*
@param px 取得した座標を、格納する構造体のポインター
*/
void getTouchPoint(PointPx *px)
{
int count = 1;
float toucheSumX = 0.0;
float toucheSumY = 0.0;
TS_Point p;
while (ts.touched() && count <= 10)
{
p = ts.getPoint();
toucheSumX += p.x;
toucheSumY += p.y;
count++;
}
float caliblationX = toucheSumX / 10.0;
float caliblationY = toucheSumY / 10.0;
convertTouchScreenToPx(caliblationX, caliblationY, px);
}
/**
* 座標を、240*320に変換
*
* @param caliblationX タッチされた座標 TS_Point.x
* @param caliblationY タッチされた座標 TS_Point.y
*
@param px 変換した座標を格納する構造体のポインター
*/
void convertTouchScreenToPx(float caliblationX, float caliblationY, PointPx *px)
{
int x = ((caliblationX - TOUCH_SCREEN_TOP_X) / (TOUCH_SCREEN_BOTTOM_X - TOUCH_SCREEN_TOP_X)) * ILI9341_TFTWIDTH;
int y = ((caliblationY - TOUCH_SCREEN_TOP_Y) / (TOUCH_SCREEN_BOTTOM_Y - TOUCH_SCREEN_TOP_Y)) * ILI9341_TFTHEIGHT;
px->x = x >= ILI9341_TFTWIDTH ? ILI9341_TFTWIDTH : x;
px->y = y >= ILI9341_TFTHEIGHT ? ILI9341_TFTHEIGHT : y;
}
具体的なGUIの制御方法
後で書く