Day 8: Touch Sensor


QT 113H datasheet


센서 동작법


Cs 의 값이 클수록 민감도가 커진다. 이때 Cs의 최대값은 0.1uF이다


3, 4번핀의 조합으로 캘리브레이션 시간을 조절할 수 있고, 토클 모드로 전환가능하다.
3,4번 조합이 적용되기 위해서 전원을 재공급해줄것

*캘리브레이션 기능:
3, 4 번이 HIGH(5V)에 연결되면 위의 표에서 보면 10s 간 센서판에 손을 터치한 상태로 출력을 발생한다.
다시 말해 10초간 계속 손을 대고 있다가 10초가 지나는 순간 2번핀의 출력은 0V로 떨어지게 되는데 이때 센서는 닿아있는 손을 포함하여 자기 보정을 하게 되는것이다. 손이 계속 닿아 있는 상태로 그 위에 손을 대보면 2번핀의 출력이 5V가 나가는것을 확인할 수 있다.

이 기능이 없다면 어떻게 될까?
터치센서를 주방용 열기구 온도 올리는 스위치로 만들어 놓았다고 해보자.
이때 누군가 스위치 위에 물을 업질렀다면 계속 온도가 올라가고 있을것이다. (물도 손과 같이 인식이 되기 때문이다.) 3,4번 핀을 둘다 하이로 설정해놓으면 10초후에는 온도를 더이상 올리지 않게 된다. 물이 있는 채로 센서는 초기화 되어 보정되기 때문이다.

5번 핀을 High = 5V에 연결하면 Gain이 약해지고
5번 핀을 Low = 0V에 연결하면 Gain이 세진다.


센서 사용 주의사항

센서 주면에 철, 물 등이 없어야한다

약간의 철이나 구리 등 전자장에 반응하는 물질을 배치함으로써 전자장의 방향을 컨트롤 할 수 있다. 하지만 세기는 약해진다.



센서에 전원을 공급할 때 될 수 있는 한 linear regulator 통해 독립전원을 공급할 것 ( 7805 등을 사용하여)


Cs를 통해 민감도를 조절하고 5번 핀으로 Gain을 조절하여 자기 상황에 맞도록 값을 조절한다.
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>


#define FOSC 16000000
#define BAUD 9600
#define UBRR FOSC/16/BAUD-1


#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_input(portdir,pin) portdir &= ~(1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)




// Initialize USART0
void init_USART0(unsigned int baud)
{
UBRR0 = baud; // Set Baudrate
UCSR0C = (3<<UCSZ00); // Character Size 8 bit
UCSR0B |= _BV(RXEN0) | _BV(TXEN0); // Receiver and Transmitter Enable
}


// Set Receive Interrupt Enable
void setRXCIE_USART0()
{
UCSR0B |= _BV(RXCIE0);
}


// Receive 1 byte Data
unsigned char receive_1byte_USART0(void)
{
loop_until_bit_is_set(UCSR0A, RXC0);
return UDR0;
}


// Transmit 1 byte Data
void transmit_1byte_USART0(unsigned char data)
{
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = data;
}


// Transmit String Data
void transmit_str_USART0(char *str)
{
while (*str != 0)
{
transmit_1byte_USART0(*str);
*str++;
}
}


// Transmit Four-Digit Integer
void transmit_4digit_USART0(int num)
{
unsigned char temp;
int digit = 1000;


while (digit != 0)
{
temp = num / digit;
transmit_1byte_USART0('0'+temp);
num -= (digit*temp);
digit /= 10;
}
}


// Transmit Digit Integer
void transmit_digit_USART0(int num)
{
char temp[4];
itoa(num, temp, 10);
transmit_str_USART0(temp);
}


int main()
{



//set_output(DDRC, LED);
init_USART0(UBRR); // initialize USART0
//output_high(PORTC, LED);
set_input(DDRC, PC5);


while (1)
{
char input;
input = PINC;


if ((input & 0b00100000) == 32)
{
transmit_str_USART0("A ha!");
transmit_1byte_USART0('\n');
_delay_ms(20);
}
}


return 0;
}
Comments