터치 센서 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를 통해
레지스터를 설정한다.
OUT핀은 active low로 설정되어 있다. active low/high 사용은 out핀
pull-up/pull-down 여부에 따라 판단하면 된다.
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;
}
[관련 포스트]
댓글
댓글 쓰기