TOUCH_CALIBRATION Example using Arduino MEGA 2560 Board
Open UTOUCH_CALIBRATION Example from " UTOUCH --> Example --> Arduino --> UTouch_calibration.ion ", but before this put "UTFT" and "UTouch" folder in to arduino libraries folder like shown in image.
Note :- you must have to put “UTFT” and “UTouch” folder in to Arduino libraries folder like shown in image.before this remove the older "UTFT and "UTouch" folder from same directory if present.
Now open UTouch_calibration.ino example and select the board Arduino mega.go to"Tools-->Board-->Arduino mega 25260" like shown in image below.
Now compile the sketch and run sketch on board.
After successful compiling plugin display on arduino mega board and attach it with desktop or laptop and select the COM port generated by arduino mega board from “tools-->port” and upload the sketch on Arduino MEGA 2560 board. You can see following screen on display.
Use a stylus or something similar to touch as close to the center of the highlighted cross-hair as possible. Keep as still as possible and keep holding until the highlight is removed. Repeat for all cross-hairs in sequence. Further instructions will be displayed when the calibration is complete. Touch screen to continue.
NOTE :- Do not use your finger as a calibration stylus or the result WILL BE imprecise.
To use the new calibration settings you must edit the UTouchCD.h, file and change the “CAL_X, CAL_Y and CAL_S” values. The values are located right below the opening comment.
Arduino Code:
------------------------------------------------------------------------------------------------------------------------------------------
#include <UTFT.h>
#include <UTouch.h>
// Define the orientation of the touch screen. Further
// information can be found in the instructions.
#define TOUCH_ORIENTATION LANDSCAPE//PORTRAIT
// Initialize display
// ------------------
// Set the pins to the correct ones for your development board
// -----------------------------------------------------------
// Standard Arduino Uno/2009 Shield : <display model>,19,18,17,16
// Standard Arduino Mega/Due shield : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Due : <display model>,25,26,27,28
// Teensy 3.x TFT Test Board : <display model>,23,22, 3, 4
// ElecHouse TFT LCD/SD Shield for Arduino Due : <display model>,22,23,31,33
//
// Remember to change the model parameter to suit your display module!
UTFT myGLCD(CTE32HR,38,39,40,41);
// Initialize touchscreen
// ----------------------
// Set the pins to the correct ones for your development board
// -----------------------------------------------------------
// Standard Arduino Uno/2009 Shield : 15,10,14, 9, 8
// Standard Arduino Mega/Due shield : 6, 5, 4, 3, 2
// CTE TFT LCD/SD Shield for Arduino Due : 6, 5, 4, 3, 2
// Teensy 3.x TFT Test Board : 26,31,27,28,29
// ElecHouse TFT LCD/SD Shield for Arduino Due : 25,26,27,29,30
//
UTouch myTouch( 6, 5, 4, 3, 2);
// ************************************
// DO NOT EDIT ANYTHING BELOW THIS LINE
// ************************************
// Declare which fonts we will be using
extern uint8_t SmallFont[];
uint32_t cx, cy;
uint32_t rx[8], ry[8];
uint32_t clx, crx, cty, cby;
float px, py;
int dispx, dispy, text_y_center;
uint32_t calx, caly, cals;
char buf[13];
void setup()
{
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setFont(SmallFont);
myTouch.InitTouch(TOUCH_ORIENTATION);
dispx=myGLCD.getDisplayXSize();
dispy=myGLCD.getDisplayYSize();
text_y_center=(dispy/2)-6;
}
void drawCrossHair(int x, int y)
{
myGLCD.drawRect(x-10, y-10, x+10, y+10);
myGLCD.drawLine(x-5, y, x+5, y);
myGLCD.drawLine(x, y-5, x, y+5);
}
void readCoordinates()
{
int iter = 5000;
int failcount = 0;
int cnt = 0;
uint32_t tx=0;
uint32_t ty=0;
boolean OK = false;
while (OK == false)
{
myGLCD.setColor(255, 255, 255);
myGLCD.print("* PRESS *", CENTER, text_y_center);
while (myTouch.dataAvailable() == false) {}
myGLCD.print("* HOLD! *", CENTER, text_y_center);
while ((myTouch.dataAvailable() == true) && (cnt<iter) && (failcount<10000))
{
myTouch.calibrateRead();
if (!((myTouch.TP_X==65535) || (myTouch.TP_Y==65535)))
{
tx += myTouch.TP_X;
ty += myTouch.TP_Y;
cnt++;
}
else
failcount++;
}
if (cnt>=iter)
{
OK = true;
}
else
{
tx = 0;
ty = 0;
cnt = 0;
}
if (failcount>=10000)
fail();
}
cx = tx / iter;
cy = ty / iter;
}
void calibrate(int x, int y, int i)
{
myGLCD.setColor(255, 255, 255);
drawCrossHair(x,y);
myGLCD.setBackColor(255, 0, 0);
readCoordinates();
myGLCD.setColor(255, 255, 255);
myGLCD.print("* RELEASE *", CENTER, text_y_center);
myGLCD.setColor(80, 80, 80);
drawCrossHair(x,y);
rx[i]=cx;
ry[i]=cy;
while (myTouch.dataAvailable() == true) {}
}
void waitForTouch()
{
while (myTouch.dataAvailable() == true) {}
while (myTouch.dataAvailable() == false) {}
while (myTouch.dataAvailable() == true) {}
}
void toHex(uint32_t num)
{
buf[0] = '0';
buf[1] = 'x';
buf[10] = 'U';
buf[11] = 'L';
buf[12] = 0;
for (int zz=9; zz>1; zz--)
{
if ((num & 0xF) > 9)
buf[zz] = (num & 0xF) + 55;
else
buf[zz] = (num & 0xF) + 48;
num=num>>4;
}
}
void startup()
{
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx-1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx-1, 14);
myGLCD.print("UTouch Calibration", CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
if (dispx==220)
{
myGLCD.print("Use a stylus or something", LEFT, 30);
myGLCD.print("similar to touch as close", LEFT, 42);
myGLCD.print("to the center of the", LEFT, 54);
myGLCD.print("highlighted crosshair as", LEFT, 66);
myGLCD.print("possible. Keep as still as", LEFT, 78);
myGLCD.print("possible and keep holding", LEFT, 90);
myGLCD.print("until the highlight is", LEFT, 102);
myGLCD.print("removed. Repeat for all", LEFT, 114);
myGLCD.print("crosshairs in sequence.", LEFT, 126);
myGLCD.print("Touch screen to continue", CENTER, 162);
}
else
{
myGLCD.print("INSTRUCTIONS", CENTER, 30);
myGLCD.print("Use a stylus or something similar to", LEFT, 50);
myGLCD.print("touch as close to the center of the", LEFT, 62);
myGLCD.print("highlighted crosshair as possible. Keep", LEFT, 74);
myGLCD.print("as still as possible and keep holding", LEFT, 86);
myGLCD.print("until the highlight is removed. Repeat", LEFT, 98);
myGLCD.print("for all crosshairs in sequence.", LEFT, 110);
myGLCD.print("Further instructions will be displayed", LEFT, 134);
myGLCD.print("when the calibration is complete.", LEFT, 146);
myGLCD.print("Do NOT use your finger as a calibration", LEFT, 170);
myGLCD.print("stylus or the result WILL BE imprecise.", LEFT, 182);
myGLCD.print("Touch screen to continue", CENTER, 226);
}
waitForTouch();
myGLCD.clrScr();
}
void done()
{
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx-1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx-1, 14);
myGLCD.print("UTouch Calibration", CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
if (dispx==220)
{
myGLCD.print("To use the new calibration", LEFT, 30);
myGLCD.print("settings you must edit the", LEFT, 42);
myGLCD.setColor(160, 160, 255);
myGLCD.print("UTouchCD.h", LEFT, 54);
myGLCD.setColor(255, 255, 255);
myGLCD.print("file and change", 88, 54);
myGLCD.print("the following values. The", LEFT, 66);
myGLCD.print("values are located right", LEFT, 78);
myGLCD.print("below the opening comment.", LEFT, 90);
myGLCD.print("CAL_X", LEFT, 110);
myGLCD.print("CAL_Y", LEFT, 122);
myGLCD.print("CAL_S", LEFT, 134);
toHex(calx);
myGLCD.print(buf, 75, 110);
toHex(caly);
myGLCD.print(buf, 75, 122);
toHex(cals);
myGLCD.print(buf, 75, 134);
}
else
{
myGLCD.print("CALIBRATION COMPLETE", CENTER, 30);
myGLCD.print("To use the new calibration", LEFT, 50);
myGLCD.print("settings you must edit the", LEFT, 62);
myGLCD.setColor(160, 160, 255);
myGLCD.print("UTouchCD.h", LEFT, 74);
myGLCD.setColor(255, 255, 255);
myGLCD.print("file and change", 88, 74);
myGLCD.print("the following values.", LEFT, 86);
myGLCD.print("The values are located right", LEFT, 98);
myGLCD.print("below the opening comment in", LEFT, 110);
myGLCD.print("the file.", LEFT, 122);
myGLCD.print("CAL_X", LEFT, 150);
myGLCD.print("CAL_Y", LEFT, 162);
myGLCD.print("CAL_S", LEFT, 174);
toHex(calx);
myGLCD.print(buf, 75, 150);
toHex(caly);
myGLCD.print(buf, 75, 162);
toHex(cals);
myGLCD.print(buf, 75, 174);
}
}
void fail()
{
myGLCD.clrScr();
myGLCD.setColor(255, 0, 0);
myGLCD.fillRect(0, 0, dispx-1, 13);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.drawLine(0, 14, dispx-1, 14);
myGLCD.print("UTouch Calibration FAILED", CENTER, 1);
myGLCD.setBackColor(0, 0, 0);
myGLCD.print("Unable to read the position", LEFT, 30);
myGLCD.print("of the press. This is a", LEFT, 42);
myGLCD.print("hardware issue and can", 88, 54);
myGLCD.print("not be corrected in", LEFT, 66);
myGLCD.print("software.", LEFT, 78);
while(true) {};
}
void loop()
{
startup();
myGLCD.setColor(80, 80, 80);
drawCrossHair(dispx-11, 10);
drawCrossHair(dispx/2, 10);
drawCrossHair(10, 10);
drawCrossHair(dispx-11, dispy/2);
drawCrossHair(10, dispy/2);
drawCrossHair(dispx-11, dispy-11);
drawCrossHair(dispx/2, dispy-11);
drawCrossHair(10, dispy-11);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(255, 0, 0);
myGLCD.print("***********", CENTER, text_y_center-12);
myGLCD.print("***********", CENTER, text_y_center+12);
calibrate(10, 10, 0);
calibrate(10, dispy/2, 1);
calibrate(10, dispy-11, 2);
calibrate(dispx/2, 10, 3);
calibrate(dispx/2, dispy-11, 4);
calibrate(dispx-11, 10, 5);
calibrate(dispx-11, dispy/2, 6);
calibrate(dispx-11, dispy-11, 7);
if (TOUCH_ORIENTATION == LANDSCAPE)
cals=(long(dispx-1)<<12)+(dispy-1);
else
cals=(long(dispy-1)<<12)+(dispx-1);
if (TOUCH_ORIENTATION == PORTRAIT)
px = abs(((float(rx[2]+rx[4]+rx[7])/3)-(float(rx[0]+rx[3]+rx[5])/3))/(dispy-20)); // PORTRAIT
else
px = abs(((float(rx[5]+rx[6]+rx[7])/3)-(float(rx[0]+rx[1]+rx[2])/3))/(dispy-20)); // LANDSCAPE
if (TOUCH_ORIENTATION == PORTRAIT)
{
clx = (((rx[0]+rx[3]+rx[5])/3)); // PORTRAIT
crx = (((rx[2]+rx[4]+rx[7])/3)); // PORTRAIT
}
else
{
clx = (((rx[0]+rx[1]+rx[2])/3)); // LANDSCAPE
crx = (((rx[5]+rx[6]+rx[7])/3)); // LANDSCAPE
}
if (clx<crx)
{
clx = clx - (px*10);
crx = crx + (px*10);
}
else
{
clx = clx + (px*10);
crx = crx - (px*10);
}
if (TOUCH_ORIENTATION == PORTRAIT)
py = abs(((float(ry[5]+ry[6]+ry[7])/3)-(float(ry[0]+ry[1]+ry[2])/3))/(dispx-20)); // PORTRAIT
else
py = abs(((float(ry[0]+ry[3]+ry[5])/3)-(float(ry[2]+ry[4]+ry[7])/3))/(dispx-20)); // LANDSCAPE
if (TOUCH_ORIENTATION == PORTRAIT)
{
cty = (((ry[5]+ry[6]+ry[7])/3)); // PORTRAIT
cby = (((ry[0]+ry[1]+ry[2])/3)); // PORTRAIT
}
else
{
cty = (((ry[0]+ry[3]+ry[5])/3)); // LANDSCAPE
cby = (((ry[2]+ry[4]+ry[7])/3)); // LANDSCAPE
}
if (cty<cby)
{
cty = cty - (py*10);
cby = cby + (py*10);
}
else
{
cty = cty + (py*10);
cby = cby - (py*10);
}
calx = (long(clx)<<14) + long(crx);
caly = (long(cty)<<14) + long(cby);
if (TOUCH_ORIENTATION == LANDSCAPE)
cals = cals + (1L<<31);
done();
while(true) {}
}
------------------------------------------------------------------------------------------------------------------------------------------
Edit new value and save UTouchCD.h file and run “UTouch_QuickPaint.ino” or “UTouch_QuickDraw.ino” to check calibration done proper or not. If not then follow the all instruction one to two time gain. See the following video for more information.
0 Comments