터치 센서 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)를 통해 윈도우 화면 미러링 방법

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

base64 인코딩 디코딩 예제 c 소스

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