Arduino DUEのタッチスクリーン操作

前回の記事「ARDUINO DUEでのTFTディスプレイの操作」では、 ArduinoでTFTディスプレイを操作するために設計されたUTFTベースライブラリのコマンドを詳細に検討しました。 この記事では、タッチスクリーンを操作できるベースライブラリへの追加であるUtouchについて説明します。







1.一般的な情報



このアドオンは、ベースライブラリと同じ作成者によって開発されました。 最新バージョンはここからダウンロードできます:

http://www.henningkarlsen.com/electronics/library.php?id=55

このアドオンは独立しておらず、UTFTベースライブラリの接続が必要です。



それでは、ほとんどのTFTディスプレイに装備されているタッチスクリーンで動作するように設計されたUtouchアドオンを詳しく見てみましょう。



2.タッチスクリーンの使用を開始する



Utouchアドオンを使用するには、プログラムにロードして初期化を実行する必要があります。 当然、UTFTベースライブラリをロードして初期化する必要があります。 前の記事で説明したディスプレイの場合、初期化は次のとおりです。

#include <UTFT.h>





UTFT myGLCD(CTE32HR,25,26,27,28);







次に、アドオンをロードしてオブジェクトを作成します-myTouchと呼ばれるタッチスクリーンです。 パラメーターとして、初期化コマンドは、TCLK、TCS、TDIN、TDOUT、およびIRQ信号が接続されているピン番号を受け取ります。 これらのパラメータは、ディスプレイの製造元またはディスプレイがコントローラに接続されているネームプレートから取得する必要があります。



タッチスクリーンのモデルでは、上記の信号はそれぞれピン6、5、4、3、および2に接続されています。ディスプレイが接続されているネームプレート回路は次のとおりです。

http://coldtears.lin3.siteonlinetest.com/files/CTE_DUE_shield.zip

表示モジュール自体の図は次のとおりです。

http://coldtears.lin3.siteonlinetest.com/files/3.2b.zip



したがって、表示するには、プログラムに次の行を挿入する必要があります。

#include <UTouch.h>





UTouch myTouch(6,5,4,3,2);







次に、void setup()プロシージャでディスプレイとタッチスクリーンを初期化する必要があります。

void setup() {





myGLCD.InitLCD();





myTouch.InitTouch();





}







InitTouchコマンドは、ベースライブラリのInitLCDコマンドと同様に、ディスプレイの垂直方向または水平方向を設定します。 デフォルトの向きは水平です。 すべて、今ではタッチスクリーンで作業できます。 タッチスクリーンが機能していることを確認できる非常に単純な例を考えてみましょう。 次のプログラムをコンパイルし、コントローラーメモリにロードします。



 #include <UTFT.h> UTFT myGLCD(CTE32HR,25,26,27,28); #include <UTouch.h> UTouch myTouch(6,5,4,3,2); void setup() { myGLCD.InitLCD(); myTouch.InitTouch(); myGLCD.clrScr(); myGLCD.fillScr(255,0,0); } void loop() { if (myTouch.dataAvailable()) { myGLCD.fillScr(0,255,0); }else {myGLCD.fillScr(255,0,0);} }
      
      





プログラムが起動すると、ディスプレイが赤に変わります。 いつでも画面をタッチします-ディスプレイが緑色に変わります。



3.タッチスクリーンのキャリブレーション



続行する前に、別の重要な手順を実行する必要があります-タッチスクリーンキャリブレーション。 Utouchアドオンに付属するプログラムの例には、UTouch_Calibrationと呼ばれる非常に重要な例が1つあります。

キャリブレーションを実行するには、メニューからこの例を開きます:

「ファイル->例-> UTouch-> Arduino-> UTouch_Calibration」



注意! コンパイルする前に、UTFT myGLCD(....)およびUTouch myTouch(....)の行をディスプレイに必要な行に置き換えることを忘れないでください。



また、キャリブレーション時には、 TOUCH_ORIENTATIONパラメーターを正しく選択する必要があります。 使用されるディスプレイモデルのこのパラメーターの値に関する情報は、Utouchライブラリに付属し、ルートフォルダーにあるUTouch_Supported_display_modules.pdfファイルに記載されています。 たとえば、ディスプレイの場合、ディスプレイ自体が水平方向であっても、PORTRAITを設定する必要があります。



注意! この値は、タッチスクリーンを調整する場合にのみ設定する必要があり、その後、画面の向きはディスプレイモジュールの向きと一致する必要があります。



起動時に、プログラムはディスプレイに説明テキストを表示し、タッチスクリーンへのタッチを待ちます。 次に、ディスプレイの端に8つの十字マークが表示され、中央にPRESSが付いた赤いウィンドウが表示されます。 開発者の指示により、強調表示された十字にタッチし、そのバックライトが消えて中央の赤いフィールドに「リリース」というメッセージが表示されるまでタッチを保持する必要があることが通知されます。 この単純な操作は、すべての十字架に対して順番に繰り返す必要があります。

ちなみに、開発者は、指を使わずにスタイラスまたは先の尖ったスティックでこの操作を実行することをお勧めします。これにより、キャリブレーションの精度が向上します。 キャリブレーションの最後に、16進形式の3つの数字が表示されます。 たとえば、次のとおりです。



CAL_X 0xBD95ECC8UL





CAL_Y 0x5EBC8000UL





CAL_S 0x0013F1DFUL







これら3つの値は、元々そこに指定されていたCAL_X、CAL_Y、およびCAL_S値の代わりに、UTouchアドオンのルートフォルダーにあるUTouch_CD.hファイルに配置する必要があります。 その後、ディスプレイは正しく動作します。



それでは、UTouchアドオンコマンドを詳しく見てみましょう。



UTouch-指定された名前でタッチスクリーンの基本クラスを作成します。パラメーターの品質は接続方法を示します。



コマンドの形式は次のとおりです。

Utouch _NAME_ (TCLK, TCS, TDIN, TDOUT, IRQ);







ここで、_NAME_は「タッチスクリーン」オブジェクトの任意の名前であり、アクセスするためのプレフィックスとして使用されます。TCLK、TCS、TDIN、TDOUT、IRQは、対応するタッチディスプレイ信号が接続されるピン番号です。



このコマンドを含む行は定義領域にあり、他のUTouchコマンドの前に配置する必要があります。 指定したオブジェクト名は、後続のすべてのUTouchコマンドのプレフィックスとして使用する必要があります。



InitTouch-タッチスクリーンを初期化し、水平方向または垂直方向を設定します。 方向識別子はパラメーターとして指定されます。



このコマンドでPORTRAITまたは0を指定すると、LANDSCAPEまたは1-水平を指定すると、垂直方向が選択されます。 タッチスクリーンの向きは、ディスプレイの向きと一致する必要があることに注意してください。 デフォルトでは(パラメーターなし)、コマンドは水平方向を設定します。



setPrecision-タッチスクリーン上のタッチポイントの座標を決定する精度を設定します。 精度識別子がパラメーターとして渡されます。



合計で4つのレベルの精度が定義され、1〜4の数字でエンコードされます。



PREC_LOW-低精度。

PREC_MEDIUM-平均精度;

PREC_HI-高精度。

PREC_EXTREME-非常に高い精度。



当然、精度のレベルは、座標を決定するのにかかる時間に反比例します。 ほとんどのタスクに最適なのはPREC_MEDIUMのレベルです。 開発者は、迅速な対応を必要とする操作に高い精度と非常に高い精度の使用を推奨しません。



精度レベルの違いは、UTouchライブラリに付属のUTouch_QuickDrawの例で説明できます。 このプログラムでは、タッチスクリーンを使用してディスプレイに描画できます。

 #include <UTFT.h> UTFT myGLCD(CTE32HR,25,26,27,28); #include <UTouch.h> UTouch myTouch(6,5,4,3,2); void setup() { myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(PORTRAIT); myTouch.setPrecision(PREC_MEDIUM); } void loop() { long x, y; while (myTouch.dataAvailable() == true) { myTouch.read(); x = myTouch.getX(); y = myTouch.getY(); if ((x!=-1) and (y!=-1)) { myGLCD.drawPixel (x, y); } } }
      
      





setPrecisionコマンドのパラメーターに異なる値を使用してこの例をコンパイルすると、違いがすぐにわかります。



dataAvailable-呼び出し時にタッチスクリーンへのタッチが修正されると、ブール値のtrueを返す関数。 残りの時間-falseを返します。



この関数は、接触の瞬間とその継続時間を決定するために使用できます。 セクション2で示した最初の例では、次の構成を使用します。

if (myTouch.dataAvailable()) {





myGLCD.fillScr(0,255,0);





}else {myGLCD.fillScr(255,0,0);}







dataAvailable関数への呼び出しが含まれていました。これにより、タッチの全時間にわたって維持されていた表示色の変更がトリガーされました。 別の例を考えてみましょう-タッチにかかる時間をミリ秒で測定します:



 #include <UTFT.h> UTFT myGLCD(CTE32HR,25,26,27,28); extern uint8_t BigFont[]; #include <UTouch.h> UTouch myTouch(6,5,4,3,2); void setup() { myGLCD.InitLCD(); myGLCD.setFont(BigFont); myTouch.InitTouch(); myGLCD.clrScr(); } void loop() { unsigned long timeOld; unsigned long timeNew; if (myTouch.dataAvailable() == true){ timeOld=millis(); while (myTouch.dataAvailable() == true) { timeNew=millis(); } myGLCD.clrScr(); myGLCD.printNumI(timeNew-timeOld, 100, 100); } }
      
      





タッチディスプレイがタッチされた時点で、プログラムは変数timeOldにミリス関数の現在の値を保存します。 さらに、タッチが保存されている限り、プログラムはtimeNew変数の現在のミリ秒値を常に更新します。 タッチが停止するとすぐに、これら2つの変数の差が表示されます。これは、ミリ秒単位のタッチ時間に等しくなります。



これで、「タッチスクリーンタッチ」イベントを操作できるようになり、タッチの瞬間、その継続時間、リリースの瞬間を判断できます。 タッチポイントの座標を取得するための残りはほとんどありません。 次のコマンドはこのためのものです。



read-タッチポイントの座標を決定する手順を開始します。



このコマンドはパラメーターを渡さず、値を返しません。 dataAvailable関数がtrueの場合に実行する必要があります。 結果の座標は生の形式で内部変数TP_XおよびTP_Yに保存されます。 ただし、このデータはディスプレイのサイズとその解像度に縮小されないため、タッチポイントの座標を取得するには、特殊な関数getXおよびgetYが使用されます。



getX-タッチポイントのX座標の値を、ディスプレイの左端に対するピクセル単位で返します。



getY-タッチポイントのY座標の値を、ディスプレイの上端に対するピクセル単位で返します。



キャリブレーションが正しく実行され、タッチスクリーンの精度が十分であれば、タッチポイントの座標は特定のピクセルの座標と一致する必要があります。 これら2つの関数の戻り値の型はintです。



次の例では、タッチスクリーンをタッチすると、タッチポイントの座標がピクセル単位で「raw」形式で表示されます。

 #include <UTFT.h> UTFT myGLCD(CTE32HR,25,26,27,28); extern uint8_t BigFont[]; #include <UTouch.h> UTouch myTouch(6,5,4,3,2); void setup() { myGLCD.InitLCD(); myGLCD.setFont(BigFont); myTouch.InitTouch(); myGLCD.clrScr(); } void loop() { int X_RAW; int Y_RAW; int X; int Y; if (myTouch.dataAvailable() == true){ myTouch.read(); X_RAW=myTouch.TP_X; Y_RAW=myTouch.TP_Y; X=myTouch.getX(); Y=myTouch.getY(); myGLCD.clrScr(); myGLCD.print("X", 100,80); myGLCD.print("Y", 200,80); myGLCD.print("PIX", 20,100); myGLCD.print("RAW", 20,120); myGLCD.printNumI(X, 100, 100); myGLCD.printNumI(Y, 200, 100); myGLCD.printNumI(X_RAW, 100, 120); myGLCD.printNumI(Y_RAW, 200, 120); } }
      
      





ここで、たとえば画面ボタンを押すなどの処理を行うには、タッチポイントの受信座標がディスプレイ上のボタンが占める領域内にあることを確認するだけで十分です。 別の例を次に示します。

 #include <UTFT.h> UTFT myGLCD(CTE32HR,25,26,27,28); extern uint8_t BigFont[]; #include <UTouch.h> UTouch myTouch(6,5,4,3,2); void setup() { myGLCD.InitLCD(); myGLCD.setFont(BigFont); myTouch.InitTouch(); myGLCD.clrScr(); } void loop() { int X; int Y; myGLCD.drawRect(100,100,150,150); if (myTouch.dataAvailable() == true){ myTouch.read(); X=myTouch.getX(); Y=myTouch.getY(); if (X>100 && X<150 && Y>100 && Y<150) { myGLCD.print("PRESSED", 100,200); }else{myGLCD.print(" ",100,200);} } }
      
      





プログラムは、ディスプレイに長方形のボタンを描画します。 ボタン領域のタッチスクリーンをタッチすると「PRESSED」が表示され、長方形の外側をタッチすると、碑文が消えます。



別の興味深い例。 このプログラムは、ディスプレイに長方形の「ウィンドウ」を描画し、右下隅をドラッグしてサイズを変更できます。 もちろん、これは完全なドラッグアンドドロップではありませんが、非常に似ています。

 #include <UTFT.h> UTFT myGLCD(CTE32HR,25,26,27,28); extern uint8_t BigFont[]; #include <UTouch.h> UTouch myTouch(6,5,4,3,2); int X=100; int Y=100; void setup() { myGLCD.InitLCD(); myGLCD.setFont(BigFont); myTouch.InitTouch(); myTouch.setPrecision(PREC_EXTREME); myGLCD.clrScr(); myGLCD.drawRect(0,0,X,Y); } void loop() { if (myTouch.dataAvailable() == true){ myGLCD.setColor(0,0,0); myGLCD.drawRect(0,0,X,Y); myTouch.read(); X=myTouch.getX(); Y=myTouch.getY(); myGLCD.setColor(255,255,255); myGLCD.drawRect(0,0,X,Y); } }
      
      





4.結論



したがって、タッチスクリーンを使用して、タッチの瞬間を特定し、タッチポイントの座標を特定し、ディスプレイに表示される簡単なコントロールを操作できます。 次回の記事では、UTFTライブラリへの別の追加であるUTFT_Buttonsを検討する予定です。UTFT_Buttonsを使用すると、テキストとグラフィックのオンスクリーンボタンを使用して作業を整理できます。



All Articles