[转]基于嵌入式Linux的通用触摸屏校准程序

发布于 2008-11-19 07:40:57

本文介绍的正是笔者在制作实际的嵌入式Linux数控机床人机接口过程中,提出的一套基于嵌入式Linux的通用触摸屏校准程序设计方案。

笔者基于S3c2410的ARM9内核,使用6.4英寸,640×480的触摸屏,嵌入式Linux内核2.4.20版本,设计了一套简单可行的方案,可以方便地实现触摸屏的校准。

校正原理及编程思路

1.校正原理

通常应用程序中使用的LCD坐标是以像素为单位的。比如说:左上角的坐标是一组非0的数值,比如(20,20),而右下角的坐标为(620,460)。这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量、缩放因子都与LCD坐标不同,所以,可以在某个函数(比如wait_event函数)中把物理坐标首先转换为像素坐标,然后再赋给POS结构,达到坐标转换的目的。图是LCD坐标和触摸屏的物理坐标的比较。

2.触摸屏校正思路

在wait_event函数中加入调试信息,开发板上运行Calibrate程序,那么触摸屏上任何一点的坐标就可以在主机监视屏上回显出来。于是,就采集到了4个角的物理坐标,假设是6.4英寸屏,640X480分辨率,则它们的像素坐标分别是(20,20)、(20,460)、(620,460)和(620,20)。这样,使用待定系数法就可以算出坐标系之间的平移关系。比如:

Vx = xFactor*Px + xOffset

Vy = yFactor*Py + yOffset

在笔者使用的开发板上,系数xFactor、yFactor、xOffset、yOffset的值分别为0.211、-16.27、-19/116、625.23。那么,在驱动函数中就可以按照这个变换关系把物理坐标转换为像素坐标赋给POS结构了。

因此,应用程序中首先弹出一个有若干点的界面,然后让用户去点,参照了Qt-embedded的对标程序,一般采用了触摸屏四个角的四个点。根据像素坐标和物理坐标计算参数,并保存到一个文件中。那么以后只要这个文件的内容有效则不必再经历屏幕校准的过程。

另外需要提醒的是,还要参照一下触摸屏驱动的读方法,确定从触摸屏读出的数据的组织格式。比如笔者使用的S3c2410的驱动的读方法就是返回8个字节表示一点的坐标,所以在驱动函数中首先要拼接才能得到点的物理坐标。

程序设计 以下是实现校准的简单构架。

1.给屏幕上放置4个定位点

通过直接给屏幕划两个短线交叉的方法来实现。下面的代码表示,在(20,20)点画一个十字光标。

DrawLine (15, 20, 26, 20, 0xf800);

DrawLine (20, 15, 20, 26, 0xf800);

2.获得每个定位点的值,也就是触摸屏采样的值

这个值要进行核准后,保存到PEN_CONFIG结构体中,其代码如下:

do {

// Calibrate Point 1 (20,20)

DrawLine (15, 20, 26, 20, 0xf800);

DrawLine (20, 15, 20, 26, 0xf800);

do

GetTouchvalue (tfd, &point[0].x, &point[0].y);

while (!(point[0].x > X1_SCOPE_MIN && point0].x < X1_SCOPE_MAX && point[0].y > Y1_SCOPE_MIN && point[0].y

...

//上面是第一个定位点处理的方法,因为有四个点,其他的也和此一样。只不过定位点和判断范围不同罢了。

//最后还要对定位的准确度进行判断。

} while(CheckCalibratePont());

3.保存PEN_CONFIG结构体到一个数据文件中

typedef struct

{

U32 xFactor;//X方向比例因子

U32 yFactor;//Y方向比例因子

U32 xOffset;//X方向偏移量

U32 yOffset;//Y方向偏移量

U8 scale; //缩放因子

RECT pan; //校正区域矩形

}PEN_CONFIG, *P_PEN_CONFIG;

在程序中通过计算获得此结构体,这些数据是非常重要的,它提供给驱动使用。以下是保存这个结构体的部分源码:

rt.left=(point[0].x + point[1].x)/2;

rt.top=(point[0].y + point[3].y)/2;

rt.right=(point[2].x + point[3].x)/2;

rt.bottom=(point[2].y + point[1].y)/2;

st.top=20;

st.left=20;

st.right=620;

st.bottom=460;

_PenCalibratePoint(&st,&rt);

// Open the file for writing config file

wfd = open("/var/pencfg", O_WRONLY);

if (wfd < 0) {

printf("Error: cannot open pencfg file.\n");

exit(1);}

printf("The pencfg file was opened successfully.\n");

if(write(wfd, &_gPenConfig, sizeof(_gPenConfig)) == sizeof(_gPenConfig)){

printf("Write Victor \n");}

close(wfd);

4.调试信息的输出

void GetTouchValue(int fp, int *x, int *y)

{ ts_event_t ts;

while (1) {

if(read(fp, &ts, sizeof(ts_event_t)) == sizeof(ts_event_t)){

if (ts.pressure == 0 ) break;

*x = ts.x;

*y = ABSY-ts.y;

}

}

printf (" x= %d, y= %d \n", *x, *y);//在屏幕上输出触摸屏坐标

}比例因子及偏移量的输出如下:

printf ("_gPenConfig.xFactor = %x _gPenConfig.yFactor = %x \n",_gPenConfig.xFactor, _gPenConfig.yFactor);

printf ("_gPenConfig.xOffset = %x _gPenConfig.yOffset = %x \n",_gPenConfig.xOffset, _gPenConfig.yOffset);

printf ("_gPenConfig.scale = %x\n",_gPenConfig.scale);

6.精度的控制

#define X1_SCOPE_MIN 45 //MIN和MAX的差值就是校准的精度

#define X1_SCOPE_MAX 75

#define X2_SCOPE_MIN 45

#define X2_SCOPE_MAX 75

#define X3_SCOPE_MIN 940

#define X3_SCOPE_MAX 970

...

7.如何运用

启动应用程序前先运行“触摸屏校准程序”,再运行MiniGUI程序。这样使得运行应用程序前,IAL可以预先提取到“触摸屏校准程序”中的数据。

嵌入式linux触摸屏校正命令,[转]基于嵌入式Linux的通用触摸屏校准程序相关推荐

  1. linux下sort命令使用详解---linux将文本文件内容加以排序命令

    转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...

  2. linux下测试ftp传输,linux下ftp命令使用详解---linux文件传输ftp命令

    linux下ftp命令使用详解---linux文件传输ftp命令 上一篇 / 下一篇  2010-12-18 09:15:35 / 个人分类:Linux ftp(file transfer proto ...

  3. linux vi 移动光标,linux中vi命令的光标移动操作linux网页制作 -电脑资料

    分享一篇关于linux中vi命令的光标移动操作的文章,有需要的朋友可以参考一下, 全屏幕文本编辑器中, 光标的移动操作无疑是最经常使用的操作了.用户只有熟练地使用移动光标的这些命令,才能迅速准确地到达 ...

  4. 基于嵌入式linux 的车载定位系统设计,基于嵌入式Linux的GPS车载定位导航系统设计...

    摘要: 随着汽车产业的迅速发展,GPS车载导航系统得到了越来越广泛的应用,已成为汽车上的重要配置,为用户提供便利.另一方面随着计算机技术.通信技术的迅猛发展,微型化和专业化成为发展的新趋势,嵌入式系统 ...

  5. 嵌入式linux音频播放器设计,基于嵌入式Linux下Madplay音频播放器设计论文.docx

    基于嵌入式Linux下Madplay音频播放器设计论文 滁州职业技术学院计算机应用技术专业毕业论文PAGE I 滁州职业技术学院信息工程系--2015届计算机应用专业毕业论文 姓 名: 周杰 班 级: ...

  6. linux图片浏览器设计目的,基于嵌入式Linu图片浏览器的设计与实现.doc

    基于嵌入式Linu图片浏览器的设计与实现 本科学生毕业论文(设计) 题目(中 文):基于嵌入式Linux图片浏览器的设计与实现(英 文):The design and implementation o ...

  7. 基于嵌入式Linux的测温系统,基于嵌入式Linux的图像监控系统

    设计.发明的目的和基本思路.创新点.技术关键和主要技术指标 随着嵌入式技术的快速发展,产生了基于嵌入式系统的远程图像视频监控系统,为信息产业,管理行业.监控行业提供了快捷.高效.廉价的服务.丰富的网络 ...

  8. linux使用ftp命令_如何使用Linux FTP命令

    linux使用ftp命令 FTP (File Transfer Protocol), is a protocol commonly used for the transfer of files bet ...

  9. linux ps -ef命令输出详解,Linux下ps命令的10个基本例子

    在Linux下ps命令是用于查看系统上运行的进程的最基本的命令之一.它提供了当前进程的同时,如用户ID,CPU使用率,内存使用率,命令名称等,它不显示实时数据,如top或htop命令的详细信息.但是, ...

  10. 【Linux】在命令行中查看Linux内核版本的几种方法

    如何知道自己的系统使用哪个Linux内核版本?以下是在Linux终端中检查内核版本的几种方法. 如何找到Linux内核版本 1.使用uname命令查找Linux内核 uname是用于获取系统信息的Li ...

最新文章

  1. 统治世界的 10 大算法,你知道几个?
  2. Office 2010的贴心功能:迷你翻译器
  3. 亲试虚拟机为REDHAT5装VM-tool
  4. [译] 使用 Web3 和 Vue.js 来创建你的第一个以太坊 dAPP(第二部分)
  5. [No0000166]CPU的组成结构及其原理
  6. a as as big rat_超好玩!12句英语绕口令,你能一口气读完几句?
  7. UVA216 ——dfs
  8. linux怎么删除代码库,是否有从代码库中删除第三方C和C库的好技巧或工具? (OS X或Linux)...
  9. Oracle data integrator 11g安装配置和一个实例应用指南pdf
  10. 软件公司产品营销大数据分析(下)
  11. python中迭代器_【Python】解析Python中的迭代器
  12. 【场景化解决方案】OA审批与金蝶云星空集成
  13. java应用程序由若干个_Java应用程序由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中。...
  14. SQL分组排序函数(组内分别排序)
  15. python培训班时间 费用-python培训班要多少钱?
  16. Java二维码生成工具类
  17. [置顶]使用scrapy_redis,自动实时增量更新东方头条网全站新闻
  18. vue生命周期和vue-resource
  19. activity 所需jiar包
  20. 《心流:最优体验心理学》读书笔记

热门文章

  1. 前后端分离和不分离图解
  2. stm32毕业设计 单片机车牌识别系统
  3. Excel查找快捷键:Ctrl+F
  4. linux 下查看硬盘容量
  5. idea好用的一些设置
  6. 动词的过去式过去分词表
  7. IDM下载浮动条使用详解
  8. 腾讯社交广告大赛总结
  9. 罗马数字转换python_Python实现将罗马数字转换成普通阿拉伯数字的方法
  10. 使用eolink优雅地进行API接口管理