'328p'에 해당되는 글 1건

  1. 2014.07.29 chapter 8, Capacitive Sensor
book/Make: AVR Programming2014. 7. 29. 01:48

책에서 구현한 방법의 원리를 짚고 넘어가자.

은박지로 capacitive sensor를 만들었다. 책에서는 그라운드에 연결되는 면은 크게, mcu의 입력이 되는 면은 작게 만들라해서 일단 그렇게. 중간엔 종이를 넣었다. 이면지 활용인데, 2009년도 영수증이네.



아래 도면과 같이 atmega328p에 연결. 100K ohm 대신 20K 사용.



코드는,



/*
   Capacitive touch sensor demo
*/

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/power.h>
#include "pinDefines.h"
#include "USART.h"


#define SENSE_TIME   25
#define THRESHOLD    8000


// -------  Global Variables ---------- //

volatile uint16_t chargeCycleCount;


// ------- Functions -------- //

void initPinChangeInterrupt(void)
{
	PCICR |= (1 << PCIE1);	/* enable Pin-change interrupts 1 (bank C) */
	PCMSK1 |= (1 << PC1);	/* enable specific interrupt for our pin PC1 */
}


ISR (PCINT1_vect)
{
	chargeCycleCount++;	/* count this change */

	CAP_SENSOR_DDR |= (1 << CAP_SENSOR);	/* output mode */
	_delay_us(1);				/* charging delay */

	CAP_SENSOR_DDR &= ~(1 << CAP_SENSOR);	/* set as input */
	PCIFR |= (1 << PCIF1);			/* clear the pin-change interrupt */
}


int main(void)
{
	// -------- Inits --------- //
	clock_prescale_set(clock_div_1);	/* full speed */
	initUSART();
	printString("==[ Cap Sensor ]==\r\n\r\n");


	LED_DDR = 0xff;
	MCUCR |= (1 << PUD);			/* disable all pull-ups */
	CAP_SENSOR_PORT |= (1 << CAP_SENSOR);	/* we can leave output high */

	initPinChangeInterrupt();


	// ------ Event loop ------ //
	while (1) {

		chargeCycleCount = 0;		/* reset counter */
		CAP_SENSOR_DDR |= (1 << CAP_SENSOR);	/* start with cap charged */

		sei();				/* start up interrupts, counting */
		_delay_ms(SENSE_TIME);
		cli();				/* done */

		if (chargeCycleCount < THRESHOLD) {
			LED_PORT = 0xff;
		} else {
			LED_PORT = 0;
		}

		printWord(chargeCycleCount);	/* for fine tuning */
		printString("\r\n");

	}	/* End event loop */

	return (0);				/* This line is never reached */
}


한마디로 요약하자면, SENSE_TIME 동안 센서의 캐패시터에 충전하고 방전시켜 그 사이클 수를 측정하여 터치를 인식. 터치가 되면 캐패시턴스가 증가하여, 방전시간이 길어져, 사이클 수가 줄어든다.

책에선 SENSE_TIME 은 50을, THRESHOLD 는 12000 을 지정했고, 운 좋게도 이 값으로 동작을 했다. 센서의 캐패시턴스 값, 연결하는 저항의 값에 따라서 THRESHOLD 값은 조정해야 한다. 빠른 인식을 원해서 나는 SENSE_TIME을 25ms 로 줄였고, 이에 맞춰 THRESHOLD 값도 변경하였다.




PC1 핀을 스코프로 들여다 봤다. 위 사진은 터치가 되지 않았을 경우, 아래 사진은 터치를 했을 경우다. 이 센서의 경우 무엇으로도 터치가 되었고, 터치되는 면적이 넓을수록 캐패시턴스가 증가하는 것 같다.

Posted by 쿨한넘