터치 센서 GT308L example code

본 글은 터치 센서 GT308L를 linux user 모드에서 컨트롤 하고 터치 이벤트를 받아오는 예제 코드를 싣고 있다.

GT308L은 위 datasheet상의 block diagram과 같은 구조로 되어 있다.
I2C를 사용하여 칩 설정을 하며, SIN1~8에서 터치 입력을 받고, 터치 이벤트가 있을 경우 INT 핀을 움직이며, 터치 상태는 OUT[1:8]을 통해 출력 된다.

터치 센서 설정 코드는 아래와 같다. 

/* 리셋, 인터럽트, OUT gpio
*/
#define gt308l_reset        7
#define gt308l_int           8
#define gt308l_out1        19

int init_gt308l()
{
uint8_t cmd[2] = {0,};
int i =0;
int fd = open_dev("/dev/i2c-1",(0xB8)>>1);
if(fd <= 0) return -1;

/*set gpios*/
gpio_export(gt308l_int);
gpio_set_outdir(gt308l_int,0);

gpio_export(gt308l_out1);
gpio_set_outdir(gt308l_out1,0);

gpio_export(gt308l_reset);
gpio_set_outdir(gt308l_reset,1);
/* reset gt308l
*/
gpio_set(gt308l_reset,0);
delay_ms(100);
gpio_set(gt308l_reset,1);
delay_ms(10);
gpio_set(gt308l_reset,0);
delay_ms(100);

/* set register setting
*/
// touch disable
cmd[0] = 0x03;
cmd[1] = 0x00;
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}

// set touch mode
cmd[0] = 0x04;
cmd[1] = 0x51; // 0x51 : single mode ,  0x55: multi mode
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}
// set pwm enable mode
cmd[0] = 0x05;
cmd[1] = 0x00; // touch statue data
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}

// Touch Engine Control
cmd[0] = 0x07;
cmd[1] = 0x11; // TOUCH_PER 0010 CAL_TIME 0001
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}

// set dev control 
cmd[0] = 0x3a;
cmd[1] = 0x25; // int_mode : level mode., out_pol : active low
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}

for(i = 0; i<8;i++)
{
//SENSITIVITY
cmd[0] = 0x40 + i;
cmd[1] = 0x08;//0x0C;
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}
}
// touch en
cmd[0] = 0x03;
cmd[1] = 0x1f;
if(write(fd, cmd,2) != 2)
{
perror("init_gt308l fail :");
close(fd);
return -1;
}

return fd;
}

int deinit_gt308l(int fd)
{
if(fd)
{
close(fd);
}
return 0;
}

센서가 연결된 I2C dev를 연 다음, 리셋, 인터럽트, OUT핀의 gpio를 설정한다. 예제 코드에서는 out 1번핀의 gpio만 사용되어 있다.
그 후 리셋 gpio를 사용하여 센서 칩을 리셋 한다. 리셋을 마친 후 i2c를 통해 레지스터를 설정한다.
<GT308L 레지스터 맵  from gt308l datasheet>

OUT핀은 active low로 설정되어 있다. active low/high 사용은 out핀 pull-up/pull-down 여부에 따라 판단하면 된다.  

<- active high 사용
<- active low 사용


GT308L의 초기화가 끝난 다음 버튼의 상태를 읽을 때는 설정된 OUT핀의 GPIO상태를 읽어 보면 된다.
위 설정 코드에서 OUT을 active low로 설정했기 때문에 gpio 상태 값이 0이 되면 터치 된 상태이다. 

#define touch_close 1
#define touch_far 0
#define touch_err -1

int probe_gt308l(int fd, int button_gpio)
{
if(fd > 0 && button_gpio > 0)
{
int val = gpio_get(button_gpio);
if(val == 0)
{
return touch_close;
}
else
{
return touch_far;
}
}
return touch_err;
}



[관련 포스트]

댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제

안드로이드(android) 전체 화면 시계 앱(clock app) 예제 코드

mkfs.fat Device or resource busy 에러 해결법