임베디드 터치스크린 에 대해서 공부를 하는데 .... 도저히 몇시간 동안 검색을 해봐도 시간낭비만 하고 있습니다. ㅠㅠ 제발 답변 좀 해주세요

dkssudxx의 이미지

1. X Y 축의 시작값과 최종값을 어떻게 계산 하는건지..?

2. 픽셀당 평균값.. 저게 왜 필요 한건지..?

3. 선언한 구조체에 어떤식으로 어떤 순서대로 어떤 값이 대입 되는지..?

4. 왜 하위 24비트 상위 16비트만을 사용 하는지..?

5. 화면을 터치 했는지 안 했는지를 어떻게 저 구문으로 알 수 있는건지..?

질문이 좀 많지만,, 몇시간 째 보고 있다가 이해가 안가서 올립니다..

고수님들의 답변 기다리고 있겠습니다. ㅠㅠ

#include
#include
#include
#include
#include
#include
#include
#include

#include
#include // 터치를 사용하기 위해서 추가된 헤더 파일

#define XRES 480 // LCD의 가로 해상도
#define YRES 272 // LCD의 세로 해상도

#define XMIN 310 // X의 시작값
#define YMIN 340 // Y의 시작 값
#define XMAX 1660 // X의 최종 값
#define YMAX 742 // Y의 최종 값

//픽셀당 평균 값 = (최대값 - 최소값) / 해상도
#define XDIFF (float)( ( XMAX-XMIN ) / (float)XRES ) // = 2.8125
#define YDIFF (float)( ( YMAX-YMIN ) / (float)YRES ) // = 1.4779

//터치 스크린 디바이스
#define TS_DEV "/dev/input/tsdev"

//터치 스크릔 입력 데이터 구조체 변수타입
typedef struct ts_sample
{
int x;
int y;
unsigned int pressure;
struct timeval tv;
}st_point;

int main()
{
int retval;
int ts_fd;
int x, y, pressure;

// 구조체 선언
st_point ts_point;

//터치스크린 디바이스 오픈
if( (ts_fd = open( TS_DEV, O_RDONLY ) ) < 0 )
{
perror(" Can't open ts dev \n");
exit(1);
}

// 터치 값을 계속 입력 받음
while(1)
{
retval = read(ts_fd , &ts_point , sizeof(ts_point));

// 상위 16비트 사용
x = (ts_point.x >> 16);
// 하위 24비트 사용
y = (ts_point.y & 0xfff);

// 누른 상태인지 파악
pressure = ts_point.x & 0xfff; // 눌렀는지 여부

// 입력된 값 - 최소값 / 평균값 (좌에서 우로)
x = (int)( ( x - XMIN ) / XDIFF );
// 해상도 - ( ( 입력된 값 - 최소값 ) / 평균 값 ) (아래에서 위로)
y = (int)( YRES - ( ( y- YMIN ) / YDIFF ) );

// 출력
printf("X : %d, Y = %d, Press : %d \n", x,y,pressure);
}

return 0;
}

snowall의 이미지

임베디드는 안해봤지만...

시작값이랑 최종값은 calibration 시킬 때 지정된 값으로 보이네요. 즉, 터치스크린과 LCD의 위치를 서로 맞춰주기 위한 값입니다. 터치스크린에서 내보낸 값이 LCD의 좌표값이랑 처음부터 일치할 리가 없겠죠?

그러니, 터치스크린에서 찍힌 어떤 값이 LCD의 어디에 대응되는지는 픽셀당 평균값으로 잡아줘야 합니다. 터치스크린이 300~1000사이의 값이고, LCD가 0~400이라면, y=ax+b의 공식을 써서 어딜 찍었는지 알아내야겠죠.

구조체에 어떤 순서로 대입되는지는 저도 잘 모르겠네요. 알아서 잘 대입해주겠죠?

왜 상위16비트 하위24비트만 쓰느냐는, 거기에 입력된 자료형이 그것만 사용하면 충분하기 때문이겠네요. 즉, 거기에 있는게 자료의 전부니까 그것만 갖고 처리하라는 뜻이겠죠. 이건 터치스크린에서 전달해주는 정보가 어떤지 봐야겠네요.

피할 수 있을때 즐겨라! http://melotopia.net/b

dkssudxx의 이미지

답변주셔서 정말 감사합니다,, ㅠ
전반적인 흐름은 이해가 가네요
그런데 시작값 최종값을 calibration 시킬 때 지정된 값이라고 하셨는데 그거는 보드를 만드는 회사에서 그렇게 지정해준건가요? 아니면 원래 사용자가 그 값을 찾아야하는건가요? 만약에 사용자가 직접찾아야하는거면 어떤 방식으로 찾아야 하는건지 알려 주실 수 있을까요??

snowall의 이미지

안드로이드 스마트폰에서 설정 잘 찾아보면 위치 보정하는 기능이 있는데요, 네 귀퉁이의 지정된 장소를 최대한 정확하게 찍으라고 합니다.

1차원에서만 예를 들자면, 두 지점을 정확하게 찍으면 됩니다. 즉, LCD화면상의 좌표 a와 b를 알고 있는데, a를 찍었더니 c라는 값이 터치스크린에서 나오고 b를 찍었더니 d라는 값이 나왔다고 치죠. 그럼 터치스크린에서 그 사이의 지점 x를 찍어서 알려줬다면, 그 점은 LCD의 어디에 대응되는가? 하는 문제입니다.

이건 간단한 1차함수 문제인데요, 그리고 간단한 선형 보간법(linear interpolation)인데요
다음과 같이 정합니다.

기울기 h = (a-b)/(c-d)

그럼 LCD위의 점 y는 y=hx+B에 대응됩니다. B를 찾으면 되는데, x=c일때 y=a가 나와야 하므로 B=a-(c*(a-b)/(c-d))가 됩니다.

이 방법을 2차원으로 확장하는건 직접 해 보시면 됩니다. 아니면 2차원에서 선형 보간법을 찾아보세요.

시작값이랑 최종값은 위의 작업을 하기 위해서 필요한 a, b, c, d값들의 일부가 됩니다. 뭐가 어떻게 되는지는 잘 생각해 보시면 알 수 있을거예요.

피할 수 있을때 즐겨라! http://melotopia.net/b

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.