로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2017/12/19
첨부#1 CapacitiveSensor.zip (7KB) (Down:1)
첨부#2 Capacitive-Sensor.ino (8KB) (Down:1)
ㆍ추천: 0  ㆍ조회: 106   
  M328-mini로 만드는 Touch 용량검출센서
M328-mini로 만드는 Touch 용량검출 센서
참조 : CapitiveSense Library Demo Sketch  http://playground.arduino.cc//Main/CapacitiveSensor?from=Main.CapSense
 저자 : Paul Badger 2008
 

Public Library로 만들어진 응용코드는 주함수에서 실행하기는 좋지만, 
Library 안에 소스코드가 들어있어 이해하고 발전시키기 어렵다.

Arduino Capacitive Touch Sensor 소스코드 개조 및 주석 ; KY Lee 2017,12,18 http://avrtools.co.kr/
안정된 검출작동과 검출값의 차이가 크게 나오는 외부 부품값과 코드에서 측정에 관계된 상수들의 조정이 중요하다.

Cap 측정에 사용하는 외부 부품은 저항 1개, Cap 1개, 전극 1개, 전극절연판 1개이다.
680K 저항은 출력핀에 연결하여 Cap을 충전한다, 잡음 안정용 39pF Cap은 입력핀과 GND에 연결한다. 
 
 

지금까지 Cap Touch Sensor 자료를 찾아서 시험해보았지만, 대부분 성능이 별로이거나,
복잡한 외부회로라든지, 비싼 IC를 별도로 산다든지,,,이래저래 대부분 사용하기 나빳다.
그러나 이 소스코드는 확실하게 접촉과 비접촉시의 검출값 차이가 크며 매우 안정된 작동을 한다.
이 정도 감도와 검출레벨의 차이가 나온다면 상용장치에서도 사용이 가능하다고 본다.
 
아래 화면사진은 samples=30, Range=80~240으로 검출한 값이다, 외부부품은 R=680K, C=39pF 이다.
더 안정된 값은 samples=240 Range=500~1000 R=680K C=39pF로 검출값은 300~500 정도 나온다.
 

 Arduino Touch Capactive Sensor 소스코드

#include "Arduino.h"    // 아래의 #define은 I/O 핀들의 비트를 직접처리하는정의 들이다.
#define PIN_TO_BASEREG(pin)             (portInputRegister(digitalPinToPort(pin)))
#define PIN_TO_BITMASK(pin)             (digitalPinToBitMask(pin))
#define IO_REG_TYPE uint8_t
#define DIRECT_READ(base, mask)         (((*(base)) & (mask)) ? 1 : 0)
#define DIRECT_MODE_INPUT(base, mask)   ((*((base)+1)) &= ~(mask), (*((base)+2)) &= ~(mask))
#define DIRECT_MODE_OUTPUT(base, mask)  ((*((base)+1)) |= (mask))
#define DIRECT_WRITE_LOW(base, mask)    ((*((base)+2)) &= ~(mask))
#define DIRECT_WRITE_HIGH(base, mask)   ((*((base)+2)) |= (mask))
 
int error;  // 오류값을 저장하는 변수
unsigned long  leastTotal;        // 최소값
unsigned int   loopTimingFactor;  // ms 타이머 상수(OSC 16MHz와 관련이 있다)
unsigned long  Timeout_Millis;    // ms 타이머의 최대값
unsigned long  AutocaL_Millis;    // 자동 교정값
unsigned long  lastCal;           // 과거값
unsigned long  total;             // 현재값
 
IO_REG_TYPE sBit;   // 송신핀의 port와 bit mask를 설정한다
volatile IO_REG_TYPE *sReg;
IO_REG_TYPE rBit;    // 수신핀의 port와 bit mask를 설정한다
volatile IO_REG_TYPE *rReg;
 
int Cap_Sense_OneCycle(void)    // 실제의 Cap 측정 함수이다
{
  noInterrupts();               // 정밀한 시간측정을 위해 모든 인터럽트를 차단
  DIRECT_WRITE_LOW(sReg, sBit); // 송신핀을 LOW로 출력
  DIRECT_MODE_INPUT(rReg, rBit);  // 수신핀을 입력으로 설정 (풀업 설정은 끈다)
 
  DIRECT_MODE_OUTPUT(rReg, rBit); // 수신핀을 출력모드로 설정
  DIRECT_WRITE_LOW(rReg, rBit); // 수신핀을 리셋 (LOW 출력 = Cap 방전 시작)
  delayMicroseconds(10);          // 측정할 Cap의 방전 시간 = 10us
 
  DIRECT_MODE_INPUT(rReg, rBit);  // 이제 수신핀을 입력으로 전환 (Cap 방전 끝)
  DIRECT_WRITE_HIGH(sReg, sBit);  // 이제 송신핀도 HIGH를 출력 (Cap 충전시작)
  interrupts();                   // 측정설정이 끝났으므로 모든 인터럽트를 허용
 
  // 측정하는 Cap에 충전된 전압을 수신핀의 입력레벨로 측정한다. 입력핀을 아날로그 비교기로 사용한다. 
  // 수신핀이 LOW 이고 시간초과가 아니면 계속 Cap을 충전하면서 타이머를 돌린다
  while ( !DIRECT_READ(rReg, rBit) && (total < Timeout_Millis) ) // 지금 측정 중
  { 
    total++;    // 측정값을 순환횟수에 따라 계속 +1 한다 (검출값의 가산누적)
  } // 수신핀이 HIGH로 측정되면 여기로 나온다 (total에 반복된 값이 들었다)
  if (total > Timeout_Millis) return -2; // 측정값이 시간초과이면 측정을 종료한다 (뒤의 함수는 실행 안함)

  // 측정값이 정상이면 Cap의 후처리를 한다.
  noInterrupts();
  DIRECT_WRITE_HIGH(rReg, rBit);    // 수신핀의 출력을 HIGH로
  DIRECT_MODE_OUTPUT(rReg, rBit);   // 수신핀을 출력모드로 변경 (Cap을 완전히 충전)
  DIRECT_WRITE_HIGH(rReg, rBit);    // dummy (짧은 시간 지연)
  DIRECT_MODE_INPUT(rReg, rBit);    // 수신핀을 입력모드로 전환 (Cap 충전을 끈다)
  DIRECT_WRITE_LOW(sReg, sBit);     // 송신핀에 LOW를 출력하여 Cap을 방전

   interrupts();
 
  #ifdef FIVE_VOLT_TOLERANCE_WORKAROUND // 5V 작동 환경이면
  DIRECT_MODE_OUTPUT(rReg, rBit);   // 수신핀을 출력모드로 변경
  DIRECT_WRITE_LOW(rReg, rBit);     // 수신핀에 LOW를 출력하여 Cap을 급속방전
  delayMicroseconds(10);            // 방전시간은 10us
  DIRECT_MODE_INPUT(rReg, rBit);    // Cap 방전이 끝났으므로 입력핀을 입력모드로 전환

  #else   // 5V 작동 환경이 아니면 수신핀을 LOW가 될때 까지 결과 값을 +1한다
  while ( DIRECT_READ(rReg, rBit) && (total < Timeout_Millis) )  
  { 
    total++;    // 송신핀은 LOW 상태로 Cap이 LOW가 될 때까지 방전하는 시간을 결과값에 더한다 (측정값을 증폭)
  }

  #endif
  if (total >= Timeout_Millis) return -2;     // 측정값이 시간초과이면 -2를 주함수로 보낸다
  else return 1;    // 정상이면 1을 주함수로 보낸다 (측정값은 total에 있다)
}
 
int led =13;    // 작동 감시용 LED 표시
void setup()
{
  // Capactor 센서의 초기화
  int sendPin =4;     // 출력핀은 4
  int receivePin =2;  // 입력핀은 2
 
  // 변수 초기화
  error = 1;
  loopTimingFactor = 310;   // 순환 타이머 상수 =310
  Timeout_Millis = (2000 * (float)loopTimingFactor * (float)F_CPU) / 16000000; // OSC는 16MHz 사용
  AutocaL_Millis = 20000;  // 자동교정 타이머는 2000ms

  sBit = PIN_TO_BITMASK(sendPin);         // get send pin's ports and bitmask
  sReg = PIN_TO_BASEREG(sendPin);         // get pointer to output register
  rBit = PIN_TO_BITMASK(receivePin);        // get receive pin's ports and bitmask
  rReg = PIN_TO_BASEREG(receivePin);

  pinMode(sendPin, OUTPUT);   // 출력핀 설정
  pinMode(receivePin, INPUT); // 입력핀 설정
  digitalWrite(sendPin, LOW); // 출력핀 리셋
 
  leastTotal = 0x0FFFFFFFL;   // 자동 교정을 시작
  lastCal = millis();         // ms 타이머를 시작
 
   pinMode(led, OUTPUT);    // D13을 led 출력으로 설정
   AutocaL_Millis = 0xFFFFFFFF;  // Cap 측정용 ms 타이머를 초기화 한다
  
   Serial.begin(115200);  // 작동 감시용 직렬포트의 속도는 115200 이다
   Serial.println("Arduino Capacitive Touch Sensor");    // Cap 측정시작 문자를 직렬포트로 보낸다
}
 
void loop()
{ // 주함수의 시작, setup 함수는 칩이 리셋되면 처음 1 번만 작동하고 여기로 온다.
  total = 0;
  int samples =240;      // Cap 검출 시료수를 240개로 Cap을 측정한다
  long start = millis();        // 현재 타이머 값을 저장

  if (samples == 0) total = 0;  // 무효
  if (error < 0) total = -1;       // 외부 회로 불량


  for (uint8_t i = 0; i < samples; i++)   // 샘플을 240 회 측정한다
  {
    if (Cap_Sense_OneCycle() < 0)  total = -2; // 변수값이 음수이면 시간초과
  } // total =0 무효, total =-1 회로불량, total = -2 시간초과, total >0 정상
 
  // 측정값이 최대값 보다 크거나 최대값의 10% 미만이면 다음 측정까지 자동교정값을 유지한다.
  if ( (millis() - lastCal > AutocaL_Millis) && abs(total  - leastTotal) < (int)(.10 * (float)leastTotal) )
  {
    leastTotal = 0x0FFFFFFFL;   // 측정값을 초기화
    lastCal = millis();         // 자동 교정값을 저장한다. 
  }
 
  if (total < leastTotal) leastTotal = total;   // 측정값이 바닥값 보다 작으면 바닥값을 변경,
  total =(total - leastTotal);   // 현재값 - 바닥값 = 검출값을 저장한다. 측정된 값은 total 이다.
  long ms_meas =millis() - start; // 측정에 소요된 시간을 계산한 다음 측정값으로 저장한다
  // Cap 측정 끝,
 
  // 이후의 처리는 total 측정값으로 필요한 작동을 시킨다.
  if (total >500 && total < 1000) // 측정한 값 500 ~ 1000을 검사. 연결된 부품값에 따라 다르다.
  {
    Serial.println(total);    // 측정된 값을 직렬포트로 보낸다
    digitalWrite(led,HIGH);    // 작동 감시용 LED 점등
    delay(10);                 // 10ms을 지연한다
  }

  else  // 만일 측정값이 범위를 벗어나면 LED를 끈다.
  {
      digitalWrite(led,LOW);   // 작동감시 LED를 끈다
      delay(30);               // 30ms을 지연한다
  }  
  // 주함수 끝 (여기서 주함수 처음으로 돌아가서 주함수를 반복한다.)
} // End of Arduino Code for the Touch Capaitive Sensing (C++ 코드의 끝)
 
이 자료의 무단 복제 및 무단 배포를 금지합니다.
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA

 AVRTOOLS
   
윗글 ESP12E-devKit로 만드는 WiFi 4 Relay 제어장치
아래글 ESP8266 MQTT Relay Control
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 390 0
41 STM32F103C 12비트 정현파 DDS V2 avrtools™ 2018/03/08 (목) 76 0
40 STM32F103C ILI9341 TFTLCD Scope V2 avrtools™ 2018/03/05 (월) 95 0
39 STM32F103C 32비트 ARM-CPU 2채널 Scope avrtools™ 2018/02/25 (일) 103 0
38 STM32F103C의 ILI9341 ILI9163 TFT-LCD 연결방법 avrtools™ 2018/02/19 (월) 103 0
37 STM32F103C+MCP4725 DDS 1KHz 정현파 발생기 avrtools™ 2018/02/18 (일) 109 0
36 STM32F103C 기판의 1~8CH ADC DMA 전송 avrtools™ 2018/02/17 (토) 102 0
35 STM32F103C 기판의 SSD1306 OLED 구동 avrtools™ 2018/02/16 (금) 102 0
34 STM32F103C ARM32 기판의 독립 IDE 소개 avrtools™ 2018/02/14 (수) 123 0
33 STM32F103C ARM32 기판의 Bootloader 개조 avrtools™ 2018/02/14 (수) 123 0
32 ESP32+OLED 기판과 PWM generator avrtools™ 2018/02/11 (일) 106 0
31 Wemos-Lolin32 Audio FFT Analyzer 제작 avrtools™ 2018/02/07 (수) 103 0
30 DUE SAM3X8E Audio FFT Analyzer 제작 avrtools™ 2018/01/30 (화) 114 0
29 AD5933 LCR-Impedance Analyzer 제작 avrtools™ 2012/03/17 (토) 634 0
28 ESP-01 펌웨어 업그레이드와 WiFi 2 Relay Control avrtools™ 2017/12/24 (일) 109 0
27 ESP12E-devKit로 만드는 WiFi 4 Relay 제어장치 avrtools™ 2017/12/23 (토) 117 0
26 M328-mini로 만드는 Touch 용량검출센서 avrtools™ 2017/12/19 (화) 106 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 577 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 693 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 636 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 601 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 611 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 638 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 533 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 820 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 807 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 445 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 592 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 865 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 592 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 485 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 960 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 613 0
9 Arduino DUE Pezo-SPeaker LCQ Meter 소스 avrtools™ 2016/01/24 (일) 399 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 630 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1841 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2772 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2298 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 674 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 628 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3879 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2846 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0