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








 게시판 검색





 
 
회원등록 비번분실


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

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2016/02/07
첨부#1 CapacitiveSensor.zip (5KB) (Down:447)
첨부#2 DpSoilCapTempSensor_V_1_0.ino (5KB) (Down:418)
ㆍ추천: 0  ㆍ조회: 335   
  Arduino 정전용량식 수분센서의 분석과 제작
Arduino 정전용량식 수분센서의 분석과 제작

QTouch 방식의 정전용량 검출방법


아트멜사에서 발표한 접촉식 용량검출 센서 QT100 칩이 있다.
스위치 검출용 QT100은 아날로그 값이 아닌 디지털 출력만 된다.
그러나 QTouch는 정전용량을 검출하는 원리를 이해하기 좋다.

QTouch 방식의 정전용량 검출회로는 회로가 간단하고 ADC도 필요없다.   
샘플링 캐패시터 Cs는 22 nF 충전저항 Rs는 1 Kohm이다. 
측정하는 용량보다 샘플 캐패시터의 용량이 크므로 충분히 평균된 측정이 된다.
 

 
QTouch 방식의 정전용량 측정 순서
1. SNSK와 SNS 핀을 모두 low로 출력하여 샘플 캐패시터 Cs를 방전한다. 
2. SNSK 신호를 +로 pull-up 하여 전극(Electrode)의 정전용량 Cx를 충전한다
3. SNSK의 pull-up을 끄고, SNSK 핀을 3-state로 전환하여 Cx와 Cs에서 분리시킨다.
4. SNS의 출력을 low로 하여 Cx의 충전전하를 Cs로 공유한다.
5. SNSK를 입력으로 전환하고, Cs에 공유된 전압이 high인지 검출한다.
6. SNSK 핀의 로직이 high로 검출될 때 까지 반복된 2~5단계의 모든 샘플링 시간이 Cx다.  

QTouch 정전용량 검출센서의 Simulation 회로
 
회로에서 좌측의 전원을 8 MHz의 16% 펄스폭으로 Cx를 충전하는 스위치는 SNSK 핀
측정용량 Cx와 병렬로 연결되는 샘플용량 Cs의 GND 측을 연결하는 스위치는 SNS 핀
SNSK 핀은 Cx를 충전하고, 충전이 끝나면 Cs의 충전된 공유전압의 레벨을 로직으로 측정한다. 

정전 용량식 수분 센서 #1
4개의 정전용량 검출전극과 3 개의 온도센서를 깊이 별로 설치하였다.
깊이별로 토양의 온도를 수분과 함께 측정한다
Arduino에서 QTouch 방식으로 4개의 측정전극과 3개의 1 wire 온도센서를 구동한다.
 
2 개의 깊이에 2 개씩 모두 4개의 전극를 하나의 센서에 만든 수분검출 센서의 회로
참조 :  Measure soil temperature in 3 points with DS18S20 in capacitive area.
  

아듀이노 소스코드와 정전용량 검출 library. (첨부파일 #1)
CapacitiveSensor.cpp는 CapacitiveSensor의 라이브러리 소스이다.
CapacitiveSensor.h는 라이브러리 실행함수 CapacitiveSensor.cxx의 헤더파일이다.
라이브러리의 검출조건을 수정하려면 CapacitiveSensor.h의 매개변수를 수정해야 한다.

ibrary 파일은 Arduino 스켓치 폴더 아래에 소스와 같이 있어야 한다.

 
연결된 Arduino에서 검출에 사용하는 포트는 D2, D4, D6, D8 이다.
D4와 D2, D4와 D6 ,D4와 D8 사이에는 10 Mohm의 저항과 220 pF의 캐패시터를 각각 추가한다.
QTouch 구동이므로 캐패시터는 두개의 핀과 병렬로 연결하고 저항른 전극과 직렬로 연결한다.
 
초기화는 첨부 라이브러리와 라이브러리의 ms 타이머를 설정하는 2 개다.
  #include <CapacitiveSensor.h>  // 라이브러리를 주함수에 첨부한다
void setup(){

  cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);  //자동교정 타이머 1을 리셋한다
}
 
정전용량을 측정하는 주함수는 다음과 같다. (설명의 편의상 검출 이외의 다른함수는 생략했다)
void loop() {
  long start = millis();  // 시간값이 측정하는 용량이므로 ms 타이머를 시작한다
  long total1 =  cs_4_2.capacitiveSensor(30);  // D4와 D2핀을 구동하고 용량을 측정한다
  long total2 =  cs_4_6.capacitiveSensor(30);  // D4와 D6핀을 구동하고 용량을 측정한다
  long total3 =  cs_4_8.capacitiveSensor(30);  // D4와 D8핀을 구동하고 용량을 측정한다
  Serial.print(millis() - start);  //자동교정 타이머 1을 리셋한다

}
 
다음 CapacitiveSensorSketch,ino는 CapacitiveSensor.h를 사용방법을 설명한 코드다.
#include <CapacitiveSensor.h>

/*
 * CapitiveSense Library Demo Sketch
 * Paul Badger 2008
 * Uses a high value resistor e.g. 10M between send pin and receive pin
 * Resistor effects sensitivity, experiment with values,

 * 50K - 50M. Larger resistor values yield larger sensor values.
 * Receive pin is the sensor pin - try different amounts of foil/metal on this pin
 */


 // 10M resistor between pins 4 & 2, pin 2 is sensor pin, add a wire and or foil if desired
CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2);       

 // 10M resistor between pins 4 & 6, pin 6 is sensor pin, add a wire and or foil
CapacitiveSensor   cs_4_6 = CapacitiveSensor(4,6);       

// 10M resistor between pins 4 & 8, pin 8 is sensor pin, add a wire and or foil
CapacitiveSensor   cs_4_8 = CapacitiveSensor(4,8);       

 
void setup() {
   cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     // turn off autocalibrate on channel 1 - just as an example
   Serial.begin(9600);
}


void loop() {
    long start = millis();
    long total1 =  cs_4_2.capacitiveSensor(30);
    long total2 =  cs_4_6.capacitiveSensor(30);
    long total3 =  cs_4_8.capacitiveSensor(30);


    Serial.print(millis() - start);        // check on performance in milliseconds
    Serial.print(" ");                    // tab character for debug windown spacing

    Serial.print(total1);                  // print sensor output 1
    Serial.print(" ");
    Serial.print(total2);                  // print sensor output 2
    Serial.print(" ");
    Serial.println(total3);                // print sensor output 3


    delay(10);                             // arbitrary delay to limit data to serial port
}

검출하는 용량이 증가하면 검출 전압은 내려간다. 용량 센서는 만들기 어렵지 않다.
작은 캐패시터의 충전은 빠르고, 그 반대인 방전도 마찬가지다.

절연된 유전체를 통해 토양의 수분함량을 비접촉으로 측정하므로 전극이 오래간다. 
그래서 정전용량 검출방식은 저항검출 방식보다 신뢰성이 있다. 실제로 이방식은 매우 넓게 사용된다.
첨부파일 #2는 용량측정에 실제로 사용된 소스이다. (첨부파일 #2)
 
정전용량  검출 library의 상세한 설명
용량측정 함수가 내장된 CapacitiveSensor.cpp 라이브러리의 이해는 매우 중요하다.
 
// CapacitiveSense.h v.04
#include "CapacitiveSensor.h"
 
// 처리함수를 생성하고 인수를 설정한다.
CapacitiveSensor::CapacitiveSensor(uint8_t sendPin, uint8_t receivePin)
{

 // 인수를 초기화 한다
 error = 1;
 loopTimingFactor = 310;  // 반복시간 변수
 CS_Timeout_Millis = (2000 * (float)loopTimingFactor * (float)F_CPU) / 16000000;
 CS_AutocaL_Millis = 20000;  // ms 자동교정 변수의 초기값 

 
 pinMode(sendPin, OUTPUT); // SNS 출력핀은 Cs 연결 스위치다.
 pinMode(receivePin, INPUT); // SNSK 측정입력 핀을 입력으로 전환
 digitalWrite(sendPin, LOW); // SNS 핀을LOW로 출력한다 => Cs를 연결

 
 sBit =  digitalPinToBitMask(sendPin); // SNS 핀의 bitmask
 sReg = PIN_TO_BASEREG(sendPin); // SNS 핀의 포트 pointer

 rBit = digitalPinToBitMask(receivePin); // SNSK 핀의 bitmask
 rReg = PIN_TO_BASEREG(receivePin);  // SNSK 핀의 포트 pointer

 
 // 용량을 측정하는 ms 타이머의 시작값은 -1 이다.
 leastTotal = 0x0FFFFFFFL;   // 측정값을 -1로 초기화(autocalibrate 시작)
 lastCal = millis();         // millis() 타이머를 읽어서 시작값으로 저장(start)
}

 
// Public 함수(주 함수에서 부르는 함수)
// 변수 sample로 전달된 수만큼SenseOneCycle()를 매번 실행한다 
long CapacitiveSensor::capacitiveSensor(uint8_t samples)
{
 total = 0;
 if (samples == 0) return 0;   // 주함수에서 요청된 측정횟수를 만족하면 측정을 정상으로 종료한다
 if (error < 0) return -1;        // 측정 pin의 불량


 // 반복해서 측정한다음 결과를 매번 total 값에 더한다(평균)
 for (uint8_t i = 0; i < samples; i++) {    

  // variable over timeout
  if (SenseOneCycle() < 0)  return -2;  // 용량 측정을 1회 호출한다
}

 
  // 자동 교정 Millis() 함수
  // 측정값 total은 baseline의 10% 이하다.
  // 측정값이 들어오면 교정을 시도한다
  // lastCal에는 계속 증가하는 ms 타이머의 시작값이 들어 있다.
  // CS_Autocal_Millis는20,000 이다(바꿀 수 있다)
  if ( (millis() - lastCal > CS_AutocaL_Millis)
   && abs(total  - leastTotal) < (int)(.10 * (float)leastTotal) ) {

   leastTotal = 0x0FFFFFFFL; // autocalibrate를 -1로 리셋
   lastCal = millis();       // ms 타이머를 읽어서 시작값으로 저장한다
  }

 
 // 측정값에서 baseline(측정된 용량이 없을 때의 값)을 감산한다
 // 측정된 값에서 바닥값(Cx의 하드웨어 초기값)을 뺀다.

 if (total < leastTotal) leastTotal = total;
 return(total - leastTotal);

}
 
// 측정은 아래의 SenseOneCycle()를 samples 만큼 반복하여 호출한다.
long CapacitiveSensor::capacitiveSensorRaw(uint8_t samples)
{
 total = 0;  // 측정을 새로 시작하기위해 측정값을 리셋한다.
 if (samples == 0) return 0;

 // bad pin - this appears not to work
 if (error < 0) return -1;                 

 
 // samples 변수로 반복하여 측정값을 total에 가산하여 평균한다.
 for (uint8_t i = 0; i < samples; i++) {    

  // variable over timeout
  if (SenseOneCycle() < 0)  return -2;  
 }
 return total;
}

 
// 자동교정용 ms 타이머 초기값 -1
void CapacitiveSensor::reset_CS_AutoCal(void){
 leastTotal = 0x0FFFFFFFL;
}

void CapacitiveSensor::set_CS_AutocaL_Millis(unsigned long autoCal_millis){
 CS_AutocaL_Millis = autoCal_millis;
}

 
 // 시스템 ms 교정값 계산 함수
void CapacitiveSensor::set_CS_Timeout_Millis(unsigned long timeout_millis){
 CS_Timeout_Millis = (timeout_millis * (float)loopTimingFactor * (float)F_CPU) / 16000000; 
}

 
// 라이브러리 안의 실제 정전용량을 측정하는 함수는 여기다. 
// 라이브러리 전용 함수이다, 주함수에서는 사용금지.
int CapacitiveSensor::SenseOneCycle(void){
 noInterrupts(); // 초기화 동안은 가로채기들 금지
 DIRECT_WRITE_LOW(sReg, sBit);   // low를SNS로출력=> Cs 연결
 DIRECT_MODE_INPUT(rReg, rBit);  // SNSK를입력으로=>  Cs 측정
 DIRECT_MODE_OUTPUT(rReg, rBit); // SNSK를출력으로=> Cs 충전
 DIRECT_WRITE_LOW(rReg, rBit);  // low를SNSK로출력=> CS와 Cx를 방전
 delayMicroseconds(10);  // 지연 10 us
 
 DIRECT_MODE_INPUT(rReg, rBit);  // SNSK를 입력으로=> Cs와 Cx의 방전 끝
 DIRECT_WRITE_HIGH(sReg, sBit); // high를 SNS로 출력 => Cs 분리
 interrupts(); // 초기화에서 Cs와 Cx를 방전하면, 가로채기를 허용

 
 // SNSK 핀이 HIGH 이면 여기서 기다린다 (방전되기를 기다린다)
 while ( !DIRECT_READ(rReg, rBit) && (total < CS_Timeout_Millis) ) {  
 total++;  // 초기화는 시간초과 될 때 까지 여기서 대기한다.
 }

 
//  시간초과 되도 방전이 안되면 -2 오류로 측정중지
 if (total > CS_Timeout_Millis) return -2;
 }

 
// Cs가 정상으로 방전되면, Cs를 분리하고, SNSK를 HIGH로=> Cx를 충전한다
 // while은SNSK 핀이2.5V 이상으로 HIGH가들어오면 Loop를 나간다.

  noInterrupts(); // 가로채기를 금지한다

 DIRECT_WRITE_HIGH(rReg, rBit);  // SNSK 핀으로 HIGH를 출력 => Cx 충전을 준비
 DIRECT_MODE_OUTPUT(rReg, rBit); // SNSK 핀을 출력으로 전환 => Cx 충전을 시작
  DIRECT_WRITE_HIGH(rReg, rBit);  // SNSK 핀으로 HIGH를 출력 => 짧은 지연시간 추가

 
 DIRECT_MODE_INPUT(rReg, rBit);  // SNSK 핀을 입력으로 전환 => Cx 충전 중지
 DIRECT_WRITE_LOW(sReg, sBit);  // SNS 핀으로 LOW를 출력 => Cs를 Cx와 연결한다
  interrupts(); // Cx의 충전이 끝나고 Cs를 연결하면 가로채기를 허용

 
 // SNSK 핀이 LOW (Cx 충전전압이 낮으면) 시간초과될 때 까지 여기를 계속돈다.
 while ( DIRECT_READ(rReg, rBit) && (total < CS_Timeout_Millis) ) { 
  total++;  // SNSK 핀이 High로될때까지 total을 +1 (측정값을 +1 한다)
 }

 
  // HIGH가 측정되어도 시간 초과이면 -2 오류로 측정을 종료
 if (total >= CS_Timeout_Millis) return -2;  // 측정상태 -2는 시간초과이다
 else return 1;  // 시간초과가 아니면 상태 1 로 측정을 정상으로 종료한다   
} // 측정된 Cx는 Cs와 공유된 값으로 total에 저장된다.

정전용량식 수분 센서 #2
참조 :
Capacitive Soil Sensor
정전용량식 검출전극은 plasti potting으로 절연한다.  
  

정전용량식 검출전극 기판
  
정전용량식 검출전극 회로 
  

발진방식의 정전용량 검출원리 #3
 
 
발진방식의  정전용량 검출회로는 의외로 간단하다.
  
 
실제로 예 3에 사용한 555 타이머 방식 CFC(capacitance to frequency convert) 회로.
이 회로는  inverter logic을 feedback으로 발진시키는 위의 회로보다 10 배이상 안정적이다.
또한 신뢰할 수 있는 data를 수집하려면, 검출전극의 절연과 오염방지가 더 중요하다.
 
친환경 모니터링의 연구자료 Research in Ecological Monitoring
정전용량 검출식 토양수분 센서 WiGreen으로 수집된 자료
  
 
정전용량 검출식 토양수분 센서 WiGreen의 검출회로와 검출전극의 구조
   

여러개의 센서를 농장에 설치하고 무선으로 수신하여 SQL 서버에서 인터넷으로 데이터를 볼 수 있다.
 
 
센서에는 3개의 LED로 건전지 전원 상태, 수분 상태 wet 과 dry를 현장에서도 표시하고 있다.
또한 자료를 보면 농장의 이름, 온도, 습도, 건전지 전원, 수분 상태, 날짜, 기록 등을 확인할 수 있다. 

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 AVRTOOLS™
   
윗글 Arduion ESP8266 WiFi 설정 방법
아래글 Arduino 전극식 수분센서의 분석과 제작
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 230 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 388 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 435 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 467 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 440 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 476 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 474 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 405 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 611 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 567 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 335 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 433 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 652 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 466 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 351 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 601 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 453 0
9 Arduino DUE based DDS Synthesizer avrtools™ 2016/01/24 (일) 273 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 479 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1730 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2625 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2161 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 540 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 483 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3707 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2701 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