Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
[转]基于嵌入式Linux的通用触摸屏校准程序
发布于 2008-11-19 07:40:57 浏览:3798
订阅该版
本文介绍的正是笔者在制作实际的嵌入式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.
"); exit(1);} printf("The pencfg file was opened successfully.
"); if(write(wfd, &_gPenConfig, sizeof(_gPenConfig)) == sizeof(_gPenConfig)){ printf("Write Victor
");} 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
", *x, *y);//在屏幕上输出触摸屏坐标 }比例因子及偏移量的输出如下: printf ("_gPenConfig.xFactor = %x _gPenConfig.yFactor = %x
",_gPenConfig.xFactor, _gPenConfig.yFactor); printf ("_gPenConfig.xOffset = %x _gPenConfig.yOffset = %x
",_gPenConfig.xOffset, _gPenConfig.yOffset); printf ("_gPenConfig.scale = %x
",_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可以预先提取到“触摸屏校准程序”中的数据。
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
3.8k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5934
被采纳
75
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
下载了0.23版本,编译s3ceb2410出错,提示lowlevel_init函数没实现
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-thread 火星一号的http发送json的物联网控制程序
2
【24嵌入式设计大赛】基于RT-Thread VisionBoard开发板的多模态AI机器人------开箱篇
3
【24嵌入式设计大赛】基于rt-thread的嵌入式多设备协同控制
4
【24嵌入式设计大赛】基于HPM5300-EVK的简易嵌入式辅助调试装置
5
【24 嵌入式设计大赛】基于英飞凌 Psoc6-EvaluationKit-062S2+ WIFI模块的DMX512协议转换器
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
rt_mq_消息队列_msg_queue
C++_cpp
at_device
MicroPython
ulog
本月问答贡献
踩姑娘的小蘑菇
5
个答案
2
次被采纳
张世争
8
个答案
1
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
rv666
7
个答案
1
次被采纳
zchong
6
个答案
1
次被采纳
本月文章贡献
Licy
3
篇文章
1
次点赞
jaffer
1
篇文章
5
次点赞
rtt_dmx
1
篇文章
5
次点赞
flytianya2010
1
篇文章
2
次点赞
BRICK PORTER
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部