Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
[转]基于嵌入式Linux的通用触摸屏校准程序
发布于 2008-11-19 07:40:57 浏览:3262
订阅该版
本文介绍的正是笔者在制作实际的嵌入式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.3k
关于作者
bernard
这家伙很懒,什么也没写!
提问
414
回答
5867
被采纳
59
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]The RFB Protocol中文版
7
[GUI相关]嵌入式系统中文输入法的设计
8
20081101 RT-Thread开发者聚会总结
9
嵌入式系统基础
10
linux2.4.19在at91rm9200 上的寄存器设置
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
如何用Ubuntu qemu跑zephyr_polling的蓝牙
2
分享一种很简单的不阻塞TCP发送方法
3
stm32c86使用串口3时无法正常读到中断的数据
4
如何用ART-PI跑zephyr_polling的蓝牙
5
掌上单片机实验室 – 基于 RTT 框架的第一个应用
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
AT
FinSH
Bootloader
CAN总线
ART-Pi
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
UART
RTC
freemodbus
rtthread
rt-smart
packages_软件包
I2C
WIZnet_W5500
flash
cubemx
FAL
定时器
BSP
AB32VG1
PWM
ADC
SDIO
msh
socket
LVGL
keil
Debug
C++_cpp
中断
编译报错
SFUD
SMP
MicroPython
本月问答贡献
出出啊
1431
个答案
317
次被采纳
小小李sunny
1342
个答案
267
次被采纳
crystal266
505
个答案
149
次被采纳
whj467467222
1212
个答案
142
次被采纳
张世争
590
个答案
135
次被采纳
本月文章贡献
出出啊
3
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
crystal266
1
篇文章
3
次点赞
whj467467222
2
篇文章
4
次点赞
张世争
6
篇文章
14
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部